From bc9f67b6e20a3dc814cee1c5bfd4dd4b8329d23a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 7 Feb 2012 21:10:35 +0400 Subject: [PATCH] Made parser aware of object literals in statement position (they were parsed as object declarations) --- .../lang/parsing/JetExpressionParsing.java | 12 ++++ .../testData/psi/ObjectLiteralAsStatement.jet | 7 ++ .../testData/psi/ObjectLiteralAsStatement.txt | 71 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 compiler/testData/psi/ObjectLiteralAsStatement.jet create mode 100644 compiler/testData/psi/ObjectLiteralAsStatement.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index a8ca16f4c42..54de03839ed 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -1389,6 +1389,18 @@ public class JetExpressionParsing extends AbstractJetParsing { declType = myJetParsing.parseTypeDef(); } else if (keywordToken == OBJECT_KEYWORD) { + // Object expression may appear at the statement position: should parse it + // as expression instead of object declaration + // sample: + // { + // object : Thread() { + // } + // } + IElementType lookahead = lookahead(1); + if (lookahead == COLON || lookahead == LBRACE) { + return null; + } + myJetParsing.parseObject(true, true); declType = OBJECT_DECLARATION; } diff --git a/compiler/testData/psi/ObjectLiteralAsStatement.jet b/compiler/testData/psi/ObjectLiteralAsStatement.jet new file mode 100644 index 00000000000..436143a237b --- /dev/null +++ b/compiler/testData/psi/ObjectLiteralAsStatement.jet @@ -0,0 +1,7 @@ +fun main(args : Array) { + object : Thread() { + }.run() + + object { + } +} \ No newline at end of file diff --git a/compiler/testData/psi/ObjectLiteralAsStatement.txt b/compiler/testData/psi/ObjectLiteralAsStatement.txt new file mode 100644 index 00000000000..d60e26862e0 --- /dev/null +++ b/compiler/testData/psi/ObjectLiteralAsStatement.txt @@ -0,0 +1,71 @@ +JetFile: ObjectLiteralAsStatement.jet + NAMESPACE_HEADER + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('main') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('args') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Array') + TYPE_ARGUMENT_LIST + PsiElement(LT)('<') + TYPE_PROJECTION + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('String') + PsiElement(GT)('>') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION + OBJECT_LITERAL + OBJECT_DECLARATION + PsiElement(object)('object') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + DELEGATION_SPECIFIER_LIST + DELEGATOR_SUPER_CALL + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Thread') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('run') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace('\n\n ') + OBJECT_LITERAL + OBJECT_DECLARATION + PsiElement(object)('object') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}')