From 75d668bc1989ddefe314c50f3c875c6907cf41e8 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 6 Jul 2015 21:07:33 +0300 Subject: [PATCH] Adapted completion in lambda signatures to modern syntax --- .../completion/KotlinCompletionContributor.kt | 41 +++++++++++++------ .../common/lambdaSignature/ParameterName1.kt | 7 ---- .../common/lambdaSignature/ParameterName2.kt | 2 +- .../common/lambdaSignature/ParameterName3.kt | 5 --- .../common/lambdaSignature/ParameterType1.kt | 2 +- .../common/lambdaSignature/ParameterType2.kt | 8 ---- .../common/lambdaSignature/ParameterType3.kt | 2 +- .../common/lambdaSignature/ParameterType4.kt | 2 +- .../common/lambdaSignature/ParameterType5.kt | 2 +- .../test/JSBasicCompletionTestGenerated.java | 18 -------- .../test/JvmBasicCompletionTestGenerated.java | 18 -------- 11 files changed, 33 insertions(+), 74 deletions(-) delete mode 100644 idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName1.kt delete mode 100644 idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName3.kt delete mode 100644 idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType2.kt diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt index e5c785dbe22..443661a2189 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt @@ -22,10 +22,7 @@ import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.patterns.PlatformPatterns import com.intellij.patterns.PsiJavaPatterns.elementType import com.intellij.patterns.PsiJavaPatterns.psiElement -import com.intellij.psi.PsiComment -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiErrorElement -import com.intellij.psi.TokenType +import com.intellij.psi.* import com.intellij.psi.search.PsiElementProcessor import com.intellij.psi.tree.TokenSet import com.intellij.psi.util.PsiTreeUtil @@ -73,11 +70,10 @@ public class KotlinCompletionContributor : CompletionContributor() { PackageDirectiveCompletion.ACTIVATION_PATTERN.accepts(tokenBefore) -> PackageDirectiveCompletion.DUMMY_IDENTIFIER - isInFunctionLiteralParameterList(tokenBefore) -> CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED - isInClassHeader(tokenBefore) -> CompletionUtilCore.DUMMY_IDENTIFIER // do not add '$' to not interrupt class declaration parsing - else -> specialExtensionReceiverDummyIdentifier(tokenBefore) + else -> specialLambdaSignatureDummyIdentifier(tokenBefore) + ?: specialExtensionReceiverDummyIdentifier(tokenBefore) ?: specialInTypeArgsDummyIdentifier(tokenBefore) ?: specialInParameterListDummyIdentifier(tokenBefore) ?: specialInArgumentListDummyIdentifier(tokenBefore) @@ -137,12 +133,6 @@ public class KotlinCompletionContributor : CompletionContributor() { return expression.getTextRange()!!.getEndOffset() } - private fun isInFunctionLiteralParameterList(tokenBefore: PsiElement?): Boolean { - val parameterList = tokenBefore?.parents?.firstOrNull { it is JetParameterList } ?: return false - val parent = parameterList.getParent() - return parent is JetFunctionLiteral && parent.getValueParameterList() == parameterList - } - private fun isInClassHeader(tokenBefore: PsiElement?): Boolean { val classOrObject = tokenBefore?.parents?.firstIsInstanceOrNull() ?: return false val name = classOrObject.getNameIdentifier() ?: return false @@ -151,6 +141,31 @@ public class KotlinCompletionContributor : CompletionContributor() { return name.endOffset <= offset && offset <= body.startOffset } + private fun specialLambdaSignatureDummyIdentifier(tokenBefore: PsiElement?): String? { + var leaf = tokenBefore + while (leaf is PsiWhiteSpace || leaf is PsiComment) { + leaf = leaf.prevLeaf(true) + } + + val lambda = leaf?.parents?.firstOrNull { it is JetFunctionLiteral } ?: return null + + val lambdaChild = leaf!!.parents.takeWhile { it != lambda }.lastOrNull() ?: return null + if (lambdaChild is JetParameterList) return CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED + + if (lambdaChild !is JetBlockExpression) return null + val blockChild = leaf.parents.takeWhile { it != lambdaChild }.lastOrNull() + if (blockChild !is PsiErrorElement) return null + val inIncompleteSignature = blockChild.siblings(forward = false, withItself = false).all { + when (it) { + is PsiWhiteSpace, is PsiComment -> true + is JetBinaryExpressionWithTypeRHS -> it.getOperationReference().getReferencedNameElementType() == JetTokens.COLON + else -> false + } + } + return if (inIncompleteSignature) CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED + "->" else null + + } + private val declarationKeywords = TokenSet.create(JetTokens.FUN_KEYWORD, JetTokens.VAL_KEYWORD, JetTokens.VAR_KEYWORD) private val declarationTokens = TokenSet.orSet(TokenSet.create(JetTokens.IDENTIFIER, JetTokens.LT, JetTokens.GT, JetTokens.COMMA, JetTokens.DOT, JetTokens.QUEST, JetTokens.COLON, diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName1.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName1.kt deleted file mode 100644 index c5121c132de..00000000000 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName1.kt +++ /dev/null @@ -1,7 +0,0 @@ -fun bar() { - val handler = { () } -} - -// INVOCATION_COUNT: 0 -// EXIST: bar -// EXIST: null diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName2.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName2.kt index 55db1b4c8ab..c69b8158009 100644 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName2.kt +++ b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName2.kt @@ -1,5 +1,5 @@ fun bar() { - val handler = { (i: Int, ) } + val handler = { i: Int, } } // NUMBER: 0 diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName3.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName3.kt deleted file mode 100644 index 8bc5663f4c1..00000000000 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName3.kt +++ /dev/null @@ -1,5 +0,0 @@ -fun bar() { - val handler = { (i, ) } -} - -// NUMBER: 0 diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType1.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType1.kt index de166f1fe4a..ec68c3abffe 100644 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType1.kt +++ b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType1.kt @@ -1,5 +1,5 @@ fun bar() { - val handler = { (i: ) } + val handler = { i: } } // EXIST: Int diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType2.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType2.kt deleted file mode 100644 index fc207cd39db..00000000000 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType2.kt +++ /dev/null @@ -1,8 +0,0 @@ -fun bar() { - val handler = { (i: } -} - -// EXIST: Int -// EXIST: String -// ABSENT: bar -// ABSENT: handler \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType3.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType3.kt index 17af74fc398..060a49f860b 100644 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType3.kt +++ b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType3.kt @@ -1,5 +1,5 @@ fun bar() { - val handler = { (i: Int, s: } + val handler = { i: Int, s: } } // EXIST: Int diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType4.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType4.kt index 9829505c48a..d36cdebac48 100644 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType4.kt +++ b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType4.kt @@ -1,5 +1,5 @@ fun bar() { - val handler = { (i: List<>) } + val handler = { i: List<> } } // EXIST: Int diff --git a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType5.kt b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType5.kt index d9199af455b..7c6325deb21 100644 --- a/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType5.kt +++ b/idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType5.kt @@ -1,5 +1,5 @@ fun bar() { - val handler = { (i: Map } + val handler = { i: Map } } // EXIST: Int diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index a6d17fc63aa..9ad422833e5 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -1281,24 +1281,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } - @TestMetadata("ParameterName1.kt") - public void testParameterName1() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName1.kt"); - doTest(fileName); - } - @TestMetadata("ParameterName2.kt") public void testParameterName2() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName2.kt"); doTest(fileName); } - @TestMetadata("ParameterName3.kt") - public void testParameterName3() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName3.kt"); - doTest(fileName); - } - @TestMetadata("ParameterName4.kt") public void testParameterName4() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName4.kt"); @@ -1317,12 +1305,6 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } - @TestMetadata("ParameterType2.kt") - public void testParameterType2() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType2.kt"); - doTest(fileName); - } - @TestMetadata("ParameterType3.kt") public void testParameterType3() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType3.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index 34bec74e287..405c2c9f8ba 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -1281,24 +1281,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } - @TestMetadata("ParameterName1.kt") - public void testParameterName1() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName1.kt"); - doTest(fileName); - } - @TestMetadata("ParameterName2.kt") public void testParameterName2() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName2.kt"); doTest(fileName); } - @TestMetadata("ParameterName3.kt") - public void testParameterName3() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName3.kt"); - doTest(fileName); - } - @TestMetadata("ParameterName4.kt") public void testParameterName4() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterName4.kt"); @@ -1317,12 +1305,6 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } - @TestMetadata("ParameterType2.kt") - public void testParameterType2() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType2.kt"); - doTest(fileName); - } - @TestMetadata("ParameterType3.kt") public void testParameterType3() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/lambdaSignature/ParameterType3.kt");