[java decompiler] excludes false inner classes
This commit is contained in:
@@ -77,37 +77,33 @@ public class ClassesProcessor {
|
|||||||
|
|
||||||
Inner rec = new Inner();
|
Inner rec = new Inner();
|
||||||
rec.simpleName = simpleName;
|
rec.simpleName = simpleName;
|
||||||
rec.type = entry.outerNameIdx != 0 ? ClassNode.CLASS_MEMBER : entry.simpleNameIdx != 0 ? ClassNode.CLASS_LOCAL : ClassNode.CLASS_ANONYMOUS;
|
rec.type = entry.simpleNameIdx == 0 ? ClassNode.CLASS_ANONYMOUS : entry.outerNameIdx == 0 ? ClassNode.CLASS_LOCAL : ClassNode.CLASS_MEMBER;
|
||||||
rec.accessFlags = entry.accessFlags;
|
rec.accessFlags = entry.accessFlags;
|
||||||
|
|
||||||
// enclosing class
|
// enclosing class
|
||||||
String enclClassName;
|
String enclClassName = entry.outerNameIdx != 0 ? entry.enclosingName : cl.qualifiedName;
|
||||||
if (entry.outerNameIdx != 0) {
|
if (enclClassName == null || innerName.equals(enclClassName)) {
|
||||||
enclClassName = entry.enclosingName;
|
continue; // invalid name or self reference
|
||||||
}
|
}
|
||||||
else {
|
if (rec.type == ClassNode.CLASS_MEMBER && !innerName.equals(enclClassName + '$' + entry.simpleName)) {
|
||||||
enclClassName = cl.qualifiedName;
|
continue; // not a real inner class
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!innerName.equals(enclClassName)) { // self reference
|
StructClass enclosingClass = context.getClasses().get(enclClassName);
|
||||||
StructClass enclosing_class = context.getClasses().get(enclClassName);
|
if (enclosingClass != null && enclosingClass.isOwn()) { // own classes only
|
||||||
if (enclosing_class != null && enclosing_class.isOwn()) { // own classes only
|
Inner existingRec = mapInnerClasses.get(innerName);
|
||||||
|
if (existingRec == null) {
|
||||||
Inner existingRec = mapInnerClasses.get(innerName);
|
mapInnerClasses.put(innerName, rec);
|
||||||
if (existingRec == null) {
|
|
||||||
mapInnerClasses.put(innerName, rec);
|
|
||||||
}
|
|
||||||
else if (!Inner.equal(existingRec, rec)) {
|
|
||||||
String message = "Inconsistent inner class entries for " + innerName + "!";
|
|
||||||
DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
|
|
||||||
}
|
|
||||||
|
|
||||||
// reference to the nested class
|
|
||||||
mapNestedClassReferences.computeIfAbsent(enclClassName, k1 -> new HashSet<>()).add(innerName);
|
|
||||||
|
|
||||||
// reference to the enclosing class
|
|
||||||
mapEnclosingClassReferences.computeIfAbsent(innerName, k -> new HashSet<>()).add(enclClassName);
|
|
||||||
}
|
}
|
||||||
|
else if (!Inner.equal(existingRec, rec)) {
|
||||||
|
String message = "Inconsistent inner class entries for " + innerName + "!";
|
||||||
|
DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reference to the nested class
|
||||||
|
mapNestedClassReferences.computeIfAbsent(enclClassName, k -> new HashSet<>()).add(innerName);
|
||||||
|
// reference to the enclosing class
|
||||||
|
mapEnclosingClassReferences.computeIfAbsent(innerName, k -> new HashSet<>()).add(enclClassName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,7 +132,6 @@ public class ClassesProcessor {
|
|||||||
|
|
||||||
Set<String> setNestedClasses = mapNestedClassReferences.get(superClass);
|
Set<String> setNestedClasses = mapNestedClassReferences.get(superClass);
|
||||||
if (setNestedClasses != null) {
|
if (setNestedClasses != null) {
|
||||||
|
|
||||||
StructClass scl = superNode.classStruct;
|
StructClass scl = superNode.classStruct;
|
||||||
StructInnerClassesAttribute inner = (StructInnerClassesAttribute)scl.getAttribute("InnerClasses");
|
StructInnerClassesAttribute inner = (StructInnerClassesAttribute)scl.getAttribute("InnerClasses");
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,8 @@ public class SingleClassesTest {
|
|||||||
//@Test public void testInUse() { doTest("pkg/TestInUse"); }
|
//@Test public void testInUse() { doTest("pkg/TestInUse"); }
|
||||||
//@Test public void testInterfaceSuper() { doTest("pkg/TestInterfaceSuper"); }
|
//@Test public void testInterfaceSuper() { doTest("pkg/TestInterfaceSuper"); }
|
||||||
|
|
||||||
|
@Test public void testGroovyTrait() { doTest("pkg/TestGroovyTrait"); }
|
||||||
|
|
||||||
private void doTest(String testFile, String... companionFiles) {
|
private void doTest(String testFile, String... companionFiles) {
|
||||||
ConsoleDecompiler decompiler = fixture.getDecompiler();
|
ConsoleDecompiler decompiler = fixture.getDecompiler();
|
||||||
|
|
||||||
|
|||||||
BIN
testData/classes/pkg/TestGroovyTrait$Trait$FieldHelper.class
Normal file
BIN
testData/classes/pkg/TestGroovyTrait$Trait$FieldHelper.class
Normal file
Binary file not shown.
BIN
testData/classes/pkg/TestGroovyTrait$Trait$Helper.class
Normal file
BIN
testData/classes/pkg/TestGroovyTrait$Trait$Helper.class
Normal file
Binary file not shown.
BIN
testData/classes/pkg/TestGroovyTrait.class
Normal file
BIN
testData/classes/pkg/TestGroovyTrait.class
Normal file
Binary file not shown.
17
testData/results/TestGroovyTrait.dec
Normal file
17
testData/results/TestGroovyTrait.dec
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package pkg;
|
||||||
|
|
||||||
|
import groovy.transform.Trait;
|
||||||
|
import org.codehaus.groovy.transform.trait.Traits.Implemented;
|
||||||
|
|
||||||
|
@Trait
|
||||||
|
public interface TestGroovyTrait {
|
||||||
|
@Implemented
|
||||||
|
Object myMethod();
|
||||||
|
|
||||||
|
@Implemented
|
||||||
|
Object getMyField();
|
||||||
|
|
||||||
|
@Implemented
|
||||||
|
void setMyField(Object var1);
|
||||||
|
}
|
||||||
|
|
||||||
8
testData/src/pkg/TestGroovyTrait.groovy
Normal file
8
testData/src/pkg/TestGroovyTrait.groovy
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
package pkg
|
||||||
|
|
||||||
|
trait TestGroovyTrait {
|
||||||
|
def myField = 42
|
||||||
|
def myMethod() {
|
||||||
|
42
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user