Use switch case statement instead of sequence of if comparisons in parser

This commit is contained in:
Ivan Kochurkin
2022-07-31 22:03:53 +02:00
committed by teamcity
parent 6bb2af142c
commit cf190f0cf2
10 changed files with 526 additions and 348 deletions
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.lexer.KtToken;
public class KDocToken extends KtToken {
public KDocToken(@NotNull @NonNls String debugName) {
super(debugName);
public KDocToken(@NotNull @NonNls String debugName, int tokenId) {
super(debugName, tokenId);
}
}
@@ -50,14 +50,23 @@ public interface KDocTokens {
}
};
KDocToken START = new KDocToken("KDOC_START");
KDocToken END = new KDocToken("KDOC_END");
KDocToken LEADING_ASTERISK = new KDocToken("KDOC_LEADING_ASTERISK");
int START_Id = 0;
int END_Id = 1;
int LEADING_ASTERISK_Id = 2;
int TEXT_Id = 3;
int CODE_BLOCK_TEXT_Id = 4;
int TAG_NAME_Id = 5;
int MARKDOWN_ESCAPED_CHAR_Id = 6;
int MARKDOWN_INLINE_LINK_Id = 7;
KDocToken TEXT = new KDocToken("KDOC_TEXT");
KDocToken CODE_BLOCK_TEXT = new KDocToken("KDOC_CODE_BLOCK_TEXT");
KDocToken START = new KDocToken("KDOC_START", START_Id);
KDocToken END = new KDocToken("KDOC_END", END_Id);
KDocToken LEADING_ASTERISK = new KDocToken("KDOC_LEADING_ASTERISK", LEADING_ASTERISK_Id);
KDocToken TAG_NAME = new KDocToken("KDOC_TAG_NAME");
KDocToken TEXT = new KDocToken("KDOC_TEXT", TEXT_Id);
KDocToken CODE_BLOCK_TEXT = new KDocToken("KDOC_CODE_BLOCK_TEXT", CODE_BLOCK_TEXT_Id);
KDocToken TAG_NAME = new KDocToken("KDOC_TAG_NAME", TAG_NAME_Id);
ILazyParseableElementType MARKDOWN_LINK = new ILazyParseableElementType("KDOC_MARKDOWN_LINK", KotlinLanguage.INSTANCE) {
@Override
public ASTNode parseContents(ASTNode chameleon) {
@@ -65,9 +74,8 @@ public interface KDocTokens {
}
};
KDocToken MARKDOWN_ESCAPED_CHAR = new KDocToken("KDOC_MARKDOWN_ESCAPED_CHAR");
KDocToken MARKDOWN_INLINE_LINK = new KDocToken("KDOC_MARKDOWN_INLINE_LINK");
KDocToken MARKDOWN_ESCAPED_CHAR = new KDocToken("KDOC_MARKDOWN_ESCAPED_CHAR", MARKDOWN_ESCAPED_CHAR_Id);
KDocToken MARKDOWN_INLINE_LINK = new KDocToken("KDOC_MARKDOWN_INLINE_LINK", MARKDOWN_INLINE_LINK_Id);
TokenSet KDOC_HIGHLIGHT_TOKENS = TokenSet.create(START, END, LEADING_ASTERISK, TEXT, CODE_BLOCK_TEXT, MARKDOWN_LINK, MARKDOWN_ESCAPED_CHAR, MARKDOWN_INLINE_LINK);
TokenSet CONTENT_TOKENS = TokenSet.create(TEXT, CODE_BLOCK_TEXT, TAG_NAME, MARKDOWN_LINK, MARKDOWN_ESCAPED_CHAR, MARKDOWN_INLINE_LINK);
}
@@ -24,25 +24,25 @@ public class KtKeywordToken extends KtSingleValueToken {
/**
* Generate keyword (identifier that has a keyword meaning in all possible contexts)
*/
public static KtKeywordToken keyword(String value) {
return keyword(value, value);
public static KtKeywordToken keyword(String value, int tokenId) {
return keyword(value, value, tokenId);
}
public static KtKeywordToken keyword(String debugName, String value) {
return new KtKeywordToken(debugName, value, false);
public static KtKeywordToken keyword(String debugName, String value, int tokenId) {
return new KtKeywordToken(debugName, value, false, tokenId);
}
/**
* Generate soft keyword (identifier that has a keyword meaning only in some contexts)
*/
public static KtKeywordToken softKeyword(String value) {
return new KtKeywordToken(value, value, true);
public static KtKeywordToken softKeyword(String value, int tokenId) {
return new KtKeywordToken(value, value, true, tokenId);
}
private final boolean myIsSoft;
protected KtKeywordToken(@NotNull @NonNls String debugName, @NotNull @NonNls String value, boolean isSoft) {
super(debugName, value);
protected KtKeywordToken(@NotNull @NonNls String debugName, @NotNull @NonNls String value, boolean isSoft, int tokenId) {
super(debugName, value, tokenId);
myIsSoft = isSoft;
}
@@ -25,18 +25,18 @@ public final class KtModifierKeywordToken extends KtKeywordToken {
/**
* Generate keyword (identifier that has a keyword meaning in all possible contexts)
*/
public static KtModifierKeywordToken keywordModifier(String value) {
return new KtModifierKeywordToken(value, value, false);
public static KtModifierKeywordToken keywordModifier(String value, int tokenId) {
return new KtModifierKeywordToken(value, value, false, tokenId);
}
/**
* Generate soft keyword (identifier that has a keyword meaning only in some contexts)
*/
public static KtModifierKeywordToken softKeywordModifier(String value) {
return new KtModifierKeywordToken(value, value, true);
public static KtModifierKeywordToken softKeywordModifier(String value, int tokenId) {
return new KtModifierKeywordToken(value, value, true, tokenId);
}
private KtModifierKeywordToken(@NotNull @NonNls String debugName, @NotNull @NonNls String value, boolean isSoft) {
super(debugName, value, isSoft);
private KtModifierKeywordToken(@NotNull @NonNls String debugName, @NotNull @NonNls String value, boolean isSoft, int tokenId) {
super(debugName, value, isSoft, tokenId);
}
}
@@ -20,11 +20,10 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
public class KtSingleValueToken extends KtToken {
private final String myValue;
public KtSingleValueToken(@NotNull @NonNls String debugName, @NotNull @NonNls String value) {
super(debugName);
public KtSingleValueToken(@NotNull @NonNls String debugName, @NotNull @NonNls String value, int tokenId) {
super(debugName, tokenId);
myValue = value;
}
@@ -22,7 +22,10 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.KotlinLanguage;
public class KtToken extends IElementType {
public KtToken(@NotNull @NonNls String debugName) {
public final int tokenId;
public KtToken(@NotNull @NonNls String debugName, int tokenId) {
super(debugName, KotlinLanguage.INSTANCE);
this.tokenId = tokenId;
}
}
@@ -26,181 +26,331 @@ import static org.jetbrains.kotlin.KtNodeTypes.DOT_QUALIFIED_EXPRESSION;
import static org.jetbrains.kotlin.KtNodeTypes.SAFE_ACCESS_EXPRESSION;
public interface KtTokens {
KtToken EOF = new KtToken("EOF");
int INVALID_Id = 0;
int EOF_Id = 1;
int RESERVED_Id = 2;
int BLOCK_COMMENT_Id = 3;
int EOL_COMMENT_Id = 4;
int SHEBANG_COMMENT_Id = 5;
int INTEGER_LITERAL_Id = 6;
int FLOAT_LITERAL_Id = 7;
int CHARACTER_LITERAL_Id = 8;
int CLOSING_QUOTE_Id = 9;
int OPEN_QUOTE_Id = 10;
int REGULAR_STRING_PART_Id = 11;
int ESCAPE_SEQUENCE_Id = 12;
int SHORT_TEMPLATE_ENTRY_START_Id = 13;
int LONG_TEMPLATE_ENTRY_START_Id = 14;
int LONG_TEMPLATE_ENTRY_END_Id = 15;
int DANGLING_NEWLINE_Id = 16;
int PACKAGE_KEYWORD_Id = 17;
int AS_KEYWORD_Id = 18;
int TYPE_ALIAS_KEYWORD_Id = 19;
int CLASS_KEYWORD_Id = 20;
int THIS_KEYWORD_Id = 21;
int SUPER_KEYWORD_Id = 22;
int VAL_KEYWORD_Id = 23;
int VAR_KEYWORD_Id = 24;
int FUN_KEYWORD_Id = 25;
int FOR_KEYWORD_Id = 26;
int NULL_KEYWORD_Id = 27;
int TRUE_KEYWORD_Id = 28;
int FALSE_KEYWORD_Id = 29;
int IS_KEYWORD_Id = 30;
int IN_KEYWORD_Id = 31;
int THROW_KEYWORD_Id = 32;
int RETURN_KEYWORD_Id = 33;
int BREAK_KEYWORD_Id = 34;
int CONTINUE_KEYWORD_Id = 35;
int OBJECT_KEYWORD_Id = 36;
int IF_KEYWORD_Id = 37;
int TRY_KEYWORD_Id = 38;
int ELSE_KEYWORD_Id = 39;
int WHILE_KEYWORD_Id = 40;
int DO_KEYWORD_Id = 41;
int WHEN_KEYWORD_Id = 42;
int INTERFACE_KEYWORD_Id = 43;
int TYPEOF_KEYWORD_Id = 44;
int AS_SAFE_Id = 45;
int IDENTIFIER_Id = 46;
int FIELD_IDENTIFIER_Id = 47;
int LBRACKET_Id = 48;
int RBRACKET_Id = 49;
int LBRACE_Id = 50;
int RBRACE_Id = 51;
int LPAR_Id = 52;
int RPAR_Id = 53;
int DOT_Id = 54;
int PLUSPLUS_Id = 55;
int MINUSMINUS_Id = 56;
int MUL_Id = 57;
int PLUS_Id = 58;
int MINUS_Id = 59;
int EXCL_Id = 60;
int DIV_Id = 61;
int PERC_Id = 62;
int LT_Id = 63;
int GT_Id = 64;
int LTEQ_Id = 65;
int GTEQ_Id = 66;
int EQEQEQ_Id = 67;
int ARROW_Id = 68;
int DOUBLE_ARROW_Id = 69;
int EXCLEQEQEQ_Id = 70;
int EQEQ_Id = 71;
int EXCLEQ_Id = 72;
int EXCLEXCL_Id = 73;
int ANDAND_Id = 74;
int AND_Id = 75;
int OROR_Id = 76;
int SAFE_ACCESS_Id = 77;
int ELVIS_Id = 78;
int QUEST_Id = 79;
int COLONCOLON_Id = 80;
int COLON_Id = 81;
int SEMICOLON_Id = 82;
int DOUBLE_SEMICOLON_Id = 83;
int RANGE_Id = 84;
int RANGE_UNTIL_Id = 85;
int EQ_Id = 86;
int MULTEQ_Id = 87;
int DIVEQ_Id = 88;
int PERCEQ_Id = 89;
int PLUSEQ_Id = 90;
int MINUSEQ_Id = 91;
int NOT_IN_Id = 92;
int NOT_IS_Id = 93;
int HASH_Id = 94;
int AT_Id = 95;
int COMMA_Id = 96;
int EOL_OR_SEMICOLON_Id = 97;
int FILE_KEYWORD_Id = 98;
int FIELD_KEYWORD_Id = 99;
int PROPERTY_KEYWORD_Id = 100;
int RECEIVER_KEYWORD_Id = 101;
int PARAM_KEYWORD_Id = 102;
int SETPARAM_KEYWORD_Id = 103;
int DELEGATE_KEYWORD_Id = 104;
int IMPORT_KEYWORD_Id = 105;
int WHERE_KEYWORD_Id = 106;
int BY_KEYWORD_Id = 107;
int GET_KEYWORD_Id = 108;
int SET_KEYWORD_Id = 109;
int CONSTRUCTOR_KEYWORD_Id = 110;
int INIT_KEYWORD_Id = 111;
int CONTEXT_KEYWORD_Id = 112;
int ABSTRACT_KEYWORD_Id = 113;
int ENUM_KEYWORD_Id = 114;
int CONTRACT_KEYWORD_Id = 115;
int OPEN_KEYWORD_Id = 116;
int INNER_KEYWORD_Id = 117;
int OVERRIDE_KEYWORD_Id = 118;
int PRIVATE_KEYWORD_Id = 119;
int PUBLIC_KEYWORD_Id = 120;
int INTERNAL_KEYWORD_Id = 121;
int PROTECTED_KEYWORD_Id = 122;
int CATCH_KEYWORD_Id = 123;
int OUT_KEYWORD_Id = 124;
int VARARG_KEYWORD_Id = 125;
int REIFIED_KEYWORD_Id = 126;
int DYNAMIC_KEYWORD_Id = 127;
int COMPANION_KEYWORD_Id = 128;
int SEALED_KEYWORD_Id = 129;
int FINALLY_KEYWORD_Id = 130;
int FINAL_KEYWORD_Id = 131;
int LATEINIT_KEYWORD_Id = 132;
int DATA_KEYWORD_Id = 133;
int VALUE_KEYWORD_Id = 134;
int INLINE_KEYWORD_Id = 135;
int NOINLINE_KEYWORD_Id = 136;
int TAILREC_KEYWORD_Id = 137;
int EXTERNAL_KEYWORD_Id = 138;
int ANNOTATION_KEYWORD_Id = 139;
int CROSSINLINE_KEYWORD_Id = 140;
int OPERATOR_KEYWORD_Id = 141;
int INFIX_KEYWORD_Id = 142;
int CONST_KEYWORD_Id = 143;
int SUSPEND_KEYWORD_Id = 144;
int HEADER_KEYWORD_Id = 145;
int IMPL_KEYWORD_Id = 146;
int EXPECT_KEYWORD_Id = 147;
int ACTUAL_KEYWORD_Id = 148;
KtToken RESERVED = new KtToken("RESERVED");
KtToken EOF = new KtToken("EOF", EOF_Id);
KtToken BLOCK_COMMENT = new KtToken("BLOCK_COMMENT");
KtToken EOL_COMMENT = new KtToken("EOL_COMMENT");
KtToken SHEBANG_COMMENT = new KtToken("SHEBANG_COMMENT");
KtToken RESERVED = new KtToken("RESERVED", RESERVED_Id);
KtToken BLOCK_COMMENT = new KtToken("BLOCK_COMMENT", BLOCK_COMMENT_Id);
KtToken EOL_COMMENT = new KtToken("EOL_COMMENT", EOL_COMMENT_Id);
KtToken SHEBANG_COMMENT = new KtToken("SHEBANG_COMMENT", SHEBANG_COMMENT_Id);
//KtToken DOC_COMMENT = new KtToken("DOC_COMMENT");
IElementType DOC_COMMENT = KDocTokens.KDOC;
IElementType WHITE_SPACE = TokenType.WHITE_SPACE;
KtToken INTEGER_LITERAL = new KtToken("INTEGER_LITERAL");
KtToken FLOAT_LITERAL = new KtToken("FLOAT_CONSTANT");
KtToken CHARACTER_LITERAL = new KtToken("CHARACTER_LITERAL");
KtToken INTEGER_LITERAL = new KtToken("INTEGER_LITERAL", INTEGER_LITERAL_Id);
KtToken FLOAT_LITERAL = new KtToken("FLOAT_CONSTANT", FLOAT_LITERAL_Id);
KtToken CHARACTER_LITERAL = new KtToken("CHARACTER_LITERAL", CHARACTER_LITERAL_Id);
KtToken CLOSING_QUOTE = new KtToken("CLOSING_QUOTE");
KtToken OPEN_QUOTE = new KtToken("OPEN_QUOTE");
KtToken REGULAR_STRING_PART = new KtToken("REGULAR_STRING_PART");
KtToken ESCAPE_SEQUENCE = new KtToken("ESCAPE_SEQUENCE");
KtToken SHORT_TEMPLATE_ENTRY_START = new KtToken("SHORT_TEMPLATE_ENTRY_START");
KtToken LONG_TEMPLATE_ENTRY_START = new KtToken("LONG_TEMPLATE_ENTRY_START");
KtToken LONG_TEMPLATE_ENTRY_END = new KtToken("LONG_TEMPLATE_ENTRY_END");
KtToken DANGLING_NEWLINE = new KtToken("DANGLING_NEWLINE");
KtToken CLOSING_QUOTE = new KtToken("CLOSING_QUOTE", CLOSING_QUOTE_Id);
KtToken OPEN_QUOTE = new KtToken("OPEN_QUOTE", OPEN_QUOTE_Id);
KtToken REGULAR_STRING_PART = new KtToken("REGULAR_STRING_PART", REGULAR_STRING_PART_Id);
KtToken ESCAPE_SEQUENCE = new KtToken("ESCAPE_SEQUENCE", ESCAPE_SEQUENCE_Id);
KtToken SHORT_TEMPLATE_ENTRY_START = new KtToken("SHORT_TEMPLATE_ENTRY_START", SHORT_TEMPLATE_ENTRY_START_Id);
KtToken LONG_TEMPLATE_ENTRY_START = new KtToken("LONG_TEMPLATE_ENTRY_START", LONG_TEMPLATE_ENTRY_START_Id);
KtToken LONG_TEMPLATE_ENTRY_END = new KtToken("LONG_TEMPLATE_ENTRY_END", LONG_TEMPLATE_ENTRY_END_Id);
KtToken DANGLING_NEWLINE = new KtToken("DANGLING_NEWLINE", DANGLING_NEWLINE_Id);
KtKeywordToken PACKAGE_KEYWORD = KtKeywordToken.keyword("package");
KtKeywordToken AS_KEYWORD = KtKeywordToken.keyword("as");
KtKeywordToken TYPE_ALIAS_KEYWORD = KtKeywordToken.keyword("typealias");
KtKeywordToken CLASS_KEYWORD = KtKeywordToken.keyword("class");
KtKeywordToken THIS_KEYWORD = KtKeywordToken.keyword("this");
KtKeywordToken SUPER_KEYWORD = KtKeywordToken.keyword("super");
KtKeywordToken VAL_KEYWORD = KtKeywordToken.keyword("val");
KtKeywordToken VAR_KEYWORD = KtKeywordToken.keyword("var");
KtModifierKeywordToken FUN_KEYWORD = KtModifierKeywordToken.keywordModifier("fun");
KtKeywordToken FOR_KEYWORD = KtKeywordToken.keyword("for");
KtKeywordToken NULL_KEYWORD = KtKeywordToken.keyword("null");
KtKeywordToken TRUE_KEYWORD = KtKeywordToken.keyword("true");
KtKeywordToken FALSE_KEYWORD = KtKeywordToken.keyword("false");
KtKeywordToken IS_KEYWORD = KtKeywordToken.keyword("is");
KtModifierKeywordToken IN_KEYWORD = KtModifierKeywordToken.keywordModifier("in");
KtKeywordToken THROW_KEYWORD = KtKeywordToken.keyword("throw");
KtKeywordToken RETURN_KEYWORD = KtKeywordToken.keyword("return");
KtKeywordToken BREAK_KEYWORD = KtKeywordToken.keyword("break");
KtKeywordToken CONTINUE_KEYWORD = KtKeywordToken.keyword("continue");
KtKeywordToken OBJECT_KEYWORD = KtKeywordToken.keyword("object");
KtKeywordToken IF_KEYWORD = KtKeywordToken.keyword("if");
KtKeywordToken TRY_KEYWORD = KtKeywordToken.keyword("try");
KtKeywordToken ELSE_KEYWORD = KtKeywordToken.keyword("else");
KtKeywordToken WHILE_KEYWORD = KtKeywordToken.keyword("while");
KtKeywordToken DO_KEYWORD = KtKeywordToken.keyword("do");
KtKeywordToken WHEN_KEYWORD = KtKeywordToken.keyword("when");
KtKeywordToken INTERFACE_KEYWORD = KtKeywordToken.keyword("interface");
KtKeywordToken PACKAGE_KEYWORD = KtKeywordToken.keyword("package", PACKAGE_KEYWORD_Id);
KtKeywordToken AS_KEYWORD = KtKeywordToken.keyword("as", AS_KEYWORD_Id);
KtKeywordToken TYPE_ALIAS_KEYWORD = KtKeywordToken.keyword("typealias", TYPE_ALIAS_KEYWORD_Id);
KtKeywordToken CLASS_KEYWORD = KtKeywordToken.keyword("class", CLASS_KEYWORD_Id);
KtKeywordToken THIS_KEYWORD = KtKeywordToken.keyword("this", THIS_KEYWORD_Id);
KtKeywordToken SUPER_KEYWORD = KtKeywordToken.keyword("super", SUPER_KEYWORD_Id);
KtKeywordToken VAL_KEYWORD = KtKeywordToken.keyword("val", VAL_KEYWORD_Id);
KtKeywordToken VAR_KEYWORD = KtKeywordToken.keyword("var", VAR_KEYWORD_Id);
KtModifierKeywordToken FUN_KEYWORD = KtModifierKeywordToken.keywordModifier("fun", FUN_KEYWORD_Id);
KtKeywordToken FOR_KEYWORD = KtKeywordToken.keyword("for", FOR_KEYWORD_Id);
KtKeywordToken NULL_KEYWORD = KtKeywordToken.keyword("null", NULL_KEYWORD_Id);
KtKeywordToken TRUE_KEYWORD = KtKeywordToken.keyword("true", TRUE_KEYWORD_Id);
KtKeywordToken FALSE_KEYWORD = KtKeywordToken.keyword("false", FALSE_KEYWORD_Id);
KtKeywordToken IS_KEYWORD = KtKeywordToken.keyword("is", IS_KEYWORD_Id);
KtModifierKeywordToken IN_KEYWORD = KtModifierKeywordToken.keywordModifier("in", IN_KEYWORD_Id);
KtKeywordToken THROW_KEYWORD = KtKeywordToken.keyword("throw", THROW_KEYWORD_Id);
KtKeywordToken RETURN_KEYWORD = KtKeywordToken.keyword("return", RETURN_KEYWORD_Id);
KtKeywordToken BREAK_KEYWORD = KtKeywordToken.keyword("break", BREAK_KEYWORD_Id);
KtKeywordToken CONTINUE_KEYWORD = KtKeywordToken.keyword("continue", CONTINUE_KEYWORD_Id);
KtKeywordToken OBJECT_KEYWORD = KtKeywordToken.keyword("object", OBJECT_KEYWORD_Id);
KtKeywordToken IF_KEYWORD = KtKeywordToken.keyword("if", IF_KEYWORD_Id);
KtKeywordToken TRY_KEYWORD = KtKeywordToken.keyword("try", TRY_KEYWORD_Id);
KtKeywordToken ELSE_KEYWORD = KtKeywordToken.keyword("else", ELSE_KEYWORD_Id);
KtKeywordToken WHILE_KEYWORD = KtKeywordToken.keyword("while", WHILE_KEYWORD_Id);
KtKeywordToken DO_KEYWORD = KtKeywordToken.keyword("do", DO_KEYWORD_Id);
KtKeywordToken WHEN_KEYWORD = KtKeywordToken.keyword("when", WHEN_KEYWORD_Id);
KtKeywordToken INTERFACE_KEYWORD = KtKeywordToken.keyword("interface", INTERFACE_KEYWORD_Id);
// Reserved for future use:
KtKeywordToken TYPEOF_KEYWORD = KtKeywordToken.keyword("typeof");
KtKeywordToken TYPEOF_KEYWORD = KtKeywordToken.keyword("typeof", TYPEOF_KEYWORD_Id);
KtToken AS_SAFE = KtKeywordToken.keyword("AS_SAFE");//new KtToken("as?");
KtToken AS_SAFE = KtKeywordToken.keyword("AS_SAFE", AS_SAFE_Id);
KtToken IDENTIFIER = new KtToken("IDENTIFIER");
KtToken IDENTIFIER = new KtToken("IDENTIFIER", IDENTIFIER_Id);
KtToken FIELD_IDENTIFIER = new KtToken("FIELD_IDENTIFIER");
KtSingleValueToken LBRACKET = new KtSingleValueToken("LBRACKET", "[");
KtSingleValueToken RBRACKET = new KtSingleValueToken("RBRACKET", "]");
KtSingleValueToken LBRACE = new KtSingleValueToken("LBRACE", "{");
KtSingleValueToken RBRACE = new KtSingleValueToken("RBRACE", "}");
KtSingleValueToken LPAR = new KtSingleValueToken("LPAR", "(");
KtSingleValueToken RPAR = new KtSingleValueToken("RPAR", ")");
KtSingleValueToken DOT = new KtSingleValueToken("DOT", ".");
KtSingleValueToken PLUSPLUS = new KtSingleValueToken("PLUSPLUS", "++");
KtSingleValueToken MINUSMINUS = new KtSingleValueToken("MINUSMINUS", "--");
KtSingleValueToken MUL = new KtSingleValueToken("MUL", "*");
KtSingleValueToken PLUS = new KtSingleValueToken("PLUS", "+");
KtSingleValueToken MINUS = new KtSingleValueToken("MINUS", "-");
KtSingleValueToken EXCL = new KtSingleValueToken("EXCL", "!");
KtSingleValueToken DIV = new KtSingleValueToken("DIV", "/");
KtSingleValueToken PERC = new KtSingleValueToken("PERC", "%");
KtSingleValueToken LT = new KtSingleValueToken("LT", "<");
KtSingleValueToken GT = new KtSingleValueToken("GT", ">");
KtSingleValueToken LTEQ = new KtSingleValueToken("LTEQ", "<=");
KtSingleValueToken GTEQ = new KtSingleValueToken("GTEQ", ">=");
KtSingleValueToken EQEQEQ = new KtSingleValueToken("EQEQEQ", "===");
KtSingleValueToken ARROW = new KtSingleValueToken("ARROW", "->");
KtSingleValueToken DOUBLE_ARROW = new KtSingleValueToken("DOUBLE_ARROW", "=>");
KtSingleValueToken EXCLEQEQEQ = new KtSingleValueToken("EXCLEQEQEQ", "!==");
KtSingleValueToken EQEQ = new KtSingleValueToken("EQEQ", "==");
KtSingleValueToken EXCLEQ = new KtSingleValueToken("EXCLEQ", "!=");
KtSingleValueToken EXCLEXCL = new KtSingleValueToken("EXCLEXCL", "!!");
KtSingleValueToken ANDAND = new KtSingleValueToken("ANDAND", "&&");
KtSingleValueToken AND = new KtSingleValueToken("AND", "&");
KtSingleValueToken OROR = new KtSingleValueToken("OROR", "||");
KtSingleValueToken SAFE_ACCESS = new KtSingleValueToken("SAFE_ACCESS", "?.");
KtSingleValueToken ELVIS = new KtSingleValueToken("ELVIS", "?:");
KtSingleValueToken QUEST = new KtSingleValueToken("QUEST", "?");
KtSingleValueToken COLONCOLON = new KtSingleValueToken("COLONCOLON", "::");
KtSingleValueToken COLON = new KtSingleValueToken("COLON", ":");
KtSingleValueToken SEMICOLON = new KtSingleValueToken("SEMICOLON", ";");
KtSingleValueToken DOUBLE_SEMICOLON = new KtSingleValueToken("DOUBLE_SEMICOLON", ";;");
KtSingleValueToken RANGE = new KtSingleValueToken("RANGE", "..");
KtSingleValueToken RANGE_UNTIL = new KtSingleValueToken("RANGE_UNTIL", "..<");
KtSingleValueToken EQ = new KtSingleValueToken("EQ", "=");
KtSingleValueToken MULTEQ = new KtSingleValueToken("MULTEQ", "*=");
KtSingleValueToken DIVEQ = new KtSingleValueToken("DIVEQ", "/=");
KtSingleValueToken PERCEQ = new KtSingleValueToken("PERCEQ", "%=");
KtSingleValueToken PLUSEQ = new KtSingleValueToken("PLUSEQ", "+=");
KtSingleValueToken MINUSEQ = new KtSingleValueToken("MINUSEQ", "-=");
KtKeywordToken NOT_IN = KtKeywordToken.keyword("NOT_IN", "!in");
KtKeywordToken NOT_IS = KtKeywordToken.keyword("NOT_IS", "!is");
KtSingleValueToken HASH = new KtSingleValueToken("HASH", "#");
KtSingleValueToken AT = new KtSingleValueToken("AT", "@");
KtToken FIELD_IDENTIFIER = new KtToken("FIELD_IDENTIFIER", FIELD_IDENTIFIER_Id);
KtSingleValueToken LBRACKET = new KtSingleValueToken("LBRACKET", "[", LBRACKET_Id);
KtSingleValueToken RBRACKET = new KtSingleValueToken("RBRACKET", "]", RBRACKET_Id);
KtSingleValueToken LBRACE = new KtSingleValueToken("LBRACE", "{", LBRACE_Id);
KtSingleValueToken RBRACE = new KtSingleValueToken("RBRACE", "}", RBRACE_Id);
KtSingleValueToken LPAR = new KtSingleValueToken("LPAR", "(", LPAR_Id);
KtSingleValueToken RPAR = new KtSingleValueToken("RPAR", ")", RPAR_Id);
KtSingleValueToken DOT = new KtSingleValueToken("DOT", ".", DOT_Id);
KtSingleValueToken PLUSPLUS = new KtSingleValueToken("PLUSPLUS", "++", PLUSPLUS_Id);
KtSingleValueToken MINUSMINUS = new KtSingleValueToken("MINUSMINUS", "--", MINUSMINUS_Id);
KtSingleValueToken MUL = new KtSingleValueToken("MUL", "*", MUL_Id);
KtSingleValueToken PLUS = new KtSingleValueToken("PLUS", "+", PLUS_Id);
KtSingleValueToken MINUS = new KtSingleValueToken("MINUS", "-", MINUS_Id);
KtSingleValueToken EXCL = new KtSingleValueToken("EXCL", "!", EXCL_Id);
KtSingleValueToken DIV = new KtSingleValueToken("DIV", "/", DIV_Id);
KtSingleValueToken PERC = new KtSingleValueToken("PERC", "%", PERC_Id);
KtSingleValueToken LT = new KtSingleValueToken("LT", "<", LT_Id);
KtSingleValueToken GT = new KtSingleValueToken("GT", ">", GT_Id);
KtSingleValueToken LTEQ = new KtSingleValueToken("LTEQ", "<=", LTEQ_Id);
KtSingleValueToken GTEQ = new KtSingleValueToken("GTEQ", ">=", GTEQ_Id);
KtSingleValueToken EQEQEQ = new KtSingleValueToken("EQEQEQ", "===", EQEQEQ_Id);
KtSingleValueToken ARROW = new KtSingleValueToken("ARROW", "->", ARROW_Id);
KtSingleValueToken DOUBLE_ARROW = new KtSingleValueToken("DOUBLE_ARROW", "=>", DOUBLE_ARROW_Id);
KtSingleValueToken EXCLEQEQEQ = new KtSingleValueToken("EXCLEQEQEQ", "!==", EXCLEQEQEQ_Id);
KtSingleValueToken EQEQ = new KtSingleValueToken("EQEQ", "==", EQEQ_Id);
KtSingleValueToken EXCLEQ = new KtSingleValueToken("EXCLEQ", "!=", EXCLEQ_Id);
KtSingleValueToken EXCLEXCL = new KtSingleValueToken("EXCLEXCL", "!!", EXCLEXCL_Id);
KtSingleValueToken ANDAND = new KtSingleValueToken("ANDAND", "&&", ANDAND_Id);
KtSingleValueToken AND = new KtSingleValueToken("AND", "&", AND_Id);
KtSingleValueToken OROR = new KtSingleValueToken("OROR", "||", OROR_Id);
KtSingleValueToken SAFE_ACCESS = new KtSingleValueToken("SAFE_ACCESS", "?.", SAFE_ACCESS_Id);
KtSingleValueToken ELVIS = new KtSingleValueToken("ELVIS", "?:", ELVIS_Id);
KtSingleValueToken QUEST = new KtSingleValueToken("QUEST", "?", QUEST_Id);
KtSingleValueToken COLONCOLON = new KtSingleValueToken("COLONCOLON", "::", COLONCOLON_Id);
KtSingleValueToken COLON = new KtSingleValueToken("COLON", ":", COLON_Id);
KtSingleValueToken SEMICOLON = new KtSingleValueToken("SEMICOLON", ";", SEMICOLON_Id);
KtSingleValueToken DOUBLE_SEMICOLON = new KtSingleValueToken("DOUBLE_SEMICOLON", ";;", DOUBLE_SEMICOLON_Id);
KtSingleValueToken RANGE = new KtSingleValueToken("RANGE", "..", RANGE_Id);
KtSingleValueToken RANGE_UNTIL = new KtSingleValueToken("RANGE_UNTIL", "..<", RANGE_UNTIL_Id);
KtSingleValueToken EQ = new KtSingleValueToken("EQ", "=", EQ_Id);
KtSingleValueToken MULTEQ = new KtSingleValueToken("MULTEQ", "*=", MULTEQ_Id);
KtSingleValueToken DIVEQ = new KtSingleValueToken("DIVEQ", "/=", DIVEQ_Id);
KtSingleValueToken PERCEQ = new KtSingleValueToken("PERCEQ", "%=", PERCEQ_Id);
KtSingleValueToken PLUSEQ = new KtSingleValueToken("PLUSEQ", "+=", PLUSEQ_Id);
KtSingleValueToken MINUSEQ = new KtSingleValueToken("MINUSEQ", "-=", MINUSEQ_Id);
KtKeywordToken NOT_IN = KtKeywordToken.keyword("NOT_IN", "!in", NOT_IN_Id);
KtKeywordToken NOT_IS = KtKeywordToken.keyword("NOT_IS", "!is", NOT_IS_Id);
KtSingleValueToken HASH = new KtSingleValueToken("HASH", "#", HASH_Id);
KtSingleValueToken AT = new KtSingleValueToken("AT", "@", AT_Id);
KtSingleValueToken COMMA = new KtSingleValueToken("COMMA", ",");
KtSingleValueToken COMMA = new KtSingleValueToken("COMMA", ",", COMMA_Id);
KtToken EOL_OR_SEMICOLON = new KtToken("EOL_OR_SEMICOLON");
KtKeywordToken FILE_KEYWORD = KtKeywordToken.softKeyword("file");
KtKeywordToken FIELD_KEYWORD = KtKeywordToken.softKeyword("field");
KtKeywordToken PROPERTY_KEYWORD = KtKeywordToken.softKeyword("property");
KtKeywordToken RECEIVER_KEYWORD = KtKeywordToken.softKeyword("receiver");
KtKeywordToken PARAM_KEYWORD = KtKeywordToken.softKeyword("param");
KtKeywordToken SETPARAM_KEYWORD = KtKeywordToken.softKeyword("setparam");
KtKeywordToken DELEGATE_KEYWORD = KtKeywordToken.softKeyword("delegate");
KtKeywordToken IMPORT_KEYWORD = KtKeywordToken.softKeyword("import");
KtKeywordToken WHERE_KEYWORD = KtKeywordToken.softKeyword("where");
KtKeywordToken BY_KEYWORD = KtKeywordToken.softKeyword("by");
KtKeywordToken GET_KEYWORD = KtKeywordToken.softKeyword("get");
KtKeywordToken SET_KEYWORD = KtKeywordToken.softKeyword("set");
KtKeywordToken CONSTRUCTOR_KEYWORD = KtKeywordToken.softKeyword("constructor");
KtKeywordToken INIT_KEYWORD = KtKeywordToken.softKeyword("init");
KtKeywordToken CONTEXT_KEYWORD = KtKeywordToken.softKeyword("context");
KtToken EOL_OR_SEMICOLON = new KtToken("EOL_OR_SEMICOLON", EOL_OR_SEMICOLON_Id);
KtKeywordToken FILE_KEYWORD = KtKeywordToken.softKeyword("file", FILE_KEYWORD_Id);
KtKeywordToken FIELD_KEYWORD = KtKeywordToken.softKeyword("field", FIELD_KEYWORD_Id);
KtKeywordToken PROPERTY_KEYWORD = KtKeywordToken.softKeyword("property", PROPERTY_KEYWORD_Id);
KtKeywordToken RECEIVER_KEYWORD = KtKeywordToken.softKeyword("receiver", RECEIVER_KEYWORD_Id);
KtKeywordToken PARAM_KEYWORD = KtKeywordToken.softKeyword("param", PARAM_KEYWORD_Id);
KtKeywordToken SETPARAM_KEYWORD = KtKeywordToken.softKeyword("setparam", SETPARAM_KEYWORD_Id);
KtKeywordToken DELEGATE_KEYWORD = KtKeywordToken.softKeyword("delegate", DELEGATE_KEYWORD_Id);
KtKeywordToken IMPORT_KEYWORD = KtKeywordToken.softKeyword("import", IMPORT_KEYWORD_Id);
KtKeywordToken WHERE_KEYWORD = KtKeywordToken.softKeyword("where", WHERE_KEYWORD_Id);
KtKeywordToken BY_KEYWORD = KtKeywordToken.softKeyword("by", BY_KEYWORD_Id);
KtKeywordToken GET_KEYWORD = KtKeywordToken.softKeyword("get", GET_KEYWORD_Id);
KtKeywordToken SET_KEYWORD = KtKeywordToken.softKeyword("set", SET_KEYWORD_Id);
KtKeywordToken CONSTRUCTOR_KEYWORD = KtKeywordToken.softKeyword("constructor", CONSTRUCTOR_KEYWORD_Id);
KtKeywordToken INIT_KEYWORD = KtKeywordToken.softKeyword("init", INIT_KEYWORD_Id);
KtKeywordToken CONTEXT_KEYWORD = KtKeywordToken.softKeyword("context", CONTEXT_KEYWORD_Id);
KtModifierKeywordToken ABSTRACT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("abstract");
KtModifierKeywordToken ENUM_KEYWORD = KtModifierKeywordToken.softKeywordModifier("enum");
KtModifierKeywordToken CONTRACT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("contract");
KtModifierKeywordToken OPEN_KEYWORD = KtModifierKeywordToken.softKeywordModifier("open");
KtModifierKeywordToken INNER_KEYWORD = KtModifierKeywordToken.softKeywordModifier("inner");
KtModifierKeywordToken OVERRIDE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("override");
KtModifierKeywordToken PRIVATE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("private");
KtModifierKeywordToken PUBLIC_KEYWORD = KtModifierKeywordToken.softKeywordModifier("public");
KtModifierKeywordToken INTERNAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("internal");
KtModifierKeywordToken PROTECTED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("protected");
KtKeywordToken CATCH_KEYWORD = KtKeywordToken.softKeyword("catch");
KtModifierKeywordToken OUT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("out");
KtModifierKeywordToken VARARG_KEYWORD = KtModifierKeywordToken.softKeywordModifier("vararg");
KtModifierKeywordToken REIFIED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("reified");
KtKeywordToken DYNAMIC_KEYWORD = KtKeywordToken.softKeyword("dynamic");
KtModifierKeywordToken COMPANION_KEYWORD = KtModifierKeywordToken.softKeywordModifier("companion");
KtModifierKeywordToken SEALED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("sealed");
KtModifierKeywordToken ABSTRACT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("abstract", ABSTRACT_KEYWORD_Id);
KtModifierKeywordToken ENUM_KEYWORD = KtModifierKeywordToken.softKeywordModifier("enum", ENUM_KEYWORD_Id);
KtModifierKeywordToken CONTRACT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("contract", CONTRACT_KEYWORD_Id);
KtModifierKeywordToken OPEN_KEYWORD = KtModifierKeywordToken.softKeywordModifier("open", OPEN_KEYWORD_Id);
KtModifierKeywordToken INNER_KEYWORD = KtModifierKeywordToken.softKeywordModifier("inner", INNER_KEYWORD_Id);
KtModifierKeywordToken OVERRIDE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("override", OVERRIDE_KEYWORD_Id);
KtModifierKeywordToken PRIVATE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("private", PRIVATE_KEYWORD_Id);
KtModifierKeywordToken PUBLIC_KEYWORD = KtModifierKeywordToken.softKeywordModifier("public", PUBLIC_KEYWORD_Id);
KtModifierKeywordToken INTERNAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("internal", INTERNAL_KEYWORD_Id);
KtModifierKeywordToken PROTECTED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("protected", PROTECTED_KEYWORD_Id);
KtKeywordToken CATCH_KEYWORD = KtKeywordToken.softKeyword("catch", CATCH_KEYWORD_Id);
KtModifierKeywordToken OUT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("out", OUT_KEYWORD_Id);
KtModifierKeywordToken VARARG_KEYWORD = KtModifierKeywordToken.softKeywordModifier("vararg", VARARG_KEYWORD_Id);
KtModifierKeywordToken REIFIED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("reified", REIFIED_KEYWORD_Id);
KtKeywordToken DYNAMIC_KEYWORD = KtKeywordToken.softKeyword("dynamic", DYNAMIC_KEYWORD_Id);
KtModifierKeywordToken COMPANION_KEYWORD = KtModifierKeywordToken.softKeywordModifier("companion", COMPANION_KEYWORD_Id);
KtModifierKeywordToken SEALED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("sealed", SEALED_KEYWORD_Id);
KtModifierKeywordToken DEFAULT_VISIBILITY_KEYWORD = PUBLIC_KEYWORD;
KtKeywordToken FINALLY_KEYWORD = KtKeywordToken.softKeyword("finally");
KtModifierKeywordToken FINAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("final");
KtKeywordToken FINALLY_KEYWORD = KtKeywordToken.softKeyword("finally", FINALLY_KEYWORD_Id);
KtModifierKeywordToken FINAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("final", FINAL_KEYWORD_Id);
KtModifierKeywordToken LATEINIT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("lateinit");
KtModifierKeywordToken LATEINIT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("lateinit", LATEINIT_KEYWORD_Id);
KtModifierKeywordToken DATA_KEYWORD = KtModifierKeywordToken.softKeywordModifier("data");
KtModifierKeywordToken VALUE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("value");
KtModifierKeywordToken INLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("inline");
KtModifierKeywordToken NOINLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("noinline");
KtModifierKeywordToken TAILREC_KEYWORD = KtModifierKeywordToken.softKeywordModifier("tailrec");
KtModifierKeywordToken EXTERNAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("external");
KtModifierKeywordToken ANNOTATION_KEYWORD = KtModifierKeywordToken.softKeywordModifier("annotation");
KtModifierKeywordToken CROSSINLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("crossinline");
KtModifierKeywordToken OPERATOR_KEYWORD = KtModifierKeywordToken.softKeywordModifier("operator");
KtModifierKeywordToken INFIX_KEYWORD = KtModifierKeywordToken.softKeywordModifier("infix");
KtModifierKeywordToken DATA_KEYWORD = KtModifierKeywordToken.softKeywordModifier("data", DATA_KEYWORD_Id);
KtModifierKeywordToken VALUE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("value", VALUE_KEYWORD_Id);
KtModifierKeywordToken INLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("inline", INLINE_KEYWORD_Id);
KtModifierKeywordToken NOINLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("noinline", NOINLINE_KEYWORD_Id);
KtModifierKeywordToken TAILREC_KEYWORD = KtModifierKeywordToken.softKeywordModifier("tailrec", TAILREC_KEYWORD_Id);
KtModifierKeywordToken EXTERNAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("external", EXTERNAL_KEYWORD_Id);
KtModifierKeywordToken ANNOTATION_KEYWORD = KtModifierKeywordToken.softKeywordModifier("annotation", ANNOTATION_KEYWORD_Id);
KtModifierKeywordToken CROSSINLINE_KEYWORD = KtModifierKeywordToken.softKeywordModifier("crossinline", CROSSINLINE_KEYWORD_Id);
KtModifierKeywordToken OPERATOR_KEYWORD = KtModifierKeywordToken.softKeywordModifier("operator", OPERATOR_KEYWORD_Id);
KtModifierKeywordToken INFIX_KEYWORD = KtModifierKeywordToken.softKeywordModifier("infix", INFIX_KEYWORD_Id);
KtModifierKeywordToken CONST_KEYWORD = KtModifierKeywordToken.softKeywordModifier("const");
KtModifierKeywordToken CONST_KEYWORD = KtModifierKeywordToken.softKeywordModifier("const", CONST_KEYWORD_Id);
KtModifierKeywordToken SUSPEND_KEYWORD = KtModifierKeywordToken.softKeywordModifier("suspend");
KtModifierKeywordToken SUSPEND_KEYWORD = KtModifierKeywordToken.softKeywordModifier("suspend", SUSPEND_KEYWORD_Id);
KtModifierKeywordToken HEADER_KEYWORD = KtModifierKeywordToken.softKeywordModifier("header");
KtModifierKeywordToken IMPL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("impl");
KtModifierKeywordToken HEADER_KEYWORD = KtModifierKeywordToken.softKeywordModifier("header", HEADER_KEYWORD_Id);
KtModifierKeywordToken IMPL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("impl", IMPL_KEYWORD_Id);
KtModifierKeywordToken EXPECT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("expect", EXPECT_KEYWORD_Id);
KtModifierKeywordToken ACTUAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("actual", ACTUAL_KEYWORD_Id);
KtModifierKeywordToken EXPECT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("expect");
KtModifierKeywordToken ACTUAL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("actual");
TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, INTERFACE_KEYWORD,
THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
@@ -144,6 +144,11 @@ import static org.jetbrains.kotlin.lexer.KtTokens.*;
myBuilder.advanceLexer();
}
protected int getTokenId() {
IElementType elementType = tt();
return (elementType instanceof KtToken) ? ((KtToken)elementType).tokenId : INVALID_Id;
}
protected IElementType tt() {
return myBuilder.getTokenType();
}
@@ -302,39 +307,42 @@ import static org.jetbrains.kotlin.lexer.KtTokens.*;
pattern.isTopLevel(openAngleBrackets, openBrackets, openBraces, openParentheses))) {
break;
}
if (at(LPAR)) {
openParentheses++;
opens.push(LPAR);
}
else if (at(LT)) {
openAngleBrackets++;
opens.push(LT);
}
else if (at(LBRACE)) {
openBraces++;
opens.push(LBRACE);
}
else if (at(LBRACKET)) {
openBrackets++;
opens.push(LBRACKET);
}
else if (at(RPAR)) {
openParentheses--;
if (opens.isEmpty() || opens.pop() != LPAR) {
if (pattern.handleUnmatchedClosing(RPAR)) {
break;
switch (getTokenId()) {
case LPAR_Id:
openParentheses++;
opens.push(LPAR);
break;
case LT_Id:
openAngleBrackets++;
opens.push(LT);
break;
case LBRACE_Id:
openBraces++;
opens.push(LBRACE);
break;
case LBRACKET_Id:
openBrackets++;
opens.push(LBRACKET);
break;
case RPAR_Id:
openParentheses--;
if (opens.isEmpty() || opens.pop() != LPAR) {
if (pattern.handleUnmatchedClosing(RPAR)) {
break;
}
}
}
}
else if (at(GT)) {
openAngleBrackets--;
}
else if (at(RBRACE)) {
openBraces--;
}
else if (at(RBRACKET)) {
openBrackets--;
break;
case GT_Id:
openAngleBrackets--;
break;
case RBRACE_Id:
openBraces--;
break;
case RBRACKET_Id:
openBrackets--;
break;
}
advance(); // skip token
}
@@ -630,66 +630,104 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
private boolean parseAtomicExpression() {
boolean ok = true;
if (at(LPAR)) {
parseParenthesizedExpression();
switch (getTokenId()) {
case LPAR_Id:
parseParenthesizedExpression();
break;
case LBRACKET_Id:
parseCollectionLiteralExpression();
break;
case THIS_KEYWORD_Id:
parseThisExpression();
break;
case SUPER_KEYWORD_Id:
parseSuperExpression();
break;
case OBJECT_KEYWORD_Id:
parseObjectLiteral();
break;
case THROW_KEYWORD_Id:
parseThrow();
break;
case RETURN_KEYWORD_Id:
parseReturn();
break;
case CONTINUE_KEYWORD_Id:
parseJump(CONTINUE);
break;
case BREAK_KEYWORD_Id:
parseJump(BREAK);
break;
case IF_KEYWORD_Id:
parseIf();
break;
case WHEN_KEYWORD_Id:
parseWhen();
break;
case TRY_KEYWORD_Id:
parseTry();
break;
case FOR_KEYWORD_Id:
parseFor();
break;
case WHILE_KEYWORD_Id:
parseWhile();
break;
case DO_KEYWORD_Id:
parseDoWhile();
break;
case IDENTIFIER_Id:
parseSimpleNameExpression();
break;
case LBRACE_Id:
parseFunctionLiteral();
break;
case OPEN_QUOTE_Id:
parseStringTemplate();
break;
/*
* literalConstant
* : "true" | "false"
* : stringTemplate
* : NoEscapeString
* : IntegerLiteral
* : CharacterLiteral
* : FloatLiteral
* : "null"
* ;
*/
case TRUE_KEYWORD_Id:
case FALSE_KEYWORD_Id:
parseOneTokenExpression(BOOLEAN_CONSTANT);
break;
case INTEGER_LITERAL_Id:
parseOneTokenExpression(INTEGER_CONSTANT);
break;
case CHARACTER_LITERAL_Id:
parseOneTokenExpression(CHARACTER_CONSTANT);
break;
case FLOAT_LITERAL_Id:
parseOneTokenExpression(FLOAT_CONSTANT);
break;
case NULL_KEYWORD_Id:
parseOneTokenExpression(NULL);
break;
case CLASS_KEYWORD_Id:
case INTERFACE_KEYWORD_Id:
case FUN_KEYWORD_Id:
case VAL_KEYWORD_Id:
case VAR_KEYWORD_Id:
case TYPE_ALIAS_KEYWORD_Id:
if (!parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */ myBuilder.newlineBeforeCurrentToken(), false)) {
ok = false;
}
// declaration was parsed, do nothing
break;
default:
ok = false;
}
else if (at(LBRACKET)) {
parseCollectionLiteralExpression();
}
else if (at(THIS_KEYWORD)) {
parseThisExpression();
}
else if (at(SUPER_KEYWORD)) {
parseSuperExpression();
}
else if (at(OBJECT_KEYWORD)) {
parseObjectLiteral();
}
else if (at(THROW_KEYWORD)) {
parseThrow();
}
else if (at(RETURN_KEYWORD)) {
parseReturn();
}
else if (at(CONTINUE_KEYWORD)) {
parseJump(CONTINUE);
}
else if (at(BREAK_KEYWORD)) {
parseJump(BREAK);
}
else if (at(IF_KEYWORD)) {
parseIf();
}
else if (at(WHEN_KEYWORD)) {
parseWhen();
}
else if (at(TRY_KEYWORD)) {
parseTry();
}
else if (at(FOR_KEYWORD)) {
parseFor();
}
else if (at(WHILE_KEYWORD)) {
parseWhile();
}
else if (at(DO_KEYWORD)) {
parseDoWhile();
}
else if (atSet(LOCAL_DECLARATION_FIRST) &&
parseLocalDeclaration(/* rollbackIfDefinitelyNotExpression = */ myBuilder.newlineBeforeCurrentToken(), false)) {
// declaration was parsed, do nothing
}
else if (at(IDENTIFIER)) {
parseSimpleNameExpression();
}
else if (at(LBRACE)) {
parseFunctionLiteral();
}
else if (at(OPEN_QUOTE)) {
parseStringTemplate();
}
else if (!parseLiteralConstant()) {
ok = false;
if (!ok) {
// TODO: better recovery if FIRST(element) did not match
errorWithRecovery("Expecting an element", TokenSet.orSet(EXPRESSION_FOLLOW, TokenSet.create(LONG_TEMPLATE_ENTRY_END)));
}
@@ -804,39 +842,6 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
}
}
/*
* literalConstant
* : "true" | "false"
* : stringTemplate
* : NoEscapeString
* : IntegerLiteral
* : CharacterLiteral
* : FloatLiteral
* : "null"
* ;
*/
private boolean parseLiteralConstant() {
if (at(TRUE_KEYWORD) || at(FALSE_KEYWORD)) {
parseOneTokenExpression(BOOLEAN_CONSTANT);
}
else if (at(INTEGER_LITERAL)) {
parseOneTokenExpression(INTEGER_CONSTANT);
}
else if (at(CHARACTER_LITERAL)) {
parseOneTokenExpression(CHARACTER_CONSTANT);
}
else if (at(FLOAT_LITERAL)) {
parseOneTokenExpression(FLOAT_CONSTANT);
}
else if (at(NULL_KEYWORD)) {
parseOneTokenExpression(NULL);
}
else {
return false;
}
return true;
}
/*
* when
* : "when" ("(" (modifiers "val" SimpleName "=")? element ")")? "{"
@@ -963,39 +968,45 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
private void parseWhenCondition() {
PsiBuilder.Marker condition = mark();
myBuilder.disableNewlines();
if (at(IN_KEYWORD) || at(NOT_IN)) {
PsiBuilder.Marker mark = mark();
advance(); // IN_KEYWORD or NOT_IN
mark.done(OPERATION_REFERENCE);
switch (getTokenId()) {
case IN_KEYWORD_Id:
case NOT_IN_Id:
PsiBuilder.Marker mark = mark();
advance(); // IN_KEYWORD or NOT_IN
mark.done(OPERATION_REFERENCE);
if (atSet(WHEN_CONDITION_RECOVERY_SET_WITH_ARROW)) {
error("Expecting an element");
}
else {
parseExpression();
}
condition.done(WHEN_CONDITION_IN_RANGE);
}
else if (at(IS_KEYWORD) || at(NOT_IS)) {
advance(); // IS_KEYWORD or NOT_IS
if (atSet(WHEN_CONDITION_RECOVERY_SET_WITH_ARROW)) {
error("Expecting an element");
}
else {
parseExpression();
}
condition.done(WHEN_CONDITION_IN_RANGE);
break;
case IS_KEYWORD_Id:
case NOT_IS_Id:
advance(); // IS_KEYWORD or NOT_IS
if (atSet(WHEN_CONDITION_RECOVERY_SET_WITH_ARROW)) {
error("Expecting a type");
}
else {
myKotlinParsing.parseTypeRef();
}
condition.done(WHEN_CONDITION_IS_PATTERN);
}
else {
if (atSet(WHEN_CONDITION_RECOVERY_SET_WITH_ARROW)) {
if (atSet(WHEN_CONDITION_RECOVERY_SET_WITH_ARROW)) {
error("Expecting a type");
}
else {
myKotlinParsing.parseTypeRef();
}
condition.done(WHEN_CONDITION_IS_PATTERN);
break;
case RBRACE_Id:
case ELSE_KEYWORD_Id:
case ARROW_Id:
case DOT_Id:
error("Expecting an expression, is-condition or in-condition");
}
else {
condition.done(WHEN_CONDITION_EXPRESSION);
break;
default:
parseExpression();
}
condition.done(WHEN_CONDITION_EXPRESSION);
condition.done(WHEN_CONDITION_EXPRESSION);
break;
}
myBuilder.restoreNewlinesState();
}
@@ -497,25 +497,24 @@ public class KotlinParsing extends AbstractKotlinParsing {
@NotNull NameParsingMode nameParsingModeForObject,
@NotNull DeclarationParsingMode declarationParsingMode
) {
IElementType keywordToken = tt();
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
return parseClass(detector.isEnumDetected(), true);
}
else if (keywordToken == FUN_KEYWORD) {
return parseFunction();
}
else if (keywordToken == VAL_KEYWORD || keywordToken == VAR_KEYWORD) {
return parseProperty(declarationParsingMode);
}
else if (keywordToken == TYPE_ALIAS_KEYWORD) {
return parseTypeAlias();
}
else if (keywordToken == OBJECT_KEYWORD) {
parseObject(nameParsingModeForObject, true);
return OBJECT_DECLARATION;
} else if (keywordToken == IDENTIFIER && detector.isEnumDetected() && declarationParsingMode.canBeEnumUsedAsSoftKeyword) {
return parseClass(true, false);
switch (getTokenId()) {
case CLASS_KEYWORD_Id:
case INTERFACE_KEYWORD_Id:
return parseClass(detector.isEnumDetected(), true);
case FUN_KEYWORD_Id:
return parseFunction();
case VAL_KEYWORD_Id:
case VAR_KEYWORD_Id:
return parseProperty(declarationParsingMode);
case TYPE_ALIAS_KEYWORD_Id:
return parseTypeAlias();
case OBJECT_KEYWORD_Id:
parseObject(nameParsingModeForObject, true);
return OBJECT_DECLARATION;
case IDENTIFIER_Id:
if (detector.isEnumDetected() && declarationParsingMode.canBeEnumUsedAsSoftKeyword) {
return parseClass(true, false);
}
}
return null;