mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-04 19:18:35 +02:00
+ -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:
parent
9a10c5aea8
commit
81d1cfb3ca
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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>();
|
||||
|
@ -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()) {
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user