From 6a7763922be81fe59f52f8ffec9850112066ebd0 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 26 Apr 2017 19:58:55 +0300 Subject: [PATCH] fixed lambda parameter names already used in the context --- .../main/collectors/VarNamesCollector.java | 5 +- .../main/rels/NestedClassProcessor.java | 18 ++++--- .../modules/decompiler/vars/VarProcessor.java | 4 ++ .../java/decompiler/SingleClassesTest.java | 1 + testData/classes/pkg/TestLambdaParams.class | Bin 0 -> 1348 bytes testData/results/TestLambdaParams.dec | 48 ++++++++++++++++++ testData/src/pkg/TestLambdaParams.java | 28 ++++++++++ 7 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 testData/classes/pkg/TestLambdaParams.class create mode 100644 testData/results/TestLambdaParams.dec create mode 100644 testData/src/pkg/TestLambdaParams.java 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 0000000000000000000000000000000000000000..8989c667f6d183039a362cc40fc79b205fdb3025 GIT binary patch literal 1348 zcmbVMZEw<06n^doRJ%G5$LN@Ql}%u}!hD$#V~ixrOxQGm`27NR*iqW1Elc*V^pgo6 z`~k+_WIPudse^5aA9~NZr_b}8d(J)W&)>rz0G{JeMFN>L`MES09;Pvebp;y=HW?Cc zOxq0JGRzl>pBZ8`rz04Wb<-B7gMLeRP2RF7q6JRPu`JOJOvh%(6zb>vf*TgMyT-@X zImN4zpRstq)#3RlI)A{hI}1N8ag9KQ;V>#tv$*e9r|HG%&^3x>hF4L=u!L#;Oi8uj z47|2DGG%8nP2mUiQQ4ok$NT=i?2HBlcNkLd9VhSukGm%#_~LZ@WCB|$ERxyQ@CbQw zcBHdQ&SU8m7?#{#*SM-mT30)+qKJ};IQAIg+;y!>hRTep!WssFX&Gk&dvt}yQRq~q zz!QdYlsIni?YyT98-<%;3idS^c&6b#(i)OTX}E_)hV4l?rhVb`gfVU+HHx3{cHnqa z&O(2(Q}BZ3weC2*flCAV!M24rI;ij&enpQT>Wy1|%s{Kdk!3Pk z`VRJu90rxv#3+~{$O1I-CG;KHI9Z+5OGEm5;AC%zdEj)281OnaVK0wxS;FYVTtNys zWU-o3<(-FWIkGbGTW=Yx8ig< { + 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; + } +}