|
|
@ -267,11 +267,8 @@ public class ClassAnalyzer |
|
|
|
constrVector.addElement(methods[j]); |
|
|
|
constrVector.addElement(methods[j]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// First analyze fields
|
|
|
|
|
|
|
|
for (int j=0; j < fields.length; j++) |
|
|
|
|
|
|
|
fields[j].analyze(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// now analyze constructors and synthetic fields:
|
|
|
|
// First analyze constructors and synthetic fields:
|
|
|
|
constrAna = null; |
|
|
|
constrAna = null; |
|
|
|
constructors = new MethodAnalyzer[constrVector.size()]; |
|
|
|
constructors = new MethodAnalyzer[constrVector.size()]; |
|
|
|
if (constructors.length > 0) { |
|
|
|
if (constructors.length > 0) { |
|
|
@ -281,15 +278,33 @@ public class ClassAnalyzer |
|
|
|
constrAna = new TransformConstructors(this, false, constructors); |
|
|
|
constrAna = new TransformConstructors(this, false, constructors); |
|
|
|
constrAna.initSyntheticFields(); |
|
|
|
constrAna.initSyntheticFields(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (staticConstructor != null) |
|
|
|
|
|
|
|
staticConstructor.analyze(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If output should be immediate, we delay analyzation to output.
|
|
|
|
|
|
|
|
// Note that this may break anonymous classes, but the user
|
|
|
|
|
|
|
|
// has been warned.
|
|
|
|
|
|
|
|
if ((Decompiler.options & Decompiler.OPTION_IMMEDIATE) != 0) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Analyze fields
|
|
|
|
|
|
|
|
for (int j=0; j < fields.length; j++) |
|
|
|
|
|
|
|
fields[j].analyze(); |
|
|
|
|
|
|
|
|
|
|
|
// Now analyze remaining methods.
|
|
|
|
// Now analyze remaining methods.
|
|
|
|
for (int j=0; j < methods.length; j++) { |
|
|
|
for (int j=0; j < methods.length; j++) { |
|
|
|
if (methods[j].isStatic() || !methods[j].isConstructor()) |
|
|
|
if (!methods[j].isConstructor()) |
|
|
|
methods[j].analyze(); |
|
|
|
methods[j].analyze(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void analyzeInnerClasses() { |
|
|
|
public void analyzeInnerClasses() { |
|
|
|
|
|
|
|
// If output should be immediate, we delay analyzation to output.
|
|
|
|
|
|
|
|
// Note that this may break anonymous classes, but the user
|
|
|
|
|
|
|
|
// has been warned.
|
|
|
|
|
|
|
|
if ((Decompiler.options & Decompiler.OPTION_IMMEDIATE) != 0) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
// Now analyze the inner classes.
|
|
|
|
// Now analyze the inner classes.
|
|
|
|
for (int j=0; j < inners.length; j++) { |
|
|
|
for (int j=0; j < inners.length; j++) { |
|
|
|
inners[j].analyze(); |
|
|
|
inners[j].analyze(); |
|
|
@ -303,7 +318,6 @@ public class ClassAnalyzer |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void makeDeclaration() { |
|
|
|
public void makeDeclaration() { |
|
|
|
// Finally anlyze the remaining field initializers.
|
|
|
|
|
|
|
|
if (constrAna != null) |
|
|
|
if (constrAna != null) |
|
|
|
constrAna.transform(); |
|
|
|
constrAna.transform(); |
|
|
|
if (staticConstructor != null) { |
|
|
|
if (staticConstructor != null) { |
|
|
@ -311,6 +325,13 @@ public class ClassAnalyzer |
|
|
|
(this, true, new MethodAnalyzer[] { staticConstructor }) |
|
|
|
(this, true, new MethodAnalyzer[] { staticConstructor }) |
|
|
|
.transform(); |
|
|
|
.transform(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If output should be immediate, we delay analyzation to output.
|
|
|
|
|
|
|
|
// Note that this may break anonymous classes, but the user
|
|
|
|
|
|
|
|
// has been warned.
|
|
|
|
|
|
|
|
if ((Decompiler.options & Decompiler.OPTION_IMMEDIATE) != 0) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
for (int j=0; j < fields.length; j++) |
|
|
|
for (int j=0; j < fields.length; j++) |
|
|
|
fields[j].makeDeclaration(); |
|
|
|
fields[j].makeDeclaration(); |
|
|
|
for (int j=0; j < inners.length; j++) |
|
|
|
for (int j=0; j < inners.length; j++) |
|
|
@ -318,7 +339,6 @@ public class ClassAnalyzer |
|
|
|
for (int j=0; j < methods.length; j++) |
|
|
|
for (int j=0; j < methods.length; j++) |
|
|
|
methods[j].makeDeclaration(); |
|
|
|
methods[j].makeDeclaration(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void dumpDeclaration(TabbedPrintWriter writer) |
|
|
|
public void dumpDeclaration(TabbedPrintWriter writer) |
|
|
|
throws java.io.IOException |
|
|
|
throws java.io.IOException |
|
|
|
{ |
|
|
|
{ |
|
|
@ -337,6 +357,11 @@ public class ClassAnalyzer |
|
|
|
blockInitializers[i].dumpSource(writer); |
|
|
|
blockInitializers[i].dumpSource(writer); |
|
|
|
needFieldNewLine = needNewLine = true; |
|
|
|
needFieldNewLine = needNewLine = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if ((Decompiler.options & Decompiler.OPTION_IMMEDIATE) != 0) { |
|
|
|
|
|
|
|
// We now do the analyzation we skipped before.
|
|
|
|
|
|
|
|
fields[i].analyze(); |
|
|
|
|
|
|
|
fields[i].makeDeclaration(); |
|
|
|
|
|
|
|
} |
|
|
|
if (fields[i].skipWriting()) |
|
|
|
if (fields[i].skipWriting()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
if (needFieldNewLine) |
|
|
|
if (needFieldNewLine) |
|
|
@ -357,10 +382,26 @@ public class ClassAnalyzer |
|
|
|
for (int i=0; i< inners.length; i++) { |
|
|
|
for (int i=0; i< inners.length; i++) { |
|
|
|
if (needNewLine) |
|
|
|
if (needNewLine) |
|
|
|
writer.println(""); |
|
|
|
writer.println(""); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((Decompiler.options & Decompiler.OPTION_IMMEDIATE) != 0) { |
|
|
|
|
|
|
|
// We now do the analyzation we skipped before.
|
|
|
|
|
|
|
|
inners[i].analyze(); |
|
|
|
|
|
|
|
inners[i].analyzeInnerClasses(); |
|
|
|
|
|
|
|
inners[i].makeDeclaration(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
inners[i].dumpSource(writer); |
|
|
|
inners[i].dumpSource(writer); |
|
|
|
needNewLine = true; |
|
|
|
needNewLine = true; |
|
|
|
} |
|
|
|
} |
|
|
|
for (int i=0; i< methods.length; i++) { |
|
|
|
for (int i=0; i< methods.length; i++) { |
|
|
|
|
|
|
|
if ((Decompiler.options & Decompiler.OPTION_IMMEDIATE) != 0) { |
|
|
|
|
|
|
|
// We now do the analyzation we skipped before.
|
|
|
|
|
|
|
|
if (!methods[i].isConstructor()) |
|
|
|
|
|
|
|
methods[i].analyze(); |
|
|
|
|
|
|
|
methods[i].analyzeInnerClasses(); |
|
|
|
|
|
|
|
methods[i].makeDeclaration(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (methods[i].skipWriting()) |
|
|
|
if (methods[i].skipWriting()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
if (needNewLine) |
|
|
|
if (needNewLine) |
|
|
|