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: