mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 21:09:11 +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 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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>();
|
||||||
|
@ -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()) {
|
||||||
|
@ -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();
|
||||||
|
@ -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,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;
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,8 @@ public class PascalFieldData extends FieldData {
|
|||||||
|
|
||||||
private String cachedName;
|
private String cachedName;
|
||||||
|
|
||||||
public PascalFieldData(ClassData cls){
|
public PascalFieldData(JavapEnvironment env, ClassData cls){
|
||||||
super(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;
|
||||||
|
@ -10,8 +10,8 @@ public class PascalMethodData extends MethodData {
|
|||||||
|
|
||||||
private String cachedName;
|
private String cachedName;
|
||||||
|
|
||||||
public PascalMethodData(ClassData cls) {
|
public PascalMethodData(JavapEnvironment env, ClassData cls) {
|
||||||
super(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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user