From e27528477f53fa55f939cd1573ad3dde72123293 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 12 Oct 2015 22:08:07 +0300 Subject: [PATCH] KT-9478 No override completion for second parameter in primary constructor #KT-9478 Fixed #KT-9386 Fixed --- .../idea/completion/KeywordCompletion.kt | 41 +++++++++++++------ .../override/SecondConstructorParameter.kt | 11 +++++ .../InPrimaryConstructorParametersList.kt | 22 ++++++++++ ...iteTargetForPrimaryConstructorParameter.kt | 16 ++++++++ .../test/JSBasicCompletionTestGenerated.java | 6 +++ .../test/JvmBasicCompletionTestGenerated.java | 6 +++ .../test/KeywordCompletionTestGenerated.java | 12 ++++++ 7 files changed, 102 insertions(+), 12 deletions(-) create mode 100644 idea/idea-completion/testData/basic/common/override/SecondConstructorParameter.kt create mode 100644 idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt create mode 100644 idea/idea-completion/testData/keywords/UseSiteTargetForPrimaryConstructorParameter.kt 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 a3ff6c1f69f..a1b88e7b023 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 @@ -122,37 +122,44 @@ object KeywordCompletion { var parent = position.getParent() var prevParent = position while (parent != null) { - val _parent = parent - when (_parent) { + when (parent) { is JetBlockExpression -> { return buildFilterWithContext("fun foo() { ", prevParent, position) } is JetWithExpressionInitializer -> { - val initializer = _parent.getInitializer() + val initializer = parent.getInitializer() if (prevParent == initializer) { return buildFilterWithContext("val v = ", initializer!!, position) } } is JetParameter -> { - val default = _parent.getDefaultValue() + val default = parent.getDefaultValue() if (prevParent == default) { return buildFilterWithContext("val v = ", default!!, position) } } } - if (_parent is JetDeclaration) { - val scope = _parent.getParent() + if (parent is JetDeclaration) { + val scope = parent.parent when (scope) { - is JetClassOrObject -> return buildFilterWithReducedContext("class X { ", _parent, position) - is JetFile -> return buildFilterWithReducedContext("", _parent, position) + is JetClassOrObject -> { + if (parent is JetPrimaryConstructor) { + return buildFilterWithReducedContext("class X ", parent, position) + } + else { + return buildFilterWithReducedContext("class X { ", parent, position) + } + } + + is JetFile -> return buildFilterWithReducedContext("", parent, position) } } - prevParent = _parent - parent = _parent.getParent() + prevParent = parent + parent = parent.parent } return buildFilterWithReducedContext("", null, position) @@ -193,11 +200,21 @@ object KeywordCompletion { else -> { if (elementAt.parent !is JetModifierList) return true - val possibleTargets = when (elementAt.parent.parent) { - is JetParameter -> listOf(VALUE_PARAMETER) + val declaration = elementAt.parent.parent + val possibleTargets = when (declaration) { + is JetParameter -> { + if (declaration.ownerFunction is JetPrimaryConstructor) + listOf(VALUE_PARAMETER, MEMBER_PROPERTY) + else + listOf(VALUE_PARAMETER) + } + is JetTypeParameter -> listOf(TYPE_PARAMETER) + is JetClassBody -> listOf(CLASS_ONLY, INTERFACE, OBJECT, ENUM_CLASS, ANNOTATION_CLASS, INNER_CLASS, MEMBER_FUNCTION, MEMBER_PROPERTY, FUNCTION, PROPERTY) + is JetFile -> listOf(CLASS_ONLY, INTERFACE, OBJECT, ENUM_CLASS, ANNOTATION_CLASS, TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY, FUNCTION, PROPERTY) + else -> return true } val modifierTargets = ModifierCheckerCore.possibleTargetMap[keywordTokenType] ?: return true diff --git a/idea/idea-completion/testData/basic/common/override/SecondConstructorParameter.kt b/idea/idea-completion/testData/basic/common/override/SecondConstructorParameter.kt new file mode 100644 index 00000000000..62f3223f566 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/override/SecondConstructorParameter.kt @@ -0,0 +1,11 @@ +interface Foo { + val foo: Int + val bar: Int +} + +class A(override val bar: Int, overr): Foo + +// EXIST: { lookupString: "override", itemText: "override" } +// EXIST: { itemText: "override val foo: Int", tailText: null, typeText: "Foo" } +// EXIST_JAVA_ONLY: { itemText: "override: Override", tailText: " (java.lang)" } +// NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt b/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt new file mode 100644 index 00000000000..89f3e7c7d3f --- /dev/null +++ b/idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt @@ -0,0 +1,22 @@ +package TestData + +class TestSample() + +// EXIST: vararg +// EXIST: noinline +// EXIST: crossinline +// EXIST: val +// EXIST: var +// EXIST: override +// EXIST: open +// EXIST: final +// EXIST: public +// EXIST: private +// EXIST: protected +// EXIST: internal + +/* TODO: keywords below should not be here*/ +// EXIST: abstract +// EXIST: const +// EXIST: lateinit +// NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/UseSiteTargetForPrimaryConstructorParameter.kt b/idea/idea-completion/testData/keywords/UseSiteTargetForPrimaryConstructorParameter.kt new file mode 100644 index 00000000000..6bab30eb584 --- /dev/null +++ b/idea/idea-completion/testData/keywords/UseSiteTargetForPrimaryConstructorParameter.kt @@ -0,0 +1,16 @@ +annotation class Ann + +class Completion(@get:Ann val p1: String, @) + +// EXIST: get +// EXIST: set +// EXIST: field +// EXIST: param +// EXIST: setparam +// EXIST: property + +/*TODO: keywords below should not be here*/ +// EXIST: val +// EXIST: var +// EXIST: receiver +// NOTHING_ELSE 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 788acd1b483..0dddf4d0eee 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 @@ -1635,6 +1635,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("SecondConstructorParameter.kt") + public void testSecondConstructorParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/SecondConstructorParameter.kt"); + doTest(fileName); + } + @TestMetadata("Simple.kt") public void testSimple() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/Simple.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 12304f16907..0c439892f65 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 @@ -1635,6 +1635,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("SecondConstructorParameter.kt") + public void testSecondConstructorParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/SecondConstructorParameter.kt"); + doTest(fileName); + } + @TestMetadata("Simple.kt") public void testSimple() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/override/Simple.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KeywordCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KeywordCompletionTestGenerated.java index 4a3f3890c54..3980615efd9 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KeywordCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/KeywordCompletionTestGenerated.java @@ -227,6 +227,12 @@ public class KeywordCompletionTestGenerated extends AbstractKeywordCompletionTes doTest(fileName); } + @TestMetadata("InPrimaryConstructorParametersList.kt") + public void testInPrimaryConstructorParametersList() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/keywords/InPrimaryConstructorParametersList.kt"); + doTest(fileName); + } + @TestMetadata("InPropertyInitializer.kt") public void testInPropertyInitializer() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/keywords/InPropertyInitializer.kt"); @@ -472,4 +478,10 @@ public class KeywordCompletionTestGenerated extends AbstractKeywordCompletionTes String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/keywords/TopScope.kt"); doTest(fileName); } + + @TestMetadata("UseSiteTargetForPrimaryConstructorParameter.kt") + public void testUseSiteTargetForPrimaryConstructorParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/keywords/UseSiteTargetForPrimaryConstructorParameter.kt"); + doTest(fileName); + } }