From b13e932c3c085c2472e271d2c02e0bdbdd4ca9ba Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 4 May 2015 12:42:59 +0300 Subject: [PATCH] Parse label reference with spaces before '@' But still report error --- .../kotlin/parsing/JetExpressionParsing.java | 7 ++- compiler/testData/psi/newLabels/recovery.txt | 26 ++++---- .../newLabels/spaceBeforeLabelReference.txt | 59 +++++++++++-------- .../formatter/ReturnExpression.after.kt | 2 +- 4 files changed, 56 insertions(+), 38 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetExpressionParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetExpressionParsing.java index 3f1bbabbba7..aa0e729a14c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetExpressionParsing.java @@ -1647,10 +1647,13 @@ public class JetExpressionParsing extends AbstractJetParsing { } /* - * label? + * labelReference? */ private void parseLabelReferenceWithNoWhitespace() { - if (at(AT) && !WHITE_SPACE_OR_COMMENT_BIT_SET.contains(myBuilder.rawLookup(-1))) { + if (at(AT) && !myBuilder.newlineBeforeCurrentToken()) { + if (WHITE_SPACE_OR_COMMENT_BIT_SET.contains(myBuilder.rawLookup(-1))) { + error("There should be no space or comments before '@' in label reference"); + } parseLabelReference(); } } diff --git a/compiler/testData/psi/newLabels/recovery.txt b/compiler/testData/psi/newLabels/recovery.txt index 7c69e391da7..331b85e12e0 100644 --- a/compiler/testData/psi/newLabels/recovery.txt +++ b/compiler/testData/psi/newLabels/recovery.txt @@ -108,13 +108,14 @@ JetFile: recovery.kt PsiWhiteSpace('\n ') RETURN PsiElement(return)('return') + PsiErrorElement:There should be no space or comments before '@' in label reference + PsiWhiteSpace(' ') - LABELED_EXPRESSION - PsiErrorElement:Label must be named - PsiElement(AT)('@') - PsiWhiteSpace(' ') - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('loop2') + PsiErrorElement:Label must be named + PsiElement(AT)('@') + PsiWhiteSpace(' ') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('loop2') PsiWhiteSpace(' ') PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) PsiElement(INTEGER_LITERAL)('7') @@ -257,12 +258,13 @@ JetFile: recovery.kt PsiWhiteSpace('\n\n ') RETURN PsiElement(return)('return') + PsiErrorElement:There should be no space or comments before '@' in label reference + PsiWhiteSpace(' ') - LABELED_EXPRESSION - PsiErrorElement:Label must be named - PsiElement(AT)('@') - PsiWhiteSpace(' ') - INTEGER_CONSTANT - PsiElement(INTEGER_LITERAL)('1') + PsiErrorElement:Label must be named + PsiElement(AT)('@') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') PsiWhiteSpace('\n') PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/newLabels/spaceBeforeLabelReference.txt b/compiler/testData/psi/newLabels/spaceBeforeLabelReference.txt index dba7c3cc185..352501c31b6 100644 --- a/compiler/testData/psi/newLabels/spaceBeforeLabelReference.txt +++ b/compiler/testData/psi/newLabels/spaceBeforeLabelReference.txt @@ -14,10 +14,13 @@ JetFile: spaceBeforeLabelReference.kt PsiWhiteSpace('\n ') BREAK PsiElement(break)('break') - PsiWhiteSpace(' ') - PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) - PsiElement(AT)('@') - PsiElement(IDENTIFIER)('l1') + PsiErrorElement:There should be no space or comments before '@' in label reference + + PsiWhiteSpace(' ') + LABEL_QUALIFIER + LABEL + PsiElement(AT)('@') + PsiElement(IDENTIFIER)('l1') PsiWhiteSpace('\n\n ') PROPERTY PsiElement(val)('val') @@ -31,15 +34,16 @@ JetFile: spaceBeforeLabelReference.kt PsiWhiteSpace('\n\n ') RETURN PsiElement(return)('return') + PsiErrorElement:There should be no space or comments before '@' in label reference + PsiWhiteSpace(' ') - LABELED_EXPRESSION - PsiErrorElement:Label must be named + LABEL_QUALIFIER + LABEL PsiElement(AT)('@') - REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('l2') - PsiWhiteSpace(' ') - PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) - PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') PsiWhiteSpace('\n\n ') PROPERTY PsiElement(val)('val') @@ -53,11 +57,12 @@ JetFile: spaceBeforeLabelReference.kt PsiWhiteSpace('\n\n ') RETURN PsiElement(return)('return') + PsiErrorElement:There should be no space or comments before '@' in label reference + PsiWhiteSpace(' ') - LABELED_EXPRESSION - PsiErrorElement:Label must be named + LABEL_QUALIFIER + LABEL PsiElement(AT)('@') - REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('l3') PsiWhiteSpace('\n\n ') PROPERTY @@ -72,11 +77,15 @@ JetFile: spaceBeforeLabelReference.kt PsiWhiteSpace('\n\n ') CONTINUE PsiElement(continue)('continue') + PsiErrorElement:There should be no space or comments before '@' in label reference + + PsiWhiteSpace(' ') + LABEL_QUALIFIER + LABEL + PsiElement(AT)('@') + PsiElement(IDENTIFIER)('l4') PsiWhiteSpace(' ') PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) - PsiElement(AT)('@') - PsiElement(IDENTIFIER)('l4') - PsiWhiteSpace(' ') PsiElement(INTEGER_LITERAL)('5') PsiWhiteSpace('\n\n ') PROPERTY @@ -91,10 +100,13 @@ JetFile: spaceBeforeLabelReference.kt PsiWhiteSpace('\n\n ') BREAK PsiElement(break)('break') - PsiComment(BLOCK_COMMENT)('/**/') - PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line) - PsiElement(AT)('@') - PsiElement(IDENTIFIER)('l5') + PsiErrorElement:There should be no space or comments before '@' in label reference + + PsiComment(BLOCK_COMMENT)('/**/') + LABEL_QUALIFIER + LABEL + PsiElement(AT)('@') + PsiElement(IDENTIFIER)('l5') PsiWhiteSpace('\n\n ') PROPERTY PsiElement(val)('val') @@ -108,12 +120,13 @@ JetFile: spaceBeforeLabelReference.kt PsiWhiteSpace('\n\n ') RETURN PsiElement(return)('return') + PsiErrorElement:There should be no space or comments before '@' in label reference + PsiWhiteSpace(' ') PsiComment(BLOCK_COMMENT)('/**/') - LABELED_EXPRESSION - PsiErrorElement:Label must be named + LABEL_QUALIFIER + LABEL PsiElement(AT)('@') - REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('l6') PsiWhiteSpace('\n\n ') PROPERTY diff --git a/idea/testData/formatter/ReturnExpression.after.kt b/idea/testData/formatter/ReturnExpression.after.kt index 69e627045b6..fe2558f66e6 100644 --- a/idea/testData/formatter/ReturnExpression.after.kt +++ b/idea/testData/formatter/ReturnExpression.after.kt @@ -23,7 +23,7 @@ fun test4(): Int { fun test5(): Int { return synchronized(this) {(): Int -> - return @synchronized 12 + return@synchronized 12 } }