From 06c993b508c2c9079d87cdeddd7c18ba2d842dfe Mon Sep 17 00:00:00 2001 From: Alexandru-Constantin Bledea Date: Mon, 7 Mar 2016 18:52:37 +0200 Subject: [PATCH] correctly decompile interface object fields --- .../decompiler/main/InitializerProcessor.java | 5 +++-- .../java/decompiler/SingleClassesTest.java | 5 +++-- .../classes/pkg/TestInterfaceWithObject.class | Bin 0 -> 329 bytes testData/results/TestInterfaceWithObject.dec | 8 ++++++++ testData/src/pkg/TestInterfaceWithObject.java | 13 +++++++++++++ 5 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 testData/classes/pkg/TestInterfaceWithObject.class create mode 100644 testData/results/TestInterfaceWithObject.dec create mode 100644 testData/src/pkg/TestInterfaceWithObject.java diff --git a/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java b/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java index d9a0a3d..e1363d8 100644 --- a/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java @@ -124,7 +124,7 @@ public class InitializerProcessor { RootStatement root = meth.root; StructClass cl = wrapper.getClassStruct(); - + boolean isInterface = cl.hasModifier(CodeConstants.ACC_INTERFACE); Statement firstdata = findFirstData(root); if (firstdata != null) { while (!firstdata.getExprents().isEmpty()) { @@ -139,7 +139,8 @@ public class InitializerProcessor { if (fexpr.isStatic() && fexpr.getClassname().equals(cl.qualifiedName) && cl.hasField(fexpr.getName(), fexpr.getDescriptor().descriptorString)) { - if (isExprentIndependent(asexpr.getRight(), meth)) { + // interfaces fields should always be initialized inline + if (isInterface || isExprentIndependent(asexpr.getRight(), meth)) { String keyField = InterpreterUtil.makeUniqueKey(fexpr.getName(), fexpr.getDescriptor().descriptorString); if (!wrapper.getStaticFieldInitializers().containsKey(keyField)) { diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index c5bcf8c..180428d 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -83,6 +83,7 @@ public class SingleClassesTest { @Test public void testMethodReferenceLetterClass() { doTest("pkg/TestMethodReferenceLetterClass"); } @Test public void testMemberAnnotations() { doTest("pkg/TestMemberAnnotations"); } @Test public void testStaticNameClash() { doTest("pkg/TestStaticNameClash"); } + @Test public void testInterfaceWithObject() { doTest("pkg/TestInterfaceWithObject"); } protected void doTest(String testFile, String... companionFiles) { ConsoleDecompiler decompiler = fixture.getDecompiler(); @@ -107,7 +108,7 @@ public class SingleClassesTest { File decompiledFile = new File(fixture.getTargetDir(), testName + ".java"); assertTrue(decompiledFile.isFile()); File referenceFile = new File(fixture.getTestDataDir(), "results/" + testName + ".dec"); - assertTrue(referenceFile.isFile()); + assertTrue("Expecting " + referenceFile.getAbsolutePath() + " to be a file", referenceFile.isFile()); assertFilesEqual(referenceFile, decompiledFile); } @@ -129,4 +130,4 @@ public class SingleClassesTest { return files; } -} \ No newline at end of file +} diff --git a/testData/classes/pkg/TestInterfaceWithObject.class b/testData/classes/pkg/TestInterfaceWithObject.class new file mode 100644 index 0000000000000000000000000000000000000000..614da5e600cf35a42e4fa5b2bf313c42b99c74f5 GIT binary patch literal 329 zcmZ`!yH3ME5S)vHAHyOV(QG&JddhP_I@MkWlH)Uk*iQmw*x1A9l~l^}Vitk;7U>m@PNr?ae literal 0 HcmV?d00001 diff --git a/testData/results/TestInterfaceWithObject.dec b/testData/results/TestInterfaceWithObject.dec new file mode 100644 index 0000000..5afeed6 --- /dev/null +++ b/testData/results/TestInterfaceWithObject.dec @@ -0,0 +1,8 @@ +package pkg; + +import java.math.BigDecimal; + +public interface TestInterfaceWithObject { + BigDecimal BUGS_IN_THE_DECOMPILER = BigDecimal.ZERO; +} + diff --git a/testData/src/pkg/TestInterfaceWithObject.java b/testData/src/pkg/TestInterfaceWithObject.java new file mode 100644 index 0000000..4653d70 --- /dev/null +++ b/testData/src/pkg/TestInterfaceWithObject.java @@ -0,0 +1,13 @@ +package pkg; + +import java.math.BigDecimal; + +/** + * @author Alexandru-Constantin Bledea + * @since March 06, 2016 + */ +public interface TestInterfaceWithObject { + + BigDecimal BUGS_IN_THE_DECOMPILER = BigDecimal.ZERO; + +}