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 e842a14043a..59847c2fa78 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 @@ -53,6 +53,12 @@ object KeywordCompletion { private val KEYWORDS_TO_IGNORE_PREFIX = TokenSet.create(OVERRIDE_KEYWORD /* it's needed to complete overrides that should be work by member name too */) + private val COMPOUND_KEYWORDS = mapOf( + COMPANION_KEYWORD to OBJECT_KEYWORD, + ENUM_KEYWORD to CLASS_KEYWORD, + ANNOTATION_KEYWORD to CLASS_KEYWORD + ) + public fun complete(position: PsiElement, prefix: String, isJvmModule: Boolean, consumer: (LookupElement) -> Unit) { if (!GENERAL_FILTER.isAcceptable(position, position)) return @@ -60,15 +66,16 @@ object KeywordCompletion { for (keywordToken in ALL_KEYWORDS) { var keyword = keywordToken.getValue() - if (keywordToken == COMPANION_KEYWORD) { // complete "companion object" instead of simply "companion" unless we are before "object" already + val nextKeyword = COMPOUND_KEYWORDS[keywordToken] + if (nextKeyword != null) { fun PsiElement.isSpace() = this is PsiWhiteSpace && '\n' !in getText() var next = position.nextLeaf { !(it.isSpace() || it.getText() == "$") }?.getText() if (next != null && next.startsWith("$")) { next = next.substring(1) } - if (next != OBJECT_KEYWORD.getValue()) { - keyword += " " + OBJECT_KEYWORD.getValue() + if (next != nextKeyword.value) { + keyword += " " + nextKeyword.value } } diff --git a/idea/idea-completion/testData/keywords/AfterClassProperty.kt b/idea/idea-completion/testData/keywords/AfterClassProperty.kt index ea21026fc74..f8382ae5df9 100644 --- a/idea/idea-completion/testData/keywords/AfterClassProperty.kt +++ b/idea/idea-completion/testData/keywords/AfterClassProperty.kt @@ -7,7 +7,7 @@ class MouseMovedEventArgs // EXIST: abstract // EXIST: as // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: get @@ -34,6 +34,6 @@ class MouseMovedEventArgs // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/AfterClasses.kt b/idea/idea-completion/testData/keywords/AfterClasses.kt index 2efb6f3594a..6b906e958da 100644 --- a/idea/idea-completion/testData/keywords/AfterClasses.kt +++ b/idea/idea-completion/testData/keywords/AfterClasses.kt @@ -14,7 +14,7 @@ class B { // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: internal @@ -32,6 +32,6 @@ class B { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/AfterFuns.kt b/idea/idea-completion/testData/keywords/AfterFuns.kt index fdee6601ecf..abfdced4bb6 100644 --- a/idea/idea-completion/testData/keywords/AfterFuns.kt +++ b/idea/idea-completion/testData/keywords/AfterFuns.kt @@ -12,7 +12,7 @@ class A { // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: inner @@ -37,6 +37,6 @@ class A { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/BeforeClass.kt b/idea/idea-completion/testData/keywords/BeforeClass.kt new file mode 100644 index 00000000000..0a1e452e19e --- /dev/null +++ b/idea/idea-completion/testData/keywords/BeforeClass.kt @@ -0,0 +1,6 @@ +eclass A { +} + +// EXIST: enum +// EXIST: external +// NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt index ad96ad3e87a..de82f7a849f 100644 --- a/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/GlobalPropertyAccessors.kt @@ -12,7 +12,7 @@ var a : Int // EXIST: abstract // EXIST: by // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: get @@ -32,6 +32,6 @@ var a : Int // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt b/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt index 6a09d1e0c15..4c14f0b9128 100644 --- a/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt +++ b/idea/idea-completion/testData/keywords/InAnnotationClassScope.kt @@ -4,7 +4,7 @@ annotation class Test { // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: object @@ -23,6 +23,6 @@ annotation class Test { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt index 2160239022d..fb25362dd60 100644 --- a/idea/idea-completion/testData/keywords/InClassBeforeFun.kt +++ b/idea/idea-completion/testData/keywords/InClassBeforeFun.kt @@ -10,7 +10,7 @@ public class Test { // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: inner @@ -35,6 +35,6 @@ public class Test { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InClassScope.kt b/idea/idea-completion/testData/keywords/InClassScope.kt index 17236537d28..a84d06d9349 100644 --- a/idea/idea-completion/testData/keywords/InClassScope.kt +++ b/idea/idea-completion/testData/keywords/InClassScope.kt @@ -4,7 +4,7 @@ class TestClass { // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: inner @@ -29,6 +29,6 @@ class TestClass { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InEnumScope2.kt b/idea/idea-completion/testData/keywords/InEnumScope2.kt index 8c2cec1482a..a7e7b02a134 100644 --- a/idea/idea-completion/testData/keywords/InEnumScope2.kt +++ b/idea/idea-completion/testData/keywords/InEnumScope2.kt @@ -5,7 +5,7 @@ enum class Test { } // EXIST: abstract -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: inner // EXIST: internal @@ -23,7 +23,7 @@ enum class Test { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // EXIST: fun diff --git a/idea/idea-completion/testData/keywords/InInterfaceScope.kt b/idea/idea-completion/testData/keywords/InInterfaceScope.kt index a4112851467..6e007a8970d 100644 --- a/idea/idea-completion/testData/keywords/InInterfaceScope.kt +++ b/idea/idea-completion/testData/keywords/InInterfaceScope.kt @@ -4,7 +4,7 @@ interface Test { // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: fun // EXIST: object // EXIST: open @@ -25,6 +25,6 @@ interface Test { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InObjectScope.kt b/idea/idea-completion/testData/keywords/InObjectScope.kt index e5415258542..20b87c033cd 100644 --- a/idea/idea-completion/testData/keywords/InObjectScope.kt +++ b/idea/idea-completion/testData/keywords/InObjectScope.kt @@ -4,7 +4,7 @@ object Test { // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: internal @@ -26,6 +26,6 @@ object Test { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt index 1cd1c56dd58..a586b395277 100644 --- a/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt +++ b/idea/idea-completion/testData/keywords/InTopScopeAfterPackage.kt @@ -4,7 +4,7 @@ package Test // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: import @@ -23,6 +23,6 @@ package Test // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors.kt b/idea/idea-completion/testData/keywords/PropertyAccessors.kt index 782d0bdd408..7b652e36f67 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors.kt @@ -6,7 +6,7 @@ class Some { // EXIST: abstract // EXIST: by // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: get @@ -33,6 +33,6 @@ class Some { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt index e23de2f6902..97e524af8f1 100644 --- a/idea/idea-completion/testData/keywords/PropertyAccessors2.kt +++ b/idea/idea-completion/testData/keywords/PropertyAccessors2.kt @@ -6,7 +6,7 @@ class Some { // EXIST: abstract // EXIST: as // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: get @@ -33,6 +33,6 @@ class Some { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/PropertySetter.kt b/idea/idea-completion/testData/keywords/PropertySetter.kt index 56426e2211d..a7263c028a4 100644 --- a/idea/idea-completion/testData/keywords/PropertySetter.kt +++ b/idea/idea-completion/testData/keywords/PropertySetter.kt @@ -7,7 +7,7 @@ class Some { // EXIST: abstract // EXIST: as // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: get @@ -35,6 +35,6 @@ class Some { // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE diff --git a/idea/idea-completion/testData/keywords/TopScope.kt b/idea/idea-completion/testData/keywords/TopScope.kt index 28ba4f8795c..0881897ad95 100644 --- a/idea/idea-completion/testData/keywords/TopScope.kt +++ b/idea/idea-completion/testData/keywords/TopScope.kt @@ -2,7 +2,7 @@ // EXIST: abstract // EXIST: class -// EXIST: enum +// EXIST: enum class // EXIST: final // EXIST: fun // EXIST: import @@ -22,6 +22,6 @@ // EXIST: inline // EXIST: tailrec // EXIST: external -// EXIST: annotation +// EXIST: annotation class // EXIST: const // NOTHING_ELSE 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 bc8cbebf409..cc52359e09e 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 @@ -71,6 +71,12 @@ public class KeywordCompletionTestGenerated extends AbstractKeywordCompletionTes JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/keywords"), Pattern.compile("^(.+)\\.kt$"), false); } + @TestMetadata("BeforeClass.kt") + public void testBeforeClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/keywords/BeforeClass.kt"); + doTest(fileName); + } + @TestMetadata("BeforeDelegationCall.kt") public void testBeforeDelegationCall() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/keywords/BeforeDelegationCall.kt");