From 0257f46ebbdfc61e73b937f6f691275f42cad910 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 8 Sep 2015 12:47:12 +0300 Subject: [PATCH] Special modifier parsing for enum entries: last of them is considered as an enum entry name #KT-9088 Fixed --- .../jetbrains/kotlin/parsing/JetParsing.java | 15 +++++-- .../testData/diagnostics/tests/enum/inline.kt | 3 ++ .../diagnostics/tests/enum/inline.txt | 18 ++++++++ compiler/testData/psi/EnumInline.kt | 3 ++ compiler/testData/psi/EnumInline.txt | 21 +++++++++ compiler/testData/psi/EnumInlinePublic.kt | 6 +++ compiler/testData/psi/EnumInlinePublic.txt | 43 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 +++ .../parsing/JetParsingTestGenerated.java | 12 ++++++ 9 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/enum/inline.kt create mode 100644 compiler/testData/diagnostics/tests/enum/inline.txt create mode 100644 compiler/testData/psi/EnumInline.kt create mode 100644 compiler/testData/psi/EnumInline.txt create mode 100644 compiler/testData/psi/EnumInlinePublic.kt create mode 100644 compiler/testData/psi/EnumInlinePublic.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java index 12efe6ee79f..459d3f04aa0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java @@ -962,8 +962,7 @@ public class JetParsing extends AbstractJetParsing { private ParseEnumEntryResult parseEnumEntry() { PsiBuilder.Marker entry = mark(); - ModifierDetector detector = new ModifierDetector(); - parseModifierList(detector, ONLY_ESCAPED_REGULAR_ANNOTATIONS); + parseModifierListWithStopAt(TokenSet.create(COMMA, SEMICOLON, RBRACE), ONLY_ESCAPED_REGULAR_ANNOTATIONS); if (!atSet(SOFT_KEYWORDS_AT_MEMBER_START) && at(IDENTIFIER)) { PsiBuilder.Marker nameAsDeclaration = mark(); @@ -2125,12 +2124,20 @@ public class JetParsing extends AbstractJetParsing { } public void parseModifierListWithUnescapedAnnotations(TokenSet stopAt) { - parseModifierListWithUnescapedAnnotations(TokenSet.create(IDENTIFIER), stopAt); + parseModifierListWithLookForStopAt(TokenSet.create(IDENTIFIER), stopAt, ALLOW_UNESCAPED_REGULAR_ANNOTATIONS); + } + + public void parseModifierListWithStopAt(TokenSet stopAt, AnnotationParsingMode mode) { + parseModifierListWithLookForStopAt(TokenSet.create(IDENTIFIER), stopAt, mode); } public void parseModifierListWithUnescapedAnnotations(TokenSet lookFor, TokenSet stopAt) { + parseModifierListWithLookForStopAt(lookFor, stopAt, ALLOW_UNESCAPED_REGULAR_ANNOTATIONS); + } + + public void parseModifierListWithLookForStopAt(TokenSet lookFor, TokenSet stopAt, AnnotationParsingMode mode) { int lastId = matchTokenStreamPredicate(new LastBefore(new AtSet(lookFor), new AnnotationTargetStop(stopAt, ANNOTATION_TARGETS), false)); - createTruncatedBuilder(lastId).parseModifierList(ALLOW_UNESCAPED_REGULAR_ANNOTATIONS); + createTruncatedBuilder(lastId).parseModifierList(mode); } private class AnnotationTargetStop extends AbstractTokenStreamPredicate { diff --git a/compiler/testData/diagnostics/tests/enum/inline.kt b/compiler/testData/diagnostics/tests/enum/inline.kt new file mode 100644 index 00000000000..29e488c6785 --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/inline.kt @@ -0,0 +1,3 @@ +enum class My { + inline +} diff --git a/compiler/testData/diagnostics/tests/enum/inline.txt b/compiler/testData/diagnostics/tests/enum/inline.txt new file mode 100644 index 00000000000..c86c8c3a9ae --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/inline.txt @@ -0,0 +1,18 @@ +package + +public final enum class My : kotlin.Enum { + enum entry inline + + private constructor My() + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: My): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): My + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/testData/psi/EnumInline.kt b/compiler/testData/psi/EnumInline.kt new file mode 100644 index 00000000000..29e488c6785 --- /dev/null +++ b/compiler/testData/psi/EnumInline.kt @@ -0,0 +1,3 @@ +enum class My { + inline +} diff --git a/compiler/testData/psi/EnumInline.txt b/compiler/testData/psi/EnumInline.txt new file mode 100644 index 00000000000..b4662bbbb8f --- /dev/null +++ b/compiler/testData/psi/EnumInline.txt @@ -0,0 +1,21 @@ +JetFile: EnumInline.kt + PACKAGE_DIRECTIVE + + IMPORT_LIST + + CLASS + MODIFIER_LIST + PsiElement(enum)('enum') + PsiWhiteSpace(' ') + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('My') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + ENUM_ENTRY + OBJECT_DECLARATION_NAME + PsiElement(IDENTIFIER)('inline') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/EnumInlinePublic.kt b/compiler/testData/psi/EnumInlinePublic.kt new file mode 100644 index 00000000000..275bd86884c --- /dev/null +++ b/compiler/testData/psi/EnumInlinePublic.kt @@ -0,0 +1,6 @@ +enum class My { + inline public, + inner private; + + companion object {} +} \ No newline at end of file diff --git a/compiler/testData/psi/EnumInlinePublic.txt b/compiler/testData/psi/EnumInlinePublic.txt new file mode 100644 index 00000000000..1fe482a0475 --- /dev/null +++ b/compiler/testData/psi/EnumInlinePublic.txt @@ -0,0 +1,43 @@ +JetFile: EnumInlinePublic.kt + PACKAGE_DIRECTIVE + + IMPORT_LIST + + CLASS + MODIFIER_LIST + PsiElement(enum)('enum') + PsiWhiteSpace(' ') + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('My') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + ENUM_ENTRY + MODIFIER_LIST + PsiElement(inline)('inline') + PsiWhiteSpace(' ') + OBJECT_DECLARATION_NAME + PsiElement(IDENTIFIER)('public') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + ENUM_ENTRY + MODIFIER_LIST + PsiElement(inner)('inner') + PsiWhiteSpace(' ') + OBJECT_DECLARATION_NAME + PsiElement(IDENTIFIER)('private') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n\n ') + OBJECT_DECLARATION + MODIFIER_LIST + PsiElement(companion)('companion') + PsiWhiteSpace(' ') + PsiElement(object)('object') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace(' \n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index d0caa036cc8..b551d5948f7 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -5322,6 +5322,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("inline.kt") + public void testInline() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/enum/inline.kt"); + doTest(fileName); + } + @TestMetadata("InsideEntryConstructorCall.kt") public void testInsideEntryConstructorCall() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/enum/InsideEntryConstructorCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java index 7ea19fead91..9385a027905 100644 --- a/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/parsing/JetParsingTestGenerated.java @@ -271,6 +271,18 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest { doParsingTest(fileName); } + @TestMetadata("EnumInline.kt") + public void testEnumInline() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/EnumInline.kt"); + doParsingTest(fileName); + } + + @TestMetadata("EnumInlinePublic.kt") + public void testEnumInlinePublic() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/EnumInlinePublic.kt"); + doParsingTest(fileName); + } + @TestMetadata("EnumMissingName.kt") public void testEnumMissingName() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/EnumMissingName.kt");