diff --git a/src/org/jetbrains/java/decompiler/main/collectors/VarNamesCollector.java b/src/org/jetbrains/java/decompiler/main/collectors/VarNamesCollector.java index 05aac72..c7ae714 100644 --- a/src/org/jetbrains/java/decompiler/main/collectors/VarNamesCollector.java +++ b/src/org/jetbrains/java/decompiler/main/collectors/VarNamesCollector.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package org.jetbrains.java.decompiler.main.collectors; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -24,7 +25,7 @@ public class VarNamesCollector { public VarNamesCollector() { } - public VarNamesCollector(Set setNames) { + public VarNamesCollector(Collection setNames) { usedNames.addAll(setNames); } diff --git a/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java b/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java index 974c057..0858c68 100644 --- a/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java @@ -142,19 +142,25 @@ public class NestedClassProcessor { if (expr.type == Exprent.EXPRENT_NEW) { NewExprent new_expr = (NewExprent)expr; + VarNamesCollector enclosingCollector = new VarNamesCollector(enclosingMethod.varproc.getVarNames()); + if (new_expr.isLambda() && lambda_class_type.equals(new_expr.getNewType())) { InvocationExprent inv_dynamic = new_expr.getConstructor(); int param_index = is_static_lambda_content ? 0 : 1; int varIndex = is_static_lambda_content ? 0 : 1; - for (int i = 0; i < vars_count; ++i) { - Exprent param = inv_dynamic.getLstParameters().get(param_index + i); + for (int i = 0; i < md_content.params.length; ++i) { + VarVersionPair varVersion = new VarVersionPair(varIndex, 0); + if (i < vars_count) { + Exprent param = inv_dynamic.getLstParameters().get(param_index + i); - if (param.type == Exprent.EXPRENT_VAR) { - VarVersionPair pair = new VarVersionPair((VarExprent)param); - String name = enclosingMethod.varproc.getVarName(pair); - mapNewNames.put(new VarVersionPair(varIndex, 0), name); + if (param.type == Exprent.EXPRENT_VAR) { + mapNewNames.put(varVersion, enclosingMethod.varproc.getVarName(new VarVersionPair((VarExprent)param))); + } + } + else { + mapNewNames.put(varVersion, enclosingCollector.getFreeName(method.varproc.getVarName(varVersion))); } varIndex += md_content.params[i].stackSize; diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarProcessor.java b/src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarProcessor.java index bfcd894..5f21ff2 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarProcessor.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarProcessor.java @@ -115,6 +115,10 @@ public class VarProcessor { mapVarNames.put(pair, name); } + public Collection getVarNames() { + return mapVarNames != null ? mapVarNames.values() : Collections.emptySet(); + } + public int getVarFinal(VarVersionPair pair) { return varVersions == null ? VarTypeProcessor.VAR_FINAL : varVersions.getVarFinal(pair); } diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 0423ec6..8c770d5 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -110,6 +110,7 @@ public class SingleClassesTest { @Test public void testSwitchOnEnum() { doTest("pkg/TestSwitchOnEnum");} //@Test public void TestSwitchOnStrings() { doTest("pkg/TestSwitchOnStrings");} @Test public void testVarArgCalls() { doTest("pkg/TestVarArgCalls"); } + @Test public void testLambdaParams() { doTest("pkg/TestLambdaParams"); } private void doTest(String testFile, String... companionFiles) { ConsoleDecompiler decompiler = fixture.getDecompiler(); diff --git a/testData/classes/pkg/TestLambdaParams.class b/testData/classes/pkg/TestLambdaParams.class new file mode 100644 index 0000000..8989c66 Binary files /dev/null and b/testData/classes/pkg/TestLambdaParams.class differ diff --git a/testData/results/TestLambdaParams.dec b/testData/results/TestLambdaParams.dec new file mode 100644 index 0000000..0048941 --- /dev/null +++ b/testData/results/TestLambdaParams.dec @@ -0,0 +1,48 @@ +package pkg; + +import java.util.function.Function; + +public class TestLambdaParams { + public static void toCollection(Object var0) { + Object var1 = null;// 23 + Function var2 = (var1x) -> { + return var0; + };// 24 + Function var3 = (var1x) -> { + return var1; + };// 25 + Function var4 = (var0x) -> { + return var0x; + };// 26 + }// 27 +} + +class 'pkg/TestLambdaParams' { + method 'lambda$toCollection$0 (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;' { + 1 8 + } + + method 'lambda$toCollection$1 (Ljava/lang/Class;Ljava/lang/Object;)Ljava/lang/Object;' { + 1 11 + } + + method 'lambda$toCollection$2 (Ljava/lang/Object;)Ljava/lang/Object;' { + 1 14 + } + + method 'toCollection (Ljava/lang/Object;)V' { + 0 6 + 1 6 + 8 9 + f 12 + 15 15 + 17 16 + } +} + +Lines mapping: +23 <-> 7 +24 <-> 10 +25 <-> 13 +26 <-> 16 +27 <-> 17 diff --git a/testData/src/pkg/TestLambdaParams.java b/testData/src/pkg/TestLambdaParams.java new file mode 100644 index 0000000..bdb9279 --- /dev/null +++ b/testData/src/pkg/TestLambdaParams.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package pkg; + +import java.util.function.BinaryOperator; +import java.util.function.Function; + +public class TestLambdaParams { + public static void toCollection(Object collectionFactory) { + Class a = null; + Function f = r1 -> collectionFactory; + Function f1 = r1 -> a; + Function f2 = r1 -> r1; + } +}