Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion FernFlower
Submodule FernFlower updated 383 files
2,802 changes: 689 additions & 2,113 deletions FernFlower-Patches/0001-Git-filter-and-setup-backport-to-Java-8.patch

Large diffs are not rendered by default.

34 changes: 21 additions & 13 deletions FernFlower-Patches/0002-Test-Framework-upgrades.patch
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ index bb303e84f33161a4b4fd40a73aa48d29981d9ef2..cc1f537e71af0748b7b97d7d8489198e
throw new RuntimeException("not implemented");
}
diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statement.java b/src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statement.java
index b5e82131dd20ea45a02ff62e085695417111adfe..b905da55c9b3bd7dc48123559809a1d7ed9eaf9c 100644
index c870c683cad7935d7aba141c0310ec0f0a2fdeda..272601270ea32fb5ccc4a822cd9d1b959bae9c35 100644
--- a/src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statement.java
+++ b/src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statement.java
@@ -469,6 +469,10 @@ public class Statement implements IMatchable {
@@ -430,6 +430,10 @@ public abstract class Statement implements IMatchable {
return false;
}

Expand Down Expand Up @@ -71,18 +71,21 @@ index 4c5641fec76837a51094d4a54800d5b7475446ca..7d29c198014cbfee8092fd31461208ce
private static boolean isTestDataDir(File dir) {
return dir.isDirectory() && new File(dir, "classes").isDirectory() && new File(dir, "results").isDirectory();
diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java
index feea5aad81ebdff6221e13cfc8472b4b5c2d78c0..1e8014083efc7c0fdfad40747cccbcd0bf33c608 100644
index e64cf91c0674163f5c81b874e21e84da83fd264e..721a3606e209f4f803dcb6b513a5768c9c437c48 100644
--- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java
+++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java
@@ -1,37 +1,20 @@
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
@@ -2,26 +2,14 @@
package org.jetbrains.java.decompiler;

import org.jetbrains.java.decompiler.main.DecompilerContext;
-import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler;
import org.jetbrains.java.decompiler.main.extern.ClassFormatException;
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;

-import java.io.File;
-import java.io.IOException;
Expand All @@ -95,7 +98,15 @@ index feea5aad81ebdff6221e13cfc8472b4b5c2d78c0..1e8014083efc7c0fdfad40747cccbcd0
-
-public class SingleClassesTest {
- private DecompilerTestFixture fixture;
-
+public class SingleClassesTest extends SingleClassesTestBase {
+ protected DecompilerTestFixture fixture;

/*
* Set individual test duration time limit to 60 seconds.
@@ -30,19 +18,14 @@ public class SingleClassesTest {
@Rule
public Timeout globalTimeout = Timeout.seconds(60);

- @Before
- public void setUp() throws IOException {
- fixture = new DecompilerTestFixture();
Expand All @@ -109,9 +120,6 @@ index feea5aad81ebdff6221e13cfc8472b4b5c2d78c0..1e8014083efc7c0fdfad40747cccbcd0
- public void tearDown() {
- fixture.tearDown();
- fixture = null;
+public class SingleClassesTest extends SingleClassesTestBase {
+ protected DecompilerTestFixture fixture;
+
+ @Override
+ protected String[] getDecompilerOptions() {
+ return new String[] {
Expand All @@ -123,10 +131,10 @@ index feea5aad81ebdff6221e13cfc8472b4b5c2d78c0..1e8014083efc7c0fdfad40747cccbcd0
}

@Test public void testPrimitiveNarrowing() { doTest("pkg/TestPrimitiveNarrowing"); }
@@ -134,45 +117,4 @@ public class SingleClassesTest {
@Test public void testRecordVararg() { doTest("records/TestRecordVararg"); }
@Test public void testRecordGenericVararg() { doTest("records/TestRecordGenericVararg"); }
@Test public void testRecordAnno() { doTest("records/TestRecordAnno"); }
@@ -226,45 +209,4 @@ public class SingleClassesTest {

@Test(expected = ClassFormatException.class)
public void testUnsupportedConstantPoolEntry() { doTest("java11/TestUnsupportedConstantPoolEntry"); }
-
- private void doTest(String testFile, String... companionFiles) {
- ConsoleDecompiler decompiler = fixture.getDecompiler();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ Subject: [PATCH] Fix initializers for anon and synthetic classes


diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java
index 2d57c02d34e186e440ee0afccac79545b5a190cf..16a7cfebe26dfe0f6244a46f9af271758be274da 100644
index 959ff51c479db3f0144df9f0de5b3ef863dcdff6..0dc28bc9d8e3b622f691939b1c8fcce9a09c11fe 100644
--- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java
+++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java
@@ -39,6 +39,7 @@ public class ClassWriter {
@@ -46,6 +46,7 @@ public class ClassWriter {
StructClass cl = wrapper.getClassStruct();

InitializerProcessor.extractInitializers(wrapper);
Expand All @@ -17,10 +17,10 @@ index 2d57c02d34e186e440ee0afccac79545b5a190cf..16a7cfebe26dfe0f6244a46f9af27175
if (node.type == ClassNode.CLASS_ROOT &&
!cl.isVersion5() &&
diff --git a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java
index 7bb50aaeb939930ea8c9679d88cf9a2cc5f0b4af..e380664d46356ec909049293a89bc4be6823dca8 100644
index 804443bf66c6cc2a9cadf5ef11c44827257aaf53..a45067feeedaece4546ae2dbc5148fbf9b2c0309 100644
--- a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java
+++ b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java
@@ -87,6 +87,31 @@ public class ClassesProcessor implements CodeConstants {
@@ -88,6 +88,31 @@ public class ClassesProcessor implements CodeConstants {
rec.type = entry.simpleNameIdx == 0 ? ClassNode.CLASS_ANONYMOUS : entry.outerNameIdx == 0 ? ClassNode.CLASS_LOCAL : ClassNode.CLASS_MEMBER;
rec.accessFlags = entry.accessFlags;

Expand Down Expand Up @@ -53,7 +53,7 @@ index 7bb50aaeb939930ea8c9679d88cf9a2cc5f0b4af..e380664d46356ec909049293a89bc4be
String enclClassName = entry.outerNameIdx != 0 ? entry.enclosingName : cl.qualifiedName;
if (enclClassName == null || innerName.equals(enclClassName)) {
diff --git a/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java b/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java
index d3696ddeda3a7df15242d613d6cde5c936642509..55badb664d4a52620710e97e040929ce5414eb9e 100644
index bc8992ff40bf8655077d2c01a7038bfbbfe999c0..4930acdf38046e1dfe3f04a7e68b4ff88c4ed594 100644
--- a/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java
+++ b/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java
@@ -13,6 +13,9 @@ import org.jetbrains.java.decompiler.modules.decompiler.stats.Statements;
Expand All @@ -70,10 +70,10 @@ index d3696ddeda3a7df15242d613d6cde5c936642509..55badb664d4a52620710e97e040929ce
Exprent exprent = firstData.getExprents().get(0);
if (exprent.type == Exprent.EXPRENT_INVOCATION) {
InvocationExprent invExpr = (InvocationExprent)exprent;
- if (Statements.isInvocationInitConstructor(invExpr, method, wrapper, false) && invExpr.getLstParameters().isEmpty()) {
- if (Statements.isInvocationInitConstructor(invExpr, method, wrapper, false) && invExpr.getParameters().isEmpty()) {
- firstData.getExprents().remove(0);
+ if (Statements.isInvocationInitConstructor(invExpr, method, wrapper, false)) {
+ List<VarVersionPair> mask = ExprUtil.getSyntheticParametersMask(invExpr.getClassname(), invExpr.getStringDescriptor(), invExpr.getLstParameters().size());
+ List<VarVersionPair> mask = ExprUtil.getSyntheticParametersMask(invExpr.getClassName(), invExpr.getStringDescriptor(), invExpr.getParameters().size());
+ boolean hideSuper = true;
+
+ //searching for non-synthetic params
Expand All @@ -82,8 +82,8 @@ index d3696ddeda3a7df15242d613d6cde5c936642509..55badb664d4a52620710e97e040929ce
+ continue;
+ }
+ VarType type = invExpr.getDescriptor().params[i];
+ if (type.type == CodeConstants.TYPE_OBJECT) {
+ ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(type.value);
+ if (type.getType() == CodeConstants.TYPE_OBJECT) {
+ ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(type.getValue());
+ if (node != null && (node.type == ClassNode.CLASS_ANONYMOUS || (node.access & CodeConstants.ACC_SYNTHETIC) != 0)) {
+ break; // Should be last
+ }
Expand Down Expand Up @@ -112,8 +112,8 @@ index d3696ddeda3a7df15242d613d6cde5c936642509..55badb664d4a52620710e97e040929ce
+ MethodDescriptor md = MethodDescriptor.parseDescriptor(desc);
+ if (md.params.length > 0) {
+ VarType type = md.params[md.params.length - 1];
+ if (type.type == CodeConstants.TYPE_OBJECT) {
+ ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(type.value);
+ if (type.getType() == CodeConstants.TYPE_OBJECT) {
+ ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(type.getValue());
+ if (node != null && (node.type == ClassNode.CLASS_ANONYMOUS) || (node.access & CodeConstants.ACC_SYNTHETIC) != 0) {
+ //TODO: Verify that the body is JUST a this([args]) call?
+ wrapper.getHiddenMembers().add(InterpreterUtil.makeUniqueKey(name, desc));
Expand Down
14 changes: 7 additions & 7 deletions FernFlower-Patches/0004-Fix-field-initalizers.patch
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Subject: [PATCH] Fix field initalizers


diff --git a/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java b/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java
index 55badb664d4a52620710e97e040929ce5414eb9e..f1e02d4a1232fe1e98d554e034ec49601fa2be70 100644
index 4930acdf38046e1dfe3f04a7e68b4ff88c4ed594..169a613c8b6e84a80895acdc18dfe0aa576c2af6 100644
--- a/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java
+++ b/src/org/jetbrains/java/decompiler/main/InitializerProcessor.java
@@ -3,6 +3,7 @@ package org.jetbrains.java.decompiler.main;
Expand Down Expand Up @@ -213,7 +213,7 @@ index 55badb664d4a52620710e97e040929ce5414eb9e..f1e02d4a1232fe1e98d554e034ec4960
+ private static void makeLaterFieldsInLambdaQualified(NewExprent nexpr, StructClass cl, int fidx) {
+ boolean isStatic = cl.getFields().get(fidx).hasModifier(CodeConstants.ACC_STATIC);
+ if (isStatic && nexpr.isLambda() && !nexpr.isMethodReference()) {
+ ClassNode child = DecompilerContext.getClassProcessor().getMapRootClasses().get(nexpr.getNewType().value);
+ ClassNode child = DecompilerContext.getClassProcessor().getMapRootClasses().get(nexpr.getNewType().getValue());
+ MethodWrapper wrapper = child.parent.getWrapper().getMethods().getWithKey(child.lambdaInformation.content_method_key);
+
+ Set<Exprent> s = new HashSet<>();
Expand Down Expand Up @@ -241,10 +241,10 @@ index 55badb664d4a52620710e97e040929ce5414eb9e..f1e02d4a1232fe1e98d554e034ec4960
+ }
}
diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/FieldExprent.java b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/FieldExprent.java
index 642a86be9a791759e04cc74ad12ffca4436dfbf6..c79f1a6fc6d13c3e61d877624c18b117a5567ce6 100644
index ec3a8668a94c7da89091a09a3002fd14346cc684..0f99c8891a4bc70626b2383b22384a1b212fe8da 100644
--- a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/FieldExprent.java
+++ b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/FieldExprent.java
@@ -31,18 +31,24 @@ public class FieldExprent extends Exprent {
@@ -29,18 +29,24 @@ public class FieldExprent extends Exprent {
private final boolean isStatic;
private Exprent instance;
private final FieldDescriptor descriptor;
Expand All @@ -269,16 +269,16 @@ index 642a86be9a791759e04cc74ad12ffca4436dfbf6..c79f1a6fc6d13c3e61d877624c18b117

addBytecodeOffsets(bytecodeOffsets);
}
@@ -89,7 +95,7 @@ public class FieldExprent extends Exprent {
@@ -87,7 +93,7 @@ public class FieldExprent extends Exprent {

if (isStatic) {
ClassNode node = (ClassNode)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_NODE);
- if (node == null || !classname.equals(node.classStruct.qualifiedName) || isAmbiguous()) {
+ if (node == null || !classname.equals(node.classStruct.qualifiedName) || isAmbiguous() || forceQualified) {
buf.append(DecompilerContext.getImportCollector().getShortNameInClassContext(ExprProcessor.buildJavaClassName(classname)));
buf.append(DecompilerContext.getImportCollector().getNestedNameInClassContext(ExprProcessor.buildJavaClassName(classname)));
buf.append(".");
}
@@ -185,6 +191,10 @@ public class FieldExprent extends Exprent {
@@ -183,6 +189,10 @@ public class FieldExprent extends Exprent {
return name;
}

Expand Down
Loading