From 1b23240c84df4a68216ad8a8110a8177814f7e67 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 2 Mar 2016 17:53:25 +0300 Subject: [PATCH] decompiler: fixed SOE if referenced method name is the same as current --- .../decompiler/main/rels/LambdaProcessor.java | 6 ++-- .../java/decompiler/SingleClassesTest.java | 1 + .../pkg/TestMethodReferenceSameName$R1.class | Bin 0 -> 444 bytes .../pkg/TestMethodReferenceSameName.class | Bin 0 -> 1000 bytes .../results/TestMethodReferenceSameName.dec | 34 ++++++++++++++++++ .../src/pkg/TestMethodReferenceSameName.java | 26 ++++++++++++++ 6 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 testData/classes/pkg/TestMethodReferenceSameName$R1.class create mode 100644 testData/classes/pkg/TestMethodReferenceSameName.class create mode 100644 testData/results/TestMethodReferenceSameName.dec create mode 100644 testData/src/pkg/TestMethodReferenceSameName.java diff --git a/src/org/jetbrains/java/decompiler/main/rels/LambdaProcessor.java b/src/org/jetbrains/java/decompiler/main/rels/LambdaProcessor.java index 0704efd..b5ac0fb 100644 --- a/src/org/jetbrains/java/decompiler/main/rels/LambdaProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/rels/LambdaProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -115,7 +115,9 @@ public class LambdaProcessor { node_lambda.parent = node; clProcessor.getMapRootClasses().put(node_lambda.simpleName, node_lambda); - mapMethodsLambda.put(node_lambda.lambdaInformation.content_method_key, node_lambda.simpleName); + if (!node_lambda.lambdaInformation.is_method_reference) { + mapMethodsLambda.put(node_lambda.lambdaInformation.content_method_key, node_lambda.simpleName); + } } } } diff --git a/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/test/org/jetbrains/java/decompiler/SingleClassesTest.java index b8869b0..6ef71c0 100644 --- a/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -79,6 +79,7 @@ public class SingleClassesTest { @Test public void testShadowing() { doTest("pkg/TestShadowing", "pkg/Shadow", "ext/Shadow"); } @Test public void testStringConcat() { doTest("pkg/TestStringConcat"); } @Test public void testJava9StringConcat() { doTest("java9/TestJava9StringConcat"); } + @Test public void testMethodReferenceSameName() { doTest("pkg/TestMethodReferenceSameName"); } protected void doTest(String testFile, String... companionFiles) { ConsoleDecompiler decompiler = fixture.getDecompiler(); diff --git a/testData/classes/pkg/TestMethodReferenceSameName$R1.class b/testData/classes/pkg/TestMethodReferenceSameName$R1.class new file mode 100644 index 0000000000000000000000000000000000000000..895110b36fa6faecdbecbedb8b0db49a57213437 GIT binary patch literal 444 zcmaKo%Syvg5QhIrVq#;o@s5ZRq>Ea?D!5bJ6a=AGXp8%kbZS%56G&3u%Y_Iod;lLx zoFlGWWHJBTzB9v_ukVjf09V*=z(&)DgV4j4hh2hO&C;@UK{)D7 z@JKCqAa*U_O{&xCmJqdT$3T)n6OD{upN2t4c&j%)bV@RDE|3GTJ#qL-<%Z1#Yz=Wi&f(b#s^7^Cfk|-(fByPfZHxJWIvkpXPFp{ zeeeeuf0OYp)UZagCO*u}nKSpEnR{mD+mExa03PF!1rr;qFmNeGm&?p<7H}O~Cbmu7 zFi|CBy88tCl~U60cp?a7Kp>w`b^0<04`ldWkGgU!eW`}BC#Ld{Tdlj_CKyj$<%Z7) z*?Qv*VWp!-l2CG7B@d(NK>B?#@R-StwI*0S9r;7~!i}kFium4k8_rT;PPQ%7(Xfz5lZ*8uMR-#GmwicUNe9t~$}jvgL^BU?kWUF&4v6`=^A$bU8D@6&Q}z$I*=Ny`DJ!xxm8FmqLv^8Ppb$ z?L=5F^j$ScGQTDEPiOM~78hHl=O&Fh-?k$>ujhucZQ>ze_YXt$Kq_;+R)TRfH-<(XY&e4o|!P{9?(HtS#I*b1(p@)O!a0^a}t literal 0 HcmV?d00001 diff --git a/testData/results/TestMethodReferenceSameName.dec b/testData/results/TestMethodReferenceSameName.dec new file mode 100644 index 0000000..3449a8c --- /dev/null +++ b/testData/results/TestMethodReferenceSameName.dec @@ -0,0 +1,34 @@ +public class TestMethodReferenceSameName { + TestMethodReferenceSameName.R1 r; + + private void foo() { + TestMethodReferenceSameName.R1 var10000 = this.r;// 5 + this.r.getClass(); + (var10000::foo).run(); + }// 6 + + class R1 { + void foo() { + }// 9 + } +} + +class 'TestMethodReferenceSameName' { + method 'foo ()V' { + 1 4 + 5 5 + e 6 + 13 7 + } +} + +class 'TestMethodReferenceSameName$R1' { + method 'foo ()V' { + 0 11 + } +} + +Lines mapping: +5 <-> 5 +6 <-> 8 +9 <-> 12 diff --git a/testData/src/pkg/TestMethodReferenceSameName.java b/testData/src/pkg/TestMethodReferenceSameName.java new file mode 100644 index 0000000..58d18d3 --- /dev/null +++ b/testData/src/pkg/TestMethodReferenceSameName.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2016 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. + */ +public class TestMethodReferenceSameName { + R1 r; + + private void foo() { + ((Runnable)r::foo).run(); + } + + class R1 { + void foo() {} + } +}