Label entries in tuple literals

This commit is contained in:
Andrey Breslav
2011-01-14 22:05:07 +03:00
parent 78cc7fdc0d
commit 52f985c9a4
7 changed files with 71 additions and 12 deletions
+1 -1
View File
@@ -36,7 +36,6 @@ public interface JetNodeTypes {
JetNodeType CLASS_BODY = new JetNodeType("CLASS_BODY", JetClassBody.class); JetNodeType CLASS_BODY = new JetNodeType("CLASS_BODY", JetClassBody.class);
JetNodeType IMPORT_DIRECTIVE = new JetNodeType("IMPORT_DIRECTIVE", JetImportDirective.class); JetNodeType IMPORT_DIRECTIVE = new JetNodeType("IMPORT_DIRECTIVE", JetImportDirective.class);
JetNodeType IMPORTED = new JetNodeType("IMPORTED"); // TODO: ???
JetNodeType NAMESPACE_BODY = new JetNodeType("NAMESPACE_BODY", JetNamespaceBody.class); JetNodeType NAMESPACE_BODY = new JetNodeType("NAMESPACE_BODY", JetNamespaceBody.class);
JetNodeType MODIFIER_LIST = new JetNodeType("MODIFIER_LIST", JetModifierList.class); JetNodeType MODIFIER_LIST = new JetNodeType("MODIFIER_LIST", JetModifierList.class);
JetNodeType ATTRIBUTE_ANNOTATION = new JetNodeType("ATTRIBUTE_ANNOTATION", JetAttributeAnnotation.class); JetNodeType ATTRIBUTE_ANNOTATION = new JetNodeType("ATTRIBUTE_ANNOTATION", JetAttributeAnnotation.class);
@@ -46,6 +45,7 @@ public interface JetNodeTypes {
JetNodeType VALUE_ARGUMENT = new JetNodeType("VALUE_ARGUMENT", JetArgument.class); JetNodeType VALUE_ARGUMENT = new JetNodeType("VALUE_ARGUMENT", JetArgument.class);
JetNodeType TYPE_REFERENCE = new JetNodeType("TYPE_REFERENCE", JetTypeReference.class); JetNodeType TYPE_REFERENCE = new JetNodeType("TYPE_REFERENCE", JetTypeReference.class);
JetNodeType LABELED_TUPLE_ENTRY = new JetNodeType("LABELED_TUPLE_ENTRY"); JetNodeType LABELED_TUPLE_ENTRY = new JetNodeType("LABELED_TUPLE_ENTRY");
JetNodeType LABELED_TUPLE_TYPE_ENTRY = new JetNodeType("LABELED_TUPLE_TYPE_ENTRY");
JetNodeType USER_TYPE = new JetNodeType("USER_TYPE", JetUserType.class); JetNodeType USER_TYPE = new JetNodeType("USER_TYPE", JetUserType.class);
JetNodeType TUPLE_TYPE = new JetNodeType("TUPLE_TYPE", JetTupleType.class); JetNodeType TUPLE_TYPE = new JetNodeType("TUPLE_TYPE", JetTupleType.class);
@@ -1218,8 +1218,15 @@ public class JetExpressionParsing extends AbstractJetParsing {
} }
/* /*
* "(" expression ")" // see tupleLiteral * tupleLiteral // Ambiguity when after a SimpleName (infix call). In this case (e) is treated as an expression in parentheses
* "(" expression{","} ")" * // to put a tuple, write write ((e))
* : "(" ((SimpleName "=")? expression){","} ")"
* ;
*
* expression
* : "(" expression ")"
* ;
*
* TODO: duplication with valueArguments (but for the error messages) * TODO: duplication with valueArguments (but for the error messages)
*/ */
private void parseParenthesizedExpressionOrTuple() { private void parseParenthesizedExpressionOrTuple() {
@@ -1237,7 +1244,16 @@ public class JetExpressionParsing extends AbstractJetParsing {
errorAndAdvance("Expecting a tuple entry (expression)"); errorAndAdvance("Expecting a tuple entry (expression)");
} }
parseExpression(); if (at(IDENTIFIER) && lookahead(1) == EQ) {
PsiBuilder.Marker entry = mark();
advance(); // IDENTIFIER
advance(); // EQ
tuple = true;
parseExpression();
entry.done(LABELED_TUPLE_ENTRY);
} else {
parseExpression();
}
if (!at(COMMA)) break; if (!at(COMMA)) break;
advance(); // COMMA advance(); // COMMA
@@ -1274,7 +1274,7 @@ public class JetParsing extends AbstractJetParsing {
advance(); // IDENTIFIER advance(); // IDENTIFIER
advance(); // COLON advance(); // COLON
parseTypeRef(); parseTypeRef();
labeledEntry.done(LABELED_TUPLE_ENTRY); labeledEntry.done(LABELED_TUPLE_TYPE_ENTRY);
} }
else if (TYPE_REF_FIRST.contains(tt())) { else if (TYPE_REF_FIRST.contains(tt())) {
parseTypeRef(); parseTypeRef();
+4 -4
View File
@@ -61,7 +61,7 @@ JetFile: TupleTypes.jet
TYPE_REFERENCE TYPE_REFERENCE
TUPLE_TYPE TUPLE_TYPE
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
LABELED_TUPLE_ENTRY LABELED_TUPLE_TYPE_ENTRY
PsiElement(IDENTIFIER)('x') PsiElement(IDENTIFIER)('x')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(COLON)(':') PsiElement(COLON)(':')
@@ -71,7 +71,7 @@ JetFile: TupleTypes.jet
PsiElement(IDENTIFIER)('Int') PsiElement(IDENTIFIER)('Int')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
LABELED_TUPLE_ENTRY LABELED_TUPLE_TYPE_ENTRY
PsiElement(IDENTIFIER)('y') PsiElement(IDENTIFIER)('y')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(COLON)(':') PsiElement(COLON)(':')
@@ -188,7 +188,7 @@ JetFile: TupleTypes.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
TUPLE_TYPE TUPLE_TYPE
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
LABELED_TUPLE_ENTRY LABELED_TUPLE_TYPE_ENTRY
PsiElement(IDENTIFIER)('x') PsiElement(IDENTIFIER)('x')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(COLON)(':') PsiElement(COLON)(':')
@@ -206,7 +206,7 @@ JetFile: TupleTypes.jet
PsiElement(IDENTIFIER)('Int') PsiElement(IDENTIFIER)('Int')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
LABELED_TUPLE_ENTRY LABELED_TUPLE_TYPE_ENTRY
PsiElement(IDENTIFIER)('y') PsiElement(IDENTIFIER)('y')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(COLON)(':') PsiElement(COLON)(':')
+3 -3
View File
@@ -60,7 +60,7 @@ JetFile: TupleTypes_ERR.jet
TYPE_REFERENCE TYPE_REFERENCE
TUPLE_TYPE TUPLE_TYPE
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
LABELED_TUPLE_ENTRY LABELED_TUPLE_TYPE_ENTRY
PsiElement(IDENTIFIER)('x') PsiElement(IDENTIFIER)('x')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(COLON)(':') PsiElement(COLON)(':')
@@ -186,7 +186,7 @@ JetFile: TupleTypes_ERR.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
TUPLE_TYPE TUPLE_TYPE
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
LABELED_TUPLE_ENTRY LABELED_TUPLE_TYPE_ENTRY
PsiElement(IDENTIFIER)('x') PsiElement(IDENTIFIER)('x')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(COLON)(':') PsiElement(COLON)(':')
@@ -204,7 +204,7 @@ JetFile: TupleTypes_ERR.jet
PsiElement(IDENTIFIER)('Int') PsiElement(IDENTIFIER)('Int')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
LABELED_TUPLE_ENTRY LABELED_TUPLE_TYPE_ENTRY
PsiElement(IDENTIFIER)('y') PsiElement(IDENTIFIER)('y')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(COLON)(':') PsiElement(COLON)(':')
@@ -0,0 +1,2 @@
val foo = (a = 3)
val foo = (a = 3, a)
@@ -0,0 +1,41 @@
JetFile: TuplesWithLabeledEntries.jet
NAMESPACE
PROPERTY
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
TUPLE
PsiElement(LPAR)('(')
LABELED_TUPLE_ENTRY
PsiElement(IDENTIFIER)('a')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('3')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n')
PROPERTY
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
TUPLE
PsiElement(LPAR)('(')
LABELED_TUPLE_ENTRY
PsiElement(IDENTIFIER)('a')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('3')
PsiElement(COMMA)(',')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a')
PsiElement(RPAR)(')')