This commit is contained in:
Andrey Breslav
2011-02-24 16:01:51 +03:00
parent c2c9f51ca8
commit bfe22843ce
21 changed files with 1086 additions and 530 deletions
+13 -6
View File
@@ -82,7 +82,7 @@ atomicExpression
: literalConstant : literalConstant
: functionLiteral : functionLiteral
: tupleLiteral : tupleLiteral
: "this" ("<" type ">")? : "this" label? ("<" type ">")?
: if : if
: when : when
: try : try
@@ -97,6 +97,12 @@ atomicExpression
: "namespace" // for the root namespace : "namespace" // for the root namespace
; ;
label
: "@"
: "@@"
: LabelName
;
literalConstant literalConstant
: "true" | "false" : "true" | "false"
: StringWithTemplates : StringWithTemplates
@@ -163,12 +169,13 @@ prefixUnaryOperation
: "++" : "--" : "++" : "--"
: "!" // No ~ : "!" // No ~
: attributes // mandatory : attributes // mandatory
: label
; ;
postfixUnaryOperation postfixUnaryOperation
: "++" : "--" : "++" : "--"
: typeArguments? valueArguments : typeArguments? valueArguments (label? functionLiteral)
: typeArguments : typeArguments (label? functionLiteral)
: arrayAccess : arrayAccess
: memberAccessOperation postfixUnaryOperation // TODO: Review : memberAccessOperation postfixUnaryOperation // TODO: Review
; ;
@@ -187,9 +194,9 @@ valueArguments
jump jump
: "throw" expression : "throw" expression
: "return" expression? : "return" label? expression?
: "continue" stringLiteral? : "continue" label?
: "break" stringLiteral? : "break" label?
// yield ? // yield ?
; ;
+1
View File
@@ -1,5 +1,6 @@
SimpleName : /*java identifier*/; SimpleName : /*java identifier*/;
FieldName : "$" SimpleName; FieldName : "$" SimpleName;
LabelName : "@" SimpleName;
[helper] Digit : ["0".."9"]; [helper] Digit : ["0".."9"];
IntegerLiteral : Digit+ "L"? IntegerLiteral : Digit+ "L"?
[helper] HexDigit : Digit | ["A"-"F", "a"-"f"]; [helper] HexDigit : Digit | ["A"-"F", "a"-"f"];
+1
View File
@@ -22,6 +22,7 @@
<lang.parserDefinition language="jet" implementationClass="org.jetbrains.jet.lang.parsing.JetParserDefinition"/> <lang.parserDefinition language="jet" implementationClass="org.jetbrains.jet.lang.parsing.JetParserDefinition"/>
<lang.commenter language="jet" implementationClass="org.jetbrains.jet.plugin.JetCommenter"/> <lang.commenter language="jet" implementationClass="org.jetbrains.jet.plugin.JetCommenter"/>
<annotator language="jet" implementationClass="org.jetbrains.jet.lang.annotations.SoftKeywordsAnnotator"/> <annotator language="jet" implementationClass="org.jetbrains.jet.lang.annotations.SoftKeywordsAnnotator"/>
<annotator language="jet" implementationClass="org.jetbrains.jet.lang.annotations.LabelsAnnotator"/>
<annotator language="jet" implementationClass="org.jetbrains.jet.lang.annotations.JetPsiChecker"/> <annotator language="jet" implementationClass="org.jetbrains.jet.lang.annotations.JetPsiChecker"/>
</extensions> </extensions>
</idea-plugin> </idea-plugin>
@@ -37,6 +37,12 @@ public class JetHighlighter extends SyntaxHighlighterBase {
SyntaxHighlighterColors.KEYWORD.getDefaultAttributes() SyntaxHighlighterColors.KEYWORD.getDefaultAttributes()
); );
public static final TextAttributesKey JET_LABEL_IDENTIFIER = TextAttributesKey.createTextAttributesKey(
"JET.LABEL.IDENTIFIER",
// TODO: proper attributes
SyntaxHighlighterColors.NUMBER.getDefaultAttributes()
);
private static final TextAttributesKey JET_NUMBER = TextAttributesKey.createTextAttributesKey( private static final TextAttributesKey JET_NUMBER = TextAttributesKey.createTextAttributesKey(
"JET.NUMBER", "JET.NUMBER",
SyntaxHighlighterColors.NUMBER.getDefaultAttributes() SyntaxHighlighterColors.NUMBER.getDefaultAttributes()
@@ -74,6 +80,8 @@ public class JetHighlighter extends SyntaxHighlighterBase {
fillMap(keys1, JetTokens.KEYWORDS, JET_KEYWORD); fillMap(keys1, JetTokens.KEYWORDS, JET_KEYWORD);
keys1.put(JetTokens.LABEL_IDENTIFIER, JET_LABEL_IDENTIFIER);
keys1.put(JetTokens.ATAT, JET_LABEL_IDENTIFIER);
keys1.put(JetTokens.FIELD_IDENTIFIER, JET_FIELD_IDENTIFIER); keys1.put(JetTokens.FIELD_IDENTIFIER, JET_FIELD_IDENTIFIER);
keys1.put(JetTokens.INTEGER_LITERAL, JET_NUMBER); keys1.put(JetTokens.INTEGER_LITERAL, JET_NUMBER);
keys1.put(JetTokens.LONG_LITERAL, JET_NUMBER); keys1.put(JetTokens.LONG_LITERAL, JET_NUMBER);
@@ -0,0 +1,36 @@
/*
* @author max
*/
package org.jetbrains.jet.lang.annotations;
import com.intellij.lang.ASTNode;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.Annotator;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.JetHighlighter;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lexer.JetTokens;
public class LabelsAnnotator implements Annotator {
public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) {
element.accept(new JetVisitor() {
@Override
public void visitPrefixExpression(JetPrefixExpression expression) {
ASTNode operationTokenNode = expression.getOperationTokenNode();
if (JetTokens.LABELS.contains(operationTokenNode.getElementType())) {
holder.createInfoAnnotation(operationTokenNode, null).setTextAttributes(JetHighlighter.JET_LABEL_IDENTIFIER);
}
}
@Override
public void visitLabelQualifiedExpression(JetLabelQualifiedExpression expression) {
ASTNode targetLabelNode = expression.getTargetLabelNode();
if (targetLabelNode != null) {
holder.createInfoAnnotation(targetLabelNode, null).setTextAttributes(JetHighlighter.JET_LABEL_IDENTIFIER);
}
}
});
}
}
@@ -34,7 +34,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
private static final TokenSet EXPRESSION_FIRST = TokenSet.orSet(TokenSet.create( private static final TokenSet EXPRESSION_FIRST = TokenSet.orSet(TokenSet.create(
// Prefix // Prefix
MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL, LBRACKET, MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL, LBRACKET, LABEL_IDENTIFIER, AT, ATAT,
// Atomic // Atomic
LPAR, // parenthesized LPAR, // parenthesized
@@ -91,7 +91,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
private enum Precedence { private enum Precedence {
POSTFIX(PLUSPLUS, MINUSMINUS), // typeArguments? valueArguments : typeArguments : arrayAccess POSTFIX(PLUSPLUS, MINUSMINUS), // typeArguments? valueArguments : typeArguments : arrayAccess
PREFIX(MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL) { // attributes PREFIX(MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL, LABEL_IDENTIFIER, AT, ATAT) { // attributes
@Override @Override
public void parseHigherPrecedence(JetExpressionParsing parser) { public void parseHigherPrecedence(JetExpressionParsing parser) {
@@ -278,8 +278,8 @@ public class JetExpressionParsing extends AbstractJetParsing {
* *
* postfixUnaryOperation * postfixUnaryOperation
* : "++" : "--" * : "++" : "--"
* : typeArguments? valueArguments * : typeArguments? valueArguments (label? functionLiteral)
* : typeArguments * : typeArguments (label? functionLiteral)
* : arrayAccess * : arrayAccess
* : memberAccessOperation postfixUnaryOperation // TODO: Review * : memberAccessOperation postfixUnaryOperation // TODO: Review
* ; * ;
@@ -354,12 +354,19 @@ public class JetExpressionParsing extends AbstractJetParsing {
} }
/* /*
* expression functionLiteral? * expression (label? functionLiteral)?
*/ */
protected boolean parseCallWithClosure() { protected boolean parseCallWithClosure() {
boolean success = false; boolean success = false;
while (!myBuilder.newlineBeforeCurrentToken() && at(LBRACE)) { while (!myBuilder.newlineBeforeCurrentToken()
parseFunctionLiteral(); && (at(LBRACE)
|| atSet(LABELS) && lookahead(1) == LBRACE)) {
if (!at(LBRACE)) {
assert _atSet(LABELS);
parsePrefixExpression();
} else {
parseFunctionLiteral();
}
success = true; success = true;
} }
return success; return success;
@@ -368,7 +375,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
/* /*
* atomicExpression * atomicExpression
* : tupleLiteral // or parenthesized expression * : tupleLiteral // or parenthesized expression
* : "this" ("<" type ">")? * : "this" label? ("<" type ">")?
* : "typeof" "(" expression ")" * : "typeof" "(" expression ")"
* : "new" constructorInvocation * : "new" constructorInvocation
* : objectLiteral * : objectLiteral
@@ -1231,13 +1238,8 @@ public class JetExpressionParsing extends AbstractJetParsing {
} }
/* /*
* : "continue" stringLiteral? * : "continue" label?
* : "break" stringLiteral? * : "break" label?
*
* stringLiteral
* : StringWithTemplates
* : NoEscapeString
* ;
*/ */
private void parseJump(JetNodeType type) { private void parseJump(JetNodeType type) {
assert _at(BREAK_KEYWORD) || _at(CONTINUE_KEYWORD); assert _at(BREAK_KEYWORD) || _at(CONTINUE_KEYWORD);
@@ -1246,13 +1248,13 @@ public class JetExpressionParsing extends AbstractJetParsing {
advance(); // BREAK_KEYWORD or CONTINUE_KEYWORD advance(); // BREAK_KEYWORD or CONTINUE_KEYWORD
if (!eol() && (at(RAW_STRING_LITERAL) || at(STRING_LITERAL))) advance(); // RAW_STRING_LITERAL or STRING_LITERAL if (!eol() && atSet(LABELS)) advance(); // LABELS
marker.done(type); marker.done(type);
} }
/* /*
* "return" expression? * "return" label? expression?
*/ */
private void parseReturn() { private void parseReturn() {
assert _at(RETURN_KEYWORD); assert _at(RETURN_KEYWORD);
@@ -1261,6 +1263,10 @@ public class JetExpressionParsing extends AbstractJetParsing {
advance(); // RETURN_KEYWORD advance(); // RETURN_KEYWORD
if (atSet(LABELS)) {
advance(); // LABELS
}
if (atSet(EXPRESSION_FIRST) && !at(EOL_OR_SEMICOLON)) parseExpression(); if (atSet(EXPRESSION_FIRST) && !at(EOL_OR_SEMICOLON)) parseExpression();
returnExpression.done(RETURN); returnExpression.done(RETURN);
@@ -1379,12 +1385,17 @@ public class JetExpressionParsing extends AbstractJetParsing {
} }
/* /*
* "this" ("<" type ">")? * "this" label? ("<" type ">")?
*/ */
private void parseThisExpression() { private void parseThisExpression() {
assert _at(THIS_KEYWORD); assert _at(THIS_KEYWORD);
PsiBuilder.Marker mark = mark(); PsiBuilder.Marker mark = mark();
advance(); // THIS_KEYWORD advance(); // THIS_KEYWORD
if (atSet(LABELS)) {
advance(); // LABELS
}
if (at(LT)) { if (at(LT)) {
// This may be "this < foo" or "this<foo>", thus the backtracking // This may be "this < foo" or "this<foo>", thus the backtracking
PsiBuilder.Marker supertype = mark(); PsiBuilder.Marker supertype = mark();
@@ -9,7 +9,7 @@ import org.jetbrains.jet.lexer.JetTokens;
/** /**
* @author max * @author max
*/ */
public class JetBreakExpression extends JetExpression { public class JetBreakExpression extends JetLabelQualifiedExpression {
public JetBreakExpression(@NotNull ASTNode node) { public JetBreakExpression(@NotNull ASTNode node) {
super(node); super(node);
} }
@@ -9,7 +9,7 @@ import org.jetbrains.jet.lexer.JetTokens;
/** /**
* @author max * @author max
*/ */
public class JetContinueExpression extends JetExpression { public class JetContinueExpression extends JetLabelQualifiedExpression {
public JetContinueExpression(@NotNull ASTNode node) { public JetContinueExpression(@NotNull ASTNode node) {
super(node); super(node);
} }
@@ -0,0 +1,29 @@
package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
/**
* @author abreslav
*/
public class JetLabelQualifiedExpression extends JetExpression {
public JetLabelQualifiedExpression(@NotNull ASTNode node) {
super(node);
}
@Nullable
public JetToken getTargetLabel() {
ASTNode targetLabelNode = getTargetLabelNode();
if (targetLabelNode == null) return null;
return (JetToken) targetLabelNode.getElementType();
}
@Nullable
public ASTNode getTargetLabelNode() {
return getNode().findChildByType(JetTokens.LABELS);
}
}
@@ -7,7 +7,7 @@ import org.jetbrains.annotations.Nullable;
/** /**
* @author max * @author max
*/ */
public class JetReturnExpression extends JetExpression { public class JetReturnExpression extends JetLabelQualifiedExpression {
public JetReturnExpression(@NotNull ASTNode node) { public JetReturnExpression(@NotNull ASTNode node) {
super(node); super(node);
} }
@@ -8,7 +8,7 @@ import org.jetbrains.jet.JetNodeTypes;
/** /**
* @author max * @author max
*/ */
public class JetThisExpression extends JetExpression { public class JetThisExpression extends JetLabelQualifiedExpression {
public JetThisExpression(@NotNull ASTNode node) { public JetThisExpression(@NotNull ASTNode node) {
super(node); super(node);
} }
@@ -171,6 +171,10 @@ public class JetVisitor extends PsiElementVisitor {
} }
public void visitReturnExpression(JetReturnExpression expression) { public void visitReturnExpression(JetReturnExpression expression) {
visitLabelQualifiedExpression(expression);
}
public void visitLabelQualifiedExpression(JetLabelQualifiedExpression expression) {
visitExpression(expression); visitExpression(expression);
} }
@@ -179,11 +183,11 @@ public class JetVisitor extends PsiElementVisitor {
} }
public void visitBreakExpression(JetBreakExpression expression) { public void visitBreakExpression(JetBreakExpression expression) {
visitExpression(expression); visitLabelQualifiedExpression(expression);
} }
public void visitContinueExpression(JetContinueExpression expression) { public void visitContinueExpression(JetContinueExpression expression) {
visitExpression(expression); visitLabelQualifiedExpression(expression);
} }
public void visitIfExpression(JetIfExpression expression) { public void visitIfExpression(JetIfExpression expression) {
@@ -271,7 +275,7 @@ public class JetVisitor extends PsiElementVisitor {
} }
public void visitThisExpression(JetThisExpression expression) { public void visitThisExpression(JetThisExpression expression) {
visitExpression(expression); visitLabelQualifiedExpression(expression);
} }
public void visitParenthesizedExpression(JetParenthesizedExpression expression) { public void visitParenthesizedExpression(JetParenthesizedExpression expression) {
@@ -28,6 +28,7 @@ PLAIN_IDENTIFIER=[:jletter:] [:jletterdigit:]*
ESCAPED_IDENTIFIER = `{PLAIN_IDENTIFIER}` ESCAPED_IDENTIFIER = `{PLAIN_IDENTIFIER}`
IDENTIFIER = {PLAIN_IDENTIFIER}|{ESCAPED_IDENTIFIER} IDENTIFIER = {PLAIN_IDENTIFIER}|{ESCAPED_IDENTIFIER}
FIELD_IDENTIFIER = \${IDENTIFIER} FIELD_IDENTIFIER = \${IDENTIFIER}
LABEL_IDENTIFIER = \@{IDENTIFIER}
BLOCK_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*" BLOCK_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*"
// TODO: Wiki markup for doc comments? // TODO: Wiki markup for doc comments?
@@ -119,6 +120,7 @@ RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
<YYINITIAL> {FIELD_IDENTIFIER} { return JetTokens.FIELD_IDENTIFIER; } <YYINITIAL> {FIELD_IDENTIFIER} { return JetTokens.FIELD_IDENTIFIER; }
<YYINITIAL> {IDENTIFIER} { return JetTokens.IDENTIFIER; } <YYINITIAL> {IDENTIFIER} { return JetTokens.IDENTIFIER; }
<YYINITIAL> {LABEL_IDENTIFIER} { return JetTokens.LABEL_IDENTIFIER; }
<YYINITIAL> "===" { return JetTokens.EQEQEQ ; } <YYINITIAL> "===" { return JetTokens.EQEQEQ ; }
<YYINITIAL> "!==" { return JetTokens.EXCLEQEQEQ; } <YYINITIAL> "!==" { return JetTokens.EXCLEQEQEQ; }
@@ -144,6 +146,7 @@ RAW_STRING_LITERAL = {THREE_QUO} {QUO_STRING_CHAR}* {THREE_QUO}?
<YYINITIAL> "->" { return JetTokens.ARROW ; } <YYINITIAL> "->" { return JetTokens.ARROW ; }
<YYINITIAL> "=>" { return JetTokens.DOUBLE_ARROW; } <YYINITIAL> "=>" { return JetTokens.DOUBLE_ARROW; }
<YYINITIAL> ".." { return JetTokens.RANGE ; } <YYINITIAL> ".." { return JetTokens.RANGE ; }
<YYINITIAL> "@@" { return JetTokens.ATAT ; }
<YYINITIAL> "[" { return JetTokens.LBRACKET ; } <YYINITIAL> "[" { return JetTokens.LBRACKET ; }
<YYINITIAL> "]" { return JetTokens.RBRACKET ; } <YYINITIAL> "]" { return JetTokens.RBRACKET ; }
<YYINITIAL> "{" { return JetTokens.LBRACE ; } <YYINITIAL> "{" { return JetTokens.LBRACE ; }
@@ -56,6 +56,7 @@ public interface JetTokens {
JetToken IDENTIFIER = new JetToken("IDENTIFIER"); JetToken IDENTIFIER = new JetToken("IDENTIFIER");
JetToken LABEL_IDENTIFIER = new JetToken("LABEL_IDENTIFIER");
JetToken FIELD_IDENTIFIER = new JetToken("FIELD_IDENTIFIER"); JetToken FIELD_IDENTIFIER = new JetToken("FIELD_IDENTIFIER");
JetToken LBRACKET = new JetToken("LBRACKET"); JetToken LBRACKET = new JetToken("LBRACKET");
@@ -103,6 +104,8 @@ public interface JetTokens {
JetToken NOT_IS = JetKeywordToken.keyword("NOT_IS"); JetToken NOT_IS = JetKeywordToken.keyword("NOT_IS");
JetToken HASH = new JetToken("HASH"); JetToken HASH = new JetToken("HASH");
JetToken AT = new JetToken("AT"); JetToken AT = new JetToken("AT");
JetToken ATAT = new JetToken("ATAT");
TokenSet LABELS = TokenSet.create(AT, ATAT, LABEL_IDENTIFIER);
JetToken COMMA = new JetToken("COMMA"); JetToken COMMA = new JetToken("COMMA");
@@ -158,5 +161,5 @@ public interface JetTokens {
TokenSet OPERATIONS = TokenSet.create(AS_KEYWORD, IS_KEYWORD, IN_KEYWORD, DOT, PLUSPLUS, MINUSMINUS, MUL, PLUS, TokenSet OPERATIONS = TokenSet.create(AS_KEYWORD, IS_KEYWORD, IN_KEYWORD, DOT, PLUSPLUS, MINUSMINUS, MUL, PLUS,
MINUS, EXCL, DIV, PERC, LT, GT, LTEQ, GTEQ, EQEQEQ, ARROW, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR, MINUS, EXCL, DIV, PERC, LT, GT, LTEQ, GTEQ, EQEQEQ, ARROW, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR,
SAFE_ACCESS, ELVIS, MAP, FILTER, QUEST, COLON, SEMICOLON, RANGE, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ, SAFE_ACCESS, ELVIS, MAP, FILTER, QUEST, COLON, SEMICOLON, RANGE, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ,
NOT_IN, NOT_IS, HASH, IDENTIFIER); NOT_IN, NOT_IS, HASH, IDENTIFIER, LABEL_IDENTIFIER, ATAT, AT);
} }
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -3,9 +3,9 @@ fun a(
a : foo = throw new Foo, a : foo = throw new Foo,
a : foo = return 10, a : foo = return 10,
a : foo = break, a : foo = break,
a : foo = break "la", a : foo = break @la,
a : foo = continue, a : foo = continue,
a : foo = continue "la", a : foo = continue @la,
a : foo = if (10) foo else bar, a : foo = if (10) foo else bar,
a : foo = if (10) foo a : foo = if (10) foo
) { ) {
@@ -13,11 +13,11 @@ fun a(
return return
10 10
break break
"la" @la
break "la" break @la
continue continue
"la" @la
continue "la" continue @la
if (foo) if (foo)
if (foo) if (foo)
bar bar
+16 -16
View File
@@ -83,7 +83,7 @@ JetFile: ControlStructures.jet
BREAK BREAK
PsiElement(break)('break') PsiElement(break)('break')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
VALUE_PARAMETER VALUE_PARAMETER
@@ -117,7 +117,7 @@ JetFile: ControlStructures.jet
CONTINUE CONTINUE
PsiElement(continue)('continue') PsiElement(continue)('continue')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
VALUE_PARAMETER VALUE_PARAMETER
@@ -197,24 +197,24 @@ JetFile: ControlStructures.jet
BREAK BREAK
PsiElement(break)('break') PsiElement(break)('break')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
STRING_CONSTANT PREFIX_EXPRESSION
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
BREAK BREAK
PsiElement(break)('break') PsiElement(break)('break')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
CONTINUE CONTINUE
PsiElement(continue)('continue') PsiElement(continue)('continue')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
STRING_CONSTANT PREFIX_EXPRESSION
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
CONTINUE CONTINUE
PsiElement(continue)('continue') PsiElement(continue)('continue')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
IF IF
PsiElement(if)('if') PsiElement(if)('if')
+60
View File
@@ -0,0 +1,60 @@
fun foo() {
return
return 1
return (@a 1)
return@
return@ 1
return@ (@ 1)
return@ @ 1
return@a
return@a 1
return@a (@a 1)
return@a @a 1
return@@
return@@ 1
return@@ (@@ 1)
return@@ @@ 1
@a return@@
@a return@@ 1
@a return@@ (@@ 1)
@a return@@ @@ 1
break
break@
break@a
break@@
continue
continue@
continue@a
continue@@
a.filter @f{
if (1) return
return@f true
}
a.filter @{
if (1) return
return@ true
}
a.filter @@{
if (1) return
return@@ true
}
this
this@
this@a
this@@
this<A>
this@<A>
this@a<A>
this@@<A>
}
+377
View File
@@ -0,0 +1,377 @@
JetFile: Labels.jet
NAMESPACE
FUN
PsiElement(fun)('fun')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
TYPE_PARAMETER_LIST
<empty list>
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiWhiteSpace(' ')
PARENTHESIZED
PsiElement(LPAR)('(')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n\n ')
RETURN
PsiElement(return)('return')
PsiElement(AT)('@')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(AT)('@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(AT)('@')
PsiWhiteSpace(' ')
PARENTHESIZED
PsiElement(LPAR)('(')
PREFIX_EXPRESSION
PsiElement(AT)('@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(AT)('@')
PsiWhiteSpace(' ')
PREFIX_EXPRESSION
PsiElement(AT)('@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n\n ')
RETURN
PsiElement(return)('return')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
PARENTHESIZED
PsiElement(LPAR)('(')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n\n ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
PARENTHESIZED
PsiElement(LPAR)('(')
PREFIX_EXPRESSION
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
PREFIX_EXPRESSION
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n\n ')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace('\n ')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
PARENTHESIZED
PsiElement(LPAR)('(')
PREFIX_EXPRESSION
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n ')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace(' ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
PREFIX_EXPRESSION
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n\n ')
BREAK
PsiElement(break)('break')
PsiWhiteSpace('\n ')
BREAK
PsiElement(break)('break')
PsiElement(AT)('@')
PsiWhiteSpace('\n ')
BREAK
PsiElement(break)('break')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace('\n ')
BREAK
PsiElement(break)('break')
PsiElement(ATAT)('@@')
PsiWhiteSpace('\n\n ')
CONTINUE
PsiElement(continue)('continue')
PsiWhiteSpace('\n ')
CONTINUE
PsiElement(continue)('continue')
PsiElement(AT)('@')
PsiWhiteSpace('\n ')
CONTINUE
PsiElement(continue)('continue')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace('\n ')
CONTINUE
PsiElement(continue)('continue')
PsiElement(ATAT)('@@')
PsiWhiteSpace('\n\n ')
CALL_EXPRESSION
DOT_QIALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('filter')
PsiWhiteSpace(' ')
PREFIX_EXPRESSION
PsiElement(LABEL_IDENTIFIER)('@f')
FUNCTION_LITERAL
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
BODY
IF
PsiElement(if)('if')
PsiWhiteSpace(' ')
PsiElement(LPAR)('(')
CONDITION
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
THEN
RETURN
PsiElement(return)('return')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(LABEL_IDENTIFIER)('@f')
PsiWhiteSpace(' ')
BOOLEAN_CONSTANT
PsiElement(true)('true')
PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
CALL_EXPRESSION
DOT_QIALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('filter')
PsiWhiteSpace(' ')
PREFIX_EXPRESSION
PsiElement(AT)('@')
FUNCTION_LITERAL
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
BODY
IF
PsiElement(if)('if')
PsiWhiteSpace(' ')
PsiElement(LPAR)('(')
CONDITION
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
THEN
RETURN
PsiElement(return)('return')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(AT)('@')
PsiWhiteSpace(' ')
BOOLEAN_CONSTANT
PsiElement(true)('true')
PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
CALL_EXPRESSION
DOT_QIALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('filter')
PsiWhiteSpace(' ')
PREFIX_EXPRESSION
PsiElement(ATAT)('@@')
FUNCTION_LITERAL
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
BODY
IF
PsiElement(if)('if')
PsiWhiteSpace(' ')
PsiElement(LPAR)('(')
CONDITION
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
THEN
RETURN
PsiElement(return)('return')
PsiWhiteSpace('\n ')
RETURN
PsiElement(return)('return')
PsiElement(ATAT)('@@')
PsiWhiteSpace(' ')
BOOLEAN_CONSTANT
PsiElement(true)('true')
PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiWhiteSpace('\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiElement(AT)('@')
PsiWhiteSpace('\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiWhiteSpace('\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiElement(ATAT)('@@')
PsiWhiteSpace('\n\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiElement(LT)('<')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('A')
PsiElement(GT)('>')
PsiWhiteSpace('\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiElement(AT)('@')
PsiElement(LT)('<')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('A')
PsiElement(GT)('>')
PsiWhiteSpace('\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiElement(LABEL_IDENTIFIER)('@a')
PsiElement(LT)('<')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('A')
PsiElement(GT)('>')
PsiWhiteSpace('\n ')
THIS_EXPRESSION
PsiElement(this)('this')
PsiElement(ATAT)('@@')
PsiElement(LT)('<')
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('A')
PsiElement(GT)('>')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
+6 -6
View File
@@ -27,9 +27,9 @@ fun a(
a : foo = throw new Foo, a : foo = throw new Foo,
a : foo = return 10, a : foo = return 10,
a : foo = break, a : foo = break,
a : foo = break "la", a : foo = break @la,
a : foo = continue, a : foo = continue,
a : foo = continue "la", a : foo = continue @la,
a : foo = 10, a : foo = 10,
a : foo = 10, a : foo = 10,
a : foo = 10, a : foo = 10,
@@ -39,9 +39,9 @@ fun a(
return return
10 10
break break
"la" @la
break "la" break @la
continue continue
"la" @la
continue "la" continue @la
} }
+16 -16
View File
@@ -550,7 +550,7 @@ JetFile: SimpleExpressions.jet
BREAK BREAK
PsiElement(break)('break') PsiElement(break)('break')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
VALUE_PARAMETER VALUE_PARAMETER
@@ -584,7 +584,7 @@ JetFile: SimpleExpressions.jet
CONTINUE CONTINUE
PsiElement(continue)('continue') PsiElement(continue)('continue')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiElement(COMMA)(',') PsiElement(COMMA)(',')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
VALUE_PARAMETER VALUE_PARAMETER
@@ -670,23 +670,23 @@ JetFile: SimpleExpressions.jet
BREAK BREAK
PsiElement(break)('break') PsiElement(break)('break')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
STRING_CONSTANT PREFIX_EXPRESSION
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
BREAK BREAK
PsiElement(break)('break') PsiElement(break)('break')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
CONTINUE CONTINUE
PsiElement(continue)('continue') PsiElement(continue)('continue')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
STRING_CONSTANT PREFIX_EXPRESSION
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
CONTINUE CONTINUE
PsiElement(continue)('continue') PsiElement(continue)('continue')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(STRING_LITERAL)('"la"') PsiElement(LABEL_IDENTIFIER)('@la')
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')