diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index e9dac9efb78..047d3fb0bb9 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -28,7 +28,6 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiTreeUtil import com.intellij.util.ProcessingContext -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassifierDescriptor diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt index 44b816fbec2..b65c46dca9a 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KeywordCompletion.kt @@ -27,6 +27,7 @@ import com.intellij.psi.filters.* import com.intellij.psi.filters.position.LeftNeighbour import com.intellij.psi.filters.position.PositionElementFilter import com.intellij.psi.tree.IElementType +import com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler import org.jetbrains.kotlin.idea.completion.handlers.KotlinKeywordInsertHandler import org.jetbrains.kotlin.lexer.JetKeywordToken @@ -51,6 +52,8 @@ object KeywordCompletion { FILE_KEYWORD to ":" ) + private val KEYWORDS_TO_IGNORE_PREFIX = TokenSet.create(OVERRIDE_KEYWORD /* it's needed to complete overrides that should be work by member name too */) + public fun complete(position: PsiElement, prefix: String, consumer: (LookupElement) -> Unit) { if (!GENERAL_FILTER.isAcceptable(position, position)) return @@ -70,15 +73,18 @@ object KeywordCompletion { } } - if (keyword.startsWith(prefix)/* use simple matching by prefix, not prefix matcher from completion*/ && parserFilter(keywordToken)) { - val element = LookupElementBuilder.create(KeywordLookupObject(), keyword) - .bold() - .withInsertHandler(if (keywordToken !in FUNCTION_KEYWORDS) - KotlinKeywordInsertHandler - else - KotlinFunctionInsertHandler.Normal(inputTypeArguments = false, inputValueArguments = false)) - consumer(element) - } + // we use simple matching by prefix, not prefix matcher from completion + if (!keyword.startsWith(prefix) && keywordToken !in KEYWORDS_TO_IGNORE_PREFIX) continue + + if (!parserFilter(keywordToken)) continue + + val element = LookupElementBuilder.create(KeywordLookupObject(), keyword) + .bold() + .withInsertHandler(if (keywordToken !in FUNCTION_KEYWORDS) + KotlinKeywordInsertHandler + else + KotlinFunctionInsertHandler.Normal(inputTypeArguments = false, inputValueArguments = false)) + consumer(element) } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt index 46af121bbd1..a94e3903fa7 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/OverridesCompletion.kt @@ -87,7 +87,7 @@ class OverridesCompletion( lookupElement = object : LookupElementDecorator(lookupElement) { override fun getLookupString() = "override" - override fun getAllLookupStrings() = setOf(lookupString) + override fun getAllLookupStrings() = setOf(lookupString, delegate.lookupString) override fun renderElement(presentation: LookupElementPresentation) { super.renderElement(presentation) diff --git a/idea/idea-completion/testData/basic/common/override/InConstructorParameters2.kt b/idea/idea-completion/testData/basic/common/override/InConstructorParameters2.kt new file mode 100644 index 00000000000..e97a487b5f9 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/override/InConstructorParameters2.kt @@ -0,0 +1,19 @@ +interface I { + fun foo() + val someVal: Int + var someVar: Int +} + +class Base1 { + protected open fun bar(){} + open val fromBase: String = "" +} + +open class Base2 : Base1() { +} + +class A(some) : Base2(), I + +// EXIST: { itemText: "override val someVal: Int", tailText: null, typeText: "I" } +// EXIST: { itemText: "override var someVar: Int", tailText: null, typeText: "I" } +// NOTHING_ELSE diff --git a/idea/idea-completion/testData/basic/common/override/TypeFunctionName.kt b/idea/idea-completion/testData/basic/common/override/TypeFunctionName.kt new file mode 100644 index 00000000000..d14e6c0a045 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/override/TypeFunctionName.kt @@ -0,0 +1,22 @@ +interface I { + fun someFun() + val someVal: Int + var someVar: Int +} + +class Base1 { + protected open fun bar(){} +} + +open class Base2 : Base1() { +} + +class A : Base2(), I { + so +} + +// ABSENT: { itemText: "override" } +// ABSENT: { itemText: "override fun bar() {...}" } +// EXIST: { itemText: "override fun someFun() {...}", lookupString: "override", allLookupStrings: "override, someFun", tailText: null, typeText: "I" } +// EXIST: { itemText: "override val someVal: Int", lookupString: "override", allLookupStrings: "override, someVal", tailText: null, typeText: "I" } +// EXIST: { itemText: "override var someVar: Int", lookupString: "override", allLookupStrings: "override, someVar", tailText: null, typeText: "I" } diff --git a/idea/idea-completion/testData/handlers/basic/override/TypeFunctionName.kt b/idea/idea-completion/testData/handlers/basic/override/TypeFunctionName.kt new file mode 100644 index 00000000000..9e8b7bf640f --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/override/TypeFunctionName.kt @@ -0,0 +1,5 @@ +class A { + equ +} + +// ELEMENT_TEXT: "override operator fun equals(other: Any?): Boolean {...}" diff --git a/idea/idea-completion/testData/handlers/basic/override/TypeFunctionName.kt.after b/idea/idea-completion/testData/handlers/basic/override/TypeFunctionName.kt.after new file mode 100644 index 00000000000..9dcae1c33a7 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/override/TypeFunctionName.kt.after @@ -0,0 +1,7 @@ +class A { + override fun equals(other: Any?): Boolean { + return super.equals(other) + } +} + +// ELEMENT_TEXT: "override operator fun equals(other: Any?): Boolean {...}" diff --git a/idea/idea-completion/testData/handlers/basic/override/TypeNameInConstructorParameter.kt b/idea/idea-completion/testData/handlers/basic/override/TypeNameInConstructorParameter.kt new file mode 100644 index 00000000000..aefb448e189 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/override/TypeNameInConstructorParameter.kt @@ -0,0 +1,8 @@ +interface I { + var someVar: java.io.File? +} + +class A(som) : I { +} + +// ELEMENT_TEXT: "override var someVar: File?" diff --git a/idea/idea-completion/testData/handlers/basic/override/TypeNameInConstructorParameter.kt.after b/idea/idea-completion/testData/handlers/basic/override/TypeNameInConstructorParameter.kt.after new file mode 100644 index 00000000000..865a2767dbc --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/override/TypeNameInConstructorParameter.kt.after @@ -0,0 +1,10 @@ +import java.io.File + +interface I { + var someVar: java.io.File? +} + +class A(override var someVar: File?) : I { +} + +// ELEMENT_TEXT: "override var someVar: File?" 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 2cf8819dd04..8b75ad0c203 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 @@ -1605,11 +1605,23 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("InConstructorParameters2.kt") + public void testInConstructorParameters2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/InConstructorParameters2.kt"); + doTest(fileName); + } + @TestMetadata("Simple.kt") public void testSimple() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/Simple.kt"); doTest(fileName); } + + @TestMetadata("TypeFunctionName.kt") + public void testTypeFunctionName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/TypeFunctionName.kt"); + doTest(fileName); + } } @TestMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType") 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 bb6961542d2..a7587fb8ec2 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 @@ -1605,11 +1605,23 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("InConstructorParameters2.kt") + public void testInConstructorParameters2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/InConstructorParameters2.kt"); + doTest(fileName); + } + @TestMetadata("Simple.kt") public void testSimple() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/Simple.kt"); doTest(fileName); } + + @TestMetadata("TypeFunctionName.kt") + public void testTypeFunctionName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/TypeFunctionName.kt"); + doTest(fileName); + } } @TestMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType") diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java index 15f4af561fb..1ddcac2370c 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java @@ -406,6 +406,18 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion doTest(fileName); } + @TestMetadata("TypeFunctionName.kt") + public void testTypeFunctionName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/override/TypeFunctionName.kt"); + doTest(fileName); + } + + @TestMetadata("TypeNameInConstructorParameter.kt") + public void testTypeNameInConstructorParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/override/TypeNameInConstructorParameter.kt"); + doTest(fileName); + } + @TestMetadata("ValInConstructorParameter.kt") public void testValInConstructorParameter() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/override/ValInConstructorParameter.kt");