/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.lang; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; import gw.lang.parser.ISourceCodeTokenizer; import gw.lang.parser.IToken; import org.jetbrains.annotations.NotNull; import java.util.Map; import java.util.Set; public class GosuTokenTypes { private static final Map<String, IElementType> TYPE_BY_TOKEN = Maps.newHashMap(); private static final Set<GosuElementType> KEYWORDS = Sets.newHashSet(); public static final GosuElementType TT_IDENTIFIER = addTokenType("_identifier_"); public static final GosuElementType TT_NUMBER = addTokenType("_literal_"); public static final GosuElementType TT_COMMENT_MULTILINE = addTokenType("_multiline_comment_"); public static final GosuElementType TT_COMMENT_LINE = addTokenType("_line_comment_"); public static final IElementType TT_WHITESPACE = TokenType.WHITE_SPACE; public static final GosuElementType TT_DOUBLE_QUOTED_STRING = addTokenType("_double_quoted_string_"); public static final GosuElementType TT_SINGLE_QUOTED_STRING = addTokenType("_single_quoted_string_"); // // Keywords // public static final GosuElementType TT_true = addKeyword("true"); public static final GosuElementType TT_false = addKeyword("false"); public static final GosuElementType TT_NaN = addKeyword("NaN"); public static final GosuElementType TT_Infinity = addKeyword("Infinity"); public static final GosuElementType TT_and = addKeyword("and"); public static final GosuElementType TT_or = addKeyword("or"); public static final GosuElementType TT_not = addKeyword("not"); public static final GosuElementType TT_null = addKeyword("null"); public static final GosuElementType TT_length = addKeyword("length"); public static final GosuElementType TT_exists = addKeyword("exists"); public static final GosuElementType TT_in = addKeyword("in"); public static final GosuElementType TT_startswith = addKeyword("startswith"); public static final GosuElementType TT_contains = addKeyword("contains"); public static final GosuElementType TT_where = addKeyword("where"); public static final GosuElementType TT_find = addKeyword("find"); public static final GosuElementType TT_var = addKeyword("var"); public static final GosuElementType TT_delegate = addKeyword("delegate"); public static final GosuElementType TT_represents = addKeyword("represents"); public static final GosuElementType TT_as = addKeyword("as"); public static final GosuElementType TT_typeof = addKeyword("typeof"); public static final GosuElementType TT_statictypeof = addKeyword("statictypeof"); public static final GosuElementType TT_typeis = addKeyword("typeis"); public static final GosuElementType TT_typeas = addKeyword("typeas"); public static final GosuElementType TT_print = addKeyword("print"); public static final GosuElementType TT_package = addKeyword("package"); public static final GosuElementType TT_uses = addKeyword("uses"); public static final GosuElementType TT_if = addKeyword("if"); public static final GosuElementType TT_else = addKeyword("else"); public static final GosuElementType TT_except = addKeyword("except"); public static final GosuElementType TT_unless = addKeyword("unless"); public static final GosuElementType TT_foreach = addKeyword("foreach"); public static final GosuElementType TT_for = addKeyword("for"); public static final GosuElementType TT_index = addKeyword("index"); public static final GosuElementType TT_iterator = addKeyword("iterator"); public static final GosuElementType TT_while = addKeyword("while"); public static final GosuElementType TT_do = addKeyword("do"); public static final GosuElementType TT_continue = addKeyword("continue"); public static final GosuElementType TT_break = addKeyword("break"); public static final GosuElementType TT_return = addKeyword("return"); public static final GosuElementType TT_construct = addKeyword("construct"); public static final GosuElementType TT_function = addKeyword("function"); public static final GosuElementType TT_property = addKeyword("property"); public static final GosuElementType TT_get = addKeyword("get"); public static final GosuElementType TT_set = addKeyword("set"); public static final GosuElementType TT_try = addKeyword("try"); public static final GosuElementType TT_catch = addKeyword("catch"); public static final GosuElementType TT_finally = addKeyword("finally"); public static final GosuElementType TT_this = addKeyword("this"); public static final GosuElementType TT_throw = addKeyword("throw"); public static final GosuElementType TT_assert = addKeyword("assert"); public static final GosuElementType TT_new = addKeyword("new"); public static final GosuElementType TT_switch = addKeyword("switch"); public static final GosuElementType TT_case = addKeyword("case"); public static final GosuElementType TT_default = addKeyword("default"); public static final GosuElementType TT_eval = addKeyword("eval"); public static final GosuElementType TT_private = addKeyword("private"); public static final GosuElementType TT_internal = addKeyword("internal"); public static final GosuElementType TT_protected = addKeyword("protected"); public static final GosuElementType TT_public = addKeyword("public"); public static final GosuElementType TT_abstract = addKeyword("abstract"); public static final GosuElementType TT_override = addKeyword("override"); public static final GosuElementType TT_hide = addKeyword("hide"); public static final GosuElementType TT_final = addKeyword("final"); public static final GosuElementType TT_static = addKeyword("static"); public static final GosuElementType TT_extends = addKeyword("extends"); public static final GosuElementType TT_transient = addKeyword("transient"); public static final GosuElementType TT_implements = addKeyword("implements"); public static final GosuElementType TT_readonly = addKeyword("readonly"); public static final GosuElementType TT_class = addKeyword("class"); public static final GosuElementType TT_interface = addKeyword("interface"); public static final GosuElementType TT_structure = addKeyword("structure"); public static final GosuElementType TT_enum = addKeyword("enum"); public static final GosuElementType TT_super = addKeyword("super"); public static final GosuElementType TT_outer = addKeyword("outer"); public static final GosuElementType TT_execution = addKeyword("execution"); public static final GosuElementType TT_request = addKeyword("request"); public static final GosuElementType TT_session = addKeyword("session"); public static final GosuElementType TT_application = addKeyword("application"); public static final GosuElementType TT_void = addKeyword("void"); public static final GosuElementType TT_block = addKeyword("block"); public static final GosuElementType TT_enhancement = addKeyword("enhancement"); public static final GosuElementType TT_classpath = addKeyword("classpath"); public static final GosuElementType TT_typeloader = addKeyword("typeloader"); public static final GosuElementType TT_using = addKeyword("using"); // // Operators // public static final GosuElementType TT_OP_assign = addTokenType("="); public static final GosuElementType TT_OP_greater = addTokenType(">"); public static final GosuElementType TT_OP_less = addTokenType("<"); public static final GosuElementType TT_OP_not_logical = addTokenType("!"); public static final GosuElementType TT_OP_not_bitwise = addTokenType("~"); public static final GosuElementType TT_OP_question = addTokenType("?"); public static final GosuElementType TT_OP_colon = addTokenType(":"); public static final GosuElementType TT_OP_ternary = addTokenType("?:"); public static final GosuElementType TT_OP_equals = addTokenType("=="); public static final GosuElementType TT_OP_less_equals = addTokenType("<="); public static final GosuElementType TT_OP_not_equals = addTokenType("!="); public static final GosuElementType TT_OP_not_equals_for_losers = addTokenType("<>"); public static final GosuElementType TT_OP_logical_and = addTokenType("&&"); public static final GosuElementType TT_OP_logical_or = addTokenType("||"); public static final GosuElementType TT_OP_increment = addTokenType("++"); public static final GosuElementType TT_OP_decrement = addTokenType("--"); public static final GosuElementType TT_OP_identity = addTokenType("==="); public static final GosuElementType TT_OP_not_identity = addTokenType("!=="); public static final GosuElementType TT_OP_expansion = addTokenType("*."); // Arithmetic operators public static final GosuElementType TT_OP_plus = addTokenType("+"); public static final GosuElementType TT_OP_minus = addTokenType("-"); public static final GosuElementType TT_OP_multiply = addTokenType("*"); public static final GosuElementType TT_OP_divide = addTokenType("/"); public static final GosuElementType TT_OP_modulo = addTokenType("%"); public static final GosuElementType TT_OP_bitwise_and = addTokenType("&"); public static final GosuElementType TT_OP_bitwise_or = addTokenType("|"); public static final GosuElementType TT_OP_bitwise_xor = addTokenType("^"); // Null-safe arithmetic operators public static final GosuElementType TT_OP_nullsafe_plus = addTokenType("?+"); public static final GosuElementType TT_OP_nullsafe_minus = addTokenType("?-"); public static final GosuElementType TT_OP_nullsafe_multiply = addTokenType("?*"); public static final GosuElementType TT_OP_nullsafe_divide = addTokenType("?/"); public static final GosuElementType TT_OP_nullsafe_modulo = addTokenType("?%"); // Compound operators public static final GosuElementType TT_OP_assign_plus = addTokenType("+="); public static final GosuElementType TT_OP_assign_minus = addTokenType("-="); public static final GosuElementType TT_OP_assign_multiply = addTokenType("*="); public static final GosuElementType TT_OP_assign_divide = addTokenType("/="); public static final GosuElementType TT_OP_assign_modulo = addTokenType("%="); public static final GosuElementType TT_OP_assign_and = addTokenType("&="); public static final GosuElementType TT_OP_assign_logical_and = addTokenType("&&="); public static final GosuElementType TT_OP_assing_or = addTokenType("|="); public static final GosuElementType TT_OP_assing_logical_or = addTokenType("||="); public static final GosuElementType TT_OP_assign_xor = addTokenType("^="); // Block operators public static final GosuElementType TT_OP_escape = addTokenType("\\"); public static final GosuElementType TT_OP_assign_closure = addTokenType("->"); // Member-access operators public static final GosuElementType TT_OP_dot = addTokenType("."); public static final GosuElementType TT_OP_nullsafe_dot = addTokenType("?."); // Null-safe array access public static final GosuElementType TT_OP_nullsafe_array_access = addTokenType("?["); // Interval operators public static final GosuElementType TT_OP_interval = addTokenType(".."); public static final GosuElementType TT_OP_interval_left_open = addTokenType("|.."); public static final GosuElementType TT_OP_interval_right_open = addTokenType("..|"); public static final GosuElementType TT_OP_interval_open = addTokenType("|..|"); // Feature Literals public static final GosuElementType TT_OP_feature_access = addTokenType("#"); public static final GosuElementType TT_OP_shift_left = addTokenType("<<"); public static final GosuElementType TT_OP_shift_right = addTokenType(">>"); public static final GosuElementType TT_OP_shift_right_unsigned = addTokenType(">>>"); public static final GosuElementType TT_OP_assign_shift_left = addTokenType("<<="); public static final GosuElementType TT_OP_assign_shift_right = addTokenType(">>="); public static final GosuElementType TT_OP_assign_shift_right_unsigned = addTokenType(">>>="); // Delimiters public static final GosuElementType TT_OP_brace_left = addTokenType("{"); public static final GosuElementType TT_OP_brace_right = addTokenType("}"); public static final GosuElementType TT_OP_paren_left = addTokenType("("); public static final GosuElementType TT_OP_paren_right = addTokenType(")"); public static final GosuElementType TT_OP_bracket_left = addTokenType("["); public static final GosuElementType TT_OP_bracket_right = addTokenType("]"); public static final GosuElementType TT_OP_quote_double = addTokenType("\""); public static final GosuElementType TT_OP_quote_single = addTokenType("'"); // Separators public static final GosuElementType TT_OP_at = addTokenType("@"); public static final GosuElementType TT_OP_dollar = addTokenType("$"); public static final GosuElementType TT_OP_comma = addTokenType(","); public static final GosuElementType TT_OP_semicolon = addTokenType(";"); public static final GosuElementType TT_OP_back_tick = addTokenType("`"); @NotNull private static GosuElementType addTokenType(@NotNull String strToken) { GosuElementType type = new GosuElementType(strToken); TYPE_BY_TOKEN.put(strToken, type); //## todo: copy keyword config wrt crappy mixed case from Keyword.java // TYPE_BY_TOKEN.put( strToken.toUpperCase(), type ); // TYPE_BY_TOKEN.put( Character.toUpperCase( strToken.charAt( 0 ) ) + strToken.substring( 1 ).toLowerCase(), type ); return type; } @NotNull private static GosuElementType addKeyword(@NotNull String strToken) { GosuElementType type = addTokenType(strToken); KEYWORDS.add(type); return type; } public static IElementType getTypeFrom(@NotNull IToken token) { switch (token.getType()) { case ISourceCodeTokenizer.TT_WORD: return TT_IDENTIFIER; case ISourceCodeTokenizer.TT_COMMENT: return token.getText().startsWith("//") ? TT_COMMENT_LINE : TT_COMMENT_MULTILINE; case ISourceCodeTokenizer.TT_WHITESPACE: return TT_WHITESPACE; case ISourceCodeTokenizer.TT_INTEGER: case ISourceCodeTokenizer.TT_NUMBER: return TT_NUMBER; case (int) '"': case (int) '\'': return TYPE_BY_TOKEN.get(String.valueOf((char) token.getType())); case ISourceCodeTokenizer.TT_KEYWORD: case ISourceCodeTokenizer.TT_OPERATOR: default: { IElementType tt = TYPE_BY_TOKEN.get(token.getText()); if (tt == null) { String tText = token.getText().toLowerCase(); tt = TYPE_BY_TOKEN.get(tText); if (tt == null) { if ("nan".equals(tText)) { tt = TYPE_BY_TOKEN.get("NaN"); } else if ("infinity".equals(tText)) { tt = TYPE_BY_TOKEN.get("Infinity"); } else { throw new IllegalStateException("Unhandled token type: " + token); } } } return tt; } } } public static boolean isKeyword(IElementType elementType) { return KEYWORDS.contains(elementType); } }