From b38fc7b3c1ba19453ea2f98b52668de89853623a Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 29 Dec 2015 12:28:50 +0300 Subject: [PATCH] Parse local interfaces in expression position --- .../parsing/KotlinExpressionParsing.java | 2 +- .../recovery/InterfaceInExpressionPosition.kt | 3 ++ .../InterfaceInExpressionPosition.txt | 40 +++++++++++++++++++ .../kotlin/parsing/ParsingTestGenerated.java | 6 +++ .../InterfaceDeclarationAsExpression.kt | 5 +++ .../checkers/PsiCheckerTestGenerated.java | 6 +++ 6 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/psi/recovery/InterfaceInExpressionPosition.kt create mode 100644 compiler/testData/psi/recovery/InterfaceInExpressionPosition.txt create mode 100644 idea/testData/checker/regression/InterfaceDeclarationAsExpression.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java index c48fa3217dc..8ad105e963b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java @@ -669,7 +669,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { else if (at(DO_KEYWORD)) { parseDoWhile(); } - else if (atSet(CLASS_KEYWORD, FUN_KEYWORD, VAL_KEYWORD, + else if (atSet(CLASS_KEYWORD, INTERFACE_KEYWORD, FUN_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, TYPE_ALIAS_KEYWORD)) { parseLocalDeclaration(); } diff --git a/compiler/testData/psi/recovery/InterfaceInExpressionPosition.kt b/compiler/testData/psi/recovery/InterfaceInExpressionPosition.kt new file mode 100644 index 00000000000..b23b2a59bae --- /dev/null +++ b/compiler/testData/psi/recovery/InterfaceInExpressionPosition.kt @@ -0,0 +1,3 @@ +val p = 1 < interface I { + fun f() {} +} \ No newline at end of file diff --git a/compiler/testData/psi/recovery/InterfaceInExpressionPosition.txt b/compiler/testData/psi/recovery/InterfaceInExpressionPosition.txt new file mode 100644 index 00000000000..680727199ed --- /dev/null +++ b/compiler/testData/psi/recovery/InterfaceInExpressionPosition.txt @@ -0,0 +1,40 @@ +JetFile: InterfaceInExpressionPosition.kt + PACKAGE_DIRECTIVE + + IMPORT_LIST + + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('p') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + BINARY_EXPRESSION + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(LT)('<') + PsiWhiteSpace(' ') + CLASS + PsiElement(interface)('interface') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('I') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('f') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java index 1d1149e4fab..a8b72c9a432 100644 --- a/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java @@ -2160,6 +2160,12 @@ public class ParsingTestGenerated extends AbstractParsingTest { doParsingTest(fileName); } + @TestMetadata("InterfaceInExpressionPosition.kt") + public void testInterfaceInExpressionPosition() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/psi/recovery/InterfaceInExpressionPosition.kt"); + doParsingTest(fileName); + } + @TestMetadata("InvalidCharAfterPropertyName.kt") public void testInvalidCharAfterPropertyName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/psi/recovery/InvalidCharAfterPropertyName.kt"); diff --git a/idea/testData/checker/regression/InterfaceDeclarationAsExpression.kt b/idea/testData/checker/regression/InterfaceDeclarationAsExpression.kt new file mode 100644 index 00000000000..9ef3516bcbc --- /dev/null +++ b/idea/testData/checker/regression/InterfaceDeclarationAsExpression.kt @@ -0,0 +1,5 @@ +val p = 1 < interface A { + fun f() { + f() + } +} diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index ddc5ff01afc..b0a016440b1 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -454,6 +454,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { doTest(fileName); } + @TestMetadata("InterfaceDeclarationAsExpression.kt") + public void testInterfaceDeclarationAsExpression() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/InterfaceDeclarationAsExpression.kt"); + doTest(fileName); + } + @TestMetadata("javaStyleClassLiteralInAnnotationArguments.kt") public void testJavaStyleClassLiteralInAnnotationArguments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/regression/javaStyleClassLiteralInAnnotationArguments.kt");