Browse Source

+ -prefix_constants <x>, -prefix_fields <x> and -prefix_innerclasses <x>
options to customise the prefixes that the translator adds to to resp.
constant, field and inner class names. For an empty prefix, use "".
Defaults: nothing for constants, "f" for fields and "Inner" for inner
classes.

git-svn-id: branches/jvmbackend@21041 -

Jonas Maebe 13 years ago
parent
commit
81d1cfb3ca

+ 5 - 3
utils/javapp/src/fpc/tools/javapp/ClassData.java

@@ -64,11 +64,13 @@ public class ClassData implements RuntimeConstants {
     private Hashtable indexHashAscii = new Hashtable();
     private Hashtable indexHashAscii = new Hashtable();
     private String pkgPrefix="";
     private String pkgPrefix="";
     private int pkgPrefixLen=0;
     private int pkgPrefixLen=0;
+    protected JavapEnvironment env;
 
 
     /**
     /**
      * Read classfile to disassemble.
      * Read classfile to disassemble.
      */
      */
-    public ClassData(InputStream infile){
+    public ClassData(JavapEnvironment env, InputStream infile){
+        this.env = env;
         try{
         try{
             this.read(new DataInputStream(infile));
             this.read(new DataInputStream(infile));
         }catch (FileNotFoundException ee) {
         }catch (FileNotFoundException ee) {
@@ -214,7 +216,7 @@ public class ClassData implements RuntimeConstants {
         int fields_count = in.readUnsignedShort();
         int fields_count = in.readUnsignedShort();
         fields=new FieldData[fields_count];
         fields=new FieldData[fields_count];
         for (int k = 0; k < fields_count; k++) {
         for (int k = 0; k < fields_count; k++) {
-            FieldData field=new FieldData(this);
+            FieldData field=new FieldData(env,this);
             field.read(in);
             field.read(in);
             fields[k]=field;
             fields[k]=field;
         }
         }
@@ -227,7 +229,7 @@ public class ClassData implements RuntimeConstants {
         int methods_count = in.readUnsignedShort();
         int methods_count = in.readUnsignedShort();
         methods=new MethodData[methods_count];
         methods=new MethodData[methods_count];
         for (int k = 0; k < methods_count ; k++) {
         for (int k = 0; k < methods_count ; k++) {
-            MethodData method=new MethodData(this);
+            MethodData method=new MethodData(env,this);
             method.read(in);
             method.read(in);
             methods[k]=method;
             methods[k]=method;
         }
         }

+ 3 - 1
utils/javapp/src/fpc/tools/javapp/FieldData.java

@@ -49,8 +49,10 @@ public class FieldData implements RuntimeConstants  {
     boolean isSynthetic=false;
     boolean isSynthetic=false;
     boolean isDeprecated=false;
     boolean isDeprecated=false;
     Vector attrs;
     Vector attrs;
+    protected JavapEnvironment env;
 
 
-    public FieldData(ClassData cls){
+    public FieldData(JavapEnvironment env, ClassData cls){
+        this.env=env;
         this.cls=cls;
         this.cls=cls;
     }
     }
 
 

+ 3 - 0
utils/javapp/src/fpc/tools/javapp/JavapEnvironment.java

@@ -76,6 +76,9 @@ public class JavapEnvironment {
     String outputName = "java";
     String outputName = "java";
     ArrayList<String> excludePrefixes;
     ArrayList<String> excludePrefixes;
     ArrayList<String> skelPrefixes;
     ArrayList<String> skelPrefixes;
+    String prefix_constant = "";
+    String prefix_field = "f";
+    String prefix_innerclass = "Inner";
 
 
     public JavapEnvironment() {
     public JavapEnvironment() {
     	excludePrefixes = new ArrayList<String>();
     	excludePrefixes = new ArrayList<String>();

+ 2 - 2
utils/javapp/src/fpc/tools/javapp/JavapPrinter.java

@@ -244,7 +244,7 @@ public class JavapPrinter {
                 // print field attribute information.
                 // print field attribute information.
                 printFieldAttributes(field);
                 printFieldAttributes(field);
             	if (!field.isFormalConst()) {
             	if (!field.isFormalConst()) {
-            		out.print("; external name '"+fieldName.substring(1)+"'");
+            		out.print("; external name '"+fieldName.substring(env.prefix_field.length())+"'");
             	}
             	}
                 out.println(";");
                 out.println(";");
             }
             }
@@ -853,7 +853,7 @@ public class JavapPrinter {
     			for (int i = 0; i < innerClassPrinters.size(); i++) {
     			for (int i = 0; i < innerClassPrinters.size(); i++) {
     				JavapPrinter innerPrinter = innerClassPrinters.get(i);
     				JavapPrinter innerPrinter = innerClassPrinters.get(i);
     				if (checkInnerVisibility(innerPrinter.cls.access,protpub)) {
     				if (checkInnerVisibility(innerPrinter.cls.access,protpub)) {
-    					String shortInnerName = PascalClassData.getShortClassName(innerPrinter.cls.getClassName()); 
+    					String shortInnerName = PascalClassData.getShortClassName(env,innerPrinter.cls.getClassName()); 
         				String shortInnerSafeName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),shortInnerName);
         				String shortInnerSafeName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),shortInnerName);
     					if (first) {
     					if (first) {
     						if (!cls.isInterface()) {
     						if (!cls.isInterface()) {

+ 27 - 0
utils/javapp/src/fpc/tools/javapp/Main.java

@@ -105,6 +105,9 @@ public class Main{
 		out.println("   -public                   Print only public classes and members");
 		out.println("   -public                   Print only public classes and members");
 		out.println("   -protected                Print protected/public classes and members");
 		out.println("   -protected                Print protected/public classes and members");
 		out.println("   -private                  Show all classes and members");
 		out.println("   -private                  Show all classes and members");
+		out.println("   -prefix_constants <x>     Prefix constant names with <x> (default: <nothing>)");
+		out.println("   -prefix_fields <x>        Prefix field names with <x> (default: f)");
+		out.println("   -prefix_innerclasses <x>  Prefix inner class names with <x> (default: Inner)");
 		out.println("   -x <class_or_pkgename>    Treat this class/package as defined in another unit (suffix package names with '.'");
 		out.println("   -x <class_or_pkgename>    Treat this class/package as defined in another unit (suffix package names with '.'");
 		out.println("   -s                        Print internal type signatures");
 		out.println("   -s                        Print internal type signatures");
 		out.println("   -bootclasspath <pathlist> Override location of class files loaded");
 		out.println("   -bootclasspath <pathlist> Override location of class files loaded");
@@ -200,6 +203,30 @@ public class Main{
 					}
 					}
 				} else if (arg.equals("-all")) {
 				} else if (arg.equals("-all")) {
 					env.showallAttr = true;
 					env.showallAttr = true;
+				} else if (arg.equals("-prefix_constants")) {
+					if ((i + 1) < argv.length) {
+						env.prefix_constant = argv[++i];
+					} else {
+						error("-prefix_constants requires argument");
+						usage();
+						return false;
+					}
+				} else if (arg.equals("-prefix_fields")) {
+					if ((i + 1) < argv.length) {
+						env.prefix_field = argv[++i];
+					} else {
+						error("-prefix_fields requires argument");
+						usage();
+						return false;
+					}
+				} else if (arg.equals("-prefix_innerclasses")) {
+					if ((i + 1) < argv.length) {
+						env.prefix_innerclass = argv[++i];
+					} else {
+						error("-prefix_innerclasses requires argument");
+						usage();
+						return false;
+					}
 				} else {
 				} else {
 					error("invalid flag: " + arg);
 					error("invalid flag: " + arg);
 					usage();
 					usage();

+ 4 - 1
utils/javapp/src/fpc/tools/javapp/MethodData.java

@@ -62,7 +62,10 @@ public class MethodData {
     boolean isSynthetic=false;
     boolean isSynthetic=false;
     boolean isDeprecated=false;
     boolean isDeprecated=false;
 
 
-    public MethodData(ClassData cls){
+    protected JavapEnvironment env;
+
+    public MethodData(JavapEnvironment env, ClassData cls){
+        this.env=env;
         this.cls=cls;
         this.cls=cls;
     }
     }
 
 

+ 8 - 8
utils/javapp/src/fpc/tools/javapp/PascalClassData.java

@@ -8,9 +8,10 @@ import java.util.HashSet;
 import java.util.StringTokenizer;
 import java.util.StringTokenizer;
 import java.util.Vector;
 import java.util.Vector;
 
 
+import fpc.tools.javapp.JavapEnvironment;
+
 public class PascalClassData extends ClassData {
 public class PascalClassData extends ClassData {
 
 
-	private JavapEnvironment env;
 	public PascalClassData outerClass;
 	public PascalClassData outerClass;
 	private HashSet<String> nestedDependencies;
 	private HashSet<String> nestedDependencies;
 	boolean setOuterDependencies; 
 	boolean setOuterDependencies; 
@@ -22,10 +23,9 @@ public class PascalClassData extends ClassData {
 
 
 	
 	
 	public PascalClassData(InputStream infile, PascalClassData outerClass, JavapEnvironment env, boolean doCollectDependencies) {
 	public PascalClassData(InputStream infile, PascalClassData outerClass, JavapEnvironment env, boolean doCollectDependencies) {
-		super (infile);
+		super (env,infile);
 		this.outerClass = outerClass;
 		this.outerClass = outerClass;
 		this.nestedDependencies = new HashSet<String>();
 		this.nestedDependencies = new HashSet<String>();
-		this.env = env;
 		ClassIdentifierInfo.registerClassInfo(getClassName(),getSuperClassName(),getSuperInterfaces());
 		ClassIdentifierInfo.registerClassInfo(getClassName(),getSuperClassName(),getSuperInterfaces());
 		if (doCollectDependencies) {
 		if (doCollectDependencies) {
 			collectDependencies();
 			collectDependencies();
@@ -127,12 +127,12 @@ public class PascalClassData extends ClassData {
 		return outerClass != null;
 		return outerClass != null;
 	}
 	}
 	
 	
-	public static String getShortClassName(String className) {
+	public static String getShortClassName(JavapEnvironment env, String className) {
 		int index;
 		int index;
 		className = className.replace('-', '_');
 		className = className.replace('-', '_');
 		if (isInnerClass(className)) {
 		if (isInnerClass(className)) {
 			index=className.lastIndexOf("$")+1;
 			index=className.lastIndexOf("$")+1;
-			return "Inner"+className.substring(index);
+			return env.prefix_innerclass+className.substring(index);
 		}
 		}
 		else
 		else
 			className = className.replace("$","__");
 			className = className.replace("$","__");
@@ -240,7 +240,7 @@ public class PascalClassData extends ClassData {
 	}
 	}
 
 
 	public String getShortClassName() {
 	public String getShortClassName() {
-		return getShortClassName(getClassName());
+		return getShortClassName(env,getClassName());
     }
     }
 	
 	
 	public String getShortPascalClassName() {
 	public String getShortPascalClassName() {
@@ -305,7 +305,7 @@ public class PascalClassData extends ClassData {
         int fields_count = in.readUnsignedShort();
         int fields_count = in.readUnsignedShort();
         fields=new FieldData[fields_count];
         fields=new FieldData[fields_count];
         for (int k = 0; k < fields_count; k++) {
         for (int k = 0; k < fields_count; k++) {
-            FieldData field=new PascalFieldData(this);
+            FieldData field=new PascalFieldData(env,this);
             field.read(in);
             field.read(in);
             fields[k]=field;
             fields[k]=field;
         }
         }
@@ -319,7 +319,7 @@ public class PascalClassData extends ClassData {
         int methods_count = in.readUnsignedShort();
         int methods_count = in.readUnsignedShort();
         methods=new PascalMethodData[methods_count];
         methods=new PascalMethodData[methods_count];
         for (int k = 0; k < methods_count ; k++) {
         for (int k = 0; k < methods_count ; k++) {
-            MethodData method=new PascalMethodData(this);
+            MethodData method=new PascalMethodData(env,this);
             method.read(in);
             method.read(in);
             methods[k]=method;
             methods[k]=method;
         }
         }

+ 6 - 4
utils/javapp/src/fpc/tools/javapp/PascalFieldData.java

@@ -8,8 +8,8 @@ public class PascalFieldData extends FieldData {
 	
 	
 	private String cachedName;
 	private String cachedName;
 
 
-	public PascalFieldData(ClassData cls){
-       super(cls);
+	public PascalFieldData(JavapEnvironment env, ClassData cls){
+       super(env, cls);
     }
     }
 	
 	
     public String getVisibilitySectionName(){
     public String getVisibilitySectionName(){
@@ -46,7 +46,7 @@ public class PascalFieldData extends FieldData {
      * Returns Pascal type signature of a field.
      * Returns Pascal type signature of a field.
      */
      */
     public String getType(){
     public String getType(){
-        return new PascalTypeSignature(getInternalSig(),cls,false,false).getFieldType();
+        return new PascalTypeSignature(env,getInternalSig(),cls,false,false).getFieldType();
     }
     }
 
 
     /**
     /**
@@ -65,7 +65,9 @@ public class PascalFieldData extends FieldData {
     		String realName = super.getName();
     		String realName = super.getName();
     		// we prepend an "f" for fields to prevent name clashes
     		// we prepend an "f" for fields to prevent name clashes
     		if (!isFormalConst())
     		if (!isFormalConst())
-    			realName = "f" + realName;
+    			realName = env.prefix_field + realName;
+    		else
+    			realName = env.prefix_constant + realName;
     		cachedName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),realName);    				
     		cachedName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),realName);    				
     	}
     	}
     	return cachedName;
     	return cachedName;

+ 4 - 4
utils/javapp/src/fpc/tools/javapp/PascalMethodData.java

@@ -10,8 +10,8 @@ public class PascalMethodData extends MethodData {
 	
 	
 	private String cachedName;
 	private String cachedName;
 	
 	
-    public PascalMethodData(ClassData cls) {
-		super(cls);
+    public PascalMethodData(JavapEnvironment env, ClassData cls) {
+		super(env,cls);
 	}
 	}
 
 
 	public String getVisibilitySectionName(){
 	public String getVisibilitySectionName(){
@@ -41,7 +41,7 @@ public class PascalMethodData extends MethodData {
      */
      */
     public String getReturnType(){
     public String getReturnType(){
 
 
-        String rttype = (new PascalTypeSignature(getInternalSig(), cls, false, false)).getReturnType();
+        String rttype = (new PascalTypeSignature(env,getInternalSig(), cls, false, false)).getReturnType();
         return rttype;
         return rttype;
     }
     }
 
 
@@ -61,7 +61,7 @@ public class PascalMethodData extends MethodData {
      * Return java type parameter signature.
      * Return java type parameter signature.
      */
      */
     public String getParameters(boolean useOpenArrays, boolean useConstOpenArrays){
     public String getParameters(boolean useOpenArrays, boolean useConstOpenArrays){
-        String ptype = (new PascalTypeSignature(getInternalSig(),cls,useOpenArrays,useConstOpenArrays)).getParameters();
+        String ptype = (new PascalTypeSignature(env,getInternalSig(),cls,useOpenArrays,useConstOpenArrays)).getParameters();
 
 
         return ptype;
         return ptype;
     }
     }

+ 4 - 2
utils/javapp/src/fpc/tools/javapp/PascalTypeSignature.java

@@ -10,8 +10,10 @@ public class PascalTypeSignature extends TypeSignature {
 	// (done for constructors, under the assumption that these won't change the
 	// (done for constructors, under the assumption that these won't change the
 	//  incoming data)
 	//  incoming data)
 	private boolean useConstOpenArrays;
 	private boolean useConstOpenArrays;
+	private JavapEnvironment env;
 
 
-	public PascalTypeSignature(String JVMSignature, ClassData cls, boolean useOpenArrays, boolean useConstOpenArrays) {
+	public PascalTypeSignature(JavapEnvironment env, String JVMSignature, ClassData cls, boolean useOpenArrays, boolean useConstOpenArrays) {
+	        this.env = env;
 		this.useOpenArrays = useOpenArrays;
 		this.useOpenArrays = useOpenArrays;
 		this.useConstOpenArrays = useConstOpenArrays;
 		this.useConstOpenArrays = useConstOpenArrays;
 		init(JVMSignature);
 		init(JVMSignature);
@@ -75,7 +77,7 @@ public class PascalTypeSignature extends TypeSignature {
             			!PascalClassData.currentUnit.isExternalInnerClass(baseType)) {
             			!PascalClassData.currentUnit.isExternalInnerClass(baseType)) {
             		int index = baseType.lastIndexOf('$');
             		int index = baseType.lastIndexOf('$');
             		outerClass = PascalClassData.getShortPascalClassName(baseType.substring(0,index))+".";
             		outerClass = PascalClassData.getShortPascalClassName(baseType.substring(0,index))+".";
-            		componentType = "Inner"+baseType.substring(index+1).replace('$', '.'); 
+            		componentType = env.prefix_innerclass+baseType.substring(index+1).replace('$', '.'); 
             	} else {
             	} else {
             		outerClass = "";
             		outerClass = "";
                 	componentType = PascalClassData.getShortPascalClassName(baseType);
                 	componentType = PascalClassData.getShortPascalClassName(baseType);

+ 7 - 7
utils/javapp/src/fpc/tools/javapp/PascalUnit.java

@@ -114,10 +114,10 @@ public class PascalUnit {
 	}
 	}
 	
 	
 	private String getDefaultShortPascalName(String classname) {
 	private String getDefaultShortPascalName(String classname) {
-		String shortname = PascalClassData.getShortClassName(classname);
+		String shortname = PascalClassData.getShortClassName(env,classname);
 		// inner class -> done (no naming problems)
 		// inner class -> done (no naming problems)
 		if (classname.indexOf('$') != -1)
 		if (classname.indexOf('$') != -1)
-			return "Inner"+shortname;
+			return env.prefix_innerclass+shortname;
 
 
 		// no package?
 		// no package?
 		if (shortname.equals(classname))
 		if (shortname.equals(classname))
@@ -139,7 +139,7 @@ public class PascalUnit {
 		if (PascalClassData.isInnerClass(className)) {
 		if (PascalClassData.isInnerClass(className)) {
 			int nestedIndex = className.indexOf('$');
 			int nestedIndex = className.indexOf('$');
 			// get the abbreviated Pascal name of the top-level class, followed by
 			// get the abbreviated Pascal name of the top-level class, followed by
-			// "Inner" + the nested class names (to avoid identifier conflicts)
+			// env.prefix_innerclass + the nested class names (to avoid identifier conflicts)
 			String res = getShortPascalName(className.substring(0,nestedIndex));
 			String res = getShortPascalName(className.substring(0,nestedIndex));
 			// create valid identifier for inner classes that only exist in external version
 			// create valid identifier for inner classes that only exist in external version
 			if (isExternalInnerClass(className)) {
 			if (isExternalInnerClass(className)) {
@@ -148,7 +148,7 @@ public class PascalUnit {
 			} else {
 			} else {
 				StringTokenizer innerTypes = new StringTokenizer(className.substring(nestedIndex+1), "$");
 				StringTokenizer innerTypes = new StringTokenizer(className.substring(nestedIndex+1), "$");
 				while (innerTypes.hasMoreTokens()) {
 				while (innerTypes.hasMoreTokens()) {
-					res = res + "." + "Inner"+innerTypes.nextToken();
+					res = res + "." + env.prefix_innerclass+innerTypes.nextToken();
 				}
 				}
 			}
 			}
 			return res;
 			return res;
@@ -353,7 +353,7 @@ public class PascalUnit {
 					// remove added '$' again
 					// remove added '$' again
 					finishingName = finishingName.substring(0,finishingName.length()-1);
 					finishingName = finishingName.substring(0,finishingName.length()-1);
 					if (nestedClasses.size()>1) {
 					if (nestedClasses.size()>1) {
-						finishingName = PascalClassData.getShortClassName(finishingName);
+						finishingName = PascalClassData.getShortClassName(env,finishingName);
 					} else {
 					} else {
 						finishingName = PascalClassData.getShortPascalClassName(finishingName);
 						finishingName = PascalClassData.getShortPascalClassName(finishingName);
 					}
 					}
@@ -367,7 +367,7 @@ public class PascalUnit {
 			if (nestedClasses.size()>0) {
 			if (nestedClasses.size()>0) {
 				unitFile.println(prefix+"  type");
 				unitFile.println(prefix+"  type");
 				prefix = prefix + "    ";
 				prefix = prefix + "    ";
-				shortPascalName = PascalClassData.getShortClassName(curClass);
+				shortPascalName = PascalClassData.getShortClassName(env,curClass);
 			} else {
 			} else {
 				shortPascalName = PascalClassData.getShortPascalClassName(curClass);
 				shortPascalName = PascalClassData.getShortPascalClassName(curClass);
 		        unitFile.println();
 		        unitFile.println();
@@ -381,7 +381,7 @@ public class PascalUnit {
 			// remove added '$' again
 			// remove added '$' again
 			finishingName = finishingName.substring(0,finishingName.length()-1);
 			finishingName = finishingName.substring(0,finishingName.length()-1);
 			if (nestedClasses.size()>1) {
 			if (nestedClasses.size()>1) {
-				finishingName = PascalClassData.getShortClassName(finishingName);
+				finishingName = PascalClassData.getShortClassName(env,finishingName);
 			} else {
 			} else {
 				finishingName = PascalClassData.getShortPascalClassName(finishingName);
 				finishingName = PascalClassData.getShortPascalClassName(finishingName);
 			}
 			}