+ -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 -
This commit is contained in:
Jonas Maebe 2012-04-25 18:14:35 +00:00
parent 9a10c5aea8
commit 81d1cfb3ca
11 changed files with 73 additions and 32 deletions

View File

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

View File

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

View File

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

View File

@ -244,7 +244,7 @@ public class JavapPrinter {
// print field attribute information.
printFieldAttributes(field);
if (!field.isFormalConst()) {
out.print("; external name '"+fieldName.substring(1)+"'");
out.print("; external name '"+fieldName.substring(env.prefix_field.length())+"'");
}
out.println(";");
}
@ -853,7 +853,7 @@ public class JavapPrinter {
for (int i = 0; i < innerClassPrinters.size(); i++) {
JavapPrinter innerPrinter = innerClassPrinters.get(i);
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);
if (first) {
if (!cls.isInterface()) {

View File

@ -105,6 +105,9 @@ public class Main{
out.println(" -public Print only public classes and members");
out.println(" -protected Print protected/public 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(" -s Print internal type signatures");
out.println(" -bootclasspath <pathlist> Override location of class files loaded");
@ -200,6 +203,30 @@ public class Main{
}
} else if (arg.equals("-all")) {
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 {
error("invalid flag: " + arg);
usage();

View File

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

View File

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

View File

@ -8,8 +8,8 @@ public class PascalFieldData extends FieldData {
private String cachedName;
public PascalFieldData(ClassData cls){
super(cls);
public PascalFieldData(JavapEnvironment env, ClassData cls){
super(env, cls);
}
public String getVisibilitySectionName(){
@ -46,7 +46,7 @@ public class PascalFieldData extends FieldData {
* Returns Pascal type signature of a field.
*/
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();
// we prepend an "f" for fields to prevent name clashes
if (!isFormalConst())
realName = "f" + realName;
realName = env.prefix_field + realName;
else
realName = env.prefix_constant + realName;
cachedName = ClassIdentifierInfo.AddIdentifierNameForClass(cls.getClassName(),realName);
}
return cachedName;

View File

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

View File

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

View File

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