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    
024    public interface JetTokens {
025        JetToken EOF   = new JetToken("EOF");
026    
027        JetToken BLOCK_COMMENT     = new JetToken("BLOCK_COMMENT");
028        JetToken EOL_COMMENT       = new JetToken("EOL_COMMENT");
029        JetToken SHEBANG_COMMENT   = new JetToken("SHEBANG_COMMENT");
030    
031        //JetToken DOC_COMMENT   = new JetToken("DOC_COMMENT");
032        IElementType DOC_COMMENT   = KDocTokens.KDOC;
033    
034        IElementType WHITE_SPACE = TokenType.WHITE_SPACE;
035    
036        JetToken INTEGER_LITERAL    = new JetToken("INTEGER_LITERAL");
037        JetToken FLOAT_LITERAL      = new JetToken("FLOAT_CONSTANT");
038        JetToken CHARACTER_LITERAL  = new JetToken("CHARACTER_LITERAL");
039    
040        JetToken CLOSING_QUOTE = new JetToken("CLOSING_QUOTE");
041        JetToken OPEN_QUOTE = new JetToken("OPEN_QUOTE");
042        JetToken REGULAR_STRING_PART = new JetToken("REGULAR_STRING_PART");
043        JetToken ESCAPE_SEQUENCE = new JetToken("ESCAPE_SEQUENCE");
044        JetToken SHORT_TEMPLATE_ENTRY_START = new JetToken("SHORT_TEMPLATE_ENTRY_START");
045        JetToken LONG_TEMPLATE_ENTRY_START = new JetToken("LONG_TEMPLATE_ENTRY_START");
046        JetToken LONG_TEMPLATE_ENTRY_END = new JetToken("LONG_TEMPLATE_ENTRY_END");
047        JetToken DANGLING_NEWLINE = new JetToken("DANGLING_NEWLINE");
048    
049        JetKeywordToken PACKAGE_KEYWORD          = JetKeywordToken.keyword("package");
050        JetKeywordToken AS_KEYWORD               = JetKeywordToken.keyword("as");
051        JetKeywordToken TYPE_ALIAS_KEYWORD       = JetKeywordToken.keyword("typealias");
052        JetKeywordToken CLASS_KEYWORD            = JetKeywordToken.keyword("class");
053        JetKeywordToken THIS_KEYWORD             = JetKeywordToken.keyword("this");
054        JetKeywordToken SUPER_KEYWORD            = JetKeywordToken.keyword("super");
055        JetKeywordToken VAL_KEYWORD              = JetKeywordToken.keyword("val");
056        JetKeywordToken VAR_KEYWORD              = JetKeywordToken.keyword("var");
057        JetKeywordToken FUN_KEYWORD              = JetKeywordToken.keyword("fun");
058        JetKeywordToken FOR_KEYWORD              = JetKeywordToken.keyword("for");
059        JetKeywordToken NULL_KEYWORD             = JetKeywordToken.keyword("null");
060        JetKeywordToken TRUE_KEYWORD             = JetKeywordToken.keyword("true");
061        JetKeywordToken FALSE_KEYWORD            = JetKeywordToken.keyword("false");
062        JetKeywordToken IS_KEYWORD               = JetKeywordToken.keyword("is");
063        JetModifierKeywordToken IN_KEYWORD       = JetModifierKeywordToken.keywordModifier("in");
064        JetKeywordToken THROW_KEYWORD            = JetKeywordToken.keyword("throw");
065        JetKeywordToken RETURN_KEYWORD           = JetKeywordToken.keyword("return");
066        JetKeywordToken BREAK_KEYWORD            = JetKeywordToken.keyword("break");
067        JetKeywordToken CONTINUE_KEYWORD         = JetKeywordToken.keyword("continue");
068        JetKeywordToken OBJECT_KEYWORD           = JetKeywordToken.keyword("object");
069        JetKeywordToken IF_KEYWORD               = JetKeywordToken.keyword("if");
070        JetKeywordToken TRY_KEYWORD              = JetKeywordToken.keyword("try");
071        JetKeywordToken ELSE_KEYWORD             = JetKeywordToken.keyword("else");
072        JetKeywordToken WHILE_KEYWORD            = JetKeywordToken.keyword("while");
073        JetKeywordToken DO_KEYWORD               = JetKeywordToken.keyword("do");
074        JetKeywordToken WHEN_KEYWORD             = JetKeywordToken.keyword("when");
075        JetKeywordToken INTERFACE_KEYWORD        = JetKeywordToken.keyword("interface");
076        // TODO: Discuss "This" keyword
077        JetKeywordToken CAPITALIZED_THIS_KEYWORD = JetKeywordToken.keyword("This");
078    
079    
080        JetToken AS_SAFE = JetKeywordToken.keyword("AS_SAFE");//new JetToken("as?");
081    
082        JetToken IDENTIFIER = new JetToken("IDENTIFIER");
083    
084        JetToken FIELD_IDENTIFIER = new JetToken("FIELD_IDENTIFIER");
085        JetSingleValueToken LBRACKET    = new JetSingleValueToken("LBRACKET", "[");
086        JetSingleValueToken RBRACKET    = new JetSingleValueToken("RBRACKET", "]");
087        JetSingleValueToken LBRACE      = new JetSingleValueToken("LBRACE", "{");
088        JetSingleValueToken RBRACE      = new JetSingleValueToken("RBRACE", "}");
089        JetSingleValueToken LPAR        = new JetSingleValueToken("LPAR", "(");
090        JetSingleValueToken RPAR        = new JetSingleValueToken("RPAR", ")");
091        JetSingleValueToken DOT         = new JetSingleValueToken("DOT", ".");
092        JetSingleValueToken PLUSPLUS    = new JetSingleValueToken("PLUSPLUS", "++");
093        JetSingleValueToken MINUSMINUS  = new JetSingleValueToken("MINUSMINUS", "--");
094        JetSingleValueToken MUL         = new JetSingleValueToken("MUL", "*");
095        JetSingleValueToken PLUS        = new JetSingleValueToken("PLUS", "+");
096        JetSingleValueToken MINUS       = new JetSingleValueToken("MINUS", "-");
097        JetSingleValueToken EXCL        = new JetSingleValueToken("EXCL", "!");
098        JetSingleValueToken DIV         = new JetSingleValueToken("DIV", "/");
099        JetSingleValueToken PERC        = new JetSingleValueToken("PERC", "%");
100        JetSingleValueToken LT          = new JetSingleValueToken("LT", "<");
101        JetSingleValueToken GT          = new JetSingleValueToken("GT", ">");
102        JetSingleValueToken LTEQ        = new JetSingleValueToken("LTEQ", "<=");
103        JetSingleValueToken GTEQ        = new JetSingleValueToken("GTEQ", ">=");
104        JetSingleValueToken EQEQEQ      = new JetSingleValueToken("EQEQEQ", "===");
105        JetSingleValueToken ARROW       = new JetSingleValueToken("ARROW", "->");
106        JetSingleValueToken DOUBLE_ARROW       = new JetSingleValueToken("DOUBLE_ARROW", "=>");
107        JetSingleValueToken EXCLEQEQEQ  = new JetSingleValueToken("EXCLEQEQEQ", "!==");
108        JetSingleValueToken EQEQ        = new JetSingleValueToken("EQEQ", "==");
109        JetSingleValueToken EXCLEQ      = new JetSingleValueToken("EXCLEQ", "!=");
110        JetSingleValueToken EXCLEXCL    = new JetSingleValueToken("EXCLEXCL", "!!");
111        JetSingleValueToken ANDAND      = new JetSingleValueToken("ANDAND", "&&");
112        JetSingleValueToken OROR        = new JetSingleValueToken("OROR", "||");
113        JetSingleValueToken SAFE_ACCESS = new JetSingleValueToken("SAFE_ACCESS", "?.");
114        JetSingleValueToken ELVIS       = new JetSingleValueToken("ELVIS", "?:");
115        JetSingleValueToken QUEST       = new JetSingleValueToken("QUEST", "?");
116        JetSingleValueToken COLONCOLON  = new JetSingleValueToken("COLONCOLON", "::");
117        JetSingleValueToken COLON       = new JetSingleValueToken("COLON", ":");
118        JetSingleValueToken SEMICOLON   = new JetSingleValueToken("SEMICOLON", ";");
119        JetSingleValueToken RANGE       = new JetSingleValueToken("RANGE", "..");
120        JetSingleValueToken EQ          = new JetSingleValueToken("EQ", "=");
121        JetSingleValueToken MULTEQ      = new JetSingleValueToken("MULTEQ", "*=");
122        JetSingleValueToken DIVEQ       = new JetSingleValueToken("DIVEQ", "/=");
123        JetSingleValueToken PERCEQ      = new JetSingleValueToken("PERCEQ", "%=");
124        JetSingleValueToken PLUSEQ      = new JetSingleValueToken("PLUSEQ", "+=");
125        JetSingleValueToken MINUSEQ     = new JetSingleValueToken("MINUSEQ", "-=");
126        JetKeywordToken NOT_IN      = JetKeywordToken.keyword("NOT_IN", "!in");
127        JetKeywordToken NOT_IS      = JetKeywordToken.keyword("NOT_IS", "!is");
128        JetSingleValueToken HASH        = new JetSingleValueToken("HASH", "#");
129        JetSingleValueToken AT          = new JetSingleValueToken("AT", "@");
130    
131        JetSingleValueToken COMMA       = new JetSingleValueToken("COMMA", ",");
132    
133        JetToken EOL_OR_SEMICOLON   = new JetToken("EOL_OR_SEMICOLON");
134        JetKeywordToken FILE_KEYWORD    = JetKeywordToken.softKeyword("file");
135        JetKeywordToken FIELD_KEYWORD     = JetKeywordToken.softKeyword("field");
136        JetKeywordToken PROPERTY_KEYWORD     = JetKeywordToken.softKeyword("property");
137        JetKeywordToken RECEIVER_KEYWORD     = JetKeywordToken.softKeyword("receiver");
138        JetKeywordToken PARAM_KEYWORD     = JetKeywordToken.softKeyword("param");
139        JetKeywordToken SPARAM_KEYWORD     = JetKeywordToken.softKeyword("sparam");
140        JetKeywordToken IMPORT_KEYWORD    = JetKeywordToken.softKeyword("import");
141        JetKeywordToken WHERE_KEYWORD     = JetKeywordToken.softKeyword("where");
142        JetKeywordToken BY_KEYWORD        = JetKeywordToken.softKeyword("by");
143        JetKeywordToken GET_KEYWORD       = JetKeywordToken.softKeyword("get");
144        JetKeywordToken SET_KEYWORD       = JetKeywordToken.softKeyword("set");
145        JetKeywordToken CONSTRUCTOR_KEYWORD = JetKeywordToken.softKeyword("constructor");
146        JetKeywordToken INIT_KEYWORD        = JetKeywordToken.softKeyword("init");
147    
148        JetModifierKeywordToken ABSTRACT_KEYWORD  = JetModifierKeywordToken.softKeywordModifier("abstract");
149        JetModifierKeywordToken ENUM_KEYWORD      = JetModifierKeywordToken.softKeywordModifier("enum");
150        JetModifierKeywordToken OPEN_KEYWORD      = JetModifierKeywordToken.softKeywordModifier("open");
151        JetModifierKeywordToken INNER_KEYWORD     = JetModifierKeywordToken.softKeywordModifier("inner");
152        JetModifierKeywordToken OVERRIDE_KEYWORD  = JetModifierKeywordToken.softKeywordModifier("override");
153        JetModifierKeywordToken PRIVATE_KEYWORD   = JetModifierKeywordToken.softKeywordModifier("private");
154        JetModifierKeywordToken PUBLIC_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("public");
155        JetModifierKeywordToken INTERNAL_KEYWORD  = JetModifierKeywordToken.softKeywordModifier("internal");
156        JetModifierKeywordToken PROTECTED_KEYWORD = JetModifierKeywordToken.softKeywordModifier("protected");
157        JetKeywordToken CATCH_KEYWORD     = JetKeywordToken.softKeyword("catch");
158        JetModifierKeywordToken OUT_KEYWORD       = JetModifierKeywordToken.softKeywordModifier("out");
159        JetModifierKeywordToken VARARG_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("vararg");
160        JetModifierKeywordToken REIFIED_KEYWORD   = JetModifierKeywordToken.softKeywordModifier("reified");
161        JetKeywordToken DYNAMIC_KEYWORD   = JetKeywordToken.softKeyword("dynamic");
162        JetModifierKeywordToken COMPANION_KEYWORD = JetModifierKeywordToken.softKeywordModifier("companion");
163        JetModifierKeywordToken SEALED_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("sealed");
164    
165        JetModifierKeywordToken DEFAULT_VISIBILITY_KEYWORD = PUBLIC_KEYWORD;
166    
167        JetKeywordToken FINALLY_KEYWORD   = JetKeywordToken.softKeyword("finally");
168        JetModifierKeywordToken FINAL_KEYWORD     = JetModifierKeywordToken.softKeywordModifier("final");
169    
170        JetModifierKeywordToken LATE_INIT_KEYWORD = JetModifierKeywordToken.softKeywordModifier("lateinit");
171    
172        JetModifierKeywordToken DATA_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("data");
173        JetModifierKeywordToken INLINE_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("inline");
174        JetModifierKeywordToken NOINLINE_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("noinline");
175        JetModifierKeywordToken TAILREC_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("tailrec");
176        JetModifierKeywordToken EXTERNAL_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("external");
177        JetModifierKeywordToken ANNOTATION_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("annotation");
178        JetModifierKeywordToken CROSSINLINE_KEYWORD    = JetModifierKeywordToken.softKeywordModifier("crossinline");
179        JetModifierKeywordToken OPERATOR_KEYWORD = JetModifierKeywordToken.softKeywordModifier("operator");
180    
181        JetModifierKeywordToken CONST_KEYWORD = JetModifierKeywordToken.softKeywordModifier("const");
182    
183        TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, INTERFACE_KEYWORD,
184                                            THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
185                                            NULL_KEYWORD,
186                                            TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD,
187                                            IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD,
188                                            ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, TRY_KEYWORD, WHEN_KEYWORD,
189                                            NOT_IN, NOT_IS, CAPITALIZED_THIS_KEYWORD, AS_SAFE
190        );
191    
192        TokenSet SOFT_KEYWORDS = TokenSet.create(FILE_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD,
193                                                 SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD,
194                                                 OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD,
195                                                 CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD,
196                                                 DYNAMIC_KEYWORD, COMPANION_KEYWORD, CONSTRUCTOR_KEYWORD, INIT_KEYWORD, SEALED_KEYWORD,
197                                                 FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD,
198                                                 LATE_INIT_KEYWORD,
199                                                 DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD,
200                                                 ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD, OPERATOR_KEYWORD
201        );
202    
203        /*
204            This array is used in stub serialization:
205            1. Do not change order.
206            2. If you add an entry or change order, increase stub version.
207         */
208        JetModifierKeywordToken[] MODIFIER_KEYWORDS_ARRAY =
209                new JetModifierKeywordToken[] {
210                        ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD,
211                        PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD,
212                        REIFIED_KEYWORD, COMPANION_KEYWORD, SEALED_KEYWORD, LATE_INIT_KEYWORD,
213                        DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD,
214                        CONST_KEYWORD, OPERATOR_KEYWORD
215                };
216    
217        // Please synchronize this array with org.jetbrains.kotlin.descriptors.annotations.ANNOTATION_MODIFIERS_FQ_NAMES
218        JetModifierKeywordToken[] ANNOTATION_MODIFIERS_KEYWORDS_ARRAY = new JetModifierKeywordToken[] {
219                DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD, ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD
220        };
221    
222        TokenSet MODIFIER_KEYWORDS = TokenSet.create(MODIFIER_KEYWORDS_ARRAY);
223    
224        TokenSet VISIBILITY_MODIFIERS = TokenSet.create(PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD);
225    
226        TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE);
227    
228        /**
229         * Don't add KDocTokens to COMMENTS TokenSet, because it is used in JetParserDefinition.getCommentTokens(),
230         * and therefor all COMMENTS tokens will be ignored by PsiBuilder.
231         *
232         * @see org.jetbrains.kotlin.psi.JetPsiUtil#isInComment(com.intellij.psi.PsiElement)
233         */
234        TokenSet COMMENTS = TokenSet.create(EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT, SHEBANG_COMMENT);
235        TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.orSet(COMMENTS, TokenSet.create(WHITE_SPACE));
236    
237        TokenSet STRINGS = TokenSet.create(CHARACTER_LITERAL, REGULAR_STRING_PART);
238        TokenSet OPERATIONS = TokenSet.create(AS_KEYWORD, AS_SAFE, IS_KEYWORD, IN_KEYWORD, DOT, PLUSPLUS, MINUSMINUS, EXCLEXCL, MUL, PLUS,
239                                              MINUS, EXCL, DIV, PERC, LT, GT, LTEQ, GTEQ, EQEQEQ, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR,
240                                              SAFE_ACCESS, ELVIS,
241                //            MAP, FILTER,
242                                              COLON,
243                                              RANGE, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ,
244                                              NOT_IN, NOT_IS,
245                                              IDENTIFIER);
246    
247        TokenSet AUGMENTED_ASSIGNMENTS = TokenSet.create(PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ);
248        TokenSet ALL_ASSIGNMENTS = TokenSet.create(EQ, PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ);
249    }