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 83aa2d49ccc..33b91aabe40 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 @@ -32,8 +32,10 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.* import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler import org.jetbrains.kotlin.idea.completion.handlers.KotlinKeywordInsertHandler +import org.jetbrains.kotlin.idea.completion.handlers.UseSiteAnnotationTargetInsertHandler import org.jetbrains.kotlin.lexer.KtKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* @@ -83,12 +85,16 @@ object KeywordCompletion { if (!parserFilter(keywordToken)) continue + val insertHandler = if (position.prevLeaf()?.node?.elementType == KtTokens.AT) + UseSiteAnnotationTargetInsertHandler + else if (keywordToken !in FUNCTION_KEYWORDS) + KotlinKeywordInsertHandler + else + KotlinFunctionInsertHandler.Normal(inputTypeArguments = false, inputValueArguments = false) + val element = LookupElementBuilder.create(KeywordLookupObject(), keyword) .bold() - .withInsertHandler(if (keywordToken !in FUNCTION_KEYWORDS) - KotlinKeywordInsertHandler - else - KotlinFunctionInsertHandler.Normal(inputTypeArguments = false, inputValueArguments = false)) + .withInsertHandler(insertHandler) consumer(element) } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt index c740809efd7..cd4f01f1cc5 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/KotlinKeywordInsertHandler.kt @@ -42,12 +42,15 @@ object KotlinKeywordInsertHandler : InsertHandler { DYNAMIC_KEYWORD).map { it.getValue() } + "companion object" override fun handleInsert(context: InsertionContext, item: LookupElement) { - val keyword = item.getLookupString() - if (keyword == FILE_KEYWORD.getValue()) { - WithTailInsertHandler.colonTail().postHandleInsert(context, item) - } - else if (keyword !in NO_SPACE_AFTER) { + val keyword = item.lookupString + if (keyword !in NO_SPACE_AFTER) { WithTailInsertHandler.spaceTail().postHandleInsert(context, item) } } } + +object UseSiteAnnotationTargetInsertHandler : InsertHandler { + override fun handleInsert(context: InsertionContext, item: LookupElement) { + WithTailInsertHandler(":", spaceBefore = false, spaceAfter = false).postHandleInsert(context, item) + } +} diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/WithTailInsertHandler.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/WithTailInsertHandler.kt index 2d6a8f0e9c8..a85589b220e 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/WithTailInsertHandler.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/handlers/WithTailInsertHandler.kt @@ -93,6 +93,5 @@ class WithTailInsertHandler(val tailText: String, fun elseTail() = WithTailInsertHandler("else", spaceBefore = true, spaceAfter = true) fun eqTail() = WithTailInsertHandler("=", spaceBefore = true, spaceAfter = true) /*TODO: use code style options*/ fun spaceTail() = WithTailInsertHandler(" ", spaceBefore = false, spaceAfter = false, overwriteText = false) - fun colonTail() = WithTailInsertHandler(":", spaceBefore = false, spaceAfter = true) } } diff --git a/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt new file mode 100644 index 00000000000..59902686c9b --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt @@ -0,0 +1,3 @@ +class C(@ val p: String) + +// ELEMENT: get diff --git a/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt.after b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt.after new file mode 100644 index 00000000000..bc02a4e89a5 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt.after @@ -0,0 +1,3 @@ +class C(@get: val p: String) + +// ELEMENT: get diff --git a/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget2.kt b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget2.kt new file mode 100644 index 00000000000..2c38f36dc57 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget2.kt @@ -0,0 +1,3 @@ +class C(@Ann var p: String) + +// ELEMENT: set diff --git a/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget2.kt.after b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget2.kt.after new file mode 100644 index 00000000000..cade1880898 --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget2.kt.after @@ -0,0 +1,3 @@ +class C(@set:Ann var p: String) + +// ELEMENT: set diff --git a/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt new file mode 100644 index 00000000000..3dac97661ab --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt @@ -0,0 +1,4 @@ +class C(@get:Ann var p: String) + +// ELEMENT: set +// CHAR: '\t' diff --git a/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt.after b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt.after new file mode 100644 index 00000000000..67b04c7f9dd --- /dev/null +++ b/idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt.after @@ -0,0 +1,4 @@ +class C(@set:Ann var p: String) + +// ELEMENT: set +// CHAR: '\t' diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java index c0fbcd8b02c..381b4abc040 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/KeywordCompletionHandlerTestGenerated.java @@ -124,4 +124,22 @@ public class KeywordCompletionHandlerTestGenerated extends AbstractKeywordComple String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/SpaceAfterImport.kt"); doTest(fileName); } + + @TestMetadata("UseSiteAnnotationTarget1.kt") + public void testUseSiteAnnotationTarget1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget1.kt"); + doTest(fileName); + } + + @TestMetadata("UseSiteAnnotationTarget2.kt") + public void testUseSiteAnnotationTarget2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget2.kt"); + doTest(fileName); + } + + @TestMetadata("UseSiteAnnotationTarget3.kt") + public void testUseSiteAnnotationTarget3() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/keywords/UseSiteAnnotationTarget3.kt"); + doTest(fileName); + } }