001    /*
002     * Copyright 2010-2015 JetBrains s.r.o.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.jetbrains.kotlin.lexer;
018    
019    import com.intellij.psi.TokenType;
020    import com.intellij.psi.tree.IElementType;
021    import com.intellij.psi.tree.TokenSet;
022    import org.jetbrains.kotlin.kdoc.lexer.KDocTokens;
023    import org.jetbrains.kotlin.psi.KtPsiUtil;
024    
025    public interface KtTokens {
026        KtToken EOF   = new KtToken("EOF");
027    
028        KtToken RESERVED    = new KtToken("RESERVED");
029    
030        KtToken BLOCK_COMMENT     = new KtToken("BLOCK_COMMENT");
031        KtToken EOL_COMMENT       = new KtToken("EOL_COMMENT");
032        KtToken SHEBANG_COMMENT   = new KtToken("SHEBANG_COMMENT");
033    
034        //KtToken DOC_COMMENT   = new KtToken("DOC_COMMENT");
035        IElementType DOC_COMMENT   = KDocTokens.KDOC;
036    
037        IElementType WHITE_SPACE = TokenType.WHITE_SPACE;
038    
039        KtToken INTEGER_LITERAL    = new KtToken("INTEGER_LITERAL");
040        KtToken FLOAT_LITERAL      = new KtToken("FLOAT_CONSTANT");
041        KtToken CHARACTER_LITERAL  = new KtToken("CHARACTER_LITERAL");
042    
043        KtToken CLOSING_QUOTE = new KtToken("CLOSING_QUOTE");
044        KtToken OPEN_QUOTE = new KtToken("OPEN_QUOTE");
045        KtToken REGULAR_STRING_PART = new KtToken("REGULAR_STRING_PART");
046        KtToken ESCAPE_SEQUENCE = new KtToken("ESCAPE_SEQUENCE");
047        KtToken SHORT_TEMPLATE_ENTRY_START = new KtToken("SHORT_TEMPLATE_ENTRY_START");
048        KtToken LONG_TEMPLATE_ENTRY_START = new KtToken("LONG_TEMPLATE_ENTRY_START");
049        KtToken LONG_TEMPLATE_ENTRY_END = new KtToken("LONG_TEMPLATE_ENTRY_END");
050        KtToken DANGLING_NEWLINE = new KtToken("DANGLING_NEWLINE");
051    
052        KtKeywordToken PACKAGE_KEYWORD          = KtKeywordToken.keyword("package");
053        KtKeywordToken AS_KEYWORD               = KtKeywordToken.keyword("as");
054        KtKeywordToken TYPE_ALIAS_KEYWORD       = KtKeywordToken.keyword("typealias");
055        KtKeywordToken CLASS_KEYWORD            = KtKeywordToken.keyword("class");
056        KtKeywordToken THIS_KEYWORD             = KtKeywordToken.keyword("this");
057        KtKeywordToken SUPER_KEYWORD            = KtKeywordToken.keyword("super");
058        KtKeywordToken VAL_KEYWORD              = KtKeywordToken.keyword("val");
059        KtKeywordToken VAR_KEYWORD              = KtKeywordToken.keyword("var");
060        KtKeywordToken FUN_KEYWORD              = KtKeywordToken.keyword("fun");
061        KtKeywordToken FOR_KEYWORD              = KtKeywordToken.keyword("for");
062        KtKeywordToken NULL_KEYWORD             = KtKeywordToken.keyword("null");
063        KtKeywordToken TRUE_KEYWORD             = KtKeywordToken.keyword("true");
064        KtKeywordToken FALSE_KEYWORD            = KtKeywordToken.keyword("false");
065        KtKeywordToken IS_KEYWORD               = KtKeywordToken.keyword("is");
066        KtModifierKeywordToken IN_KEYWORD       = KtModifierKeywordToken.keywordModifier("in");
067        KtKeywordToken THROW_KEYWORD            = KtKeywordToken.keyword("throw");
068        KtKeywordToken RETURN_KEYWORD           = KtKeywordToken.keyword("return");
069        KtKeywordToken BREAK_KEYWORD            = KtKeywordToken.keyword("break");
070        KtKeywordToken CONTINUE_KEYWORD         = KtKeywordToken.keyword("continue");
071        KtKeywordToken OBJECT_KEYWORD           = KtKeywordToken.keyword("object");
072        KtKeywordToken IF_KEYWORD               = KtKeywordToken.keyword("if");
073        KtKeywordToken TRY_KEYWORD              = KtKeywordToken.keyword("try");
074        KtKeywordToken ELSE_KEYWORD             = KtKeywordToken.keyword("else");
075        KtKeywordToken WHILE_KEYWORD            = KtKeywordToken.keyword("while");
076        KtKeywordToken DO_KEYWORD               = KtKeywordToken.keyword("do");
077        KtKeywordToken WHEN_KEYWORD             = KtKeywordToken.keyword("when");
078        KtKeywordToken INTERFACE_KEYWORD        = KtKeywordToken.keyword("interface");
079    
080        // Reserved for future use:
081        KtKeywordToken TYPEOF_KEYWORD           = KtKeywordToken.keyword("typeof");
082    
083        KtToken AS_SAFE = KtKeywordToken.keyword("AS_SAFE");//new KtToken("as?");
084    
085        KtToken IDENTIFIER = new KtToken("IDENTIFIER");
086    
087        KtToken FIELD_IDENTIFIER = new KtToken("FIELD_IDENTIFIER");
088        KtSingleValueToken LBRACKET    = new KtSingleValueToken("LBRACKET", "[");
089        KtSingleValueToken RBRACKET    = new KtSingleValueToken("RBRACKET", "]");
090        KtSingleValueToken LBRACE      = new KtSingleValueToken("LBRACE", "{");
091        KtSingleValueToken RBRACE      = new KtSingleValueToken("RBRACE", "}");
092        KtSingleValueToken LPAR        = new KtSingleValueToken("LPAR", "(");
093        KtSingleValueToken RPAR        = new KtSingleValueToken("RPAR", ")");
094        KtSingleValueToken DOT         = new KtSingleValueToken("DOT", ".");
095        KtSingleValueToken PLUSPLUS    = new KtSingleValueToken("PLUSPLUS", "++");
096        KtSingleValueToken MINUSMINUS  = new KtSingleValueToken("MINUSMINUS", "--");
097        KtSingleValueToken MUL         = new KtSingleValueToken("MUL", "*");
098        KtSingleValueToken PLUS        = new KtSingleValueToken("PLUS", "+");
099        KtSingleValueToken MINUS       = new KtSingleValueToken("MINUS", "-");
100        KtSingleValueToken EXCL        = new KtSingleValueToken("EXCL", "!");
101        KtSingleValueToken DIV         = new KtSingleValueToken("DIV", "/");
102        KtSingleValueToken PERC        = new KtSingleValueToken("PERC", "%");
103        KtSingleValueToken LT          = new KtSingleValueToken("LT", "<");
104        KtSingleValueToken GT          = new KtSingleValueToken("GT", ">");
105        KtSingleValueToken LTEQ        = new KtSingleValueToken("LTEQ", "<=");
106        KtSingleValueToken GTEQ        = new KtSingleValueToken("GTEQ", ">=");
107        KtSingleValueToken EQEQEQ      = new KtSingleValueToken("EQEQEQ", "===");
108        KtSingleValueToken ARROW       = new KtSingleValueToken("ARROW", "->");
109        KtSingleValueToken DOUBLE_ARROW       = new KtSingleValueToken("DOUBLE_ARROW", "=>");
110        KtSingleValueToken EXCLEQEQEQ  = new KtSingleValueToken("EXCLEQEQEQ", "!==");
111        KtSingleValueToken EQEQ        = new KtSingleValueToken("EQEQ", "==");
112        KtSingleValueToken EXCLEQ      = new KtSingleValueToken("EXCLEQ", "!=");
113        KtSingleValueToken EXCLEXCL    = new KtSingleValueToken("EXCLEXCL", "!!");
114        KtSingleValueToken ANDAND      = new KtSingleValueToken("ANDAND", "&&");
115        KtSingleValueToken OROR        = new KtSingleValueToken("OROR", "||");
116        KtSingleValueToken SAFE_ACCESS = new KtSingleValueToken("SAFE_ACCESS", "?.");
117        KtSingleValueToken ELVIS       = new KtSingleValueToken("ELVIS", "?:");
118        KtSingleValueToken QUEST       = new KtSingleValueToken("QUEST", "?");
119        KtSingleValueToken COLONCOLON  = new KtSingleValueToken("COLONCOLON", "::");
120        KtSingleValueToken COLON       = new KtSingleValueToken("COLON", ":");
121        KtSingleValueToken SEMICOLON   = new KtSingleValueToken("SEMICOLON", ";");
122        KtSingleValueToken DOUBLE_SEMICOLON   = new KtSingleValueToken("DOUBLE_SEMICOLON", ";;");
123        KtSingleValueToken RANGE       = new KtSingleValueToken("RANGE", "..");
124        KtSingleValueToken EQ          = new KtSingleValueToken("EQ", "=");
125        KtSingleValueToken MULTEQ      = new KtSingleValueToken("MULTEQ", "*=");
126        KtSingleValueToken DIVEQ       = new KtSingleValueToken("DIVEQ", "/=");
127        KtSingleValueToken PERCEQ      = new KtSingleValueToken("PERCEQ", "%=");
128        KtSingleValueToken PLUSEQ      = new KtSingleValueToken("PLUSEQ", "+=");
129        KtSingleValueToken MINUSEQ     = new KtSingleValueToken("MINUSEQ", "-=");
130        KtKeywordToken NOT_IN      = KtKeywordToken.keyword("NOT_IN", "!in");
131        KtKeywordToken NOT_IS      = KtKeywordToken.keyword("NOT_IS", "!is");
132        KtSingleValueToken HASH        = new KtSingleValueToken("HASH", "#");
133        KtSingleValueToken AT          = new KtSingleValueToken("AT", "@");
134    
135        KtSingleValueToken COMMA       = new KtSingleValueToken("COMMA", ",");
136    
137        KtToken EOL_OR_SEMICOLON   = new KtToken("EOL_OR_SEMICOLON");
138        KtKeywordToken FILE_KEYWORD    = KtKeywordToken.softKeyword("file");
139        KtKeywordToken FIELD_KEYWORD     = KtKeywordToken.softKeyword("field");
140        KtKeywordToken PROPERTY_KEYWORD     = KtKeywordToken.softKeyword("property");
141        KtKeywordToken RECEIVER_KEYWORD     = KtKeywordToken.softKeyword("receiver");
142        KtKeywordToken PARAM_KEYWORD     = KtKeywordToken.softKeyword("param");
143        KtKeywordToken SETPARAM_KEYWORD  = KtKeywordToken.softKeyword("setparam");
144        KtKeywordToken DELEGATE_KEYWORD  = KtKeywordToken.softKeyword("delegate");
145        KtKeywordToken IMPORT_KEYWORD    = KtKeywordToken.softKeyword("import");
146        KtKeywordToken WHERE_KEYWORD     = KtKeywordToken.softKeyword("where");
147        KtKeywordToken BY_KEYWORD        = KtKeywordToken.softKeyword("by");
148        KtKeywordToken GET_KEYWORD       = KtKeywordToken.softKeyword("get");
149        KtKeywordToken SET_KEYWORD       = KtKeywordToken.softKeyword("set");
150        KtKeywordToken CONSTRUCTOR_KEYWORD = KtKeywordToken.softKeyword("constructor");
151        KtKeywordToken INIT_KEYWORD        = KtKeywordToken.softKeyword("init");
152    
153        KtModifierKeywordToken ABSTRACT_KEYWORD  = KtModifierKeywordToken.softKeywordModifier("abstract");
154        KtModifierKeywordToken ENUM_KEYWORD      = KtModifierKeywordToken.softKeywordModifier("enum");
155        KtModifierKeywordToken OPEN_KEYWORD      = KtModifierKeywordToken.softKeywordModifier("open");
156        KtModifierKeywordToken INNER_KEYWORD     = KtModifierKeywordToken.softKeywordModifier("inner");
157        KtModifierKeywordToken OVERRIDE_KEYWORD  = KtModifierKeywordToken.softKeywordModifier("override");
158        KtModifierKeywordToken PRIVATE_KEYWORD   = KtModifierKeywordToken.softKeywordModifier("private");
159        KtModifierKeywordToken PUBLIC_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("public");
160        KtModifierKeywordToken INTERNAL_KEYWORD  = KtModifierKeywordToken.softKeywordModifier("internal");
161        KtModifierKeywordToken PROTECTED_KEYWORD = KtModifierKeywordToken.softKeywordModifier("protected");
162        KtKeywordToken CATCH_KEYWORD     = KtKeywordToken.softKeyword("catch");
163        KtModifierKeywordToken OUT_KEYWORD       = KtModifierKeywordToken.softKeywordModifier("out");
164        KtModifierKeywordToken VARARG_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("vararg");
165        KtModifierKeywordToken REIFIED_KEYWORD   = KtModifierKeywordToken.softKeywordModifier("reified");
166        KtKeywordToken DYNAMIC_KEYWORD   = KtKeywordToken.softKeyword("dynamic");
167        KtModifierKeywordToken COMPANION_KEYWORD = KtModifierKeywordToken.softKeywordModifier("companion");
168        KtModifierKeywordToken SEALED_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("sealed");
169    
170        KtModifierKeywordToken DEFAULT_VISIBILITY_KEYWORD = PUBLIC_KEYWORD;
171    
172        KtKeywordToken FINALLY_KEYWORD   = KtKeywordToken.softKeyword("finally");
173        KtModifierKeywordToken FINAL_KEYWORD     = KtModifierKeywordToken.softKeywordModifier("final");
174    
175        KtModifierKeywordToken LATEINIT_KEYWORD = KtModifierKeywordToken.softKeywordModifier("lateinit");
176    
177        KtModifierKeywordToken DATA_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("data");
178        KtModifierKeywordToken INLINE_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("inline");
179        KtModifierKeywordToken NOINLINE_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("noinline");
180        KtModifierKeywordToken TAILREC_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("tailrec");
181        KtModifierKeywordToken EXTERNAL_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("external");
182        KtModifierKeywordToken ANNOTATION_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("annotation");
183        KtModifierKeywordToken CROSSINLINE_KEYWORD    = KtModifierKeywordToken.softKeywordModifier("crossinline");
184        KtModifierKeywordToken OPERATOR_KEYWORD = KtModifierKeywordToken.softKeywordModifier("operator");
185        KtModifierKeywordToken INFIX_KEYWORD = KtModifierKeywordToken.softKeywordModifier("infix");
186    
187        KtModifierKeywordToken CONST_KEYWORD = KtModifierKeywordToken.softKeywordModifier("const");
188    
189        KtModifierKeywordToken SUSPEND_KEYWORD = KtModifierKeywordToken.softKeywordModifier("suspend");
190    
191        KtModifierKeywordToken HEADER_KEYWORD = KtModifierKeywordToken.softKeywordModifier("header");
192        KtModifierKeywordToken IMPL_KEYWORD = KtModifierKeywordToken.softKeywordModifier("impl");
193    
194        TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, INTERFACE_KEYWORD,
195                                            THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
196                                            NULL_KEYWORD,
197                                            TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD,
198                                            IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD,
199                                            ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, TRY_KEYWORD, WHEN_KEYWORD,
200                                            NOT_IN, NOT_IS, AS_SAFE,
201                                            TYPEOF_KEYWORD
202        );
203    
204        TokenSet SOFT_KEYWORDS = TokenSet.create(FILE_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD,
205                                                 SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD,
206                                                 OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD,
207                                                 CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD,
208                                                 DYNAMIC_KEYWORD, COMPANION_KEYWORD, CONSTRUCTOR_KEYWORD, INIT_KEYWORD, SEALED_KEYWORD,
209                                                 FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SETPARAM_KEYWORD,
210                                                 DELEGATE_KEYWORD,
211                                                 LATEINIT_KEYWORD,
212                                                 DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD,
213                                                 ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD,
214                                                 SUSPEND_KEYWORD, HEADER_KEYWORD, IMPL_KEYWORD
215        );
216    
217        /*
218            This array is used in stub serialization:
219            1. Do not change order.
220            2. If you add an entry or change order, increase stub version.
221         */
222        KtModifierKeywordToken[] MODIFIER_KEYWORDS_ARRAY =
223                new KtModifierKeywordToken[] {
224                        ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD,
225                        PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD,
226                        REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATEINIT_KEYWORD,
227                        DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD,
228                        CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD, SUSPEND_KEYWORD, HEADER_KEYWORD, IMPL_KEYWORD
229                };
230    
231        TokenSet MODIFIER_KEYWORDS = TokenSet.create(MODIFIER_KEYWORDS_ARRAY);
232    
233        TokenSet TYPE_MODIFIER_KEYWORDS = TokenSet.create(SUSPEND_KEYWORD);
234        TokenSet TYPE_ARGUMENT_MODIFIER_KEYWORDS = TokenSet.create(IN_KEYWORD, OUT_KEYWORD);
235        TokenSet RESERVED_VALUE_PARAMETER_MODIFIER_KEYWORDS = TokenSet.create(OUT_KEYWORD, VARARG_KEYWORD);
236    
237        TokenSet VISIBILITY_MODIFIERS = TokenSet.create(PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD);
238    
239        TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE);
240    
241        /**
242         * Don't add KDocTokens to COMMENTS TokenSet, because it is used in KotlinParserDefinition.getCommentTokens(),
243         * and therefor all COMMENTS tokens will be ignored by PsiBuilder.
244         *
245         * @see KtPsiUtil#isInComment(com.intellij.psi.PsiElement)
246         */
247        TokenSet COMMENTS = TokenSet.create(EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT, SHEBANG_COMMENT);
248        TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.orSet(COMMENTS, WHITESPACES);
249    
250        TokenSet STRINGS = TokenSet.create(CHARACTER_LITERAL, REGULAR_STRING_PART);
251        TokenSet OPERATIONS = TokenSet.create(AS_KEYWORD, AS_SAFE, IS_KEYWORD, IN_KEYWORD, DOT, PLUSPLUS, MINUSMINUS, EXCLEXCL, MUL, PLUS,
252                                              MINUS, EXCL, DIV, PERC, LT, GT, LTEQ, GTEQ, EQEQEQ, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR,
253                                              SAFE_ACCESS, ELVIS,
254                                              RANGE, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ,
255                                              NOT_IN, NOT_IS,
256                                              IDENTIFIER);
257    
258        TokenSet AUGMENTED_ASSIGNMENTS = TokenSet.create(PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ);
259        TokenSet ALL_ASSIGNMENTS = TokenSet.create(EQ, PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ);
260    }