EA-41231 (omit synthetic inner class constructor parameter)

This commit is contained in:
Roman Shevchenko 2014-10-14 18:32:15 +02:00
parent 373ca99e37
commit 6889e7435a
13 changed files with 55 additions and 6 deletions

View File

@ -250,7 +250,7 @@ public class ClassWriter {
for (ClassNode inner : node.nested) { for (ClassNode inner : node.nested) {
if (inner.type == ClassNode.CLASS_MEMBER) { if (inner.type == ClassNode.CLASS_MEMBER) {
StructClass innerCl = inner.classStruct; StructClass innerCl = inner.classStruct;
boolean isSynthetic = (inner.access & CodeConstants.ACC_SYNTHETIC) != 0 || innerCl.isSynthetic(); boolean isSynthetic = (inner.access & CodeConstants.ACC_SYNTHETIC) != 0 || innerCl.isSynthetic() || inner.namelessConstructorStub;
boolean hide = isSynthetic && DecompilerContext.getOption(IFernflowerPreferences.REMOVE_SYNTHETIC) || boolean hide = isSynthetic && DecompilerContext.getOption(IFernflowerPreferences.REMOVE_SYNTHETIC) ||
wrapper.getHiddenMembers().contains(innerCl.qualifiedName); wrapper.getHiddenMembers().contains(innerCl.qualifiedName);
if (hide) continue; if (hide) continue;

View File

@ -359,6 +359,7 @@ public class ClassesProcessor {
public Set<String> enclosingClasses = new HashSet<String>(); public Set<String> enclosingClasses = new HashSet<String>();
public ClassNode parent; public ClassNode parent;
public LambdaInformation lambdaInformation; public LambdaInformation lambdaInformation;
public boolean namelessConstructorStub = false;
public ClassNode(String content_class_name, public ClassNode(String content_class_name,
String content_method_name, String content_method_name,

View File

@ -79,6 +79,7 @@ public class NestedClassProcessor {
DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN); DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
child.simpleName = "NamelessClass_" + (++nameless); child.simpleName = "NamelessClass_" + (++nameless);
} }
child.namelessConstructorStub = !cl.hasModifier(CodeConstants.ACC_STATIC) && cl.getMethods().size() + cl.getFields().size() == 0;
} }
} }

View File

@ -311,20 +311,31 @@ public class NewExprent extends Exprent {
if (!enumconst || start < lstParameters.size()) { if (!enumconst || start < lstParameters.size()) {
buf.append("("); buf.append("(");
boolean firstpar = true; boolean firstParam = true;
for (int i = start; i < lstParameters.size(); i++) { for (int i = start; i < lstParameters.size(); i++) {
if (sigFields == null || sigFields.get(i) == null) { if (sigFields == null || sigFields.get(i) == null) {
if (!firstpar) { Exprent expr = lstParameters.get(i);
VarType leftType = constructor.getDescriptor().params[i];
if (i == lstParameters.size() - 1 && expr.getExprType() == VarType.VARTYPE_NULL) {
ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(leftType.value);
if (node != null && node.namelessConstructorStub) {
break; // skip last parameter of synthetic constructor call
}
}
if (!firstParam) {
buf.append(", "); buf.append(", ");
} }
TextBuffer buff = new TextBuffer(); TextBuffer buff = new TextBuffer();
ExprProcessor.getCastedExprent(lstParameters.get(i), constructor.getDescriptor().params[i], buff, indent, true, tracer); ExprProcessor.getCastedExprent(expr, leftType, buff, indent, true, tracer);
buf.append(buff); buf.append(buff);
firstpar = false;
firstParam = false;
} }
} }
buf.append(")"); buf.append(")");
} }
} }

View File

@ -34,4 +34,6 @@ public class SingleClassesTest extends SingleClassesTestBase {
@Test public void testEnum() { doTest("pkg/TestEnum"); } @Test public void testEnum() { doTest("pkg/TestEnum"); }
@Test public void testDebugSymbols() { doTest("pkg/TestDebugSymbols"); } @Test public void testDebugSymbols() { doTest("pkg/TestDebugSymbols"); }
@Test public void testInvalidMethodSignature() { doTest("InvalidMethodSignature"); } @Test public void testInvalidMethodSignature() { doTest("InvalidMethodSignature"); }
@Test public void testInnerClassConstructor() { doTest("pkg/TestInnerClassConstructor"); }
@Test public void testInnerClassConstructor11() { doTest("v11/TestInnerClassConstructor"); }
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,17 @@
package pkg;
class TestInnerClassConstructor {
void m() {
new TestInnerClassConstructor.Inner("text");
}
void n(String var1) {
System.out.println("n(): " + var1);
}
final class Inner {
private Inner(String var2) {
TestInnerClassConstructor.this.n(var2);
}
}
}

View File

@ -0,0 +1,17 @@
package pkg;
class TestInnerClassConstructor {
void m() {
new Inner("text");
}
void n(String s) {
System.out.println("n(): " + s);
}
final class Inner {
private Inner(String s) {
n(s);
}
}
}