From ca92ec0b7bf09a8c4318280bd994b799c6962fbd Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 22 Mar 2017 15:06:22 +0300 Subject: [PATCH] Fix "Specify explicit lambda signature" when no parameters exists So #KT-15075 Fixed --- .../src/org/jetbrains/kotlin/psi/KtPsiFactory.kt | 6 ++++-- .../SpecifyExplicitLambdaSignatureIntention.kt | 6 +++--- .../specifyExplicitLambdaSignature/delegate.kt | 14 ++++++++++++++ .../delegate.kt.after | 15 +++++++++++++++ .../noParameters.kt | 9 +++++++++ .../noParameters.kt.after | 10 ++++++++++ .../idea/intentions/IntentionTestGenerated.java | 12 ++++++++++++ 7 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 idea/testData/intentions/specifyExplicitLambdaSignature/delegate.kt create mode 100644 idea/testData/intentions/specifyExplicitLambdaSignature/delegate.kt.after create mode 100644 idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt create mode 100644 idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt.after diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt index ef4aa084422..1e58710668a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt @@ -345,8 +345,10 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m fun createTypeParameter(text: String) = createTypeParameterList("<$text>").parameters.first()!! - fun createLambdaParameterList(text: String) = - createLambdaExpression(text, "0").functionLiteral.valueParameterList!! + fun createLambdaParameterListIfAny(text: String) = + createLambdaExpression(text, "0").functionLiteral.valueParameterList + + fun createLambdaParameterList(text: String) = createLambdaParameterListIfAny(text)!! fun createLambdaExpression(parameters: String, body: String): KtLambdaExpression = (if (parameters.isNotEmpty()) createExpression("{ $parameters -> $body }") diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyExplicitLambdaSignatureIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyExplicitLambdaSignatureIntention.kt index e20cce84263..801d2c50cbf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyExplicitLambdaSignatureIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyExplicitLambdaSignatureIntention.kt @@ -54,9 +54,9 @@ class SpecifyExplicitLambdaSignatureIntention : SelfTargetingIntention Unit but Base was expected + +// See also KT-15075 + +interface Base { + fun foo() +} + +class Derived : Base by { + override fun foo() {} +} diff --git a/idea/testData/intentions/specifyExplicitLambdaSignature/delegate.kt.after b/idea/testData/intentions/specifyExplicitLambdaSignature/delegate.kt.after new file mode 100644 index 00000000000..eaeedea2249 --- /dev/null +++ b/idea/testData/intentions/specifyExplicitLambdaSignature/delegate.kt.after @@ -0,0 +1,15 @@ +// IS_APPLICABLE: true +// SKIP_ERRORS_BEFORE +// ERROR: Modifier 'override' is not applicable to 'local function' +// ERROR: Type mismatch: inferred type is () -> Unit but Base was expected + +// See also KT-15075 + +interface Base { + fun foo() +} + +class Derived : Base by { + -> + override fun foo() {} +} diff --git a/idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt b/idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt new file mode 100644 index 00000000000..a31a844d2b0 --- /dev/null +++ b/idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt @@ -0,0 +1,9 @@ +// WITH_RUNTIME + +fun bar() {} + +fun foo() { + run { + bar() + } +} \ No newline at end of file diff --git a/idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt.after b/idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt.after new file mode 100644 index 00000000000..c41bf988b8f --- /dev/null +++ b/idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt.after @@ -0,0 +1,10 @@ +// WITH_RUNTIME + +fun bar() {} + +fun foo() { + run { + -> + bar() + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index f73e5e0544d..ac4654af9f9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -14218,6 +14218,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("delegate.kt") + public void testDelegate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/specifyExplicitLambdaSignature/delegate.kt"); + doTest(fileName); + } + @TestMetadata("emptyParamListWithBrackets.kt") public void testEmptyParamListWithBrackets() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/specifyExplicitLambdaSignature/emptyParamListWithBrackets.kt"); @@ -14266,6 +14272,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("noParameters.kt") + public void testNoParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/specifyExplicitLambdaSignature/noParameters.kt"); + doTest(fileName); + } + @TestMetadata("shortenReferencesForParams.kt") public void testShortenReferencesForParams() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/specifyExplicitLambdaSignature/shortenReferencesForParams.kt");