Labels
This commit is contained in:
@@ -82,7 +82,7 @@ atomicExpression
|
||||
: literalConstant
|
||||
: functionLiteral
|
||||
: tupleLiteral
|
||||
: "this" ("<" type ">")?
|
||||
: "this" label? ("<" type ">")?
|
||||
: if
|
||||
: when
|
||||
: try
|
||||
@@ -97,6 +97,12 @@ atomicExpression
|
||||
: "namespace" // for the root namespace
|
||||
;
|
||||
|
||||
label
|
||||
: "@"
|
||||
: "@@"
|
||||
: LabelName
|
||||
;
|
||||
|
||||
literalConstant
|
||||
: "true" | "false"
|
||||
: StringWithTemplates
|
||||
@@ -163,12 +169,13 @@ prefixUnaryOperation
|
||||
: "++" : "--"
|
||||
: "!" // No ~
|
||||
: attributes // mandatory
|
||||
: label
|
||||
;
|
||||
|
||||
postfixUnaryOperation
|
||||
: "++" : "--"
|
||||
: typeArguments? valueArguments
|
||||
: typeArguments
|
||||
: typeArguments? valueArguments (label? functionLiteral)
|
||||
: typeArguments (label? functionLiteral)
|
||||
: arrayAccess
|
||||
: memberAccessOperation postfixUnaryOperation // TODO: Review
|
||||
;
|
||||
@@ -187,9 +194,9 @@ valueArguments
|
||||
|
||||
jump
|
||||
: "throw" expression
|
||||
: "return" expression?
|
||||
: "continue" stringLiteral?
|
||||
: "break" stringLiteral?
|
||||
: "return" label? expression?
|
||||
: "continue" label?
|
||||
: "break" label?
|
||||
// yield ?
|
||||
;
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
SimpleName : /*java identifier*/;
|
||||
FieldName : "$" SimpleName;
|
||||
LabelName : "@" SimpleName;
|
||||
[helper] Digit : ["0".."9"];
|
||||
IntegerLiteral : Digit+ "L"?
|
||||
[helper] HexDigit : Digit | ["A"-"F", "a"-"f"];
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<lang.parserDefinition language="jet" implementationClass="org.jetbrains.jet.lang.parsing.JetParserDefinition"/>
|
||||
<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.LabelsAnnotator"/>
|
||||
<annotator language="jet" implementationClass="org.jetbrains.jet.lang.annotations.JetPsiChecker"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
||||
|
||||
@@ -37,6 +37,12 @@ public class JetHighlighter extends SyntaxHighlighterBase {
|
||||
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(
|
||||
"JET.NUMBER",
|
||||
SyntaxHighlighterColors.NUMBER.getDefaultAttributes()
|
||||
@@ -74,6 +80,8 @@ public class JetHighlighter extends SyntaxHighlighterBase {
|
||||
|
||||
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.INTEGER_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(
|
||||
// Prefix
|
||||
MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL, LBRACKET,
|
||||
MINUS, PLUS, MINUSMINUS, PLUSPLUS, EXCL, LBRACKET, LABEL_IDENTIFIER, AT, ATAT,
|
||||
// Atomic
|
||||
|
||||
LPAR, // parenthesized
|
||||
@@ -91,7 +91,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
private enum Precedence {
|
||||
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
|
||||
public void parseHigherPrecedence(JetExpressionParsing parser) {
|
||||
@@ -278,8 +278,8 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
*
|
||||
* postfixUnaryOperation
|
||||
* : "++" : "--"
|
||||
* : typeArguments? valueArguments
|
||||
* : typeArguments
|
||||
* : typeArguments? valueArguments (label? functionLiteral)
|
||||
* : typeArguments (label? functionLiteral)
|
||||
* : arrayAccess
|
||||
* : memberAccessOperation postfixUnaryOperation // TODO: Review
|
||||
* ;
|
||||
@@ -354,12 +354,19 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
}
|
||||
|
||||
/*
|
||||
* expression functionLiteral?
|
||||
* expression (label? functionLiteral)?
|
||||
*/
|
||||
protected boolean parseCallWithClosure() {
|
||||
boolean success = false;
|
||||
while (!myBuilder.newlineBeforeCurrentToken() && at(LBRACE)) {
|
||||
parseFunctionLiteral();
|
||||
while (!myBuilder.newlineBeforeCurrentToken()
|
||||
&& (at(LBRACE)
|
||||
|| atSet(LABELS) && lookahead(1) == LBRACE)) {
|
||||
if (!at(LBRACE)) {
|
||||
assert _atSet(LABELS);
|
||||
parsePrefixExpression();
|
||||
} else {
|
||||
parseFunctionLiteral();
|
||||
}
|
||||
success = true;
|
||||
}
|
||||
return success;
|
||||
@@ -368,7 +375,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
/*
|
||||
* atomicExpression
|
||||
* : tupleLiteral // or parenthesized expression
|
||||
* : "this" ("<" type ">")?
|
||||
* : "this" label? ("<" type ">")?
|
||||
* : "typeof" "(" expression ")"
|
||||
* : "new" constructorInvocation
|
||||
* : objectLiteral
|
||||
@@ -1231,13 +1238,8 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
}
|
||||
|
||||
/*
|
||||
* : "continue" stringLiteral?
|
||||
* : "break" stringLiteral?
|
||||
*
|
||||
* stringLiteral
|
||||
* : StringWithTemplates
|
||||
* : NoEscapeString
|
||||
* ;
|
||||
* : "continue" label?
|
||||
* : "break" label?
|
||||
*/
|
||||
private void parseJump(JetNodeType type) {
|
||||
assert _at(BREAK_KEYWORD) || _at(CONTINUE_KEYWORD);
|
||||
@@ -1246,13 +1248,13 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
* "return" expression?
|
||||
* "return" label? expression?
|
||||
*/
|
||||
private void parseReturn() {
|
||||
assert _at(RETURN_KEYWORD);
|
||||
@@ -1261,6 +1263,10 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
|
||||
advance(); // RETURN_KEYWORD
|
||||
|
||||
if (atSet(LABELS)) {
|
||||
advance(); // LABELS
|
||||
}
|
||||
|
||||
if (atSet(EXPRESSION_FIRST) && !at(EOL_OR_SEMICOLON)) parseExpression();
|
||||
|
||||
returnExpression.done(RETURN);
|
||||
@@ -1379,12 +1385,17 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
}
|
||||
|
||||
/*
|
||||
* "this" ("<" type ">")?
|
||||
* "this" label? ("<" type ">")?
|
||||
*/
|
||||
private void parseThisExpression() {
|
||||
assert _at(THIS_KEYWORD);
|
||||
PsiBuilder.Marker mark = mark();
|
||||
advance(); // THIS_KEYWORD
|
||||
|
||||
if (atSet(LABELS)) {
|
||||
advance(); // LABELS
|
||||
}
|
||||
|
||||
if (at(LT)) {
|
||||
// This may be "this < foo" or "this<foo>", thus the backtracking
|
||||
PsiBuilder.Marker supertype = mark();
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jetbrains.jet.lexer.JetTokens;
|
||||
/**
|
||||
* @author max
|
||||
*/
|
||||
public class JetBreakExpression extends JetExpression {
|
||||
public class JetBreakExpression extends JetLabelQualifiedExpression {
|
||||
public JetBreakExpression(@NotNull ASTNode node) {
|
||||
super(node);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jetbrains.jet.lexer.JetTokens;
|
||||
/**
|
||||
* @author max
|
||||
*/
|
||||
public class JetContinueExpression extends JetExpression {
|
||||
public class JetContinueExpression extends JetLabelQualifiedExpression {
|
||||
public JetContinueExpression(@NotNull ASTNode 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
|
||||
*/
|
||||
public class JetReturnExpression extends JetExpression {
|
||||
public class JetReturnExpression extends JetLabelQualifiedExpression {
|
||||
public JetReturnExpression(@NotNull ASTNode node) {
|
||||
super(node);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.jetbrains.jet.JetNodeTypes;
|
||||
/**
|
||||
* @author max
|
||||
*/
|
||||
public class JetThisExpression extends JetExpression {
|
||||
public class JetThisExpression extends JetLabelQualifiedExpression {
|
||||
public JetThisExpression(@NotNull ASTNode node) {
|
||||
super(node);
|
||||
}
|
||||
|
||||
@@ -171,6 +171,10 @@ public class JetVisitor extends PsiElementVisitor {
|
||||
}
|
||||
|
||||
public void visitReturnExpression(JetReturnExpression expression) {
|
||||
visitLabelQualifiedExpression(expression);
|
||||
}
|
||||
|
||||
public void visitLabelQualifiedExpression(JetLabelQualifiedExpression expression) {
|
||||
visitExpression(expression);
|
||||
}
|
||||
|
||||
@@ -179,11 +183,11 @@ public class JetVisitor extends PsiElementVisitor {
|
||||
}
|
||||
|
||||
public void visitBreakExpression(JetBreakExpression expression) {
|
||||
visitExpression(expression);
|
||||
visitLabelQualifiedExpression(expression);
|
||||
}
|
||||
|
||||
public void visitContinueExpression(JetContinueExpression expression) {
|
||||
visitExpression(expression);
|
||||
visitLabelQualifiedExpression(expression);
|
||||
}
|
||||
|
||||
public void visitIfExpression(JetIfExpression expression) {
|
||||
@@ -271,7 +275,7 @@ public class JetVisitor extends PsiElementVisitor {
|
||||
}
|
||||
|
||||
public void visitThisExpression(JetThisExpression expression) {
|
||||
visitExpression(expression);
|
||||
visitLabelQualifiedExpression(expression);
|
||||
}
|
||||
|
||||
public void visitParenthesizedExpression(JetParenthesizedExpression expression) {
|
||||
|
||||
@@ -28,6 +28,7 @@ PLAIN_IDENTIFIER=[:jletter:] [:jletterdigit:]*
|
||||
ESCAPED_IDENTIFIER = `{PLAIN_IDENTIFIER}`
|
||||
IDENTIFIER = {PLAIN_IDENTIFIER}|{ESCAPED_IDENTIFIER}
|
||||
FIELD_IDENTIFIER = \${IDENTIFIER}
|
||||
LABEL_IDENTIFIER = \@{IDENTIFIER}
|
||||
|
||||
BLOCK_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*"
|
||||
// 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> {IDENTIFIER} { return JetTokens.IDENTIFIER; }
|
||||
<YYINITIAL> {LABEL_IDENTIFIER} { return JetTokens.LABEL_IDENTIFIER; }
|
||||
|
||||
<YYINITIAL> "===" { return JetTokens.EQEQEQ ; }
|
||||
<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.DOUBLE_ARROW; }
|
||||
<YYINITIAL> ".." { return JetTokens.RANGE ; }
|
||||
<YYINITIAL> "@@" { return JetTokens.ATAT ; }
|
||||
<YYINITIAL> "[" { return JetTokens.LBRACKET ; }
|
||||
<YYINITIAL> "]" { return JetTokens.RBRACKET ; }
|
||||
<YYINITIAL> "{" { return JetTokens.LBRACE ; }
|
||||
|
||||
@@ -56,6 +56,7 @@ public interface JetTokens {
|
||||
|
||||
|
||||
JetToken IDENTIFIER = new JetToken("IDENTIFIER");
|
||||
JetToken LABEL_IDENTIFIER = new JetToken("LABEL_IDENTIFIER");
|
||||
JetToken FIELD_IDENTIFIER = new JetToken("FIELD_IDENTIFIER");
|
||||
|
||||
JetToken LBRACKET = new JetToken("LBRACKET");
|
||||
@@ -103,6 +104,8 @@ public interface JetTokens {
|
||||
JetToken NOT_IS = JetKeywordToken.keyword("NOT_IS");
|
||||
JetToken HASH = new JetToken("HASH");
|
||||
JetToken AT = new JetToken("AT");
|
||||
JetToken ATAT = new JetToken("ATAT");
|
||||
TokenSet LABELS = TokenSet.create(AT, ATAT, LABEL_IDENTIFIER);
|
||||
|
||||
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,
|
||||
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,
|
||||
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
@@ -3,9 +3,9 @@ fun a(
|
||||
a : foo = throw new Foo,
|
||||
a : foo = return 10,
|
||||
a : foo = break,
|
||||
a : foo = break "la",
|
||||
a : foo = break @la,
|
||||
a : foo = continue,
|
||||
a : foo = continue "la",
|
||||
a : foo = continue @la,
|
||||
a : foo = if (10) foo else bar,
|
||||
a : foo = if (10) foo
|
||||
) {
|
||||
@@ -13,11 +13,11 @@ fun a(
|
||||
return
|
||||
10
|
||||
break
|
||||
"la"
|
||||
break "la"
|
||||
@la
|
||||
break @la
|
||||
continue
|
||||
"la"
|
||||
continue "la"
|
||||
@la
|
||||
continue @la
|
||||
if (foo)
|
||||
if (foo)
|
||||
bar
|
||||
|
||||
@@ -83,7 +83,7 @@ JetFile: ControlStructures.jet
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiElement(COMMA)(',')
|
||||
PsiWhiteSpace('\n ')
|
||||
VALUE_PARAMETER
|
||||
@@ -117,7 +117,7 @@ JetFile: ControlStructures.jet
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiElement(COMMA)(',')
|
||||
PsiWhiteSpace('\n ')
|
||||
VALUE_PARAMETER
|
||||
@@ -197,24 +197,24 @@ JetFile: ControlStructures.jet
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace('\n ')
|
||||
STRING_CONSTANT
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiWhiteSpace('\n ')
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PREFIX_EXPRESSION
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n ')
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n ')
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace('\n ')
|
||||
STRING_CONSTANT
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiWhiteSpace('\n ')
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PREFIX_EXPRESSION
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n ')
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n ')
|
||||
IF
|
||||
PsiElement(if)('if')
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
@@ -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)('}')
|
||||
@@ -27,9 +27,9 @@ fun a(
|
||||
a : foo = throw new Foo,
|
||||
a : foo = return 10,
|
||||
a : foo = break,
|
||||
a : foo = break "la",
|
||||
a : foo = break @la,
|
||||
a : foo = continue,
|
||||
a : foo = continue "la",
|
||||
a : foo = continue @la,
|
||||
a : foo = 10,
|
||||
a : foo = 10,
|
||||
a : foo = 10,
|
||||
@@ -39,9 +39,9 @@ fun a(
|
||||
return
|
||||
10
|
||||
break
|
||||
"la"
|
||||
break "la"
|
||||
@la
|
||||
break @la
|
||||
continue
|
||||
"la"
|
||||
continue "la"
|
||||
@la
|
||||
continue @la
|
||||
}
|
||||
@@ -550,7 +550,7 @@ JetFile: SimpleExpressions.jet
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiElement(COMMA)(',')
|
||||
PsiWhiteSpace('\n ')
|
||||
VALUE_PARAMETER
|
||||
@@ -584,7 +584,7 @@ JetFile: SimpleExpressions.jet
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiElement(COMMA)(',')
|
||||
PsiWhiteSpace('\n ')
|
||||
VALUE_PARAMETER
|
||||
@@ -670,23 +670,23 @@ JetFile: SimpleExpressions.jet
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace('\n ')
|
||||
STRING_CONSTANT
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiWhiteSpace('\n ')
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PREFIX_EXPRESSION
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n ')
|
||||
BREAK
|
||||
PsiElement(break)('break')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n ')
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace('\n ')
|
||||
STRING_CONSTANT
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PsiWhiteSpace('\n ')
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(STRING_LITERAL)('"la"')
|
||||
PREFIX_EXPRESSION
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n ')
|
||||
CONTINUE
|
||||
PsiElement(continue)('continue')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiElement(LABEL_IDENTIFIER)('@la')
|
||||
PsiWhiteSpace('\n')
|
||||
PsiElement(RBRACE)('}')
|
||||
Reference in New Issue
Block a user