1 cananian 1.1.4.1 // UniqueName.java, created Mon Jan 10 22:00:06 2000 by cananian
  2 cananian 1.1.4.2 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.4.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 cananian 1.1.4.1 package harpoon.ClassFile;
  5 cananian 1.1.4.1 
  6 cananian 1.1.4.1 import java.util.HashMap;
  7 cananian 1.1.4.1 import java.util.Map;
  8 cananian 1.1.4.1 /**
  9 cananian 1.1.4.1  * <code>UniqueName</code> contains methods to create unique class,
 10 cananian 1.1.4.1  * field, or method names.
 11 cananian 1.1.4.1  * 
 12 cananian 1.1.4.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 13 cananian 1.2      * @version $Id: UniqueName.java,v 1.2 2002/02/25 21:03:04 cananian Exp $
 14 cananian 1.1.4.1  */
 15 cananian 1.1.4.1 public abstract class UniqueName {
 16 cananian 1.1.4.1   private final static Map suffixMap = new HashMap(); // efficiency hack.
 17 cananian 1.1.4.1 
 18 cananian 1.1.4.1   /** Make a unique class name from a given suggestion.
 19 cananian 1.1.4.1    *  The suggestion string may be null or empty.
 20 cananian 1.1.4.1    */
 21 cananian 1.1.4.1   public static String uniqueClassName(String suggestion, Linker context) {
 22 cananian 1.1.4.1     if (suggestion==null || suggestion.equals("")) suggestion="FLEXc";
 23 cananian 1.1.4.1     // remove trailing dollar-signs.
 24 cananian 1.1.4.1     while (suggestion.charAt(suggestion.length()-1)=='$')
 25 cananian 1.1.4.1       suggestion = suggestion.substring(0, suggestion.length()-1);
 26 cananian 1.1.4.1     // remove anything after a double dollar sign.
 27 cananian 1.1.4.1     if (suggestion.indexOf("$$")!=-1)
 28 cananian 1.1.4.1       suggestion = suggestion.substring(0, suggestion.lastIndexOf("$$"));
 29 cananian 1.1.4.1     // try unadorned name & return it if unique.
 30 cananian 1.1.4.1     try { context.forName(suggestion); }
 31 cananian 1.1.4.1     catch (NoSuchClassException e) { return suggestion; }
 32 cananian 1.1.4.1     // find lowest unique number for class.
 33 cananian 1.1.4.1     // the goal here is determinism.  the suffixMap makes it efficient.
 34 cananian 1.1.4.1     Integer lastsuffix = (Integer) suffixMap.get(suggestion);
 35 cananian 1.1.4.1     for (int i=(lastsuffix==null)?0:(lastsuffix.intValue()+1); true; i++) {
 36 cananian 1.1.4.1       String className = suggestion + "$$" + i;
 37 cananian 1.1.4.1       try { context.forName(className); }
 38 cananian 1.1.4.1       catch (NoSuchClassException e) {
 39 cananian 1.1.4.1         suffixMap.put(suggestion, new Integer(i));
 40 cananian 1.1.4.1         return className;
 41 cananian 1.1.4.1       }
 42 cananian 1.1.4.1     }
 43 cananian 1.1.4.1   }
 44 cananian 1.1.4.1   
 45 cananian 1.1.4.1   /** Make a unique field name from a given suggestion.
 46 cananian 1.1.4.1    *  The suggestion string may be null or empty.
 47 cananian 1.1.4.1    */
 48 cananian 1.1.4.1   public static String uniqueFieldName(String suggestion, HClass context)
 49 cananian 1.1.4.1   {
 50 cananian 1.1.4.1     if (suggestion==null || suggestion.equals("")) suggestion="FLEXm";
 51 cananian 1.1.4.1     // remove trailing dollar-signs.
 52 cananian 1.1.4.1     while (suggestion.charAt(suggestion.length()-1)=='$')
 53 cananian 1.1.4.1       suggestion = suggestion.substring(0, suggestion.length()-1);
 54 cananian 1.1.4.1     // remove anything after a double dollar sign.
 55 cananian 1.1.4.1     if (suggestion.indexOf("$$")!=-1)
 56 cananian 1.1.4.1       suggestion = suggestion.substring(0, suggestion.lastIndexOf("$$"));
 57 cananian 1.1.4.1     // find lowest unique number for method.
 58 cananian 1.1.4.1   L1:
 59 cananian 1.1.4.1     for (int i=-1; true; i++) {
 60 cananian 1.1.4.1       String fieldname = (i<0)?suggestion:(suggestion+"$$"+i);
 61 cananian 1.1.4.1       // search class for existing method.
 62 cananian 1.1.4.1       HField[] hf = context.getDeclaredFields();
 63 cananian 1.1.4.1       for (int j=0; j<hf.length; j++)
 64 cananian 1.1.4.1         if (hf[j].getName().equals(fieldname))
 65 cananian 1.1.4.1           continue L1;
 66 cananian 1.1.4.1       // found a valid name.
 67 cananian 1.1.4.1       return fieldname;
 68 cananian 1.1.4.1     }
 69 cananian 1.1.4.1   }
 70 cananian 1.1.4.1   
 71 cananian 1.1.4.1   /** Make a unique method name from a given suggestion.
 72 cananian 1.1.4.1    *  The suggestion string may be null or empty.
 73 cananian 1.1.4.1    */
 74 cananian 1.1.4.1   public static String uniqueMethodName(String suggestion, HClass context)
 75 cananian 1.1.4.1   {
 76 cananian 1.1.4.1     if (suggestion==null || suggestion.equals("")) suggestion="FLEXm";
 77 cananian 1.1.4.1     // remove trailing dollar-signs.
 78 cananian 1.1.4.1     while (suggestion.charAt(suggestion.length()-1)=='$')
 79 cananian 1.1.4.1       suggestion = suggestion.substring(0, suggestion.length()-1);
 80 cananian 1.1.4.1     // remove anything after a double dollar sign.
 81 cananian 1.1.4.1     if (suggestion.indexOf("$$")!=-1)
 82 cananian 1.1.4.1       suggestion = suggestion.substring(0, suggestion.lastIndexOf("$$"));
 83 cananian 1.1.4.1     // find lowest unique number for method.
 84 cananian 1.1.4.1   L1:
 85 cananian 1.1.4.1     for (int i=-1; true; i++) {
 86 cananian 1.1.4.1       String methodname = (i<0)?suggestion:(suggestion+"$$"+i);
 87 cananian 1.1.4.1       // search class for existing method.
 88 cananian 1.1.4.1       HMethod[] hm = context.getDeclaredMethods();
 89 cananian 1.1.4.1       for (int j=0; j<hm.length; j++)
 90 cananian 1.1.4.1         if (hm[j].getName().equals(methodname)
 91 cananian 1.1.4.1             /* && hm[j].getDescriptor().equals(descriptor)*/)
 92 cananian 1.1.4.1           continue L1;
 93 cananian 1.1.4.1       // found a valid name.
 94 cananian 1.1.4.1       return methodname;
 95 cananian 1.1.4.1     }
 96 cananian 1.1.4.1   }
 97 cananian 1.1.4.1 }
 98 cananian 1.1.4.1 
 99 cananian 1.1.4.1 // set emacs indentation style.
100 cananian 1.1.4.1 // Local Variables:
101 cananian 1.1.4.1 // c-basic-offset:2
102 cananian 1.2     // End: