From 85be0450baaaf6c19a614e0afb8b494f67ffe62c Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 14 Feb 2020 10:02:36 +0300 Subject: [PATCH] Fix invalidated element access exception in ObjectLiteralToLambdaIntention #KT-36149 fixed #KT-36152 fixed --- .../ObjectLiteralToLambdaIntention.kt | 20 ++++++++++--- .../newJ2k/objectLiteral/kt-36149.java | 28 +++++++++++++++++++ .../testData/newJ2k/objectLiteral/kt-36149.kt | 21 ++++++++++++++ .../objectLiteral/kt-36152.external.java | 15 ++++++++++ .../newJ2k/objectLiteral/kt-36152.java | 15 ++++++++++ .../testData/newJ2k/objectLiteral/kt-36152.kt | 12 ++++++++ ...otlinConverterSingleFileTestGenerated.java | 10 +++++++ 7 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 nj2k/testData/newJ2k/objectLiteral/kt-36149.java create mode 100644 nj2k/testData/newJ2k/objectLiteral/kt-36149.kt create mode 100644 nj2k/testData/newJ2k/objectLiteral/kt-36152.external.java create mode 100644 nj2k/testData/newJ2k/objectLiteral/kt-36152.java create mode 100644 nj2k/testData/newJ2k/objectLiteral/kt-36152.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt index f51223fefc8..3a2a8b76c2b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt @@ -150,14 +150,14 @@ class ObjectLiteralToLambdaIntention : SelfTargetingRangeIntention + val endOffset = (replacedByPointer.callee.parent as? KtCallExpression)?.typeArgumentList?.endOffset + ?: replacedByPointer.callee.endOffset + ShortenReferences.DEFAULT.process(replacedByPointer.containingKtFile, replacedByPointer.startOffset, endOffset) + } } } + + private val KtExpression.callee + get() = getCalleeExpressionIfAny() as KtNameReferenceExpression } private data class Data( diff --git a/nj2k/testData/newJ2k/objectLiteral/kt-36149.java b/nj2k/testData/newJ2k/objectLiteral/kt-36149.java new file mode 100644 index 00000000000..aa3bf234b3f --- /dev/null +++ b/nj2k/testData/newJ2k/objectLiteral/kt-36149.java @@ -0,0 +1,28 @@ +// Stubbed from Android Activity +class Activity { + public final void runOnUiThread(Runnable action) { + action.run(); + } +} + +public class Foo { + private Activity activity; + + public void foo() { + synchronized (this) { + activity.runOnUiThread(new Runnable() { + public void run() { + } + }); + } + } + + public void bar() { + synchronized (this) { + activity.runOnUiThread(new Runnable() { + public void run() { + } + }); + } + } +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/objectLiteral/kt-36149.kt b/nj2k/testData/newJ2k/objectLiteral/kt-36149.kt new file mode 100644 index 00000000000..4d6565d129b --- /dev/null +++ b/nj2k/testData/newJ2k/objectLiteral/kt-36149.kt @@ -0,0 +1,21 @@ +// Stubbed from Android Activity +internal class Activity { + fun runOnUiThread(action: Runnable) { + action.run() + } +} + +class Foo { + private val activity: Activity? = null + fun foo() { + synchronized(this) { + activity!!.runOnUiThread(Runnable { }) + } + } + + fun bar() { + synchronized(this) { + activity!!.runOnUiThread(Runnable { }) + } + } +} diff --git a/nj2k/testData/newJ2k/objectLiteral/kt-36152.external.java b/nj2k/testData/newJ2k/objectLiteral/kt-36152.external.java new file mode 100644 index 00000000000..6e82bab8d22 --- /dev/null +++ b/nj2k/testData/newJ2k/objectLiteral/kt-36152.external.java @@ -0,0 +1,15 @@ +// Stubbed class from 'androidx.preference:preference:1.1.0' +public class Preference { + + public interface OnPreferenceClickListener { + boolean onPreferenceClick(Preference preference); + } + + @SuppressWarnings("unused") + public OnPreferenceClickListener getOnPreferenceClickListener() { + return null; + } + + public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) { + } +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/objectLiteral/kt-36152.java b/nj2k/testData/newJ2k/objectLiteral/kt-36152.java new file mode 100644 index 00000000000..8b21253ec89 --- /dev/null +++ b/nj2k/testData/newJ2k/objectLiteral/kt-36152.java @@ -0,0 +1,15 @@ +public class Foo { + public void foo(Preference l, Preference pm) { + l.setOnPreferenceClickListener((p) -> true); + + pm.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference preference) { + return true; + } + }); + } + + private void bar(Preference l) { + l.setOnPreferenceClickListener((p) -> true); + } +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/objectLiteral/kt-36152.kt b/nj2k/testData/newJ2k/objectLiteral/kt-36152.kt new file mode 100644 index 00000000000..683d01b0ba0 --- /dev/null +++ b/nj2k/testData/newJ2k/objectLiteral/kt-36152.kt @@ -0,0 +1,12 @@ +import Preference.OnPreferenceClickListener + +class Foo { + fun foo(l: Preference, pm: Preference) { + l.onPreferenceClickListener = OnPreferenceClickListener { p: Preference? -> true } + pm.onPreferenceClickListener = OnPreferenceClickListener { true } + } + + private fun bar(l: Preference) { + l.onPreferenceClickListener = OnPreferenceClickListener { p: Preference? -> true } + } +} diff --git a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java index 9226cabf185..c3ed07702b0 100644 --- a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java +++ b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java @@ -4061,6 +4061,16 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("nj2k/testData/newJ2k/objectLiteral"), Pattern.compile("^([^\\.]+)\\.java$"), null, true); } + @TestMetadata("kt-36149.java") + public void testKt_36149() throws Exception { + runTest("nj2k/testData/newJ2k/objectLiteral/kt-36149.java"); + } + + @TestMetadata("kt-36152.java") + public void testKt_36152() throws Exception { + runTest("nj2k/testData/newJ2k/objectLiteral/kt-36152.java"); + } + @TestMetadata("MyFrame.java") public void testMyFrame() throws Exception { runTest("nj2k/testData/newJ2k/objectLiteral/MyFrame.java");