diff --git a/gradle.properties b/gradle.properties index 6f391a0..1a28bfc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ platformVersion = 2023.2.4 # Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html # Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22 -platformPlugins = org.jetbrains.plugins.textmate +platformPlugins = org.jetbrains.plugins.textmate, org.jetbrains.plugins.go:232.10203.2 pluginSinceBuild = 232 diff --git a/src/main/gen/com/templ/templ/parsing/TemplParser.java b/src/main/gen/com/templ/templ/parsing/TemplParser.java index 496933e..88ec8e7 100644 --- a/src/main/gen/com/templ/templ/parsing/TemplParser.java +++ b/src/main/gen/com/templ/templ/parsing/TemplParser.java @@ -10,6 +10,7 @@ import com.intellij.psi.tree.TokenSet; import com.intellij.lang.PsiParser; import com.intellij.lang.LightPsiParser; +import static com.intellij.psi.TokenType.WHITE_SPACE; @SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"}) public class TemplParser implements PsiParser, LightPsiParser { @@ -36,135 +37,40 @@ static boolean parse_root_(IElementType t, PsiBuilder b, int l) { } /* ********************************************************** */ - // COMPONENT_IMPORT_START COMPONENT_REFERENCE (component_struct_literal COMPONENT_REFERENCE)? component_params? component_children? + // COMPONENT_IMPORT_START COMPONENT_REFERENCE component_children? public static boolean component(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "component")) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_, COMPONENT, ""); r = consumeTokens(b, 1, COMPONENT_IMPORT_START, COMPONENT_REFERENCE); p = r; // pin = 1 - r = r && report_error_(b, component_2(b, l + 1)); - r = p && report_error_(b, component_3(b, l + 1)) && r; - r = p && component_4(b, l + 1) && r; + r = r && component_2(b, l + 1); exit_section_(b, l, m, r, p, TemplParser::recover_component); return r || p; } - // (component_struct_literal COMPONENT_REFERENCE)? + // component_children? private static boolean component_2(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "component_2")) return false; - component_2_0(b, l + 1); - return true; - } - - // component_struct_literal COMPONENT_REFERENCE - private static boolean component_2_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_2_0")) return false; - boolean r; - Marker m = enter_section_(b); - r = component_struct_literal(b, l + 1); - r = r && consumeToken(b, COMPONENT_REFERENCE); - exit_section_(b, m, null, r); - return r; - } - - // component_params? - private static boolean component_3(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_3")) return false; - component_params(b, l + 1); - return true; - } - - // component_children? - private static boolean component_4(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_4")) return false; component_children(b, l + 1); return true; } /* ********************************************************** */ - // COMPONENT_CHILDREN_START+ LBRACE html_decl_body RBRACE + // LBRACE html_decl_body RBRACE public static boolean component_children(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "component_children")) return false; - if (!nextTokenIs(b, COMPONENT_CHILDREN_START)) return false; - boolean r, p; - Marker m = enter_section_(b, l, _NONE_, COMPONENT_CHILDREN, null); - r = component_children_0(b, l + 1); - p = r; // pin = 1 - r = r && report_error_(b, consumeToken(b, LBRACE)); - r = p && report_error_(b, html_decl_body(b, l + 1)) && r; - r = p && consumeToken(b, RBRACE) && r; - exit_section_(b, l, m, r, p, null); - return r || p; - } - - // COMPONENT_CHILDREN_START+ - private static boolean component_children_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_children_0")) return false; - boolean r; - Marker m = enter_section_(b); - r = consumeToken(b, COMPONENT_CHILDREN_START); - while (r) { - int c = current_position_(b); - if (!consumeToken(b, COMPONENT_CHILDREN_START)) break; - if (!empty_element_parsed_guard_(b, "component_children_0", c)) break; - } - exit_section_(b, m, null, r); - return r; - } - - /* ********************************************************** */ - // LPARENTH GO_COMPONENT_IMPORT_PARAMS* RPARENTH - public static boolean component_params(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_params")) return false; - if (!nextTokenIs(b, LPARENTH)) return false; - boolean r, p; - Marker m = enter_section_(b, l, _NONE_, COMPONENT_PARAMS, null); - r = consumeToken(b, LPARENTH); - p = r; // pin = 1 - r = r && report_error_(b, component_params_1(b, l + 1)); - r = p && consumeToken(b, RPARENTH) && r; - exit_section_(b, l, m, r, p, null); - return r || p; - } - - // GO_COMPONENT_IMPORT_PARAMS* - private static boolean component_params_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_params_1")) return false; - while (true) { - int c = current_position_(b); - if (!consumeToken(b, GO_COMPONENT_IMPORT_PARAMS)) break; - if (!empty_element_parsed_guard_(b, "component_params_1", c)) break; - } - return true; - } - - /* ********************************************************** */ - // LBRACE GO_COMPONENT_STRUCT_LITERAL* RBRACE - public static boolean component_struct_literal(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_struct_literal")) return false; if (!nextTokenIs(b, LBRACE)) return false; boolean r, p; - Marker m = enter_section_(b, l, _NONE_, COMPONENT_STRUCT_LITERAL, null); + Marker m = enter_section_(b, l, _NONE_, COMPONENT_CHILDREN, null); r = consumeToken(b, LBRACE); p = r; // pin = 1 - r = r && report_error_(b, component_struct_literal_1(b, l + 1)); + r = r && report_error_(b, html_decl_body(b, l + 1)); r = p && consumeToken(b, RBRACE) && r; exit_section_(b, l, m, r, p, null); return r || p; } - // GO_COMPONENT_STRUCT_LITERAL* - private static boolean component_struct_literal_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "component_struct_literal_1")) return false; - while (true) { - int c = current_position_(b); - if (!consumeToken(b, GO_COMPONENT_STRUCT_LITERAL)) break; - if (!empty_element_parsed_guard_(b, "component_struct_literal_1", c)) break; - } - return true; - } - /* ********************************************************** */ // CSS_DECL_START CSS_CLASS_ID css_params LBRACE CSS_PROPERTIES* RBRACE public static boolean css_decl(PsiBuilder b, int l) { @@ -219,35 +125,56 @@ private static boolean css_params_1(PsiBuilder b, int l) { } /* ********************************************************** */ - // GO_ELSE_START_FRAGMENT html_decl_body + // RBRACE GO_ELSE (GO_IF GO_FRAGMENT+)? LBRACE html_decl_body public static boolean else_$(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "else_$")) return false; - if (!nextTokenIs(b, GO_ELSE_START_FRAGMENT)) return false; + if (!nextTokenIs(b, RBRACE)) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_, ELSE, null); - r = consumeToken(b, GO_ELSE_START_FRAGMENT); - p = r; // pin = 1 - r = r && html_decl_body(b, l + 1); + r = consumeTokens(b, 2, RBRACE, GO_ELSE); + p = r; // pin = 2 + r = r && report_error_(b, else_2(b, l + 1)); + r = p && report_error_(b, consumeToken(b, LBRACE)) && r; + r = p && html_decl_body(b, l + 1) && r; exit_section_(b, l, m, r, p, null); return r || p; } - /* ********************************************************** */ - // GO_ELSE_IF_START_FRAGMENT html_decl_body - public static boolean else_if(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "else_if")) return false; - if (!nextTokenIs(b, GO_ELSE_IF_START_FRAGMENT)) return false; - boolean r, p; - Marker m = enter_section_(b, l, _NONE_, ELSE_IF, null); - r = consumeToken(b, GO_ELSE_IF_START_FRAGMENT); - p = r; // pin = 1 - r = r && html_decl_body(b, l + 1); - exit_section_(b, l, m, r, p, null); - return r || p; + // (GO_IF GO_FRAGMENT+)? + private static boolean else_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "else_2")) return false; + else_2_0(b, l + 1); + return true; + } + + // GO_IF GO_FRAGMENT+ + private static boolean else_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "else_2_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, GO_IF); + r = r && else_2_0_1(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // GO_FRAGMENT+ + private static boolean else_2_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "else_2_0_1")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, GO_FRAGMENT); + while (r) { + int c = current_position_(b); + if (!consumeToken(b, GO_FRAGMENT)) break; + if (!empty_element_parsed_guard_(b, "else_2_0_1", c)) break; + } + exit_section_(b, m, null, r); + return r; } /* ********************************************************** */ - // BOOL_EXPR_START? LBRACE GO_EXPR* RBRACE + // BOOL_EXPR_START? LBRACE (GO_EXPR | TEMPL_FRAGMENT)* RBRACE public static boolean expr(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "expr")) return false; if (!nextTokenIs(b, "", BOOL_EXPR_START, LBRACE)) return false; @@ -269,42 +196,52 @@ private static boolean expr_0(PsiBuilder b, int l) { return true; } - // GO_EXPR* + // (GO_EXPR | TEMPL_FRAGMENT)* private static boolean expr_2(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "expr_2")) return false; while (true) { int c = current_position_(b); - if (!consumeToken(b, GO_EXPR)) break; + if (!expr_2_0(b, l + 1)) break; if (!empty_element_parsed_guard_(b, "expr_2", c)) break; } return true; } + // GO_EXPR | TEMPL_FRAGMENT + private static boolean expr_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "expr_2_0")) return false; + boolean r; + r = consumeToken(b, GO_EXPR); + if (!r) r = consumeToken(b, TEMPL_FRAGMENT); + return r; + } + /* ********************************************************** */ - // GO_FOR_START_FRAGMENT html_decl_body RBRACE + // GO_FOR GO_FRAGMENT* LBRACE html_decl_body RBRACE public static boolean for_loop(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "for_loop")) return false; - if (!nextTokenIs(b, GO_FOR_START_FRAGMENT)) return false; + if (!nextTokenIs(b, GO_FOR)) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_, FOR_LOOP, null); - r = consumeToken(b, GO_FOR_START_FRAGMENT); + r = consumeToken(b, GO_FOR); p = r; // pin = 1 - r = r && report_error_(b, html_decl_body(b, l + 1)); + r = r && report_error_(b, for_loop_1(b, l + 1)); + r = p && report_error_(b, consumeToken(b, LBRACE)) && r; + r = p && report_error_(b, html_decl_body(b, l + 1)) && r; r = p && consumeToken(b, RBRACE) && r; exit_section_(b, l, m, r, p, null); return r || p; } - /* ********************************************************** */ - // GO_ROOT_FRAGMENT - public static boolean go_root(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "go_root")) return false; - if (!nextTokenIs(b, GO_ROOT_FRAGMENT)) return false; - boolean r; - Marker m = enter_section_(b); - r = consumeToken(b, GO_ROOT_FRAGMENT); - exit_section_(b, m, GO_ROOT, r); - return r; + // GO_FRAGMENT* + private static boolean for_loop_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "for_loop_1")) return false; + while (true) { + int c = current_position_(b); + if (!consumeToken(b, GO_FRAGMENT)) break; + if (!empty_element_parsed_guard_(b, "for_loop_1", c)) break; + } + return true; } /* ********************************************************** */ @@ -336,7 +273,7 @@ private static boolean html_decl_1(PsiBuilder b, int l) { } /* ********************************************************** */ - // (HTML_FRAGMENT | expr | if_cond | switch_stmt | for_loop | component)* + // (HTML_FRAGMENT | TEMPL_FRAGMENT | raw_go | expr | if_cond | switch_stmt | for_loop | component)* public static boolean html_decl_body(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "html_decl_body")) return false; Marker m = enter_section_(b, l, _NONE_, HTML_DECL_BODY, ""); @@ -349,12 +286,14 @@ public static boolean html_decl_body(PsiBuilder b, int l) { return true; } - // HTML_FRAGMENT | expr | if_cond | switch_stmt | for_loop | component + // HTML_FRAGMENT | TEMPL_FRAGMENT | raw_go | expr | if_cond | switch_stmt | for_loop | component private static boolean html_decl_body_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "html_decl_body_0")) return false; boolean r; Marker m = enter_section_(b); r = consumeToken(b, HTML_FRAGMENT); + if (!r) r = consumeToken(b, TEMPL_FRAGMENT); + if (!r) r = raw_go(b, l + 1); if (!r) r = expr(b, l + 1); if (!r) r = if_cond(b, l + 1); if (!r) r = switch_stmt(b, l + 1); @@ -365,37 +304,68 @@ private static boolean html_decl_body_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // GO_IF_START_FRAGMENT html_decl_body else_if* else? RBRACE + // GO_IF GO_FRAGMENT* LBRACE html_decl_body else* RBRACE public static boolean if_cond(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "if_cond")) return false; - if (!nextTokenIs(b, GO_IF_START_FRAGMENT)) return false; + if (!nextTokenIs(b, GO_IF)) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_, IF_COND, null); - r = consumeToken(b, GO_IF_START_FRAGMENT); + r = consumeToken(b, GO_IF); p = r; // pin = 1 - r = r && report_error_(b, html_decl_body(b, l + 1)); - r = p && report_error_(b, if_cond_2(b, l + 1)) && r; - r = p && report_error_(b, if_cond_3(b, l + 1)) && r; + r = r && report_error_(b, if_cond_1(b, l + 1)); + r = p && report_error_(b, consumeToken(b, LBRACE)) && r; + r = p && report_error_(b, html_decl_body(b, l + 1)) && r; + r = p && report_error_(b, if_cond_4(b, l + 1)) && r; r = p && consumeToken(b, RBRACE) && r; exit_section_(b, l, m, r, p, null); return r || p; } - // else_if* - private static boolean if_cond_2(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_cond_2")) return false; + // GO_FRAGMENT* + private static boolean if_cond_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "if_cond_1")) return false; + while (true) { + int c = current_position_(b); + if (!consumeToken(b, GO_FRAGMENT)) break; + if (!empty_element_parsed_guard_(b, "if_cond_1", c)) break; + } + return true; + } + + // else* + private static boolean if_cond_4(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "if_cond_4")) return false; while (true) { int c = current_position_(b); - if (!else_if(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "if_cond_2", c)) break; + if (!else_$(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "if_cond_4", c)) break; } return true; } - // else? - private static boolean if_cond_3(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_cond_3")) return false; - else_$(b, l + 1); + /* ********************************************************** */ + // DOUBLE_LBRACE GO_FRAGMENT* DOUBLE_RBRACE + public static boolean raw_go(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "raw_go")) return false; + if (!nextTokenIs(b, DOUBLE_LBRACE)) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_, RAW_GO, null); + r = consumeToken(b, DOUBLE_LBRACE); + p = r; // pin = 1 + r = r && report_error_(b, raw_go_1(b, l + 1)); + r = p && consumeToken(b, DOUBLE_RBRACE) && r; + exit_section_(b, l, m, r, p, null); + return r || p; + } + + // GO_FRAGMENT* + private static boolean raw_go_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "raw_go_1")) return false; + while (true) { + int c = current_position_(b); + if (!consumeToken(b, GO_FRAGMENT)) break; + if (!empty_element_parsed_guard_(b, "raw_go_1", c)) break; + } return true; } @@ -444,13 +414,13 @@ private static boolean recover_component_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // go_root (root_item)* + // GO_PACKAGE_FRAGMENT (root_item)* static boolean root(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "root")) return false; - if (!nextTokenIs(b, GO_ROOT_FRAGMENT)) return false; + if (!nextTokenIs(b, GO_PACKAGE_FRAGMENT)) return false; boolean r; Marker m = enter_section_(b); - r = go_root(b, l + 1); + r = consumeToken(b, GO_PACKAGE_FRAGMENT); r = r && root_1(b, l + 1); exit_section_(b, m, null, r); return r; @@ -478,12 +448,12 @@ private static boolean root_1_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // go_root | html_decl | css_decl | script_decl + // GO_ROOT_FRAGMENT | html_decl | css_decl | script_decl static boolean root_item(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "root_item")) return false; boolean r; Marker m = enter_section_(b, l, _NONE_); - r = go_root(b, l + 1); + r = consumeToken(b, GO_ROOT_FRAGMENT); if (!r) r = html_decl(b, l + 1); if (!r) r = css_decl(b, l + 1); if (!r) r = script_decl(b, l + 1); @@ -492,7 +462,7 @@ static boolean root_item(PsiBuilder b, int l) { } /* ********************************************************** */ - // SCRIPT_DECL_START SCRIPT_FUNCTION_DECL* SCRIPT_BODY* RBRACE + // SCRIPT_DECL_START SCRIPT_FUNCTION_DECL* LBRACE SCRIPT_BODY* RBRACE public static boolean script_decl(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "script_decl")) return false; if (!nextTokenIs(b, SCRIPT_DECL_START)) return false; @@ -501,7 +471,8 @@ public static boolean script_decl(PsiBuilder b, int l) { r = consumeToken(b, SCRIPT_DECL_START); p = r; // pin = 1 r = r && report_error_(b, script_decl_1(b, l + 1)); - r = p && report_error_(b, script_decl_2(b, l + 1)) && r; + r = p && report_error_(b, consumeToken(b, LBRACE)) && r; + r = p && report_error_(b, script_decl_3(b, l + 1)) && r; r = p && consumeToken(b, RBRACE) && r; exit_section_(b, l, m, r, p, null); return r || p; @@ -519,12 +490,12 @@ private static boolean script_decl_1(PsiBuilder b, int l) { } // SCRIPT_BODY* - private static boolean script_decl_2(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "script_decl_2")) return false; + private static boolean script_decl_3(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "script_decl_3")) return false; while (true) { int c = current_position_(b); if (!consumeToken(b, SCRIPT_BODY)) break; - if (!empty_element_parsed_guard_(b, "script_decl_2", c)) break; + if (!empty_element_parsed_guard_(b, "script_decl_3", c)) break; } return true; } @@ -558,35 +529,48 @@ public static boolean switch_default(PsiBuilder b, int l) { } /* ********************************************************** */ - // GO_SWITCH_START_FRAGMENT switch_case* switch_default? RBRACE + // GO_SWITCH GO_FRAGMENT* LBRACE switch_case* switch_default? RBRACE public static boolean switch_stmt(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "switch_stmt")) return false; - if (!nextTokenIs(b, GO_SWITCH_START_FRAGMENT)) return false; + if (!nextTokenIs(b, GO_SWITCH)) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_, SWITCH_STMT, null); - r = consumeToken(b, GO_SWITCH_START_FRAGMENT); + r = consumeToken(b, GO_SWITCH); p = r; // pin = 1 r = r && report_error_(b, switch_stmt_1(b, l + 1)); - r = p && report_error_(b, switch_stmt_2(b, l + 1)) && r; + r = p && report_error_(b, consumeToken(b, LBRACE)) && r; + r = p && report_error_(b, switch_stmt_3(b, l + 1)) && r; + r = p && report_error_(b, switch_stmt_4(b, l + 1)) && r; r = p && consumeToken(b, RBRACE) && r; exit_section_(b, l, m, r, p, null); return r || p; } - // switch_case* + // GO_FRAGMENT* private static boolean switch_stmt_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "switch_stmt_1")) return false; while (true) { int c = current_position_(b); - if (!switch_case(b, l + 1)) break; + if (!consumeToken(b, GO_FRAGMENT)) break; if (!empty_element_parsed_guard_(b, "switch_stmt_1", c)) break; } return true; } + // switch_case* + private static boolean switch_stmt_3(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "switch_stmt_3")) return false; + while (true) { + int c = current_position_(b); + if (!switch_case(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "switch_stmt_3", c)) break; + } + return true; + } + // switch_default? - private static boolean switch_stmt_2(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "switch_stmt_2")) return false; + private static boolean switch_stmt_4(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "switch_stmt_4")) return false; switch_default(b, l + 1); return true; } diff --git a/src/main/gen/com/templ/templ/parsing/_TemplLexer.java b/src/main/gen/com/templ/templ/parsing/_TemplLexer.java index e0e8878..1b22972 100644 --- a/src/main/gen/com/templ/templ/parsing/_TemplLexer.java +++ b/src/main/gen/com/templ/templ/parsing/_TemplLexer.java @@ -6,7 +6,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.lexer.FlexLexer; import org.bouncycastle.util.Arrays; -import com.intellij.util.containers.Stack; +import com.intellij.util.containers.Stack;import q.H.W; import static com.intellij.psi.TokenType.*; import static com.templ.templ.psi.TemplTypes.*; @@ -29,17 +29,20 @@ public class _TemplLexer implements FlexLexer { public static final int IN_CSS_DECLARATION_BODY = 10; public static final int IN_SCRIPT_DECLARATION_START = 12; public static final int IN_SCRIPT_DECLARATION_BODY = 14; - public static final int IN_EXPR = 16; - public static final int IN_COMPONENT_IMPORT = 18; - public static final int IN_COMPONENT_IMPORT_STRUCT_LITERAL = 20; - public static final int IN_COMPONENT_IMPORT_PARAMS = 22; - public static final int IN_COMPONENT_IMPORT_PARAMS_END_WITHOUT_CHILDREN = 24; - public static final int IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START = 26; - public static final int IN_BLOCK_COMMENT = 28; - public static final int IN_GO_STRING = 30; - public static final int IN_GO_RAW_STRING = 32; - public static final int IN_HTML_COMMENT = 34; - public static final int IN_HTML_TAG_OPENER = 36; + public static final int IN_RAW_GO = 16; + public static final int IN_EXPR = 18; + public static final int IN_GO_BLOCK_START = 20; + public static final int IN_CLASS_EXPR = 22; + public static final int IN_COMPONENT_IMPORT = 24; + public static final int IN_COMPONENT_IMPORT_STRUCT_LITERAL = 26; + public static final int IN_COMPONENT_IMPORT_PARAMS = 28; + public static final int IN_COMPONENT_IMPORT_PARAMS_END_WITHOUT_CHILDREN = 30; + public static final int IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START = 32; + public static final int IN_BLOCK_COMMENT = 34; + public static final int IN_GO_STRING = 36; + public static final int IN_GO_RAW_STRING = 38; + public static final int IN_HTML_COMMENT = 40; + public static final int IN_HTML_TAG_OPENER = 42; /** * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l @@ -49,8 +52,8 @@ public class _TemplLexer implements FlexLexer { */ private static final int ZZ_LEXSTATE[] = { 0, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 11, - 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, - 20, 20, 21, 21, 22, 23 + 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 17, 17, + 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25 }; /** @@ -79,7 +82,7 @@ public class _TemplLexer implements FlexLexer { "\1\u6600\5\u1f00\1\u6700\1\u6800\1\u6900\5\u1f00\1\u6a00\1\u6b00"+ "\4\u1f00\1\u6c00\2\u1f00\1\u6d00\16\u1f00\246\u0100\1\u6e00\20\u0100"+ "\1\u6f00\1\u7000\25\u0100\1\u7100\34\u0100\1\u7200\14\u1f00\2\u0100"+ - "\1\u7300\u0b06\u1f00\1\u2700\u02fe\u1f00"; + "\1\u7300\u0b06\u1f00\1\u7400\u02fe\u1f00"; private static int [] zzUnpackcmap_top() { int [] result = new int[4352]; @@ -107,196 +110,226 @@ private static int zzUnpackcmap_top(String packed, int offset, int [] result) { private static final int [] ZZ_CMAP_BLOCKS = zzUnpackcmap_blocks(); private static final String ZZ_CMAP_BLOCKS_PACKED_0 = - "\11\0\1\1\1\2\2\3\1\4\22\0\1\5\1\6"+ - "\1\7\5\0\1\10\1\11\1\12\2\0\1\13\1\14"+ - "\1\15\12\16\1\17\1\0\1\20\1\21\1\22\1\23"+ - "\1\24\32\16\1\0\1\25\2\0\1\16\1\26\1\27"+ - "\1\16\1\30\1\31\1\32\1\33\1\16\1\34\1\35"+ - "\2\16\1\36\1\37\1\16\1\40\1\41\1\16\1\42"+ - "\1\43\1\44\1\45\1\16\1\46\3\16\1\47\1\0"+ - "\1\50\7\0\1\3\32\0\1\1\11\0\1\16\12\0"+ - "\1\16\4\0\1\16\5\0\27\16\1\0\37\16\1\0"+ - "\u01ca\16\4\0\14\16\16\0\5\16\7\0\1\16\1\0"+ - "\1\16\21\0\165\16\1\0\2\16\2\0\4\16\1\0"+ - "\1\16\6\0\1\16\1\0\3\16\1\0\1\16\1\0"+ - "\24\16\1\0\123\16\1\0\213\16\1\0\255\16\1\0"+ - "\46\16\2\0\1\16\6\0\51\16\10\0\55\16\1\0"+ - "\1\16\1\0\2\16\1\0\2\16\1\0\1\16\10\0"+ - "\33\16\4\0\4\16\35\0\13\16\5\0\112\16\4\0"+ - "\146\16\1\0\10\16\2\0\12\16\1\0\23\16\2\0"+ - "\1\16\20\0\73\16\2\0\145\16\16\0\66\16\4\0"+ - "\1\16\2\0\1\16\2\0\56\16\22\0\34\16\4\0"+ - "\13\16\65\0\25\16\1\0\10\16\25\0\17\16\1\0"+ - "\201\16\2\0\12\16\1\0\23\16\1\0\10\16\2\0"+ - "\2\16\2\0\26\16\1\0\7\16\1\0\1\16\3\0"+ - "\4\16\2\0\11\16\2\0\2\16\2\0\4\16\10\0"+ - "\1\16\4\0\2\16\1\0\5\16\2\0\14\16\12\0"+ - "\1\16\1\0\1\16\2\0\3\16\1\0\6\16\4\0"+ - "\2\16\2\0\26\16\1\0\7\16\1\0\2\16\1\0"+ - "\2\16\1\0\2\16\2\0\1\16\1\0\5\16\4\0"+ - "\2\16\2\0\3\16\3\0\1\16\7\0\4\16\1\0"+ - "\1\16\7\0\20\16\13\0\3\16\1\0\11\16\1\0"+ - "\3\16\1\0\26\16\1\0\7\16\1\0\2\16\1\0"+ - "\5\16\2\0\12\16\1\0\3\16\1\0\3\16\2\0"+ - "\1\16\17\0\4\16\2\0\12\16\11\0\7\16\1\0"+ - "\3\16\1\0\10\16\2\0\2\16\2\0\26\16\1\0"+ - "\7\16\1\0\2\16\1\0\5\16\2\0\11\16\2\0"+ - "\2\16\2\0\3\16\10\0\2\16\4\0\2\16\1\0"+ - "\5\16\2\0\12\16\1\0\1\16\20\0\2\16\1\0"+ - "\6\16\3\0\3\16\1\0\4\16\3\0\2\16\1\0"+ - "\1\16\1\0\2\16\3\0\2\16\3\0\3\16\3\0"+ - "\14\16\4\0\5\16\3\0\3\16\1\0\4\16\2\0"+ - "\1\16\6\0\1\16\16\0\12\16\20\0\15\16\1\0"+ - "\3\16\1\0\27\16\1\0\20\16\3\0\10\16\1\0"+ - "\3\16\1\0\4\16\7\0\2\16\1\0\3\16\5\0"+ - "\4\16\2\0\12\16\20\0\4\16\1\0\10\16\1\0"+ - "\3\16\1\0\27\16\1\0\12\16\1\0\5\16\2\0"+ - "\11\16\1\0\3\16\1\0\4\16\7\0\2\16\7\0"+ - "\1\16\1\0\4\16\2\0\12\16\1\0\2\16\15\0"+ - "\4\16\1\0\10\16\1\0\3\16\1\0\63\16\1\0"+ - "\3\16\1\0\5\16\5\0\4\16\7\0\5\16\2\0"+ - "\12\16\12\0\6\16\2\0\2\16\1\0\22\16\3\0"+ - "\30\16\1\0\11\16\1\0\1\16\2\0\7\16\3\0"+ - "\1\16\4\0\6\16\1\0\1\16\1\0\10\16\6\0"+ - "\12\16\2\0\2\16\15\0\72\16\5\0\17\16\1\0"+ - "\12\16\47\0\2\16\1\0\1\16\1\0\5\16\1\0"+ - "\30\16\1\0\1\16\1\0\27\16\2\0\5\16\1\0"+ - "\1\16\1\0\6\16\2\0\12\16\2\0\4\16\40\0"+ - "\1\16\27\0\2\16\6\0\12\16\13\0\1\16\1\0"+ - "\1\16\1\0\1\16\4\0\12\16\1\0\44\16\4\0"+ - "\24\16\1\0\22\16\1\0\44\16\11\0\1\16\71\0"+ - "\112\16\6\0\116\16\2\0\46\16\1\0\1\16\5\0"+ - "\1\16\2\0\53\16\1\0\115\16\1\0\4\16\2\0"+ - "\7\16\1\0\1\16\1\0\4\16\2\0\51\16\1\0"+ - "\4\16\2\0\41\16\1\0\4\16\2\0\7\16\1\0"+ - "\1\16\1\0\4\16\2\0\17\16\1\0\71\16\1\0"+ - "\4\16\2\0\103\16\2\0\3\16\40\0\20\16\20\0"+ - "\126\16\2\0\6\16\3\0\u016c\16\2\0\21\16\1\1"+ - "\32\16\5\0\113\16\3\0\13\16\7\0\15\16\1\0"+ - "\7\16\13\0\25\16\13\0\24\16\14\0\15\16\1\0"+ - "\3\16\1\0\2\16\14\0\124\16\3\0\1\16\4\0"+ - "\2\16\2\0\12\16\41\0\3\16\2\0\12\16\6\0"+ - "\131\16\7\0\53\16\5\0\106\16\12\0\37\16\1\0"+ - "\14\16\4\0\14\16\12\0\50\16\2\0\5\16\13\0"+ - "\54\16\4\0\32\16\6\0\12\16\46\0\34\16\4\0"+ - "\77\16\1\0\35\16\2\0\13\16\6\0\12\16\15\0"+ - "\1\16\10\0\17\16\101\0\114\16\4\0\12\16\21\0"+ - "\11\16\14\0\164\16\14\0\70\16\10\0\12\16\3\0"+ - "\61\16\2\0\11\16\7\0\53\16\2\0\3\16\20\0"+ - "\3\16\1\0\47\16\5\0\372\16\1\0\33\16\2\0"+ - "\6\16\2\0\46\16\2\0\6\16\2\0\10\16\1\0"+ - "\1\16\1\0\1\16\1\0\1\16\1\0\37\16\2\0"+ - "\65\16\1\0\7\16\1\0\1\16\3\0\3\16\1\0"+ - "\7\16\3\0\4\16\2\0\6\16\4\0\15\16\5\0"+ - "\3\16\1\0\7\16\3\0\13\1\35\0\2\3\5\0"+ - "\1\1\17\0\2\16\23\0\1\16\12\0\1\1\21\0"+ - "\1\16\15\0\1\16\20\0\15\16\63\0\41\16\21\0"+ - "\1\16\4\0\1\16\2\0\12\16\1\0\1\16\3\0"+ - "\5\16\6\0\1\16\1\0\1\16\1\0\1\16\1\0"+ - "\4\16\1\0\13\16\2\0\4\16\5\0\5\16\4\0"+ - "\1\16\21\0\51\16\u022d\0\64\16\26\0\57\16\1\0"+ - "\57\16\1\0\205\16\6\0\11\16\14\0\46\16\1\0"+ - "\1\16\5\0\1\16\2\0\70\16\7\0\1\16\17\0"+ - "\30\16\11\0\7\16\1\0\7\16\1\0\7\16\1\0"+ - "\7\16\1\0\7\16\1\0\7\16\1\0\7\16\1\0"+ - "\7\16\1\0\40\16\57\0\1\16\320\0\1\1\4\0"+ - "\3\16\31\0\17\16\1\0\5\16\2\0\5\16\4\0"+ - "\126\16\2\0\2\16\2\0\3\16\1\0\132\16\1\0"+ - "\4\16\5\0\53\16\1\0\136\16\21\0\33\16\65\0"+ - "\306\16\112\0\360\16\20\0\215\16\103\0\56\16\2\0"+ - "\15\16\3\0\34\16\24\0\63\16\1\0\12\16\1\0"+ - "\163\16\45\0\11\16\2\0\147\16\2\0\65\16\2\0"+ - "\5\16\60\0\61\16\30\0\64\16\14\0\106\16\12\0"+ - "\12\16\6\0\30\16\3\0\1\16\1\0\61\16\2\0"+ - "\44\16\14\0\35\16\3\0\101\16\16\0\13\16\6\0"+ - "\37\16\1\0\67\16\11\0\16\16\2\0\12\16\6\0"+ - "\27\16\3\0\111\16\30\0\3\16\2\0\20\16\2\0"+ - "\5\16\12\0\6\16\2\0\6\16\2\0\6\16\11\0"+ - "\7\16\1\0\7\16\1\0\53\16\1\0\14\16\10\0"+ - "\173\16\1\0\2\16\2\0\12\16\6\0\244\16\14\0"+ - "\27\16\4\0\61\16\4\0\u0100\51\156\16\2\0\152\16"+ - "\46\0\7\16\14\0\5\16\5\0\14\16\1\0\15\16"+ - "\1\0\5\16\1\0\1\16\1\0\2\16\1\0\2\16"+ - "\1\0\154\16\41\0\153\16\22\0\100\16\2\0\66\16"+ - "\50\0\14\16\4\0\20\16\20\0\20\16\3\0\2\16"+ - "\30\0\3\16\40\0\5\16\1\0\207\16\23\0\12\16"+ - "\7\0\32\16\4\0\1\16\1\0\32\16\13\0\131\16"+ - "\3\0\6\16\2\0\6\16\2\0\6\16\2\0\3\16"+ - "\43\0\14\16\1\0\32\16\1\0\23\16\1\0\2\16"+ - "\1\0\17\16\2\0\16\16\42\0\173\16\105\0\65\16"+ - "\210\0\1\16\202\0\35\16\3\0\61\16\17\0\1\16"+ - "\37\0\40\16\15\0\36\16\5\0\53\16\5\0\36\16"+ - "\2\0\44\16\4\0\10\16\1\0\5\16\52\0\236\16"+ - "\2\0\12\16\6\0\44\16\4\0\44\16\4\0\50\16"+ - "\10\0\64\16\234\0\67\16\11\0\26\16\12\0\10\16"+ - "\230\0\6\16\2\0\1\16\1\0\54\16\1\0\2\16"+ - "\3\0\1\16\2\0\27\16\12\0\27\16\11\0\37\16"+ - "\101\0\23\16\1\0\2\16\12\0\26\16\12\0\32\16"+ - "\106\0\70\16\6\0\2\16\100\0\4\16\1\0\2\16"+ - "\5\0\10\16\1\0\3\16\1\0\35\16\2\0\3\16"+ - "\4\0\1\16\40\0\35\16\3\0\35\16\43\0\10\16"+ - "\1\0\36\16\31\0\66\16\12\0\26\16\12\0\23\16"+ - "\15\0\22\16\156\0\111\16\67\0\63\16\15\0\63\16"+ - "\15\0\50\16\10\0\12\16\306\0\35\16\12\0\1\16"+ - "\10\0\41\16\217\0\27\16\11\0\107\16\37\0\12\16"+ - "\17\0\74\16\25\0\31\16\7\0\12\16\6\0\65\16"+ - "\1\0\12\16\4\0\3\16\11\0\44\16\2\0\1\16"+ - "\11\0\105\16\4\0\4\16\3\0\13\16\1\0\1\16"+ - "\43\0\22\16\1\0\45\16\6\0\1\16\101\0\7\16"+ - "\1\0\1\16\1\0\4\16\1\0\17\16\1\0\12\16"+ - "\7\0\73\16\5\0\12\16\6\0\4\16\1\0\10\16"+ - "\2\0\2\16\2\0\26\16\1\0\7\16\1\0\2\16"+ - "\1\0\5\16\1\0\12\16\2\0\2\16\2\0\3\16"+ - "\2\0\1\16\6\0\1\16\5\0\7\16\2\0\7\16"+ - "\3\0\5\16\213\0\113\16\5\0\12\16\4\0\2\16"+ - "\40\0\106\16\1\0\1\16\10\0\12\16\246\0\66\16"+ - "\2\0\11\16\27\0\6\16\42\0\101\16\3\0\1\16"+ - "\13\0\12\16\46\0\71\16\7\0\12\16\66\0\33\16"+ - "\2\0\17\16\4\0\12\16\306\0\73\16\145\0\112\16"+ - "\25\0\1\16\240\0\10\16\2\0\56\16\2\0\10\16"+ - "\1\0\2\16\33\0\77\16\10\0\1\16\10\0\112\16"+ - "\3\0\1\16\42\0\71\16\7\0\11\16\1\0\55\16"+ - "\1\0\11\16\17\0\12\16\30\0\36\16\2\0\26\16"+ - "\1\0\16\16\111\0\7\16\1\0\2\16\1\0\54\16"+ - "\3\0\1\16\1\0\2\16\1\0\11\16\10\0\12\16"+ - "\6\0\6\16\1\0\2\16\1\0\45\16\1\0\2\16"+ - "\1\0\6\16\7\0\12\16\u0136\0\27\16\11\0\232\16"+ - "\146\0\157\16\21\0\304\16\274\0\57\16\321\0\107\16"+ - "\271\0\71\16\7\0\37\16\1\0\12\16\146\0\36\16"+ - "\2\0\5\16\13\0\67\16\11\0\4\16\14\0\12\16"+ - "\11\0\25\16\5\0\23\16\260\0\100\16\200\0\113\16"+ - "\4\0\71\16\7\0\21\16\100\0\2\16\1\0\1\16"+ - "\34\0\370\16\10\0\363\16\15\0\37\16\61\0\3\16"+ - "\21\0\4\16\10\0\u018c\16\4\0\153\16\5\0\15\16"+ - "\3\0\11\16\7\0\12\16\3\0\2\16\306\0\5\16"+ - "\3\0\6\16\10\0\10\16\2\0\7\16\36\0\4\16"+ - "\224\0\3\16\273\0\125\16\1\0\107\16\1\0\2\16"+ - "\2\0\1\16\2\0\2\16\2\0\4\16\1\0\14\16"+ - "\1\0\1\16\1\0\7\16\1\0\101\16\1\0\4\16"+ - "\2\0\10\16\1\0\7\16\1\0\34\16\1\0\4\16"+ - "\1\0\5\16\1\0\1\16\3\0\7\16\1\0\u0154\16"+ - "\2\0\31\16\1\0\31\16\1\0\37\16\1\0\31\16"+ - "\1\0\37\16\1\0\31\16\1\0\37\16\1\0\31\16"+ - "\1\0\37\16\1\0\31\16\1\0\10\16\2\0\151\16"+ - "\4\0\62\16\10\0\1\16\16\0\1\16\26\0\5\16"+ - "\1\0\17\16\120\0\7\16\1\0\21\16\2\0\7\16"+ - "\1\0\2\16\1\0\5\16\325\0\55\16\3\0\16\16"+ - "\2\0\12\16\4\0\1\16\u0171\0\72\16\6\0\305\16"+ - "\13\0\7\16\51\0\114\16\4\0\12\16\246\0\4\16"+ - "\1\0\33\16\1\0\2\16\1\0\1\16\2\0\1\16"+ - "\1\0\12\16\1\0\4\16\1\0\1\16\1\0\1\16"+ - "\6\0\1\16\4\0\1\16\1\0\1\16\1\0\1\16"+ - "\1\0\3\16\1\0\2\16\1\0\1\16\2\0\1\16"+ - "\1\0\1\16\1\0\1\16\1\0\1\16\1\0\1\16"+ - "\1\0\2\16\1\0\1\16\2\0\4\16\1\0\7\16"+ - "\1\0\4\16\1\0\4\16\1\0\1\16\1\0\12\16"+ - "\1\0\21\16\5\0\3\16\1\0\5\16\1\0\21\16"+ - "\164\0\32\16\6\0\32\16\6\0\32\16\166\0\327\16"+ - "\51\0\65\16\13\0\336\16\2\0\u0182\16\16\0\u0131\16"+ - "\37\0\36\16\342\0"; + "\11\0\1\1\1\2\1\3\1\4\1\5\22\0\1\1"+ + "\1\6\1\7\4\0\1\10\1\11\1\12\1\13\1\0"+ + "\1\14\1\15\1\16\1\17\12\20\1\21\1\0\1\22"+ + "\1\23\1\24\1\25\1\26\32\20\1\0\1\27\2\0"+ + "\1\30\1\31\1\32\1\20\1\33\1\34\1\35\1\36"+ + "\1\37\1\40\1\41\1\20\1\42\1\43\1\44\1\20"+ + "\1\45\1\46\1\20\1\47\1\50\1\51\1\52\1\20"+ + "\1\53\3\20\1\54\1\0\1\55\7\0\1\3\32\0"+ + "\1\56\11\0\1\20\12\0\1\20\4\0\1\20\5\0"+ + "\27\20\1\0\37\20\1\0\u01ca\20\4\0\14\20\16\0"+ + "\5\20\7\0\1\20\1\0\1\20\21\0\160\30\5\20"+ + "\1\0\2\20\2\0\4\20\1\0\1\20\6\0\1\20"+ + "\1\0\3\20\1\0\1\20\1\0\24\20\1\0\123\20"+ + "\1\0\213\20\1\0\7\30\246\20\1\0\46\20\2\0"+ + "\1\20\6\0\51\20\10\0\55\30\1\0\1\30\1\0"+ + "\2\30\1\0\2\30\1\0\1\30\10\0\33\20\4\0"+ + "\4\20\35\0\13\30\5\0\53\20\25\30\12\20\4\0"+ + "\2\20\1\30\143\20\1\0\1\20\7\30\2\0\6\30"+ + "\2\20\2\30\1\0\4\30\17\20\2\0\1\20\20\0"+ + "\1\20\1\30\36\20\33\30\2\0\131\20\13\30\1\20"+ + "\16\0\53\20\11\30\2\20\4\0\1\20\2\0\1\30"+ + "\2\0\26\20\4\30\1\20\11\30\1\20\3\30\1\20"+ + "\5\30\22\0\31\20\3\30\4\0\13\20\65\0\25\20"+ + "\1\0\10\20\25\0\17\30\1\0\41\30\66\20\3\30"+ + "\1\20\22\30\1\20\7\30\12\20\2\30\2\0\12\20"+ + "\1\0\20\20\3\30\1\0\10\20\2\0\2\20\2\0"+ + "\26\20\1\0\7\20\1\0\1\20\3\0\4\20\2\0"+ + "\1\30\1\20\7\30\2\0\2\30\2\0\3\30\1\20"+ + "\10\0\1\30\4\0\2\20\1\0\3\20\2\30\2\0"+ + "\14\20\12\0\1\20\1\0\1\30\2\0\3\30\1\0"+ + "\6\20\4\0\2\20\2\0\26\20\1\0\7\20\1\0"+ + "\2\20\1\0\2\20\1\0\2\20\2\0\1\30\1\0"+ + "\5\30\4\0\2\30\2\0\3\30\3\0\1\30\7\0"+ + "\4\20\1\0\1\20\7\0\12\20\2\30\3\20\1\30"+ + "\13\0\3\30\1\0\11\20\1\0\3\20\1\0\26\20"+ + "\1\0\7\20\1\0\2\20\1\0\5\20\2\0\1\30"+ + "\1\20\10\30\1\0\3\30\1\0\3\30\2\0\1\20"+ + "\17\0\2\20\2\30\2\0\12\20\11\0\1\20\6\30"+ + "\1\0\3\30\1\0\10\20\2\0\2\20\2\0\26\20"+ + "\1\0\7\20\1\0\2\20\1\0\5\20\2\0\1\30"+ + "\1\20\7\30\2\0\2\30\2\0\3\30\10\0\2\30"+ + "\4\0\2\20\1\0\3\20\2\30\2\0\12\20\1\0"+ + "\1\20\20\0\1\30\1\20\1\0\6\20\3\0\3\20"+ + "\1\0\4\20\3\0\2\20\1\0\1\20\1\0\2\20"+ + "\3\0\2\20\3\0\3\20\3\0\14\20\4\0\5\30"+ + "\3\0\3\30\1\0\4\30\2\0\1\20\6\0\1\30"+ + "\16\0\12\20\20\0\5\30\10\20\1\0\3\20\1\0"+ + "\27\20\1\0\20\20\3\0\1\20\7\30\1\0\3\30"+ + "\1\0\4\30\7\0\2\30\1\0\3\20\5\0\2\20"+ + "\2\30\2\0\12\20\20\0\1\20\3\30\1\0\10\20"+ + "\1\0\3\20\1\0\27\20\1\0\12\20\1\0\5\20"+ + "\2\0\1\30\1\20\7\30\1\0\3\30\1\0\4\30"+ + "\7\0\2\30\7\0\1\20\1\0\2\20\2\30\2\0"+ + "\12\20\1\0\2\20\15\0\4\30\1\0\10\20\1\0"+ + "\3\20\1\0\51\20\2\30\1\20\7\30\1\0\3\30"+ + "\1\0\4\30\1\20\5\0\3\20\1\30\7\0\3\20"+ + "\2\30\2\0\12\20\12\0\6\20\2\0\2\30\1\0"+ + "\22\20\3\0\30\20\1\0\11\20\1\0\1\20\2\0"+ + "\7\20\3\0\1\30\4\0\6\30\1\0\1\30\1\0"+ + "\10\30\6\0\12\20\2\0\2\30\15\0\60\20\1\30"+ + "\2\20\7\30\5\0\7\20\10\30\1\0\12\20\47\0"+ + "\2\20\1\0\1\20\1\0\5\20\1\0\30\20\1\0"+ + "\1\20\1\0\12\20\1\30\2\20\11\30\1\20\2\0"+ + "\5\20\1\0\1\20\1\0\6\30\2\0\12\20\2\0"+ + "\4\20\40\0\1\20\27\0\2\30\6\0\12\20\13\0"+ + "\1\30\1\0\1\30\1\0\1\30\4\0\2\30\10\20"+ + "\1\0\44\20\4\0\24\30\1\0\2\30\5\20\13\30"+ + "\1\0\44\30\11\0\1\30\71\0\53\20\24\30\13\20"+ + "\6\0\6\20\4\30\4\20\3\30\1\20\3\30\2\20"+ + "\7\30\3\20\4\30\15\20\14\30\1\20\1\30\12\20"+ + "\4\30\2\0\46\20\1\0\1\20\5\0\1\20\2\0"+ + "\53\20\1\0\115\20\1\0\4\20\2\0\7\20\1\0"+ + "\1\20\1\0\4\20\2\0\51\20\1\0\4\20\2\0"+ + "\41\20\1\0\4\20\2\0\7\20\1\0\1\20\1\0"+ + "\4\20\2\0\17\20\1\0\71\20\1\0\4\20\2\0"+ + "\103\20\2\0\3\30\40\0\20\20\20\0\126\20\2\0"+ + "\6\20\3\0\u016c\20\2\0\21\20\1\56\32\20\5\0"+ + "\113\20\3\0\3\30\10\20\7\0\15\20\1\0\4\20"+ + "\3\30\13\0\22\20\3\30\13\0\22\20\2\30\14\0"+ + "\15\20\1\0\3\20\1\0\2\30\14\0\64\20\40\30"+ + "\3\0\1\20\4\0\1\20\1\30\2\0\12\20\41\0"+ + "\3\30\2\0\12\20\6\0\131\20\7\0\5\20\2\30"+ + "\42\20\1\30\1\20\5\0\106\20\12\0\37\20\1\0"+ + "\14\30\4\0\14\30\12\0\50\20\2\0\5\20\13\0"+ + "\54\20\4\0\32\20\6\0\12\20\46\0\27\20\5\30"+ + "\4\0\65\20\12\30\1\0\35\30\2\0\1\30\12\20"+ + "\6\0\12\20\15\0\1\20\10\0\17\30\101\0\5\30"+ + "\57\20\21\30\7\20\4\0\12\20\21\0\11\30\14\0"+ + "\3\30\36\20\15\30\70\20\16\30\14\0\44\20\24\30"+ + "\10\0\12\20\3\0\61\20\2\0\11\20\7\0\53\20"+ + "\2\0\3\20\20\0\3\30\1\0\25\30\4\20\1\30"+ + "\6\20\1\30\2\20\3\30\1\20\5\0\300\20\72\30"+ + "\1\0\5\30\26\20\2\0\6\20\2\0\46\20\2\0"+ + "\6\20\2\0\10\20\1\0\1\20\1\0\1\20\1\0"+ + "\1\20\1\0\37\20\2\0\65\20\1\0\7\20\1\0"+ + "\1\20\3\0\3\20\1\0\7\20\3\0\4\20\2\0"+ + "\6\20\4\0\15\20\5\0\3\20\1\0\7\20\3\0"+ + "\13\56\35\0\2\3\5\0\1\56\17\0\2\30\23\0"+ + "\1\30\12\0\1\56\21\0\1\20\15\0\1\20\20\0"+ + "\15\20\63\0\41\30\21\0\1\20\4\0\1\20\2\0"+ + "\12\20\1\0\1\20\3\0\5\20\6\0\1\20\1\0"+ + "\1\20\1\0\1\20\1\0\4\20\1\0\13\20\2\0"+ + "\4\20\5\0\5\20\4\0\1\20\21\0\43\30\2\20"+ + "\4\30\u022d\0\64\30\26\0\57\20\1\0\57\20\1\0"+ + "\205\20\6\0\4\20\3\30\2\20\14\0\46\20\1\0"+ + "\1\20\5\0\1\20\2\0\70\20\7\0\1\20\17\0"+ + "\1\30\27\20\11\0\7\20\1\0\7\20\1\0\7\20"+ + "\1\0\7\20\1\0\7\20\1\0\7\20\1\0\7\20"+ + "\1\0\7\20\1\0\40\30\57\0\1\20\320\0\1\56"+ + "\4\0\2\20\1\30\31\0\17\30\1\0\5\20\2\0"+ + "\3\30\2\20\4\0\126\20\2\0\2\30\2\0\3\20"+ + "\1\0\132\20\1\0\4\20\5\0\53\20\1\0\136\20"+ + "\21\0\33\20\65\0\306\20\112\0\360\20\20\0\215\20"+ + "\103\0\56\20\2\0\15\20\3\0\34\20\24\0\57\20"+ + "\4\30\1\0\12\30\1\0\37\20\2\30\106\20\14\30"+ + "\45\0\11\20\2\0\147\20\2\0\65\20\2\0\5\20"+ + "\60\0\13\20\1\30\3\20\1\30\4\20\1\30\27\20"+ + "\5\30\30\0\64\20\14\0\2\30\62\20\22\30\12\0"+ + "\12\20\6\0\22\30\6\20\3\0\1\20\1\0\2\20"+ + "\1\30\46\20\10\30\2\0\27\20\15\30\14\0\35\20"+ + "\3\0\4\30\57\20\16\30\16\0\13\20\6\0\5\20"+ + "\1\30\31\20\1\0\51\20\16\30\11\0\3\20\1\30"+ + "\10\20\2\30\2\0\12\20\6\0\27\20\3\0\1\20"+ + "\3\30\62\20\1\30\1\20\3\30\2\20\2\30\5\20"+ + "\2\30\1\20\1\30\1\20\30\0\3\20\2\0\13\20"+ + "\5\30\2\0\3\20\2\30\12\0\6\20\2\0\6\20"+ + "\2\0\6\20\11\0\7\20\1\0\7\20\1\0\53\20"+ + "\1\0\14\20\10\0\163\20\10\30\1\0\2\30\2\0"+ + "\12\20\6\0\244\20\14\0\27\20\4\0\61\20\4\0"+ + "\u0100\57\156\20\2\0\152\20\46\0\7\20\14\0\5\20"+ + "\5\0\1\20\1\30\12\20\1\0\15\20\1\0\5\20"+ + "\1\0\1\20\1\0\2\20\1\0\2\20\1\0\154\20"+ + "\41\0\153\20\22\0\100\20\2\0\66\20\50\0\14\20"+ + "\4\0\20\30\20\0\20\30\3\0\2\30\30\0\3\30"+ + "\40\0\5\20\1\0\207\20\23\0\12\20\7\0\32\20"+ + "\4\0\1\30\1\0\32\20\13\0\131\20\3\0\6\20"+ + "\2\0\6\20\2\0\6\20\2\0\3\20\43\0\14\20"+ + "\1\0\32\20\1\0\23\20\1\0\2\20\1\0\17\20"+ + "\2\0\16\20\42\0\173\20\105\0\65\30\210\0\1\30"+ + "\202\0\35\20\3\0\61\20\17\0\1\30\37\0\40\20"+ + "\15\0\24\20\1\30\10\20\1\30\5\0\46\20\5\30"+ + "\5\0\36\20\2\0\44\20\4\0\10\20\1\0\5\30"+ + "\52\0\236\20\2\0\12\20\6\0\44\20\4\0\44\20"+ + "\4\0\50\20\10\0\64\20\234\0\67\20\11\0\26\20"+ + "\12\0\10\20\230\0\6\20\2\0\1\20\1\0\54\20"+ + "\1\0\2\20\3\0\1\20\2\0\27\20\12\0\27\20"+ + "\11\0\37\20\101\0\23\20\1\0\2\20\12\0\26\20"+ + "\12\0\32\20\106\0\70\20\6\0\2\20\100\0\1\20"+ + "\3\30\1\0\2\30\5\0\4\30\4\20\1\0\3\20"+ + "\1\0\35\20\2\0\3\30\4\0\1\30\40\0\35\20"+ + "\3\0\35\20\43\0\10\20\1\0\34\20\2\30\31\0"+ + "\66\20\12\0\26\20\12\0\23\20\15\0\22\20\156\0"+ + "\111\20\67\0\63\20\15\0\63\20\15\0\44\20\4\30"+ + "\10\0\12\20\306\0\35\20\12\0\1\20\10\0\26\20"+ + "\13\30\217\0\27\20\11\0\3\30\65\20\17\30\37\0"+ + "\12\20\17\0\4\30\55\20\13\30\25\0\31\20\7\0"+ + "\12\20\6\0\3\30\44\20\16\30\1\0\12\20\4\0"+ + "\1\20\2\30\11\0\43\20\1\30\2\0\1\20\11\0"+ + "\3\30\60\20\16\30\4\20\4\0\4\30\3\0\13\20"+ + "\1\0\1\20\43\0\22\20\1\0\31\20\14\30\6\0"+ + "\1\30\101\0\7\20\1\0\1\20\1\0\4\20\1\0"+ + "\17\20\1\0\12\20\7\0\57\20\14\30\5\0\12\20"+ + "\6\0\4\30\1\0\10\20\2\0\2\20\2\0\26\20"+ + "\1\0\7\20\1\0\2\20\1\0\5\20\1\0\2\30"+ + "\1\20\7\30\2\0\2\30\2\0\3\30\2\0\1\20"+ + "\6\0\1\30\5\0\5\20\2\30\2\0\7\30\3\0"+ + "\5\30\213\0\65\20\22\30\4\20\5\0\12\20\4\0"+ + "\1\30\1\20\40\0\60\20\24\30\2\20\1\0\1\20"+ + "\10\0\12\20\246\0\57\20\7\30\2\0\11\30\27\0"+ + "\4\20\2\30\42\0\60\20\21\30\3\0\1\20\13\0"+ + "\12\20\46\0\53\20\15\30\1\20\7\0\12\20\66\0"+ + "\33\20\2\0\17\30\4\0\12\20\306\0\54\20\17\30"+ + "\145\0\112\20\25\0\1\20\240\0\10\20\2\0\47\20"+ + "\7\30\2\0\7\30\1\20\1\0\1\20\1\30\33\0"+ + "\1\20\12\30\50\20\7\30\1\20\4\30\10\0\1\30"+ + "\10\0\1\20\13\30\56\20\20\30\3\0\1\20\42\0"+ + "\71\20\7\0\11\20\1\0\45\20\10\30\1\0\10\30"+ + "\1\20\17\0\12\20\30\0\36\20\2\0\26\30\1\0"+ + "\16\30\111\0\7\20\1\0\2\20\1\0\46\20\6\30"+ + "\3\0\1\30\1\0\2\30\1\0\7\30\1\20\1\30"+ + "\10\0\12\20\6\0\6\20\1\0\2\20\1\0\40\20"+ + "\5\30\1\0\2\30\1\0\5\30\1\20\7\0\12\20"+ + "\u0136\0\23\20\4\30\11\0\232\20\146\0\157\30\21\0"+ + "\304\20\274\0\57\20\321\0\107\20\271\0\71\20\7\0"+ + "\37\20\1\0\12\20\146\0\36\20\2\0\5\30\13\0"+ + "\60\20\7\30\11\0\4\20\14\0\12\20\11\0\25\20"+ + "\5\0\23\20\260\0\100\20\200\0\113\20\4\0\1\30"+ + "\1\20\67\30\7\0\4\30\15\20\100\0\2\20\1\0"+ + "\1\20\34\0\370\20\10\0\363\20\15\0\37\20\61\0"+ + "\3\20\21\0\4\20\10\0\u018c\20\4\0\153\20\5\0"+ + "\15\20\3\0\11\20\7\0\12\20\3\0\2\30\306\0"+ + "\5\30\3\0\6\30\10\0\10\30\2\0\7\30\36\0"+ + "\4\30\224\0\3\30\273\0\125\20\1\0\107\20\1\0"+ + "\2\20\2\0\1\20\2\0\2\20\2\0\4\20\1\0"+ + "\14\20\1\0\1\20\1\0\7\20\1\0\101\20\1\0"+ + "\4\20\2\0\10\20\1\0\7\20\1\0\34\20\1\0"+ + "\4\20\1\0\5\20\1\0\1\20\3\0\7\20\1\0"+ + "\u0154\20\2\0\31\20\1\0\31\20\1\0\37\20\1\0"+ + "\31\20\1\0\37\20\1\0\31\20\1\0\37\20\1\0"+ + "\31\20\1\0\37\20\1\0\31\20\1\0\10\20\2\0"+ + "\62\20\67\30\4\0\62\30\10\0\1\30\16\0\1\30"+ + "\26\0\5\30\1\0\17\30\120\0\7\30\1\0\21\30"+ + "\2\0\7\30\1\0\2\30\1\0\5\30\325\0\55\20"+ + "\3\0\7\30\7\20\2\0\12\20\4\0\1\20\u0171\0"+ + "\54\20\4\30\12\20\6\0\305\20\13\0\7\30\51\0"+ + "\104\20\7\30\1\20\4\0\12\20\246\0\4\20\1\0"+ + "\33\20\1\0\2\20\1\0\1\20\2\0\1\20\1\0"+ + "\12\20\1\0\4\20\1\0\1\20\1\0\1\20\6\0"+ + "\1\20\4\0\1\20\1\0\1\20\1\0\1\20\1\0"+ + "\3\20\1\0\2\20\1\0\1\20\2\0\1\20\1\0"+ + "\1\20\1\0\1\20\1\0\1\20\1\0\1\20\1\0"+ + "\2\20\1\0\1\20\2\0\4\20\1\0\7\20\1\0"+ + "\4\20\1\0\4\20\1\0\1\20\1\0\12\20\1\0"+ + "\21\20\5\0\3\20\1\0\5\20\1\0\21\20\164\0"+ + "\32\30\6\0\32\30\6\0\32\30\166\0\327\20\51\0"+ + "\65\20\13\0\336\20\2\0\u0182\20\16\0\u0131\20\37\0"+ + "\36\20\342\0\360\30\20\0"; private static int [] zzUnpackcmap_blocks() { - int [] result = new int[29696]; + int [] result = new int[29952]; int offset = 0; offset = zzUnpackcmap_blocks(ZZ_CMAP_BLOCKS_PACKED_0, offset, result); return result; @@ -320,22 +353,22 @@ private static int zzUnpackcmap_blocks(String packed, int offset, int [] result) private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\30\0\1\1\1\2\1\1\1\3\3\1\3\4\2\5"+ + "\32\0\1\1\1\2\1\1\1\3\4\1\3\4\3\5"+ "\1\6\1\5\1\7\1\10\1\5\1\11\5\5\1\12"+ "\1\13\1\14\1\15\1\13\1\16\1\13\1\17\1\20"+ - "\1\21\1\17\2\22\1\12\3\23\2\24\2\25\1\26"+ - "\1\27\1\30\1\31\2\32\1\33\1\34\1\35\1\34"+ - "\1\36\1\37\3\40\1\41\1\42\2\41\2\5\1\43"+ - "\2\5\1\44\1\45\3\0\2\46\17\0\2\47\2\50"+ - "\1\0\1\51\1\52\1\0\1\53\1\54\4\0\1\55"+ - "\11\0\1\56\1\57\1\60\1\61\1\62\2\0\1\63"+ - "\4\0\2\64\2\0\1\65\4\0\1\66\1\0\1\67"+ - "\3\0\2\70\1\0\2\71\2\0\2\72\1\73\1\0"+ - "\1\74\2\0\1\75\3\0\2\76\1\77\2\100\1\101"+ - "\1\102"; + "\1\21\1\17\2\22\1\12\3\23\2\24\3\25\1\26"+ + "\1\14\2\26\1\27\1\30\5\25\2\31\1\32\1\33"+ + "\4\34\1\35\1\36\3\37\1\40\1\41\2\40\2\5"+ + "\1\42\3\5\1\43\1\44\4\0\2\45\3\0\1\46"+ + "\1\47\13\0\1\50\1\0\2\51\2\52\1\53\4\0"+ + "\1\54\2\0\2\55\1\0\2\56\1\0\1\57\1\60"+ + "\6\0\1\61\10\0\1\62\3\0\1\63\1\0\2\64"+ + "\1\65\1\66\1\67\4\0\1\70\4\0\1\71\4\0"+ + "\1\72\1\73\6\0\1\74\3\75\1\0\1\76\1\77"+ + "\2\0\1\100\1\0\1\101\2\102\1\0\3\103\1\104"; private static int [] zzUnpackAction() { - int [] result = new int[190]; + int [] result = new int[220]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -360,33 +393,37 @@ private static int zzUnpackAction(String packed, int offset, int [] result) { private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\52\0\124\0\176\0\250\0\322\0\374\0\u0126"+ - "\0\u0150\0\u017a\0\u01a4\0\u01ce\0\u01f8\0\u0222\0\u024c\0\u0276"+ - "\0\u02a0\0\u02ca\0\u02f4\0\u031e\0\u0348\0\u0372\0\u039c\0\u03c6"+ - "\0\u03f0\0\u03f0\0\u041a\0\u03f0\0\u0444\0\u046e\0\u0498\0\u03f0"+ - "\0\u041a\0\u04c2\0\u03f0\0\u041a\0\u04ec\0\u0516\0\u03f0\0\u0540"+ - "\0\u056a\0\u03f0\0\u0594\0\u05be\0\u05e8\0\u0612\0\u063c\0\u0540"+ - "\0\u03f0\0\u0666\0\u03f0\0\u041a\0\u0690\0\u06ba\0\u03f0\0\u03f0"+ - "\0\u03f0\0\u041a\0\u03f0\0\u041a\0\u03f0\0\u03f0\0\u041a\0\u06e4"+ - "\0\u03f0\0\u041a\0\u03f0\0\u041a\0\u03f0\0\u03f0\0\u070e\0\u03f0"+ - "\0\u03f0\0\u041a\0\u03f0\0\u03f0\0\u0738\0\u041a\0\u0762\0\u03f0"+ - "\0\u03f0\0\u078c\0\u041a\0\u03f0\0\u03f0\0\u041a\0\u07b6\0\u07e0"+ - "\0\u080a\0\u03f0\0\u0834\0\u085e\0\u03f0\0\u0888\0\u08b2\0\u08dc"+ - "\0\u0906\0\u03f0\0\u0930\0\u095a\0\u0516\0\u0540\0\u0984\0\u056a"+ - "\0\u0594\0\u05be\0\u05e8\0\u0612\0\u063c\0\u09ae\0\u09d8\0\u0a02"+ - "\0\u0a2c\0\u0a56\0\u03f0\0\u0a80\0\u03f0\0\u0aaa\0\u0ad4\0\u03f0"+ - "\0\u03f0\0\u0afe\0\u03f0\0\u03f0\0\u0b28\0\u0b52\0\u0b7c\0\u085e"+ - "\0\u03f0\0\u0ba6\0\u0bd0\0\u0bfa\0\u0c24\0\u0c4e\0\u0c78\0\u0ca2"+ - "\0\u0ccc\0\u0cf6\0\u03f0\0\u03f0\0\u03f0\0\u03f0\0\u03f0\0\u0d20"+ - "\0\u0d4a\0\u03f0\0\u0d74\0\u0d9e\0\u0dc8\0\u0df2\0\u03f0\0\u0e1c"+ - "\0\u0e46\0\u0e70\0\u03f0\0\u0e9a\0\u0ec4\0\u0eee\0\u0f18\0\u03f0"+ - "\0\u0f42\0\u03f0\0\u0f6c\0\u0f96\0\u0fc0\0\u0ec4\0\u0fea\0\u1014"+ - "\0\u03f0\0\u103e\0\u1068\0\u1092\0\u0fc0\0\u10bc\0\u0ec4\0\u10e6"+ - "\0\u03f0\0\u1110\0\u113a\0\u0fc0\0\u1164\0\u118e\0\u11b8\0\u1164"+ - "\0\u11e2\0\u03f0\0\u03f0\0\u120c\0\u1164\0\u03f0"; + "\0\0\0\60\0\140\0\220\0\300\0\360\0\u0120\0\u0150"+ + "\0\u0180\0\u01b0\0\u01e0\0\u0210\0\u0240\0\u0270\0\u02a0\0\u02d0"+ + "\0\u0300\0\u0330\0\u0360\0\u0390\0\u03c0\0\u03f0\0\u0420\0\u0450"+ + "\0\u0480\0\u04b0\0\u04e0\0\u04e0\0\u0510\0\u04e0\0\u0540\0\u0570"+ + "\0\u05a0\0\u05d0\0\u04e0\0\u0510\0\u0600\0\u04e0\0\u0630\0\u0510"+ + "\0\u0660\0\u0690\0\u06c0\0\u06f0\0\u0720\0\u04e0\0\u0750\0\u0780"+ + "\0\u07b0\0\u07e0\0\u0810\0\u06f0\0\u04e0\0\u0840\0\u04e0\0\u0510"+ + "\0\u0870\0\u08a0\0\u04e0\0\u04e0\0\u04e0\0\u0510\0\u04e0\0\u0510"+ + "\0\u04e0\0\u04e0\0\u0510\0\u08d0\0\u04e0\0\u0510\0\u04e0\0\u0510"+ + "\0\u0900\0\u04e0\0\u04e0\0\u0510\0\u0930\0\u04e0\0\u04e0\0\u0960"+ + "\0\u0990\0\u09c0\0\u09f0\0\u0a20\0\u04e0\0\u0510\0\u04e0\0\u04e0"+ + "\0\u0a50\0\u0a80\0\u04e0\0\u0ab0\0\u0a50\0\u04e0\0\u04e0\0\u0ae0"+ + "\0\u0510\0\u04e0\0\u04e0\0\u0510\0\u0b10\0\u0b40\0\u0b70\0\u04e0"+ + "\0\u0ba0\0\u0bd0\0\u0c00\0\u04e0\0\u0c30\0\u0c60\0\u0c90\0\u0cc0"+ + "\0\u0cf0\0\u04e0\0\u0d20\0\u0d50\0\u0d80\0\u0690\0\u04e0\0\u04e0"+ + "\0\u06f0\0\u0db0\0\u0720\0\u0750\0\u0780\0\u07b0\0\u07e0\0\u0810"+ + "\0\u0de0\0\u0e10\0\u0e40\0\u04e0\0\u0e70\0\u04e0\0\u0ea0\0\u04e0"+ + "\0\u0ed0\0\u04e0\0\u0f00\0\u0930\0\u0f30\0\u0f60\0\u04e0\0\u0f90"+ + "\0\u0a20\0\u04e0\0\u0fc0\0\u0a50\0\u04e0\0\u0ff0\0\u1020\0\u04e0"+ + "\0\u04e0\0\u1050\0\u1080\0\u10b0\0\u10e0\0\u1110\0\u0c00\0\u04e0"+ + "\0\u1140\0\u1170\0\u11a0\0\u11d0\0\u1200\0\u1230\0\u1260\0\u1290"+ + "\0\u04e0\0\u12c0\0\u12f0\0\u1320\0\u04e0\0\u1350\0\u04e0\0\u1380"+ + "\0\u04e0\0\u04e0\0\u04e0\0\u13b0\0\u13e0\0\u1410\0\u1440\0\u04e0"+ + "\0\u1470\0\u14a0\0\u14d0\0\u1500\0\u04e0\0\u1530\0\u1560\0\u1590"+ + "\0\u15c0\0\u04e0\0\u04e0\0\u15f0\0\u1620\0\u1650\0\u1680\0\u16b0"+ + "\0\u16e0\0\u04e0\0\u04e0\0\u15f0\0\u1710\0\u1740\0\u04e0\0\u04e0"+ + "\0\u1770\0\u17a0\0\u04e0\0\u17d0\0\u04e0\0\u04e0\0\u1800\0\u1830"+ + "\0\u04e0\0\u1830\0\u1860\0\u04e0"; private static int [] zzUnpackRowMap() { - int [] result = new int[190]; + int [] result = new int[220]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -409,65 +446,78 @@ private static int zzUnpackRowMap(String packed, int offset, int [] result) { private static final int [] ZZ_TRANS = zzUnpacktrans(); private static final String ZZ_TRANS_PACKED_0 = - "\7\31\1\32\5\31\1\33\10\31\1\34\32\31\1\32"+ - "\5\31\1\33\10\31\1\34\1\31\1\35\12\31\1\36"+ - "\1\37\5\31\7\40\1\32\5\40\1\41\10\40\1\34"+ - "\20\40\1\42\2\40\15\43\1\44\2\43\1\45\1\43"+ - "\1\46\24\43\1\47\1\50\2\43\5\51\7\43\1\44"+ - "\2\43\1\45\1\43\1\46\1\43\1\52\3\43\1\53"+ - "\1\54\1\43\1\55\1\43\1\56\5\43\1\57\3\43"+ - "\1\47\1\60\1\43\1\61\5\62\2\61\1\63\4\61"+ - "\1\64\1\65\10\61\20\65\1\66\2\61\10\67\1\70"+ - "\1\71\3\67\1\72\34\67\15\73\1\74\51\73\1\74"+ - "\32\73\1\75\1\73\15\76\1\77\31\76\1\100\2\76"+ - "\15\101\1\102\51\101\1\102\32\101\1\75\1\101\7\103"+ - "\1\32\5\103\1\104\10\103\1\34\20\103\1\105\1\106"+ - "\1\103\14\61\1\107\1\64\1\107\5\61\1\110\2\61"+ - "\20\107\3\61\15\111\1\112\31\111\1\105\1\113\1\111"+ - "\7\114\1\32\1\70\1\115\3\114\1\116\10\114\1\34"+ - "\23\114\15\61\1\64\35\61\5\117\7\61\1\64\31\61"+ - "\1\120\2\61\12\121\1\122\2\121\1\123\34\121\2\124"+ - "\3\61\2\124\1\125\5\124\1\126\7\124\1\127\23\124"+ - "\1\61\15\124\1\126\10\124\1\125\23\124\13\43\1\130"+ - "\1\43\1\44\51\43\1\44\3\43\1\131\1\132\1\133"+ - "\23\43\1\47\1\50\2\43\5\134\7\43\1\44\3\43"+ - "\1\131\1\132\1\133\11\43\1\56\11\43\1\47\1\60"+ - "\1\43\64\0\1\135\2\0\1\136\77\0\1\137\36\0"+ - "\1\140\53\0\1\141\21\0\2\142\1\143\53\0\1\144"+ - "\44\0\5\145\16\0\1\52\26\0\5\146\24\0\1\147"+ - "\20\0\5\150\16\0\1\52\3\0\1\151\1\152\1\0"+ - "\1\153\1\0\1\154\5\0\1\155\35\0\1\156\54\0"+ - "\1\157\57\0\1\160\44\0\1\161\64\0\1\162\4\0"+ - "\5\62\62\0\1\65\10\0\20\65\5\0\2\163\1\164"+ - "\47\0\2\165\1\166\46\0\5\167\2\0\1\170\3\0"+ - "\1\107\1\0\1\107\10\0\20\107\1\171\3\0\5\172"+ - "\45\0\5\117\61\0\1\173\43\0\1\174\55\0\1\175"+ - "\45\0\1\176\63\0\1\177\31\0\5\200\27\0\1\154"+ - "\14\0\2\136\3\0\44\136\44\0\1\201\50\0\1\202"+ - "\46\0\1\203\14\0\1\142\62\0\1\204\74\0\1\205"+ - "\56\0\1\206\41\0\1\207\60\0\1\210\7\0\47\161"+ - "\1\211\2\161\35\0\1\212\16\0\1\163\51\0\1\165"+ - "\50\0\5\167\41\0\1\213\3\0\5\172\41\0\1\214"+ - "\24\0\1\215\27\0\7\176\1\216\42\176\47\0\1\217"+ - "\37\0\1\220\55\0\1\221\23\0\1\222\101\0\1\223"+ - "\40\0\1\224\46\0\1\225\23\0\5\226\46\0\2\227"+ - "\1\230\111\0\1\231\46\0\1\232\46\0\1\233\45\0"+ - "\1\234\17\0\17\224\1\235\32\224\45\0\1\236\4\0"+ - "\47\226\1\237\2\226\2\0\1\240\77\0\1\241\65\0"+ - "\1\242\6\0\4\243\1\244\41\0\1\245\3\0\1\235"+ - "\2\246\1\247\1\235\102\0\1\250\15\0\2\251\1\252"+ - "\101\0\1\253\16\0\5\243\41\0\1\245\3\0\5\243"+ - "\27\0\1\254\11\0\1\245\3\0\1\245\2\255\1\256"+ - "\1\245\45\0\1\235\1\257\1\246\1\247\1\235\110\0"+ - "\1\260\7\0\1\261\50\0\5\262\77\0\1\263\17\0"+ - "\1\245\1\264\1\255\1\256\1\245\63\0\1\265\32\0"+ - "\47\262\1\266\2\262\47\263\1\267\2\263\1\0\1\265"+ - "\2\270\1\271\1\265\44\0\2\262\1\272\44\262\1\266"+ - "\2\262\2\0\2\273\1\274\46\0\1\265\1\275\1\270"+ - "\1\271\1\265\46\0\1\276\47\0"; + "\7\33\1\34\7\33\1\35\11\33\1\36\35\33\1\34"+ + "\7\33\1\35\11\33\1\36\1\33\1\37\12\33\1\40"+ + "\1\33\1\41\1\42\6\33\7\43\1\34\7\43\1\44"+ + "\11\43\1\36\22\43\1\45\3\43\16\46\1\47\1\50"+ + "\2\46\1\51\1\46\1\52\27\46\1\53\1\54\3\46"+ + "\1\55\2\46\1\55\11\46\1\47\1\50\2\46\1\51"+ + "\1\46\1\52\1\46\1\56\4\46\1\57\1\60\1\46"+ + "\1\61\2\46\1\62\6\46\1\63\3\46\1\53\1\64"+ + "\2\46\1\65\5\66\3\65\1\67\5\65\1\70\1\71"+ + "\7\65\1\71\1\65\22\71\1\72\1\65\1\66\1\65"+ + "\11\73\1\74\1\75\4\73\1\76\40\73\17\77\1\100"+ + "\57\77\1\100\35\77\1\101\2\77\17\102\1\103\34\102"+ + "\1\104\3\102\17\105\1\106\57\105\1\106\35\105\1\101"+ + "\2\105\17\107\1\110\35\107\1\111\2\107\1\112\1\113"+ + "\2\112\1\113\2\112\1\34\7\112\1\114\1\115\10\112"+ + "\1\36\22\115\1\116\1\117\2\112\1\107\1\113\2\107"+ + "\1\113\12\107\1\110\15\107\1\120\1\121\2\107\1\122"+ + "\6\107\1\123\3\107\1\124\3\107\17\125\1\126\34\125"+ + "\1\127\1\130\2\125\1\131\1\132\2\131\1\132\4\131"+ + "\1\133\2\131\1\133\1\131\1\133\1\134\6\131\1\135"+ + "\25\131\1\133\3\131\17\65\1\70\47\65\1\34\7\65"+ + "\1\70\11\65\1\36\27\65\1\113\2\65\1\113\12\65"+ + "\1\70\34\65\1\136\3\65\13\137\1\140\3\137\1\141"+ + "\40\137\2\142\4\65\1\142\1\143\7\142\1\144\7\142"+ + "\1\145\27\142\1\65\17\142\1\144\11\142\1\143\26\142"+ + "\15\46\1\146\1\46\1\50\57\46\1\50\3\46\1\147"+ + "\1\150\1\151\5\46\1\152\20\46\1\53\1\54\3\46"+ + "\1\153\2\46\1\153\12\46\1\50\3\46\1\147\1\150"+ + "\1\151\5\46\1\152\5\46\1\62\12\46\1\53\1\64"+ + "\2\46\73\0\1\154\3\0\1\155\110\0\1\156\41\0"+ + "\1\157\60\0\1\160\61\0\1\161\24\0\3\162\1\163"+ + "\53\0\1\164\2\0\1\164\11\0\1\164\1\0\1\164"+ + "\7\0\1\164\1\0\22\164\12\0\1\165\52\0\1\166"+ + "\2\0\1\166\21\0\1\167\105\0\1\170\4\0\1\171"+ + "\2\0\1\171\30\0\1\172\23\0\1\173\2\0\1\173"+ + "\21\0\1\56\4\0\1\174\1\175\1\0\1\176\2\0"+ + "\1\177\6\0\1\200\41\0\1\201\62\0\1\202\67\0"+ + "\1\203\50\0\1\204\74\0\1\205\5\0\5\66\50\0"+ + "\1\66\21\0\1\71\7\0\1\71\1\0\22\71\6\0"+ + "\3\206\1\207\54\0\3\210\1\211\127\0\1\212\20\0"+ + "\1\213\1\0\1\214\11\0\22\214\47\0\1\215\61\0"+ + "\1\216\50\0\1\217\74\0\1\220\5\0\1\221\1\222"+ + "\1\0\1\221\1\223\53\0\1\224\1\225\1\0\1\224"+ + "\1\226\53\0\1\224\1\225\1\0\1\224\1\226\46\0"+ + "\1\227\4\0\1\224\1\225\1\0\1\224\1\226\5\0"+ + "\1\154\3\0\1\155\57\0\1\230\47\0\1\231\65\0"+ + "\1\232\51\0\1\233\1\234\72\0\1\235\77\0\1\236"+ + "\15\0\1\237\2\0\1\237\34\0\1\177\16\0\2\155"+ + "\4\0\51\155\51\0\1\240\42\0\1\241\73\0\1\242"+ + "\54\0\1\243\15\0\1\162\56\0\1\164\2\0\1\164"+ + "\11\0\1\164\1\0\1\164\7\0\1\164\1\0\22\164"+ + "\1\244\20\0\1\245\105\0\1\246\64\0\1\247\45\0"+ + "\1\250\70\0\1\251\51\0\1\252\20\0\1\206\57\0"+ + "\1\210\73\0\1\253\111\0\1\254\56\0\1\255\51\0"+ + "\1\256\20\0\1\222\57\0\1\225\56\0\1\227\1\257"+ + "\1\0\1\227\1\260\76\0\1\261\33\0\7\233\1\262"+ + "\50\233\10\234\1\262\47\234\54\0\1\263\35\0\1\264"+ + "\67\0\1\265\56\0\1\266\64\0\1\267\11\0\55\244"+ + "\1\46\2\244\15\0\1\270\112\0\1\271\44\0\1\272"+ + "\54\0\1\273\76\0\1\274\24\0\1\125\76\0\1\275"+ + "\73\0\1\276\10\0\1\257\125\0\1\277\41\0\1\300"+ + "\73\0\1\301\54\0\1\302\51\0\1\303\22\0\21\272"+ + "\1\304\36\272\52\0\1\305\40\0\1\306\57\0\1\307"+ + "\74\0\1\310\46\0\1\311\71\0\1\312\7\0\1\304"+ + "\2\313\1\314\1\315\115\0\1\316\54\0\1\317\57\0"+ + "\1\320\42\0\1\321\71\0\1\322\24\0\1\323\126\0"+ + "\1\324\62\0\1\325\3\0\2\322\1\326\2\322\1\327"+ + "\52\322\21\0\1\330\40\0\1\326\56\0\1\330\2\331"+ + "\1\332\1\333\54\0\1\334\55\0"; private static int [] zzUnpacktrans() { - int [] result = new int[4662]; + int [] result = new int[6288]; int offset = 0; offset = zzUnpacktrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -505,20 +555,21 @@ private static int zzUnpacktrans(String packed, int offset, int [] result) { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\30\0\2\11\1\1\1\11\3\1\1\11\2\1\1\11"+ - "\3\1\1\11\2\1\1\11\6\1\1\11\1\1\1\11"+ - "\3\1\3\11\1\1\1\11\1\1\2\11\2\1\1\11"+ - "\1\1\1\11\1\1\2\11\1\1\2\11\1\1\2\11"+ - "\3\1\2\11\2\1\2\11\4\1\1\11\2\1\1\11"+ - "\1\1\3\0\1\11\1\1\17\0\1\11\1\1\1\11"+ - "\1\1\1\0\2\11\1\0\2\11\4\0\1\11\11\0"+ - "\5\11\2\0\1\11\4\0\1\11\1\1\2\0\1\11"+ - "\4\0\1\11\1\0\1\11\3\0\2\1\1\0\1\11"+ - "\1\1\2\0\3\1\1\0\1\11\2\0\1\1\3\0"+ - "\2\1\2\11\2\1\1\11"; + "\32\0\2\11\1\1\1\11\4\1\1\11\2\1\1\11"+ + "\7\1\1\11\6\1\1\11\1\1\1\11\3\1\3\11"+ + "\1\1\1\11\1\1\2\11\2\1\1\11\1\1\1\11"+ + "\2\1\2\11\2\1\2\11\5\1\1\11\1\1\2\11"+ + "\2\1\1\11\2\1\2\11\2\1\2\11\4\1\1\11"+ + "\3\1\1\11\1\1\4\0\1\11\1\1\3\0\2\11"+ + "\13\0\1\11\1\0\1\11\1\1\1\11\1\1\1\11"+ + "\4\0\1\11\2\0\1\11\1\1\1\0\1\11\1\1"+ + "\1\0\2\11\6\0\1\11\10\0\1\11\3\0\1\11"+ + "\1\0\1\11\1\1\3\11\4\0\1\11\4\0\1\11"+ + "\4\0\2\11\6\0\2\11\2\1\1\0\2\11\2\0"+ + "\1\11\1\0\2\11\1\1\1\0\1\11\2\1\1\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[190]; + int [] result = new int[220]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -619,7 +670,7 @@ public IElementType resolveStateDefaultToken(int state) { switch (state) { case YYINITIAL: return GO_ROOT_FRAGMENT; case IN_EXPR: return GO_EXPR; - case IN_COMPONENT_IMPORT_PARAMS: return GO_COMPONENT_IMPORT_PARAMS; +// case IN_COMPONENT_IMPORT_PARAMS: return GO_COMPONENT_IMPORT_PARAMS; case IN_TEMPL_DECLARATION_START: return DECL_GO_TOKEN; default: throw new IllegalStateException("Unknown default token for state: " + state); } @@ -908,86 +959,86 @@ else if (zzAtEOF) { { return GO_ROOT_FRAGMENT; } // fall through - case 67: break; + case 69: break; case 2: { yyPushState(IN_GO_STRING); return resolveStateDefaultToken(peekPreviousState()); } // fall through - case 68: break; + case 70: break; case 3: { yyPushState(IN_GO_RAW_STRING); return resolveStateDefaultToken(peekPreviousState()); } // fall through - case 69: break; + case 71: break; case 4: { return DECL_GO_TOKEN; } // fall through - case 70: break; + case 72: break; case 5: { return HTML_FRAGMENT; } // fall through - case 71: break; + case 73: break; case 6: { yyPushState(IN_HTML_TAG_OPENER); return HTML_FRAGMENT; } // fall through - case 72: break; + case 74: break; case 7: { yypushback(1); // IN_EXPR handles brace nesting yyPushState(IN_EXPR); } // fall through - case 73: break; + case 75: break; case 8: { return RBRACE; } // fall through - case 74: break; + case 76: break; case 9: { yypushback(1); yyPushState(IN_COMPONENT_IMPORT); - return HTML_FRAGMENT; + return WHITE_SPACE; } // fall through - case 75: break; + case 77: break; case 10: { yyResetState(YYINITIAL); return RBRACE; } // fall through - case 76: break; + case 78: break; case 11: { yyResetState(YYINITIAL); return BAD_CHARACTER; } // fall through - case 77: break; + case 79: break; case 12: { return WHITE_SPACE; } // fall through - case 78: break; + case 80: break; case 13: { yypushback(1); // IN_CSS_DECLARATION_PARAMS handles parens nesting yyPushState(IN_CSS_DECLARATION_PARAMS); } // fall through - case 79: break; + case 81: break; case 14: { return CSS_CLASS_ID; } // fall through - case 80: break; + case 82: break; case 15: { return GO_CSS_DECL_PARAMS; } // fall through - case 81: break; + case 83: break; case 16: { parensNestingLevel++; if (parensNestingLevel == 1) { @@ -995,7 +1046,7 @@ else if (zzAtEOF) { } } // fall through - case 82: break; + case 84: break; case 17: { parensNestingLevel--; if (parensNestingLevel == 0) { @@ -1004,117 +1055,106 @@ else if (zzAtEOF) { } } // fall through - case 83: break; + case 85: break; case 18: { return CSS_PROPERTIES; } // fall through - case 84: break; + case 86: break; case 19: { return SCRIPT_FUNCTION_DECL; } // fall through - case 85: break; + case 87: break; case 20: { return SCRIPT_BODY; } // fall through - case 86: break; + case 88: break; case 21: - { return GO_EXPR; + { return GO_FRAGMENT; } // fall through - case 87: break; + case 89: break; case 22: - { braceNestingLevel++; - if (braceNestingLevel == 1) { - return LBRACE; - } + { return GO_EXPR; } // fall through - case 88: break; + case 90: break; case 23: - { braceNestingLevel--; - if (braceNestingLevel == 0) { - yyPopState(); // IN_TEMPL_DECLARATION_BODY or IN_HTML_TAG_OPENER - return RBRACE; - } + { braceNestingLevel++; + return LBRACE; } // fall through - case 89: break; + case 91: break; case 24: - { yyPopState(); // IN_TEMPL_DECLARATION_BODY - return COMPONENT_REFERENCE; + { braceNestingLevel--; + if (braceNestingLevel == 0) { + yyPopState(); // IN_COMPONENT_IMPORT + } + return RBRACE; } // fall through - case 90: break; + case 92: break; case 25: - { return COMPONENT_IMPORT_START; + { return TEMPL_FRAGMENT; } // fall through - case 91: break; + case 93: break; case 26: - { return GO_COMPONENT_STRUCT_LITERAL; + { braceNestingLevel++; + return TEMPL_FRAGMENT; } // fall through - case 92: break; + case 94: break; case 27: { braceNestingLevel--; - if (braceNestingLevel == 0) { - yyPopState(); // IN_COMPONENT_IMPORT - return RBRACE; - } + if (braceNestingLevel == 0) { + yyPopState(); // IN_HTML_TAG_OPENER + } + return TEMPL_FRAGMENT; } // fall through - case 93: break; + case 95: break; case 28: - { return GO_COMPONENT_IMPORT_PARAMS; + { return COMPONENT_REFERENCE; } // fall through - case 94: break; + case 96: break; case 29: - { parensNestingLevel--; - if (parensNestingLevel == 0) { - yyPopState(); // IN_TEMPL_DECLARATION_BODY - return RPARENTH; - } + { return COMPONENT_IMPORT_START; } // fall through - case 95: break; + case 97: break; case 30: - { return COMPONENT_CHILDREN_START; - } - // fall through - case 96: break; - case 31: { yyPopState(); // IN_TEMPL_DECLARATION_BODY return LBRACE; } // fall through - case 97: break; - case 32: + case 98: break; + case 31: { return BLOCK_COMMENT; } // fall through - case 98: break; - case 33: + case 99: break; + case 32: { return resolveStateDefaultToken(peekPreviousState()); } // fall through - case 99: break; - case 34: + case 100: break; + case 33: { yyPopState(); return resolveStateDefaultToken(yystate()); } // fall through - case 100: break; - case 35: + case 101: break; + case 34: { yyPopState(); yypushback(1); // So that we can detect component imports "@" straight after ">". } // fall through - case 101: break; - case 36: + case 102: break; + case 35: { if (isCommentEnabled()) { yyPushState(IN_BLOCK_COMMENT); return BLOCK_COMMENT; @@ -1122,16 +1162,16 @@ else if (zzAtEOF) { yypushback(yylength() - 1); } // fall through - case 102: break; - case 37: + case 103: break; + case 36: { if (isCommentEnabled()) { return LINE_COMMENT; } yypushback(yylength() - 1); } // fall through - case 103: break; - case 38: + case 104: break; + case 37: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL, zzStartRead, 1); @@ -1139,8 +1179,28 @@ else if (zzAtEOF) { return LBRACE; } // fall through - case 104: break; + case 105: break; + case 38: + { yypushback(1); + yyPushState(IN_COMPONENT_IMPORT); + return HTML_FRAGMENT; + } + // fall through + case 106: break; case 39: + { yyPushState(IN_RAW_GO); + return DOUBLE_LBRACE; + } + // fall through + case 107: break; + case 40: + { yypushback(2); + yyPushState(IN_GO_BLOCK_START); + return WHITE_SPACE; + } + // fall through + case 108: break; + case 41: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL, zzStartRead, 1); @@ -1148,203 +1208,183 @@ else if (zzAtEOF) { return LBRACE; } // fall through - case 105: break; - case 40: + case 109: break; + case 42: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL, zzStartRead, 1); { yyReplaceState(IN_SCRIPT_DECLARATION_BODY); - return SCRIPT_FUNCTION_DECL; - } - // fall through - case 106: break; - case 41: - { yypushback(1); - yyReplaceState(IN_COMPONENT_IMPORT_PARAMS); - return COMPONENT_REFERENCE; - } - // fall through - case 107: break; - case 42: - { yypushback(1); - yyPushState(IN_COMPONENT_IMPORT_STRUCT_LITERAL); - return COMPONENT_REFERENCE; + return LBRACE; } // fall through - case 108: break; + case 110: break; case 43: { yyPopState(); - return BLOCK_COMMENT; + return DOUBLE_RBRACE; } // fall through - case 109: break; + case 111: break; case 44: - { // Ignore escaped quotes. - return resolveStateDefaultToken(peekPreviousState()); + { return GO_IF; } // fall through - case 110: break; + case 112: break; case 45: - { yyPushState(IN_CSS_DECLARATION_START); - return CSS_DECL_START; + { yyPopState(); + return LBRACE; } // fall through - case 111: break; + case 113: break; case 46: - { yypushback(2); - yyReplaceState(IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START); + { yypushback(yylength()-1); + yyPopState(); return COMPONENT_REFERENCE; } // fall through - case 112: break; + case 114: break; case 47: - { parensNestingLevel--; - if (parensNestingLevel == 0) { - yypushback(yylength() - 1); - yyReplaceState(IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START); - return RPARENTH; - } + { yyPopState(); + return BLOCK_COMMENT; } // fall through - case 113: break; + case 115: break; case 48: - { yyPopState(); - return HTML_FRAGMENT; + { // Ignore escaped quotes. + return resolveStateDefaultToken(peekPreviousState()); } // fall through - case 114: break; + case 116: break; case 49: - { // Skip over attribute value so that we don't detect keywords in it. - return HTML_FRAGMENT; + { yyPushState(IN_CSS_DECLARATION_START); + return CSS_DECL_START; } // fall through - case 115: break; + case 117: break; case 50: - { yypushback(1); // IN_EXPR handles brace nesting - yyPushState(IN_EXPR); - return BOOL_EXPR_START; + { yypushback(3); + yyPushState(IN_GO_BLOCK_START); + return WHITE_SPACE; } // fall through - case 116: break; + case 118: break; case 51: - { yyPushState(IN_HTML_COMMENT); - return HTML_FRAGMENT; + { return GO_FOR; } // fall through - case 117: break; + case 119: break; case 52: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -1); - { return GO_IF_START_FRAGMENT; + { yypushback(yylength()-1); + yyReplaceState(IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START); + return WHITE_SPACE; } // fall through - case 118: break; + case 120: break; case 53: - { yyPushState(IN_TEMPL_DECLARATION_START); - return HTML_DECL_START; + { yyPopState(); + return HTML_FRAGMENT; } // fall through - case 119: break; + case 121: break; case 54: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -2); - { return GO_IF_START_FRAGMENT; + { // Skip over attribute value so that we don't detect keywords in it. + return HTML_FRAGMENT; } // fall through - case 120: break; + case 122: break; case 55: - { yyPushState(IN_SCRIPT_DECLARATION_START); - return SCRIPT_DECL_START; + { yypushback(1); // IN_EXPR handles brace nesting + yyPushState(IN_EXPR); + return BOOL_EXPR_START; } // fall through - case 121: break; + case 123: break; case 56: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -1); - { return GO_CASE_FRAGMENT; + { yyPushState(IN_HTML_COMMENT); + return HTML_FRAGMENT; } // fall through - case 122: break; + case 124: break; case 57: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -1); - { return GO_FOR_START_FRAGMENT; + { return GO_ELSE; } // fall through - case 123: break; + case 125: break; case 58: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -1); - { return GO_ELSE_START_FRAGMENT; + { yyPushState(IN_TEMPL_DECLARATION_START); + return HTML_DECL_START; } // fall through - case 124: break; + case 126: break; case 59: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -2); - { return GO_CASE_FRAGMENT; + { yypushback(yylength() - 1); + yyPushState(IN_GO_BLOCK_START); + return RBRACE; } // fall through - case 125: break; + case 127: break; case 60: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -2); - { return GO_FOR_START_FRAGMENT; + { yyPushState(IN_SCRIPT_DECLARATION_START); + return SCRIPT_DECL_START; } // fall through - case 126: break; + case 128: break; case 61: // lookahead expression with fixed lookahead length zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -2); - { return GO_ELSE_START_FRAGMENT; + (zzBufferL, zzMarkedPos, -1); + { return GO_CASE_FRAGMENT; } // fall through - case 127: break; + case 129: break; case 62: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -1); - { return GO_DEFAULT_FRAGMENT; + { yypushback(6); + yyPushState(IN_GO_BLOCK_START); + return WHITE_SPACE; } // fall through - case 128: break; + case 130: break; case 63: - { return GO_SWITCH_START_FRAGMENT; + { return GO_SWITCH; } // fall through - case 129: break; + case 131: break; case 64: // lookahead expression with fixed lookahead length zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -1); - { return GO_ELSE_IF_START_FRAGMENT; + (zzBufferL, zzMarkedPos, -2); + { return GO_CASE_FRAGMENT; } // fall through - case 130: break; + case 132: break; case 65: + { // skip over class attributes for now + yypushback(1); + yyPushState(IN_CLASS_EXPR); + return HTML_FRAGMENT; + } + // fall through + case 133: break; + case 66: + { return GO_PACKAGE_FRAGMENT; + } + // fall through + case 134: break; + case 67: // lookahead expression with fixed lookahead length zzMarkedPos = Character.offsetByCodePoints - (zzBufferL, zzMarkedPos, -2); + (zzBufferL, zzMarkedPos, -1); { return GO_DEFAULT_FRAGMENT; } // fall through - case 131: break; - case 66: + case 135: break; + case 68: // lookahead expression with fixed lookahead length zzMarkedPos = Character.offsetByCodePoints (zzBufferL, zzMarkedPos, -2); - { return GO_ELSE_IF_START_FRAGMENT; + { return GO_DEFAULT_FRAGMENT; } // fall through - case 132: break; + case 136: break; default: zzScanError(ZZ_NO_MATCH); } diff --git a/src/main/gen/com/templ/templ/psi/TemplComponent.java b/src/main/gen/com/templ/templ/psi/TemplComponent.java index fd48a04..b94879b 100644 --- a/src/main/gen/com/templ/templ/psi/TemplComponent.java +++ b/src/main/gen/com/templ/templ/psi/TemplComponent.java @@ -10,10 +10,4 @@ public interface TemplComponent extends PsiElement { @Nullable TemplComponentChildren getComponentChildren(); - @Nullable - TemplComponentParams getComponentParams(); - - @Nullable - TemplComponentStructLiteral getComponentStructLiteral(); - } diff --git a/src/main/gen/com/templ/templ/psi/TemplComponentParams.java b/src/main/gen/com/templ/templ/psi/TemplComponentParams.java deleted file mode 100644 index 6558b09..0000000 --- a/src/main/gen/com/templ/templ/psi/TemplComponentParams.java +++ /dev/null @@ -1,10 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.templ.templ.psi; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.psi.PsiElement; - -public interface TemplComponentParams extends PsiElement { - -} diff --git a/src/main/gen/com/templ/templ/psi/TemplComponentStructLiteral.java b/src/main/gen/com/templ/templ/psi/TemplComponentStructLiteral.java deleted file mode 100644 index a21c166..0000000 --- a/src/main/gen/com/templ/templ/psi/TemplComponentStructLiteral.java +++ /dev/null @@ -1,10 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.templ.templ.psi; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.psi.PsiElement; - -public interface TemplComponentStructLiteral extends PsiElement { - -} diff --git a/src/main/gen/com/templ/templ/psi/TemplElseIf.java b/src/main/gen/com/templ/templ/psi/TemplElseIf.java deleted file mode 100644 index 1bb324c..0000000 --- a/src/main/gen/com/templ/templ/psi/TemplElseIf.java +++ /dev/null @@ -1,13 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.templ.templ.psi; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.psi.PsiElement; - -public interface TemplElseIf extends PsiElement { - - @Nullable - TemplHtmlDeclBody getHtmlDeclBody(); - -} diff --git a/src/main/gen/com/templ/templ/psi/TemplHtmlDeclBody.java b/src/main/gen/com/templ/templ/psi/TemplHtmlDeclBody.java index ab32d59..a3d0a4a 100644 --- a/src/main/gen/com/templ/templ/psi/TemplHtmlDeclBody.java +++ b/src/main/gen/com/templ/templ/psi/TemplHtmlDeclBody.java @@ -19,6 +19,9 @@ public interface TemplHtmlDeclBody extends PsiElement { @NotNull List getIfCondList(); + @NotNull + List getRawGoList(); + @NotNull List getSwitchStmtList(); diff --git a/src/main/gen/com/templ/templ/psi/TemplIfCond.java b/src/main/gen/com/templ/templ/psi/TemplIfCond.java index 71d8af7..2e25b30 100644 --- a/src/main/gen/com/templ/templ/psi/TemplIfCond.java +++ b/src/main/gen/com/templ/templ/psi/TemplIfCond.java @@ -7,11 +7,8 @@ public interface TemplIfCond extends PsiElement { - @Nullable - TemplElse getElse(); - @NotNull - List getElseIfList(); + List getElseList(); @Nullable TemplHtmlDeclBody getHtmlDeclBody(); diff --git a/src/main/gen/com/templ/templ/psi/TemplGoRoot.java b/src/main/gen/com/templ/templ/psi/TemplRawGo.java similarity index 79% rename from src/main/gen/com/templ/templ/psi/TemplGoRoot.java rename to src/main/gen/com/templ/templ/psi/TemplRawGo.java index 90938ae..a64c1e4 100644 --- a/src/main/gen/com/templ/templ/psi/TemplGoRoot.java +++ b/src/main/gen/com/templ/templ/psi/TemplRawGo.java @@ -5,6 +5,6 @@ import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; -public interface TemplGoRoot extends PsiElement { +public interface TemplRawGo extends PsiElement { } diff --git a/src/main/gen/com/templ/templ/psi/TemplTypes.java b/src/main/gen/com/templ/templ/psi/TemplTypes.java index 7833351..407657e 100644 --- a/src/main/gen/com/templ/templ/psi/TemplTypes.java +++ b/src/main/gen/com/templ/templ/psi/TemplTypes.java @@ -10,17 +10,14 @@ public interface TemplTypes { IElementType COMPONENT = new TemplElementType("COMPONENT"); IElementType COMPONENT_CHILDREN = new TemplElementType("COMPONENT_CHILDREN"); - IElementType COMPONENT_PARAMS = new TemplElementType("COMPONENT_PARAMS"); - IElementType COMPONENT_STRUCT_LITERAL = new TemplElementType("COMPONENT_STRUCT_LITERAL"); IElementType CSS_DECL = new TemplElementType("CSS_DECL"); IElementType ELSE = new TemplElementType("ELSE"); - IElementType ELSE_IF = new TemplElementType("ELSE_IF"); IElementType EXPR = new TemplElementType("EXPR"); IElementType FOR_LOOP = new TemplElementType("FOR_LOOP"); - IElementType GO_ROOT = new TemplElementType("GO_ROOT"); IElementType HTML_DECL = new TemplElementType("HTML_DECL"); IElementType HTML_DECL_BODY = new TemplElementType("HTML_DECL_BODY"); IElementType IF_COND = new TemplElementType("IF_COND"); + IElementType RAW_GO = new TemplElementType("RAW_GO"); IElementType SCRIPT_DECL = new TemplElementType("SCRIPT_DECL"); IElementType SWITCH_CASE = new TemplElementType("SWITCH_CASE"); IElementType SWITCH_DEFAULT = new TemplElementType("SWITCH_DEFAULT"); @@ -28,25 +25,25 @@ public interface TemplTypes { IElementType BLOCK_COMMENT = new TemplTokenType("BLOCK_COMMENT"); IElementType BOOL_EXPR_START = new TemplTokenType("BOOL_EXPR_START"); - IElementType COMPONENT_CHILDREN_START = new TemplTokenType("COMPONENT_CHILDREN_START"); IElementType COMPONENT_IMPORT_START = new TemplTokenType("@"); IElementType COMPONENT_REFERENCE = new TemplTokenType("COMPONENT_REFERENCE"); IElementType CSS_CLASS_ID = new TemplTokenType("CSS_CLASS_ID"); IElementType CSS_DECL_START = new TemplTokenType("css"); IElementType CSS_PROPERTIES = new TemplTokenType("CSS_PROPERTIES"); IElementType DECL_GO_TOKEN = new TemplTokenType("DECL_GO_TOKEN"); + IElementType DOUBLE_LBRACE = new TemplTokenType("{{"); + IElementType DOUBLE_RBRACE = new TemplTokenType("}}"); IElementType GO_CASE_FRAGMENT = new TemplTokenType("GO_CASE_FRAGMENT"); - IElementType GO_COMPONENT_IMPORT_PARAMS = new TemplTokenType("GO_COMPONENT_IMPORT_PARAMS"); - IElementType GO_COMPONENT_STRUCT_LITERAL = new TemplTokenType("GO_COMPONENT_STRUCT_LITERAL"); IElementType GO_CSS_DECL_PARAMS = new TemplTokenType("GO_CSS_DECL_PARAMS"); IElementType GO_DEFAULT_FRAGMENT = new TemplTokenType("GO_DEFAULT_FRAGMENT"); - IElementType GO_ELSE_IF_START_FRAGMENT = new TemplTokenType("GO_ELSE_IF_START_FRAGMENT"); - IElementType GO_ELSE_START_FRAGMENT = new TemplTokenType("GO_ELSE_START_FRAGMENT"); + IElementType GO_ELSE = new TemplTokenType("GO_ELSE"); IElementType GO_EXPR = new TemplTokenType("GO_EXPR"); - IElementType GO_FOR_START_FRAGMENT = new TemplTokenType("GO_FOR_START_FRAGMENT"); - IElementType GO_IF_START_FRAGMENT = new TemplTokenType("GO_IF_START_FRAGMENT"); + IElementType GO_FOR = new TemplTokenType("GO_FOR"); + IElementType GO_FRAGMENT = new TemplTokenType("GO_FRAGMENT"); + IElementType GO_IF = new TemplTokenType("GO_IF"); + IElementType GO_PACKAGE_FRAGMENT = new TemplTokenType("GO_PACKAGE_FRAGMENT"); IElementType GO_ROOT_FRAGMENT = new TemplTokenType("GO_ROOT_FRAGMENT"); - IElementType GO_SWITCH_START_FRAGMENT = new TemplTokenType("GO_SWITCH_START_FRAGMENT"); + IElementType GO_SWITCH = new TemplTokenType("GO_SWITCH"); IElementType HTML_DECL_START = new TemplTokenType("templ"); IElementType HTML_FRAGMENT = new TemplTokenType("HTML_FRAGMENT"); IElementType LBRACE = new TemplTokenType("{"); @@ -57,6 +54,7 @@ public interface TemplTypes { IElementType SCRIPT_BODY = new TemplTokenType("SCRIPT_BODY"); IElementType SCRIPT_DECL_START = new TemplTokenType("script"); IElementType SCRIPT_FUNCTION_DECL = new TemplTokenType("SCRIPT_FUNCTION_DECL"); + IElementType TEMPL_FRAGMENT = new TemplTokenType("TEMPL_FRAGMENT"); class Factory { public static PsiElement createElement(ASTNode node) { @@ -67,30 +65,18 @@ public static PsiElement createElement(ASTNode node) { else if (type == COMPONENT_CHILDREN) { return new TemplComponentChildrenImpl(node); } - else if (type == COMPONENT_PARAMS) { - return new TemplComponentParamsImpl(node); - } - else if (type == COMPONENT_STRUCT_LITERAL) { - return new TemplComponentStructLiteralImpl(node); - } else if (type == CSS_DECL) { return new TemplCssDeclImpl(node); } else if (type == ELSE) { return new TemplElseImpl(node); } - else if (type == ELSE_IF) { - return new TemplElseIfImpl(node); - } else if (type == EXPR) { return new TemplExprImpl(node); } else if (type == FOR_LOOP) { return new TemplForLoopImpl(node); } - else if (type == GO_ROOT) { - return new TemplGoRootImpl(node); - } else if (type == HTML_DECL) { return new TemplHtmlDeclImpl(node); } @@ -100,6 +86,9 @@ else if (type == HTML_DECL_BODY) { else if (type == IF_COND) { return new TemplIfCondImpl(node); } + else if (type == RAW_GO) { + return new TemplRawGoImpl(node); + } else if (type == SCRIPT_DECL) { return new TemplScriptDeclImpl(node); } diff --git a/src/main/gen/com/templ/templ/psi/TemplVisitor.java b/src/main/gen/com/templ/templ/psi/TemplVisitor.java index 3ce25e6..966eeb7 100644 --- a/src/main/gen/com/templ/templ/psi/TemplVisitor.java +++ b/src/main/gen/com/templ/templ/psi/TemplVisitor.java @@ -15,14 +15,6 @@ public void visitComponentChildren(@NotNull TemplComponentChildren o) { visitPsiElement(o); } - public void visitComponentParams(@NotNull TemplComponentParams o) { - visitPsiElement(o); - } - - public void visitComponentStructLiteral(@NotNull TemplComponentStructLiteral o) { - visitPsiElement(o); - } - public void visitCssDecl(@NotNull TemplCssDecl o) { visitPsiElement(o); } @@ -31,10 +23,6 @@ public void visitElse(@NotNull TemplElse o) { visitPsiElement(o); } - public void visitElseIf(@NotNull TemplElseIf o) { - visitPsiElement(o); - } - public void visitExpr(@NotNull TemplExpr o) { visitPsiElement(o); } @@ -43,10 +31,6 @@ public void visitForLoop(@NotNull TemplForLoop o) { visitPsiElement(o); } - public void visitGoRoot(@NotNull TemplGoRoot o) { - visitPsiElement(o); - } - public void visitHtmlDecl(@NotNull TemplHtmlDecl o) { visitPsiElement(o); } @@ -59,6 +43,10 @@ public void visitIfCond(@NotNull TemplIfCond o) { visitPsiElement(o); } + public void visitRawGo(@NotNull TemplRawGo o) { + visitPsiElement(o); + } + public void visitScriptDecl(@NotNull TemplScriptDecl o) { visitPsiElement(o); } diff --git a/src/main/gen/com/templ/templ/psi/impl/TemplComponentImpl.java b/src/main/gen/com/templ/templ/psi/impl/TemplComponentImpl.java index 73e29fc..ccefed6 100644 --- a/src/main/gen/com/templ/templ/psi/impl/TemplComponentImpl.java +++ b/src/main/gen/com/templ/templ/psi/impl/TemplComponentImpl.java @@ -33,16 +33,4 @@ public TemplComponentChildren getComponentChildren() { return findChildByClass(TemplComponentChildren.class); } - @Override - @Nullable - public TemplComponentParams getComponentParams() { - return findChildByClass(TemplComponentParams.class); - } - - @Override - @Nullable - public TemplComponentStructLiteral getComponentStructLiteral() { - return findChildByClass(TemplComponentStructLiteral.class); - } - } diff --git a/src/main/gen/com/templ/templ/psi/impl/TemplComponentParamsImpl.java b/src/main/gen/com/templ/templ/psi/impl/TemplComponentParamsImpl.java deleted file mode 100644 index e584886..0000000 --- a/src/main/gen/com/templ/templ/psi/impl/TemplComponentParamsImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.templ.templ.psi.impl; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.util.PsiTreeUtil; -import static com.templ.templ.psi.TemplTypes.*; -import com.intellij.extapi.psi.ASTWrapperPsiElement; -import com.templ.templ.psi.*; - -public class TemplComponentParamsImpl extends ASTWrapperPsiElement implements TemplComponentParams { - - public TemplComponentParamsImpl(@NotNull ASTNode node) { - super(node); - } - - public void accept(@NotNull TemplVisitor visitor) { - visitor.visitComponentParams(this); - } - - @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof TemplVisitor) accept((TemplVisitor)visitor); - else super.accept(visitor); - } - -} diff --git a/src/main/gen/com/templ/templ/psi/impl/TemplComponentStructLiteralImpl.java b/src/main/gen/com/templ/templ/psi/impl/TemplComponentStructLiteralImpl.java deleted file mode 100644 index d48012b..0000000 --- a/src/main/gen/com/templ/templ/psi/impl/TemplComponentStructLiteralImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.templ.templ.psi.impl; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.util.PsiTreeUtil; -import static com.templ.templ.psi.TemplTypes.*; -import com.intellij.extapi.psi.ASTWrapperPsiElement; -import com.templ.templ.psi.*; - -public class TemplComponentStructLiteralImpl extends ASTWrapperPsiElement implements TemplComponentStructLiteral { - - public TemplComponentStructLiteralImpl(@NotNull ASTNode node) { - super(node); - } - - public void accept(@NotNull TemplVisitor visitor) { - visitor.visitComponentStructLiteral(this); - } - - @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof TemplVisitor) accept((TemplVisitor)visitor); - else super.accept(visitor); - } - -} diff --git a/src/main/gen/com/templ/templ/psi/impl/TemplElseIfImpl.java b/src/main/gen/com/templ/templ/psi/impl/TemplElseIfImpl.java deleted file mode 100644 index 6df2d57..0000000 --- a/src/main/gen/com/templ/templ/psi/impl/TemplElseIfImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -// This is a generated file. Not intended for manual editing. -package com.templ.templ.psi.impl; - -import java.util.List; -import org.jetbrains.annotations.*; -import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.util.PsiTreeUtil; -import static com.templ.templ.psi.TemplTypes.*; -import com.intellij.extapi.psi.ASTWrapperPsiElement; -import com.templ.templ.psi.*; - -public class TemplElseIfImpl extends ASTWrapperPsiElement implements TemplElseIf { - - public TemplElseIfImpl(@NotNull ASTNode node) { - super(node); - } - - public void accept(@NotNull TemplVisitor visitor) { - visitor.visitElseIf(this); - } - - @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof TemplVisitor) accept((TemplVisitor)visitor); - else super.accept(visitor); - } - - @Override - @Nullable - public TemplHtmlDeclBody getHtmlDeclBody() { - return findChildByClass(TemplHtmlDeclBody.class); - } - -} diff --git a/src/main/gen/com/templ/templ/psi/impl/TemplHtmlDeclBodyImpl.java b/src/main/gen/com/templ/templ/psi/impl/TemplHtmlDeclBodyImpl.java index 70588ad..aa09621 100644 --- a/src/main/gen/com/templ/templ/psi/impl/TemplHtmlDeclBodyImpl.java +++ b/src/main/gen/com/templ/templ/psi/impl/TemplHtmlDeclBodyImpl.java @@ -51,6 +51,12 @@ public List getIfCondList() { return PsiTreeUtil.getChildrenOfTypeAsList(this, TemplIfCond.class); } + @Override + @NotNull + public List getRawGoList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, TemplRawGo.class); + } + @Override @NotNull public List getSwitchStmtList() { diff --git a/src/main/gen/com/templ/templ/psi/impl/TemplIfCondImpl.java b/src/main/gen/com/templ/templ/psi/impl/TemplIfCondImpl.java index bcdf65a..f50f49b 100644 --- a/src/main/gen/com/templ/templ/psi/impl/TemplIfCondImpl.java +++ b/src/main/gen/com/templ/templ/psi/impl/TemplIfCondImpl.java @@ -27,16 +27,10 @@ public void accept(@NotNull PsiElementVisitor visitor) { else super.accept(visitor); } - @Override - @Nullable - public TemplElse getElse() { - return findChildByClass(TemplElse.class); - } - @Override @NotNull - public List getElseIfList() { - return PsiTreeUtil.getChildrenOfTypeAsList(this, TemplElseIf.class); + public List getElseList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, TemplElse.class); } @Override diff --git a/src/main/gen/com/templ/templ/psi/impl/TemplGoRootImpl.java b/src/main/gen/com/templ/templ/psi/impl/TemplRawGoImpl.java similarity index 81% rename from src/main/gen/com/templ/templ/psi/impl/TemplGoRootImpl.java rename to src/main/gen/com/templ/templ/psi/impl/TemplRawGoImpl.java index b2b0746..6eeab1e 100644 --- a/src/main/gen/com/templ/templ/psi/impl/TemplGoRootImpl.java +++ b/src/main/gen/com/templ/templ/psi/impl/TemplRawGoImpl.java @@ -11,14 +11,14 @@ import com.intellij.extapi.psi.ASTWrapperPsiElement; import com.templ.templ.psi.*; -public class TemplGoRootImpl extends ASTWrapperPsiElement implements TemplGoRoot { +public class TemplRawGoImpl extends ASTWrapperPsiElement implements TemplRawGo { - public TemplGoRootImpl(@NotNull ASTNode node) { + public TemplRawGoImpl(@NotNull ASTNode node) { super(node); } public void accept(@NotNull TemplVisitor visitor) { - visitor.visitGoRoot(this); + visitor.visitRawGo(this); } @Override diff --git a/src/main/grammar/Templ.bnf b/src/main/grammar/Templ.bnf index 5a51e5c..8cee79b 100644 --- a/src/main/grammar/Templ.bnf +++ b/src/main/grammar/Templ.bnf @@ -13,9 +13,15 @@ tokenTypeClass="com.templ.templ.psi.TemplTokenType" psiImplUtilClass="com.templ.templ.psi.TemplPsiImplUtil" + parserImports=[ + "static com.intellij.psi.TokenType.WHITE_SPACE" + ] + tokens=[ LBRACE='{' RBRACE='}' + DOUBLE_LBRACE='{{' + DOUBLE_RBRACE='}}' LPARENTH='(' RPARENTH=')' HTML_DECL_START='templ' @@ -25,43 +31,46 @@ LINE_COMMENT='LINE_COMMENT' BLOCK_COMMENT='BLOCK_COMMENT' ] + } -root ::= go_root (root_item)* -private root_item ::= go_root | html_decl | css_decl | script_decl {pin=1 recoverWhile=recover} + +root ::= GO_PACKAGE_FRAGMENT (root_item)* +private root_item ::= GO_ROOT_FRAGMENT | html_decl | css_decl | script_decl {pin=1 recoverWhile=recover} private recover ::= !(HTML_DECL_START | CSS_DECL_START | SCRIPT_DECL_START | GO_ROOT_FRAGMENT) -go_root ::= GO_ROOT_FRAGMENT html_decl ::= HTML_DECL_START DECL_GO_TOKEN* LBRACE html_decl_body RBRACE {pin=1} -html_decl_body ::= (HTML_FRAGMENT | expr | if_cond | switch_stmt | for_loop | component)* +html_decl_body ::= (HTML_FRAGMENT | TEMPL_FRAGMENT | raw_go | expr | if_cond | switch_stmt | for_loop | component)* // https://templ.guide/syntax-and-usage/expressions and https://templ.guide/syntax-and-usage/template-composition -expr ::= BOOL_EXPR_START? LBRACE GO_EXPR* RBRACE {pin=2} +expr ::= BOOL_EXPR_START? LBRACE (GO_EXPR | TEMPL_FRAGMENT)* RBRACE {pin=2} + +// https://templ.guide/syntax-and-usage/raw-go/ +raw_go ::= DOUBLE_LBRACE GO_FRAGMENT* DOUBLE_RBRACE {pin=1} // https://templ.guide/syntax-and-usage/if-else -if_cond ::= GO_IF_START_FRAGMENT html_decl_body else_if* else? RBRACE {pin=1} -else_if ::= GO_ELSE_IF_START_FRAGMENT html_decl_body {pin=1} -else ::= GO_ELSE_START_FRAGMENT html_decl_body {pin=1} +if_cond ::= GO_IF GO_FRAGMENT* LBRACE html_decl_body else* RBRACE {pin=1} +//else_if ::= RBRACE GO_ELSE GO_IF GO_FRAGMENT* LBRACE html_decl_body {pin=1} +else ::= RBRACE GO_ELSE (GO_IF GO_FRAGMENT+)? LBRACE html_decl_body {pin=2} // https://templ.guide/syntax-and-usage/switch -switch_stmt ::= GO_SWITCH_START_FRAGMENT switch_case* switch_default? RBRACE {pin=1} +switch_stmt ::= GO_SWITCH GO_FRAGMENT* LBRACE switch_case* switch_default? RBRACE {pin=1} switch_case ::= GO_CASE_FRAGMENT html_decl_body {pin=1} switch_default ::= GO_DEFAULT_FRAGMENT html_decl_body {pin=1} // https://templ.guide/syntax-and-usage/loops -for_loop ::= GO_FOR_START_FRAGMENT html_decl_body RBRACE {pin=1} +for_loop ::= GO_FOR GO_FRAGMENT* LBRACE html_decl_body RBRACE {pin=1} // https://templ.guide/syntax-and-usage/template-composition -component ::= COMPONENT_IMPORT_START COMPONENT_REFERENCE (component_struct_literal COMPONENT_REFERENCE)? component_params? component_children? {pin=1; recoverWhile=recover_component} +component ::= COMPONENT_IMPORT_START COMPONENT_REFERENCE component_children? {pin=1; recoverWhile=recover_component} private recover_component ::= !(COMPONENT_IMPORT_START | HTML_FRAGMENT | RBRACE | RPARENTH) -component_struct_literal ::= LBRACE GO_COMPONENT_STRUCT_LITERAL* RBRACE {pin=1} -component_params ::= LPARENTH GO_COMPONENT_IMPORT_PARAMS* RPARENTH {pin=1} -component_children ::= COMPONENT_CHILDREN_START+ LBRACE html_decl_body RBRACE {pin=1} +component_children ::= LBRACE html_decl_body RBRACE {pin=1} // https://templ.guide/syntax-and-usage/css-style-management#css-components css_decl ::= CSS_DECL_START CSS_CLASS_ID css_params LBRACE CSS_PROPERTIES* RBRACE {pin=1} private css_params ::= LPARENTH GO_CSS_DECL_PARAMS* RPARENTH // https://templ.guide/syntax-and-usage/script-templates#script-templates -script_decl ::= SCRIPT_DECL_START SCRIPT_FUNCTION_DECL* SCRIPT_BODY* RBRACE {pin=1} +script_decl ::= SCRIPT_DECL_START SCRIPT_FUNCTION_DECL* LBRACE SCRIPT_BODY* RBRACE {pin=1} + diff --git a/src/main/grammar/_TemplLexer.flex b/src/main/grammar/_TemplLexer.flex index 990f11a..8705160 100644 --- a/src/main/grammar/_TemplLexer.flex +++ b/src/main/grammar/_TemplLexer.flex @@ -3,7 +3,7 @@ package com.templ.templ.parsing; import com.intellij.psi.tree.IElementType; import com.intellij.lexer.FlexLexer; import org.bouncycastle.util.Arrays; -import com.intellij.util.containers.Stack; +import com.intellij.util.containers.Stack;import q.H.W; import static com.intellij.psi.TokenType.*; import static com.templ.templ.psi.TemplTypes.*; @@ -45,7 +45,7 @@ import static com.templ.templ.psi.TemplTypes.*; switch (state) { case YYINITIAL: return GO_ROOT_FRAGMENT; case IN_EXPR: return GO_EXPR; - case IN_COMPONENT_IMPORT_PARAMS: return GO_COMPONENT_IMPORT_PARAMS; +// case IN_COMPONENT_IMPORT_PARAMS: return GO_COMPONENT_IMPORT_PARAMS; case IN_TEMPL_DECLARATION_START: return DECL_GO_TOKEN; default: throw new IllegalStateException("Unknown default token for state: " + state); } @@ -63,8 +63,9 @@ import static com.templ.templ.psi.TemplTypes.*; %type IElementType %unicode +NEW_LINE = \r|\n|\r\n WHITE_SPACE=\s+ -OPTIONAL_WHITE_SPACE=\s* +OPTIONAL_WHITE_SPACE=[\ \t\f]* %state IN_TEMPL_DECLARATION_START %state IN_TEMPL_DECLARATION_BODY @@ -73,7 +74,10 @@ OPTIONAL_WHITE_SPACE=\s* %state IN_CSS_DECLARATION_BODY %state IN_SCRIPT_DECLARATION_START %state IN_SCRIPT_DECLARATION_BODY +%state IN_RAW_GO %state IN_EXPR +%state IN_GO_BLOCK_START +%state IN_CLASS_EXPR %state IN_COMPONENT_IMPORT %state IN_COMPONENT_IMPORT_STRUCT_LITERAL %state IN_COMPONENT_IMPORT_PARAMS @@ -156,6 +160,10 @@ OPTIONAL_WHITE_SPACE=\s* } { + ^ "package" ~{NEW_LINE} { + return GO_PACKAGE_FRAGMENT; + } + ^ "templ" { yyPushState(IN_TEMPL_DECLARATION_START); return HTML_DECL_START; @@ -188,16 +196,21 @@ OPTIONAL_WHITE_SPACE=\s* } { - ^ {OPTIONAL_WHITE_SPACE} "if" ~"{" $ { - return GO_IF_START_FRAGMENT; + ^ {OPTIONAL_WHITE_SPACE} "if" { + yypushback(2); + yyPushState(IN_GO_BLOCK_START); + return WHITE_SPACE; } - "}" {OPTIONAL_WHITE_SPACE} "else if" ~"{" $ { - return GO_ELSE_IF_START_FRAGMENT; + "}" {OPTIONAL_WHITE_SPACE} "else" { + yypushback(yylength() - 1); + yyPushState(IN_GO_BLOCK_START); + return RBRACE; } - "}" {OPTIONAL_WHITE_SPACE} "else" {OPTIONAL_WHITE_SPACE} "{" {OPTIONAL_WHITE_SPACE} $ { - return GO_ELSE_START_FRAGMENT; + "{{" { + yyPushState(IN_RAW_GO); + return DOUBLE_LBRACE; } "{" { @@ -221,11 +234,18 @@ OPTIONAL_WHITE_SPACE=\s* yypushback(1); // So that we can detect component imports "@" straight after ">". } - "=\"" ~"\"" { + ("=\"" ~"\""|"='" ~"'") { // Skip over attribute value so that we don't detect keywords in it. return HTML_FRAGMENT; } + "class={" { + // skip over class attributes for now + yypushback(1); + yyPushState(IN_CLASS_EXPR); + return HTML_FRAGMENT; + } + "?={" { yypushback(1); // IN_EXPR handles brace nesting yyPushState(IN_EXPR); @@ -248,8 +268,14 @@ OPTIONAL_WHITE_SPACE=\s* return HTML_FRAGMENT; } - ^ {OPTIONAL_WHITE_SPACE} "switch" {WHITE_SPACE} ~"{\n" { - return GO_SWITCH_START_FRAGMENT; + "." [.\w\ \t\f]+ "{" ~"}" { + return HTML_FRAGMENT; + } + + ^ {OPTIONAL_WHITE_SPACE} "switch" { + yypushback(6); + yyPushState(IN_GO_BLOCK_START); + return WHITE_SPACE; } ^ {OPTIONAL_WHITE_SPACE} "case" ~":" {OPTIONAL_WHITE_SPACE} $ { @@ -260,14 +286,16 @@ OPTIONAL_WHITE_SPACE=\s* return GO_DEFAULT_FRAGMENT; } - ^ {OPTIONAL_WHITE_SPACE} "for" {WHITE_SPACE} ~"{" $ { - return GO_FOR_START_FRAGMENT; + ^ {OPTIONAL_WHITE_SPACE} "for" { + yypushback(3); + yyPushState(IN_GO_BLOCK_START); + return WHITE_SPACE; } ^ {OPTIONAL_WHITE_SPACE} "@" { yypushback(1); yyPushState(IN_COMPONENT_IMPORT); - return HTML_FRAGMENT; + return WHITE_SPACE; } ">" {OPTIONAL_WHITE_SPACE} "@" { @@ -297,111 +325,120 @@ OPTIONAL_WHITE_SPACE=\s* return COMPONENT_IMPORT_START; } - [\w\.]+ "{" { - yypushback(1); - yyPushState(IN_COMPONENT_IMPORT_STRUCT_LITERAL); - return COMPONENT_REFERENCE; + [\ \t\f] "{" {OPTIONAL_WHITE_SPACE} {NEW_LINE} { + yypushback(yylength()-1); + yyReplaceState(IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START); + return WHITE_SPACE; } - [\w\.]+ "(" { - yypushback(1); - yyReplaceState(IN_COMPONENT_IMPORT_PARAMS); + ([^{(,.]|")") {OPTIONAL_WHITE_SPACE} {NEW_LINE} { + yypushback(yylength()-1); + yyPopState(); return COMPONENT_REFERENCE; } - [\w\.]+ {WHITE_SPACE} "{" { - yypushback(2); - yyReplaceState(IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START); + [^] { return COMPONENT_REFERENCE; } +} - [\w\.]+ { + { + [\ \t\f] { + return WHITE_SPACE; + } + + "{" { yyPopState(); // IN_TEMPL_DECLARATION_BODY - return COMPONENT_REFERENCE; + return LBRACE; + } +} + + { + "}}" { + yyPopState(); + return DOUBLE_RBRACE; + } + + [^] { + return GO_FRAGMENT; } } - { + { "{" { braceNestingLevel++; - if (braceNestingLevel == 1) { - return LBRACE; - } + return LBRACE; } "}" { - braceNestingLevel--; - if (braceNestingLevel == 0) { - yyPopState(); // IN_COMPONENT_IMPORT - return RBRACE; - } + braceNestingLevel--; + if (braceNestingLevel == 0) { + yyPopState(); // IN_COMPONENT_IMPORT + } + return RBRACE; + } + + ([:letter:]|[:digit:])+ "..." { + return TEMPL_FRAGMENT; + } + + [\ \t\f] { + return WHITE_SPACE; } [^] { - return GO_COMPONENT_STRUCT_LITERAL; + return GO_EXPR; } } - { - "(" { - parensNestingLevel++; - if (parensNestingLevel == 1) { - return LPARENTH; - } + { + "{" {OPTIONAL_WHITE_SPACE} {NEW_LINE} { + yyPopState(); + return LBRACE; } - ")" {WHITE_SPACE} "{" { - parensNestingLevel--; - if (parensNestingLevel == 0) { - yypushback(yylength() - 1); - yyReplaceState(IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START); - return RPARENTH; - } + "if" { + return GO_IF; } - ")" { - parensNestingLevel--; - if (parensNestingLevel == 0) { - yyPopState(); // IN_TEMPL_DECLARATION_BODY - return RPARENTH; - } + "else" { + return GO_ELSE; } - [^] { - return GO_COMPONENT_IMPORT_PARAMS; + "switch" { + return GO_SWITCH; } -} - { - {WHITE_SPACE} { - return COMPONENT_CHILDREN_START; + "for" { + return GO_FOR; } - "{" { - yyPopState(); // IN_TEMPL_DECLARATION_BODY - return LBRACE; + [\ \t\f] { + return WHITE_SPACE; + } + + [^] { + return GO_FRAGMENT; } } - { + { "{" { braceNestingLevel++; - if (braceNestingLevel == 1) { - return LBRACE; - } + return TEMPL_FRAGMENT; } "}" { - braceNestingLevel--; - if (braceNestingLevel == 0) { - yyPopState(); // IN_TEMPL_DECLARATION_BODY or IN_HTML_TAG_OPENER - return RBRACE; - } + braceNestingLevel--; + if (braceNestingLevel == 0) { + yyPopState(); // IN_HTML_TAG_OPENER + } + return TEMPL_FRAGMENT; } [^] { - return GO_EXPR; - } + return TEMPL_FRAGMENT; + } } { @@ -457,7 +494,7 @@ OPTIONAL_WHITE_SPACE=\s* { "{" $ { yyReplaceState(IN_SCRIPT_DECLARATION_BODY); - return SCRIPT_FUNCTION_DECL; + return LBRACE; } [^] { @@ -476,6 +513,15 @@ OPTIONAL_WHITE_SPACE=\s* } } +// TODO: Make whitespace work! +//\R?(\R|[\ \n\t\f])+ { +// return WHITE_SPACE; +//} +// +//[\ \n\t\f]+ { +// return WHITE_SPACE; +//} + [^] { yyResetState(YYINITIAL); return BAD_CHARACTER; diff --git a/src/main/kotlin/com/templ/templ/file/TemplFileViewProvider.kt b/src/main/kotlin/com/templ/templ/file/TemplFileViewProvider.kt index 6159fab..d5a48f9 100644 --- a/src/main/kotlin/com/templ/templ/file/TemplFileViewProvider.kt +++ b/src/main/kotlin/com/templ/templ/file/TemplFileViewProvider.kt @@ -1,41 +1,39 @@ package com.templ.templ.file +import com.goide.GoLanguage import com.intellij.lang.Language import com.intellij.lang.LanguageParserDefinitions import com.intellij.lang.html.HTMLLanguage +import com.intellij.lexer.Lexer +import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.MultiplePsiFilesPerDocumentFileViewProvider import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager +import com.intellij.psi.TokenType import com.intellij.psi.impl.source.PsiFileImpl import com.intellij.psi.templateLanguages.TemplateDataElementType import com.intellij.psi.templateLanguages.TemplateDataModifications import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider import com.templ.templ.TemplLanguage +import com.templ.templ.file.languages.GoLanguageType +import com.templ.templ.file.languages.HtmlElementType +import com.templ.templ.parsing._TemplLexer import com.templ.templ.psi.TemplLeafElementType import com.templ.templ.psi.TemplTypes +import org.jetbrains.annotations.NotNull class TemplFileViewProvider(manager: PsiManager, virtualFile: VirtualFile, eventSystemEnabled: Boolean) : MultiplePsiFilesPerDocumentFileViewProvider(manager, virtualFile, eventSystemEnabled), TemplateLanguageFileViewProvider { - private val htmlElementType = object : TemplateDataElementType("HTML inside Templ", HTMLLanguage.INSTANCE, TemplTypes.HTML_FRAGMENT, TemplLeafElementType("TEMPL_NOT_HTML")) { - override fun appendCurrentTemplateToken(tokenEndOffset: Int, tokenText: CharSequence): TemplateDataModifications { - // Detect if were inside an attribute value and if so, insert fake quotes to make the HTML parser happy. - if (StringUtil.endsWithChar(tokenText, '=')) { - return TemplateDataModifications.fromRangeToRemove(tokenEndOffset, "\"\"") - } - - return super.appendCurrentTemplateToken(tokenEndOffset, tokenText) - } - } - override fun getBaseLanguage(): Language { return TemplLanguage } override fun getLanguages(): Set { - return setOf(baseLanguage, HTMLLanguage.INSTANCE) + return setOf(baseLanguage, HTMLLanguage.INSTANCE, GoLanguage.INSTANCE) } override fun getTemplateDataLanguage(): Language { @@ -43,15 +41,14 @@ class TemplFileViewProvider(manager: PsiManager, virtualFile: VirtualFile, event } override fun createFile(lang: Language): PsiFile? { - if (lang === HTMLLanguage.INSTANCE) { - val file = LanguageParserDefinitions.INSTANCE.forLanguage(lang).createFile(this) as PsiFileImpl - file.contentElementType = htmlElementType - return file - } else if (lang === baseLanguage) { - return LanguageParserDefinitions.INSTANCE.forLanguage(lang).createFile(this) as PsiFileImpl - } else { - return null + val file = LanguageParserDefinitions.INSTANCE.forLanguage(lang).createFile(this) as PsiFileImpl + when (lang) { + HTMLLanguage.INSTANCE -> file.contentElementType = HtmlElementType() + GoLanguage.INSTANCE -> file.contentElementType = GoLanguageType() + TemplLanguage -> return file + else -> return null } + return file } override fun cloneInner(virtualFile: VirtualFile): MultiplePsiFilesPerDocumentFileViewProvider { diff --git a/src/main/kotlin/com/templ/templ/file/languages/GoLanguageType.kt b/src/main/kotlin/com/templ/templ/file/languages/GoLanguageType.kt new file mode 100644 index 0000000..e0d5698 --- /dev/null +++ b/src/main/kotlin/com/templ/templ/file/languages/GoLanguageType.kt @@ -0,0 +1,181 @@ +package com.templ.templ.file.languages + +import com.goide.GoLanguage +import com.intellij.lang.Language +import com.intellij.lexer.Lexer +import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.util.TextRange +import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.TokenType +import com.intellij.psi.templateLanguages.TemplateDataElementType +import com.intellij.psi.templateLanguages.TemplateDataModifications +import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider +import com.templ.templ.parsing._TemplLexer +import com.templ.templ.psi.TemplLeafElementType +import com.templ.templ.psi.TemplTypes +import org.jetbrains.annotations.NotNull + +class GoLanguageType : TemplateDataElementType( + "Go inside Templ", + GoLanguage.INSTANCE, + TemplTypes.GO_ROOT_FRAGMENT, + TemplLeafElementType("TEMPL_NOT_GO") +) { + override fun getTemplateFileLanguage(viewProvider: TemplateLanguageFileViewProvider): Language { + return GoLanguage.INSTANCE + } + + private fun getRangeDump(range: @NotNull TextRange, sequence: @NotNull CharSequence): @NotNull String { + return "'" + StringUtil.escapeLineBreak(range.subSequence(sequence).toString()) + "' " + range + } + + override fun collectTemplateModifications( + sourceCode: @NotNull CharSequence, + baseLexer: @NotNull Lexer + ): @NotNull TemplateDataModifications { + + val modifications = TemplateDataModifications() + baseLexer.start(sourceCode) + var currentRange = TextRange.EMPTY_RANGE + + var tokenCounter = 0 + var braceCounter = 0 + while (baseLexer.tokenType != null) { + ++tokenCounter + if (tokenCounter % 1000 == 0) { + ProgressManager.checkCanceled() + } + + val newRange = TextRange.create(baseLexer.tokenStart, baseLexer.tokenEnd) + + assert(currentRange.endOffset == newRange.startOffset) { + "Inconsistent tokens stream from $baseLexer: " + getRangeDump( + currentRange, + sourceCode + ) + " followed by " + getRangeDump(newRange, sourceCode) + } + + currentRange = newRange + when (baseLexer.tokenType) { + TemplTypes.GO_ROOT_FRAGMENT, + TemplTypes.GO_IF, + TemplTypes.GO_ELSE, + TemplTypes.GO_FRAGMENT, + TemplTypes.GO_SWITCH, + TemplTypes.GO_CASE_FRAGMENT, + TemplTypes.GO_DEFAULT_FRAGMENT, + TemplTypes.GO_FOR, + TemplTypes.DECL_GO_TOKEN, + TemplTypes.GO_EXPR, + TokenType.WHITE_SPACE -> { + modifications.addAll( + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + ) + } + + TemplTypes.HTML_FRAGMENT, + TemplTypes.SCRIPT_BODY, + TemplTypes.TEMPL_FRAGMENT, + TemplTypes.COMPONENT_IMPORT_START -> { + val emptyText = baseLexer.tokenSequence.toString().replace(Regex("\\S"), " ") + modifications.addRangeToRemove(baseLexer.tokenStart, emptyText) + modifications.addOuterRange(currentRange) + } + + TemplTypes.GO_PACKAGE_FRAGMENT -> { + modifications.addAll( + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + ) + modifications.addRangeToRemove(baseLexer.tokenEnd, "import \"github.com/a-h/templ\"\n") + } + + TemplTypes.COMPONENT_REFERENCE -> { + modifications.addAll( + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + ) + modifications.addRangeToRemove(baseLexer.tokenEnd, ".Render(nil, nil);") + } + + TemplTypes.HTML_DECL_START -> { + modifications.addRangeToRemove(baseLexer.tokenStart, "func") + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + } + + TemplTypes.LBRACE -> { + if (arrayOf( + _TemplLexer.IN_TEMPL_DECLARATION_START, + _TemplLexer.IN_TEMPL_DECLARATION_BODY, + _TemplLexer.IN_EXPR, + _TemplLexer.IN_HTML_TAG_OPENER, + _TemplLexer.IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START, + _TemplLexer.IN_GO_BLOCK_START, + ).contains(baseLexer.state) + ) { + braceCounter++ + + if (baseLexer.state == _TemplLexer.IN_TEMPL_DECLARATION_START) { + modifications.addRangeToRemove(baseLexer.tokenStart, "templ.Component ") + } + + modifications.addAll( + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + ) + + if (baseLexer.state == _TemplLexer.IN_HTML_TAG_OPENER || baseLexer.state == _TemplLexer.IN_TEMPL_DECLARATION_BODY) { + modifications.addRangeToRemove(baseLexer.tokenEnd, "var _ string = ") + } + } else { + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + } + } + + TemplTypes.RBRACE -> { + if (arrayOf( + _TemplLexer.IN_TEMPL_DECLARATION_START, + _TemplLexer.IN_TEMPL_DECLARATION_BODY, + _TemplLexer.IN_EXPR, + _TemplLexer.IN_HTML_TAG_OPENER, + _TemplLexer.IN_COMPONENT_IMPORT_CHILDREN_BLOCK_START, + _TemplLexer.IN_GO_BLOCK_START, + ).contains(baseLexer.state) + ) { + braceCounter-- + + if (baseLexer.state == _TemplLexer.IN_TEMPL_DECLARATION_BODY + && braceCounter == 0) { + modifications.addRangeToRemove(baseLexer.tokenStart, "return nil") + } + + modifications.addAll( + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + ) + if (baseLexer.state == _TemplLexer.IN_EXPR) { + modifications.addRangeToRemove(baseLexer.tokenEnd, ";") + } + } else { + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + } + } + + else -> { + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + } + } + baseLexer.advance() + } + + return modifications + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/templ/templ/file/languages/HtmlElementType.kt b/src/main/kotlin/com/templ/templ/file/languages/HtmlElementType.kt new file mode 100644 index 0000000..257364c --- /dev/null +++ b/src/main/kotlin/com/templ/templ/file/languages/HtmlElementType.kt @@ -0,0 +1,201 @@ +package com.templ.templ.file.languages + +import com.intellij.lang.html.HTMLLanguage +import com.intellij.lexer.Lexer +import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.util.TextRange +import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.TokenType +import com.intellij.psi.templateLanguages.TemplateDataElementType +import com.intellij.psi.templateLanguages.TemplateDataModifications +import com.templ.templ.parsing._TemplLexer +import com.templ.templ.psi.TemplLeafElementType +import com.templ.templ.psi.TemplTypes +import org.jetbrains.annotations.NotNull + +class HtmlElementType : TemplateDataElementType("HTML inside Templ", + HTMLLanguage.INSTANCE, + TemplTypes.HTML_FRAGMENT, + TemplLeafElementType("TEMPL_NOT_HTML") +) { + override fun appendCurrentTemplateToken(tokenEndOffset: Int, tokenText: CharSequence): TemplateDataModifications { + // Detect if were inside an attribute value and if so, insert fake quotes to make the HTML parser happy. + if (StringUtil.endsWithChar(tokenText, '=')) { + return TemplateDataModifications.fromRangeToRemove(tokenEndOffset, "\"\"") + } + + return super.appendCurrentTemplateToken(tokenEndOffset, tokenText) + } + + private fun getRangeDump(range: @NotNull TextRange, sequence: @NotNull CharSequence): @NotNull String { + return "'" + StringUtil.escapeLineBreak(range.subSequence(sequence).toString()) + "' " + range + } + + override fun collectTemplateModifications( + sourceCode: @NotNull CharSequence, + baseLexer: @NotNull Lexer + ): @NotNull TemplateDataModifications { + + val modifications = TemplateDataModifications() + baseLexer.start(sourceCode) + var currentRange = TextRange.EMPTY_RANGE + + var tokenCounter = 0 + var braceCounter = -1 + while (baseLexer.tokenType != null) { + ++tokenCounter + if (tokenCounter % 1000 == 0) { + ProgressManager.checkCanceled() + } + + val newRange = TextRange.create(baseLexer.tokenStart, baseLexer.tokenEnd) + + assert(currentRange.endOffset == newRange.startOffset) { + "Inconsistent tokens stream from $baseLexer: " + getRangeDump( + currentRange, + sourceCode + ) + " followed by " + getRangeDump(newRange, sourceCode) + } + + currentRange = newRange + when (baseLexer.tokenType) { + TemplTypes.HTML_FRAGMENT, + TemplTypes.SCRIPT_BODY, + TokenType.WHITE_SPACE -> { + + val tokenModifications = + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + modifications.addAll(tokenModifications) + } + + TemplTypes.GO_PACKAGE_FRAGMENT, + TemplTypes.GO_ROOT_FRAGMENT, + TemplTypes.GO_IF, + TemplTypes.GO_ELSE, + TemplTypes.GO_FRAGMENT, + TemplTypes.GO_SWITCH, + TemplTypes.GO_CASE_FRAGMENT, + TemplTypes.GO_DEFAULT_FRAGMENT, + TemplTypes.GO_FOR, + TemplTypes.DECL_GO_TOKEN, + TemplTypes.TEMPL_FRAGMENT -> { + val emptyText = baseLexer.tokenSequence.toString().replace(Regex("\\S"), "") + modifications.addRangeToRemove(baseLexer.tokenStart, emptyText) + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, emptyText) + ) + } + + TemplTypes.SCRIPT_DECL_START -> { + modifications.addRangeToRemove(baseLexer.tokenStart, "<") + val tokenModifications = + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + modifications.addAll(tokenModifications) + modifications.addRangeToRemove(baseLexer.tokenEnd, ">function") + } + + TemplTypes.SCRIPT_FUNCTION_DECL -> { + // TODO: this is a hack to get the function name and arguments, it should really be done straight from the lexer. + val matches = "(.*)\\((.*)\\)".toRegex().find(baseLexer.tokenSequence) + if (matches != null && matches.groups.size == 3) { + val functionName = matches.groups[1]?.value + val functionArgs = matches.groups[2]?.value + + if (functionName != null && functionArgs != null) { + val args = functionArgs.split(",").map { it.split(" ") } + + modifications.addAll( + this.appendCurrentTemplateToken( + baseLexer.tokenStart + functionName.length + 1, + baseLexer.tokenSequence.subSequence(0, functionName.length + 1) + ) + ) + + var pos = baseLexer.tokenStart + functionName.length + 1 + for (arg in args) { + modifications.addAll( + this.appendCurrentTemplateToken( + pos, + arg[0] + ) + ) + pos += arg[0].length + if (arg.size > 1) { + modifications.addOuterRange( + TextRange(pos, pos + 1 + arg[1].length), + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + pos += 1 + arg[1].length + } + if (args.indexOf(arg) < args.size - 1) { + modifications.addAll( + this.appendCurrentTemplateToken( + pos, + "," + ) + ) + } + } + modifications.addAll( + this.appendCurrentTemplateToken( + pos, + ")" + ) + ) + + } + } + + } + + TemplTypes.LBRACE -> { + if (braceCounter > 0) { + braceCounter++ + } + if (baseLexer.state == _TemplLexer.IN_SCRIPT_DECLARATION_START) { + if (braceCounter == -1) { + braceCounter = 1 + } + val tokenModifications = + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + modifications.addAll(tokenModifications) + } else { + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + } + } + + TemplTypes.RBRACE -> { + if (braceCounter >= 0) { + braceCounter-- + } + if (baseLexer.state == _TemplLexer.IN_SCRIPT_DECLARATION_BODY && braceCounter == 0) { + val tokenModifications = + this.appendCurrentTemplateToken(baseLexer.tokenEnd, baseLexer.tokenSequence) + modifications.addAll(tokenModifications) + modifications.addRangeToRemove(baseLexer.tokenEnd, "") + braceCounter = -1 + } else { + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + } + } + + else -> { + modifications.addOuterRange( + currentRange, + this.isInsertionToken(baseLexer.tokenType, baseLexer.tokenSequence) + ) + } + } + baseLexer.advance() + } + + return modifications + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/templ/templ/parsing/TemplLexer.kt b/src/main/kotlin/com/templ/templ/parsing/TemplLexer.kt index c0f1a85..44862d6 100644 --- a/src/main/kotlin/com/templ/templ/parsing/TemplLexer.kt +++ b/src/main/kotlin/com/templ/templ/parsing/TemplLexer.kt @@ -12,13 +12,14 @@ class TemplLexer : MergingLexerAdapter( TemplTypes.HTML_FRAGMENT, TemplTypes.GO_ROOT_FRAGMENT, TemplTypes.DECL_GO_TOKEN, - TemplTypes.GO_COMPONENT_IMPORT_PARAMS, TemplTypes.GO_EXPR, + TemplTypes.GO_FRAGMENT, TemplTypes.GO_CSS_DECL_PARAMS, TemplTypes.CSS_PROPERTIES, TemplTypes.SCRIPT_FUNCTION_DECL, TemplTypes.SCRIPT_BODY, TemplTypes.BLOCK_COMMENT, - TemplTypes.GO_COMPONENT_STRUCT_LITERAL + TemplTypes.COMPONENT_REFERENCE, + TemplTypes.TEMPL_FRAGMENT ) ) diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f5fa199..80a867e 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -12,6 +12,7 @@ com.intellij.modules.platform com.intellij.modules.ultimate org.jetbrains.plugins.textmate + org.jetbrains.plugins.go enabled\n ') + WHITE_SPACE (' ') + TemplTokenType.GO_IF ('if') + TemplTokenType.GO_FRAGMENT (' enabled ') + TemplTokenType.{ ('{\n') + TemplTokenType.HTML_FRAGMENT ('
enabled
\n ') TemplTokenType.} ('}') TemplTokenType.HTML_FRAGMENT ('\n
') TemplTokenType.{ ('{') @@ -86,17 +90,31 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\n') TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' hello() ') TemplTokenType.{ ('{') TemplTokenType.HTML_FRAGMENT ('\n') - TemplTokenType.GO_IF_START_FRAGMENT (' if true {') - TemplTokenType.HTML_FRAGMENT ('\n

if

\n ') - TemplTokenType.GO_ELSE_IF_START_FRAGMENT ('} else if false {') - TemplTokenType.HTML_FRAGMENT ('\n

else if

\n ') - TemplTokenType.GO_ELSE_START_FRAGMENT ('} else {') - TemplTokenType.HTML_FRAGMENT ('\n

else

\n ') + WHITE_SPACE (' ') + TemplTokenType.GO_IF ('if') + TemplTokenType.GO_FRAGMENT (' true ') + TemplTokenType.{ ('{\n') + TemplTokenType.HTML_FRAGMENT ('

if

\n ') + TemplTokenType.} ('}') + TemplTokenType.GO_FRAGMENT (' ') + TemplTokenType.GO_ELSE ('else') + TemplTokenType.GO_FRAGMENT (' ') + TemplTokenType.GO_IF ('if') + TemplTokenType.GO_FRAGMENT (' false ') + TemplTokenType.{ ('{\n') + TemplTokenType.HTML_FRAGMENT ('

else if

\n ') + TemplTokenType.} ('}') + TemplTokenType.GO_FRAGMENT (' ') + TemplTokenType.GO_ELSE ('else') + TemplTokenType.GO_FRAGMENT (' ') + TemplTokenType.{ ('{\n') + TemplTokenType.HTML_FRAGMENT ('

else

\n ') TemplTokenType.} ('}') TemplTokenType.HTML_FRAGMENT ('\n') TemplTokenType.} ('}') @@ -122,12 +140,16 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\n') TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' hello(type string) ') TemplTokenType.{ ('{') TemplTokenType.HTML_FRAGMENT ('\n') - TemplTokenType.GO_SWITCH_START_FRAGMENT (' switch type {\n') + WHITE_SPACE (' ') + TemplTokenType.GO_SWITCH ('switch') + TemplTokenType.GO_FRAGMENT (' type ') + TemplTokenType.{ ('{\n') TemplTokenType.GO_CASE_FRAGMENT (' case "case1":') TemplTokenType.HTML_FRAGMENT ('\n

case 1

\n') TemplTokenType.GO_CASE_FRAGMENT (' case "case2":') @@ -157,13 +179,17 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\n') TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' nameList(items []Item) ') TemplTokenType.{ ('{') TemplTokenType.HTML_FRAGMENT ('\n
    \n') - TemplTokenType.GO_FOR_START_FRAGMENT (' for _, item := range items {') - TemplTokenType.HTML_FRAGMENT ('\n
  • ') + WHITE_SPACE (' ') + TemplTokenType.GO_FOR ('for') + TemplTokenType.GO_FRAGMENT (' _, item := range items ') + TemplTokenType.{ ('{\n') + TemplTokenType.HTML_FRAGMENT ('
  • ') TemplTokenType.{ ('{') TemplTokenType.GO_EXPR (' item.Name ') TemplTokenType.} ('}') @@ -187,17 +213,16 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\n') TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' test4() ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n ') + TemplTokenType.HTML_FRAGMENT ('\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('test3') - TemplTokenType.( ('(') - TemplTokenType.GO_COMPONENT_IMPORT_PARAMS ('"hello"') - TemplTokenType.) (')') - TemplTokenType.COMPONENT_CHILDREN_START (' ') + TemplTokenType.COMPONENT_REFERENCE ('test3("hello")') + WHITE_SPACE (' ') TemplTokenType.{ ('{') TemplTokenType.HTML_FRAGMENT ('\n hello \n ') TemplTokenType.} ('}') @@ -223,22 +248,20 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\n') TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' test3() ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n

    asdf

    \n ') + TemplTokenType.HTML_FRAGMENT ('\n

    asdf

    \n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('hello') - TemplTokenType.( ('(') - TemplTokenType.GO_COMPONENT_IMPORT_PARAMS ('"case2"') - TemplTokenType.) (')') - TemplTokenType.HTML_FRAGMENT ('\n ') + TemplTokenType.COMPONENT_REFERENCE ('hello("case2")') + TemplTokenType.HTML_FRAGMENT ('\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('test2') - TemplTokenType.( ('(') - TemplTokenType.) (')') - TemplTokenType.COMPONENT_CHILDREN_START (' ') + TemplTokenType.COMPONENT_REFERENCE ('test2()') + WHITE_SPACE (' ') TemplTokenType.{ ('{') TemplTokenType.HTML_FRAGMENT ('\n \n ') TemplTokenType.} ('}') @@ -275,7 +298,8 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\nimport fmt\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\nimport fmt\n\n') TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' wrapper(index int) ') TemplTokenType.{ ('{') @@ -285,7 +309,9 @@ class TemplLexerTest : LexerTestCase() { TemplTokenType.} ('}') TemplTokenType.HTML_FRAGMENT ('>\n ') TemplTokenType.{ ('{') - TemplTokenType.GO_EXPR (' children... ') + TemplTokenType.GO_EXPR (' ') + TemplTokenType.TEMPL_FRAGMENT ('children...') + TemplTokenType.GO_EXPR (' ') TemplTokenType.} ('}') TemplTokenType.HTML_FRAGMENT ('\n
\n') TemplTokenType.} ('}') @@ -293,36 +319,28 @@ class TemplLexerTest : LexerTestCase() { TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' template() ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n ') + TemplTokenType.HTML_FRAGMENT ('\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('wrapper') - TemplTokenType.( ('(') - TemplTokenType.GO_COMPONENT_IMPORT_PARAMS ('1') - TemplTokenType.) (')') - TemplTokenType.COMPONENT_CHILDREN_START (' ') + TemplTokenType.COMPONENT_REFERENCE ('wrapper(1)') + WHITE_SPACE (' ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n
hello
\n ') + TemplTokenType.HTML_FRAGMENT ('\n
hello
\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('wrapper') - TemplTokenType.( ('(') - TemplTokenType.GO_COMPONENT_IMPORT_PARAMS ('2') - TemplTokenType.) (')') - TemplTokenType.COMPONENT_CHILDREN_START (' ') + TemplTokenType.COMPONENT_REFERENCE ('wrapper(2)') + WHITE_SPACE (' ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n\n ') + TemplTokenType.HTML_FRAGMENT ('\n\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('wrapper') - TemplTokenType.( ('(') - TemplTokenType.GO_COMPONENT_IMPORT_PARAMS ('3') - TemplTokenType.) (')') - TemplTokenType.COMPONENT_CHILDREN_START (' ') + TemplTokenType.COMPONENT_REFERENCE ('wrapper(3)') + WHITE_SPACE (' ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n child3\n ') + TemplTokenType.HTML_FRAGMENT ('\n child3\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('wrapper') - TemplTokenType.( ('(') - TemplTokenType.GO_COMPONENT_IMPORT_PARAMS ('4') - TemplTokenType.) (')') + TemplTokenType.COMPONENT_REFERENCE ('wrapper(4)') TemplTokenType.HTML_FRAGMENT ('\n ') TemplTokenType.} ('}') TemplTokenType.HTML_FRAGMENT ('\n ') @@ -349,7 +367,8 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\n') TemplTokenType.css ('css') WHITE_SPACE (' ') TemplTokenType.CSS_CLASS_ID ('cssComponentGreen') @@ -415,7 +434,8 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n') TemplTokenType.LINE_COMMENT ('// line comment') TemplTokenType.GO_ROOT_FRAGMENT ('\n') TemplTokenType.BLOCK_COMMENT ('/*\n/* block comment\n */') @@ -434,11 +454,9 @@ class TemplLexerTest : LexerTestCase() { TemplTokenType.DECL_GO_TOKEN (' ComplexCommentTest() ') TemplTokenType.{ ('{') TemplTokenType.HTML_FRAGMENT ('\n \n \n ') TemplTokenType.BLOCK_COMMENT ('/* Test3 */') TemplTokenType.HTML_FRAGMENT ('\n Test4\n \n') @@ -457,9 +475,11 @@ class TemplLexerTest : LexerTestCase() { } """.trimIndent(), """ - TemplTokenType.GO_ROOT_FRAGMENT ('package main\n\n') + TemplTokenType.GO_PACKAGE_FRAGMENT ('package main') + TemplTokenType.GO_ROOT_FRAGMENT ('\n\n') TemplTokenType.script ('script') - TemplTokenType.SCRIPT_FUNCTION_DECL (' test1() {') + TemplTokenType.SCRIPT_FUNCTION_DECL (' test1() ') + TemplTokenType.{ ('{') TemplTokenType.SCRIPT_BODY ('\n console.log("hello")\n') TemplTokenType.} ('}') """.trimIndent() @@ -481,15 +501,10 @@ class TemplLexerTest : LexerTestCase() { TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' Message() ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n
\n ') + TemplTokenType.HTML_FRAGMENT ('\n
\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') - TemplTokenType.COMPONENT_REFERENCE ('Data') - TemplTokenType.{ ('{') - TemplTokenType.GO_COMPONENT_STRUCT_LITERAL ('\n message: fmt.Sprintf("%s", "You can implement methods on a type."),\n ') - TemplTokenType.} ('}') - TemplTokenType.COMPONENT_REFERENCE ('.Method') - TemplTokenType.( ('(') - TemplTokenType.) (')') + TemplTokenType.COMPONENT_REFERENCE ('Data{\n message: fmt.Sprintf("%s", "You can implement methods on a type."),\n }.Method()') TemplTokenType.HTML_FRAGMENT ('\n
\n') TemplTokenType.} ('}') """.trimIndent() @@ -511,10 +526,11 @@ class TemplLexerTest : LexerTestCase() { TemplTokenType.templ ('templ') TemplTokenType.DECL_GO_TOKEN (' test(comp templ.Component) ') TemplTokenType.{ ('{') - TemplTokenType.HTML_FRAGMENT ('\n
\n ') + TemplTokenType.HTML_FRAGMENT ('\n
\n') + WHITE_SPACE (' ') TemplTokenType.@ ('@') TemplTokenType.COMPONENT_REFERENCE ('comp') - TemplTokenType.COMPONENT_CHILDREN_START (' ') + WHITE_SPACE (' ') TemplTokenType.{ ('{') TemplTokenType.HTML_FRAGMENT ('\n
Children
\n ') TemplTokenType.} ('}') diff --git a/src/test/testData/ParsingTestBasicFeatures.templ b/src/test/testData/ParsingTestBasicFeatures.templ index db683e7..26e0fb9 100644 --- a/src/test/testData/ParsingTestBasicFeatures.templ +++ b/src/test/testData/ParsingTestBasicFeatures.templ @@ -1,11 +1,15 @@ -package main +package untitled1 templ Hello(name string) {
Hello, { name }
} +type Person struct { + Name string +} + templ Greeting( - person Person + person Person, ) {
@Hello(person.Name) @@ -32,6 +36,12 @@ script withComment() { //' } +type data struct{} + +func (d data) IsTrue() bool { + return true +} + templ conditionals(d data) {
if d.IsTrue() { diff --git a/src/test/testData/ParsingTestBasicFeatures.txt b/src/test/testData/ParsingTestBasicFeatures.txt index f4efbe4..5c723d1 100644 --- a/src/test/testData/ParsingTestBasicFeatures.txt +++ b/src/test/testData/ParsingTestBasicFeatures.txt @@ -1,236 +1,315 @@ -Templ File(0,1312) - TemplGoRootImpl(TemplElementType.GO_ROOT)(0,14) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('package main\n\n')(0,14) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(14,71) - PsiElement(TemplTokenType.templ)('templ')(14,19) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Hello(name string) ')(19,39) - PsiElement(TemplTokenType.{)('{')(39,40) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(40,70) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
Hello, ')(40,55) - TemplExprImpl(TemplElementType.EXPR)(55,63) - PsiElement(TemplTokenType.{)('{')(55,56) - PsiElement(TemplTokenType.GO_EXPR)(' name ')(56,62) - PsiElement(TemplTokenType.})('}')(62,63) - PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n')(63,70) - PsiElement(TemplTokenType.})('}')(70,71) - TemplGoRootImpl(TemplElementType.GO_ROOT)(71,73) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(71,73) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(73,170) - PsiElement(TemplTokenType.templ)('templ')(73,78) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Greeting(\n person Person\n ) ')(78,109) - PsiElement(TemplTokenType.{)('{')(109,110) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(110,169) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n ')(110,140) - TemplComponentImpl(TemplElementType.COMPONENT)(140,159) - PsiElement(TemplTokenType.@)('@')(140,141) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('Hello')(141,146) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(146,159) - PsiElement(TemplTokenType.()('(')(146,147) - PsiElement(TemplTokenType.GO_COMPONENT_IMPORT_PARAMS)('person.Name')(147,158) - PsiElement(TemplTokenType.))(')')(158,159) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(159,169) - PsiElement(TemplTokenType.})('}')(169,170) - TemplGoRootImpl(TemplElementType.GO_ROOT)(170,210) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\ntype Data struct {\n\tmessage string\n}\n\n')(170,210) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(210,263) - PsiElement(TemplTokenType.templ)('templ')(210,215) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' (d Data) Method() ')(215,234) - PsiElement(TemplTokenType.{)('{')(234,235) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(235,262) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
')(235,242) - TemplExprImpl(TemplElementType.EXPR)(242,255) - PsiElement(TemplTokenType.{)('{')(242,243) - PsiElement(TemplTokenType.GO_EXPR)(' d.message ')(243,254) - PsiElement(TemplTokenType.})('}')(254,255) - PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n')(255,262) - PsiElement(TemplTokenType.})('}')(262,263) - TemplGoRootImpl(TemplElementType.GO_ROOT)(263,265) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(263,265) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(265,400) - PsiElement(TemplTokenType.templ)('templ')(265,270) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Message() ')(270,281) - PsiElement(TemplTokenType.{)('{')(281,282) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(282,399) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n ')(282,301) - TemplComponentImpl(TemplElementType.COMPONENT)(301,387) - PsiElement(TemplTokenType.@)('@')(301,302) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('Data')(302,306) - TemplComponentStructLiteralImpl(TemplElementType.COMPONENT_STRUCT_LITERAL)(306,378) - PsiElement(TemplTokenType.{)('{')(306,307) - PsiElement(TemplTokenType.GO_COMPONENT_STRUCT_LITERAL)('\n message: "You can implement methods on a type.",\n ')(307,377) - PsiElement(TemplTokenType.})('}')(377,378) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('.Method')(378,385) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(385,387) - PsiElement(TemplTokenType.()('(')(385,386) - PsiElement(TemplTokenType.))(')')(386,387) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(387,399) - PsiElement(TemplTokenType.})('}')(399,400) - TemplGoRootImpl(TemplElementType.GO_ROOT)(400,402) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(400,402) - TemplScriptDeclImpl(TemplElementType.SCRIPT_DECL)(402,431) - PsiElement(TemplTokenType.script)('script')(402,408) - PsiElement(TemplTokenType.SCRIPT_FUNCTION_DECL)(' withComment() {')(408,424) - PsiElement(TemplTokenType.SCRIPT_BODY)('\n\t')(424,426) - PsiComment(TemplTokenType.LINE_COMMENT)('//'')(426,429) - PsiElement(TemplTokenType.SCRIPT_BODY)('\n')(429,430) - PsiElement(TemplTokenType.})('}')(430,431) - TemplGoRootImpl(TemplElementType.GO_ROOT)(431,433) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(431,433) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(433,851) - PsiElement(TemplTokenType.templ)('templ')(433,438) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' conditionals(d data) ')(438,460) - PsiElement(TemplTokenType.{)('{')(460,461) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(461,850) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n')(461,469) - TemplIfCondImpl(TemplElementType.IF_COND)(469,584) - PsiElement(TemplTokenType.GO_IF_START_FRAGMENT)('\t\tif d.IsTrue() {')(469,486) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(486,517) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
True
\n\t\t')(486,517) - TemplElseIfImpl(TemplElementType.ELSE_IF)(517,558) - PsiElement(TemplTokenType.GO_ELSE_IF_START_FRAGMENT)('} else if !d.IsTrue() {')(517,540) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(540,558) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(540,544) - TemplExprImpl(TemplElementType.EXPR)(544,555) - PsiElement(TemplTokenType.{)('{')(544,545) - PsiElement(TemplTokenType.GO_EXPR)(' "False" ')(545,554) - PsiElement(TemplTokenType.})('}')(554,555) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(555,558) - TemplElseImpl(TemplElementType.ELSE)(558,583) - PsiElement(TemplTokenType.GO_ELSE_START_FRAGMENT)('} else {')(558,566) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(566,583) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(566,570) - TemplExprImpl(TemplElementType.EXPR)(570,580) - PsiElement(TemplTokenType.{)('{')(570,571) - PsiElement(TemplTokenType.GO_EXPR)(' "Else" ')(571,579) - PsiElement(TemplTokenType.})('}')(579,580) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(580,583) - PsiElement(TemplTokenType.})('}')(583,584) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n\t
\n')(584,600) - TemplIfCondImpl(TemplElementType.IF_COND)(600,666) - PsiElement(TemplTokenType.GO_IF_START_FRAGMENT)('\t\tif 1 == 2 {')(600,613) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(613,628) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(613,617) - TemplExprImpl(TemplElementType.EXPR)(617,625) - PsiElement(TemplTokenType.{)('{')(617,618) - PsiElement(TemplTokenType.GO_EXPR)(' "If" ')(618,624) - PsiElement(TemplTokenType.})('}')(624,625) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(625,628) - TemplElseIfImpl(TemplElementType.ELSE_IF)(628,665) - PsiElement(TemplTokenType.GO_ELSE_IF_START_FRAGMENT)('} else if 1 == 1 {')(628,646) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(646,665) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(646,650) - TemplExprImpl(TemplElementType.EXPR)(650,662) - PsiElement(TemplTokenType.{)('{')(650,651) - PsiElement(TemplTokenType.GO_EXPR)(' "ElseIf" ')(651,661) - PsiElement(TemplTokenType.})('}')(661,662) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(662,665) - PsiElement(TemplTokenType.})('}')(665,666) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n\t
\n')(666,682) - TemplIfCondImpl(TemplElementType.IF_COND)(682,841) - PsiElement(TemplTokenType.GO_IF_START_FRAGMENT)('\t\tif 1 == 2 {')(682,695) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(695,710) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(695,699) - TemplExprImpl(TemplElementType.EXPR)(699,707) - PsiElement(TemplTokenType.{)('{')(699,700) - PsiElement(TemplTokenType.GO_EXPR)(' "If" ')(700,706) - PsiElement(TemplTokenType.})('}')(706,707) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(707,710) - TemplElseIfImpl(TemplElementType.ELSE_IF)(710,786) - PsiElement(TemplTokenType.GO_ELSE_IF_START_FRAGMENT)('} else if 1 == 3 {')(710,728) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(728,786) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t
\n ')(728,758) - TemplExprImpl(TemplElementType.EXPR)(758,770) - PsiElement(TemplTokenType.{)('{')(758,759) - PsiElement(TemplTokenType.GO_EXPR)(' "ElseIf" ')(759,769) - PsiElement(TemplTokenType.})('}')(769,770) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t
\n\t\t')(770,786) - TemplElseIfImpl(TemplElementType.ELSE_IF)(786,807) - PsiElement(TemplTokenType.GO_ELSE_IF_START_FRAGMENT)('} else if 1 == 4 {')(786,804) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(804,807) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(804,807) - TemplElseIfImpl(TemplElementType.ELSE_IF)(807,840) - PsiElement(TemplTokenType.GO_ELSE_IF_START_FRAGMENT)('} else if 1 == 1 {')(807,825) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(825,840) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(825,829) - TemplExprImpl(TemplElementType.EXPR)(829,837) - PsiElement(TemplTokenType.{)('{')(829,830) - PsiElement(TemplTokenType.GO_EXPR)(' "OK" ')(830,836) - PsiElement(TemplTokenType.})('}')(836,837) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(837,840) - PsiElement(TemplTokenType.})('}')(840,841) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n')(841,850) - PsiElement(TemplTokenType.})('}')(850,851) - TemplGoRootImpl(TemplElementType.GO_ROOT)(851,853) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(851,853) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(853,939) - PsiElement(TemplTokenType.templ)('templ')(853,858) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' loops(items []string) ')(858,881) - PsiElement(TemplTokenType.{)('{')(881,882) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(882,938) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(882,883) - TemplForLoopImpl(TemplElementType.FOR_LOOP)(883,937) - PsiElement(TemplTokenType.GO_FOR_START_FRAGMENT)('\tfor _, item := range items {')(883,912) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(912,936) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t
')(912,920) - TemplExprImpl(TemplElementType.EXPR)(920,928) - PsiElement(TemplTokenType.{)('{')(920,921) - PsiElement(TemplTokenType.GO_EXPR)(' item ')(921,927) - PsiElement(TemplTokenType.})('}')(927,928) - PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n\t')(928,936) - PsiElement(TemplTokenType.})('}')(936,937) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(937,938) - PsiElement(TemplTokenType.})('}')(938,939) - TemplGoRootImpl(TemplElementType.GO_ROOT)(939,941) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(939,941) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(941,1104) - PsiElement(TemplTokenType.templ)('templ')(941,946) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' render(input string) ')(946,968) - PsiElement(TemplTokenType.{)('{')(968,969) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(969,1103) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(969,970) - TemplSwitchStmtImpl(TemplElementType.SWITCH_STMT)(970,1102) - PsiElement(TemplTokenType.GO_SWITCH_START_FRAGMENT)('\tswitch input {\n')(970,986) - TemplSwitchCaseImpl(TemplElementType.SWITCH_CASE)(986,1018) - PsiElement(TemplTokenType.GO_CASE_FRAGMENT)('\t\tcase "a":')(986,997) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(997,1018) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(997,1001) - TemplExprImpl(TemplElementType.EXPR)(1001,1017) - PsiElement(TemplTokenType.{)('{')(1001,1002) - PsiElement(TemplTokenType.GO_EXPR)(' "it was 'a'" ')(1002,1016) - PsiElement(TemplTokenType.})('}')(1016,1017) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(1017,1018) - TemplSwitchCaseImpl(TemplElementType.SWITCH_CASE)(1018,1058) - PsiElement(TemplTokenType.GO_CASE_FRAGMENT)('\t\tcase "b":')(1018,1029) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1029,1058) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t
It was 'b'
\n')(1029,1058) - TemplSwitchDefaultImpl(TemplElementType.SWITCH_DEFAULT)(1058,1101) - PsiElement(TemplTokenType.GO_DEFAULT_FRAGMENT)('\t\tdefault:')(1058,1068) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1068,1101) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(1068,1072) - TemplExprImpl(TemplElementType.EXPR)(1072,1099) - PsiElement(TemplTokenType.{)('{')(1072,1073) - PsiElement(TemplTokenType.GO_EXPR)(' "it was something else" ')(1073,1098) - PsiElement(TemplTokenType.})('}')(1098,1099) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(1099,1101) - PsiElement(TemplTokenType.})('}')(1101,1102) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(1102,1103) - PsiElement(TemplTokenType.})('}')(1103,1104) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1104,1106) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1104,1106) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(1106,1312) - PsiElement(TemplTokenType.templ)('templ')(1106,1111) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' attributeEscaping(url string) ')(1111,1142) - PsiElement(TemplTokenType.{)('{')(1142,1143) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1143,1311) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n\t\ttext\n\t
\n\t
\n\t\tClick\n\t
\n')(1283,1311) - PsiElement(TemplTokenType.})('}')(1311,1312) +Templ File(0,1427) + PsiElement(TemplTokenType.GO_PACKAGE_FRAGMENT)('package untitled1')(0,17) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(17,19) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(19,76) + PsiElement(TemplTokenType.templ)('templ')(19,24) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Hello(name string) ')(24,44) + PsiElement(TemplTokenType.{)('{')(44,45) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(45,75) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
Hello, ')(45,60) + TemplExprImpl(TemplElementType.EXPR)(60,68) + PsiElement(TemplTokenType.{)('{')(60,61) + PsiElement(TemplTokenType.GO_EXPR)(' name ')(61,67) + PsiElement(TemplTokenType.})('}')(67,68) + PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n')(68,75) + PsiElement(TemplTokenType.})('}')(75,76) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\ntype Person struct {\n Name string\n}\n\n')(76,118) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(118,216) + PsiElement(TemplTokenType.templ)('templ')(118,123) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Greeting(\n person Person,\n ) ')(123,155) + PsiElement(TemplTokenType.{)('{')(155,156) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(156,215) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(156,182) + PsiWhiteSpace(' ')(182,186) + TemplComponentImpl(TemplElementType.COMPONENT)(186,205) + PsiElement(TemplTokenType.@)('@')(186,187) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('Hello(person.Name)')(187,205) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(205,215) + PsiElement(TemplTokenType.})('}')(215,216) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\ntype Data struct {\n\tmessage string\n}\n\n')(216,256) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(256,309) + PsiElement(TemplTokenType.templ)('templ')(256,261) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' (d Data) Method() ')(261,280) + PsiElement(TemplTokenType.{)('{')(280,281) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(281,308) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
')(281,288) + TemplExprImpl(TemplElementType.EXPR)(288,301) + PsiElement(TemplTokenType.{)('{')(288,289) + PsiElement(TemplTokenType.GO_EXPR)(' d.message ')(289,300) + PsiElement(TemplTokenType.})('}')(300,301) + PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n')(301,308) + PsiElement(TemplTokenType.})('}')(308,309) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(309,311) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(311,446) + PsiElement(TemplTokenType.templ)('templ')(311,316) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Message() ')(316,327) + PsiElement(TemplTokenType.{)('{')(327,328) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(328,445) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(328,339) + PsiWhiteSpace(' ')(339,347) + TemplComponentImpl(TemplElementType.COMPONENT)(347,433) + PsiElement(TemplTokenType.@)('@')(347,348) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('Data{\n message: "You can implement methods on a type.",\n }.Method()')(348,433) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(433,445) + PsiElement(TemplTokenType.})('}')(445,446) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(446,448) + TemplScriptDeclImpl(TemplElementType.SCRIPT_DECL)(448,477) + PsiElement(TemplTokenType.script)('script')(448,454) + PsiElement(TemplTokenType.SCRIPT_FUNCTION_DECL)(' withComment() ')(454,469) + PsiElement(TemplTokenType.{)('{')(469,470) + PsiElement(TemplTokenType.SCRIPT_BODY)('\n\t')(470,472) + PsiComment(TemplTokenType.LINE_COMMENT)('//'')(472,475) + PsiElement(TemplTokenType.SCRIPT_BODY)('\n')(475,476) + PsiElement(TemplTokenType.})('}')(476,477) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\ntype data struct{}\n\nfunc (d data) IsTrue() bool {\n return true\n}\n\n')(477,548) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(548,966) + PsiElement(TemplTokenType.templ)('templ')(548,553) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' conditionals(d data) ')(553,575) + PsiElement(TemplTokenType.{)('{')(575,576) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(576,965) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n')(576,584) + PsiWhiteSpace('\t\t')(584,586) + TemplIfCondImpl(TemplElementType.IF_COND)(586,699) + PsiElement(TemplTokenType.GO_IF)('if')(586,588) + PsiWhiteSpace(' ')(588,589) + PsiElement(TemplTokenType.GO_FRAGMENT)('d.IsTrue()')(589,599) + PsiWhiteSpace(' ')(599,600) + PsiElement(TemplTokenType.{)('{\n')(600,602) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(602,632) + PsiElement(TemplTokenType.HTML_FRAGMENT)('
True
\n\t\t')(602,632) + TemplElseImpl(TemplElementType.ELSE)(632,673) + PsiElement(TemplTokenType.})('}')(632,633) + PsiWhiteSpace(' ')(633,634) + PsiElement(TemplTokenType.GO_ELSE)('else')(634,638) + PsiWhiteSpace(' ')(638,639) + PsiElement(TemplTokenType.GO_IF)('if')(639,641) + PsiWhiteSpace(' ')(641,642) + PsiElement(TemplTokenType.GO_FRAGMENT)('!d.IsTrue()')(642,653) + PsiWhiteSpace(' ')(653,654) + PsiElement(TemplTokenType.{)('{\n')(654,656) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(656,673) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t\t')(656,659) + TemplExprImpl(TemplElementType.EXPR)(659,670) + PsiElement(TemplTokenType.{)('{')(659,660) + PsiElement(TemplTokenType.GO_EXPR)(' "False" ')(660,669) + PsiElement(TemplTokenType.})('}')(669,670) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(670,673) + TemplElseImpl(TemplElementType.ELSE)(673,698) + PsiElement(TemplTokenType.})('}')(673,674) + PsiWhiteSpace(' ')(674,675) + PsiElement(TemplTokenType.GO_ELSE)('else')(675,679) + PsiWhiteSpace(' ')(679,680) + PsiElement(TemplTokenType.{)('{\n')(680,682) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(682,698) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t\t')(682,685) + TemplExprImpl(TemplElementType.EXPR)(685,695) + PsiElement(TemplTokenType.{)('{')(685,686) + PsiElement(TemplTokenType.GO_EXPR)(' "Else" ')(686,694) + PsiElement(TemplTokenType.})('}')(694,695) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(695,698) + PsiElement(TemplTokenType.})('}')(698,699) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n\t
\n')(699,715) + PsiWhiteSpace('\t\t')(715,717) + TemplIfCondImpl(TemplElementType.IF_COND)(717,781) + PsiElement(TemplTokenType.GO_IF)('if')(717,719) + PsiWhiteSpace(' ')(719,720) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(720,721) + PsiWhiteSpace(' ')(721,722) + PsiElement(TemplTokenType.GO_FRAGMENT)('==')(722,724) + PsiWhiteSpace(' ')(724,725) + PsiElement(TemplTokenType.GO_FRAGMENT)('2')(725,726) + PsiWhiteSpace(' ')(726,727) + PsiElement(TemplTokenType.{)('{\n')(727,729) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(729,743) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t\t')(729,732) + TemplExprImpl(TemplElementType.EXPR)(732,740) + PsiElement(TemplTokenType.{)('{')(732,733) + PsiElement(TemplTokenType.GO_EXPR)(' "If" ')(733,739) + PsiElement(TemplTokenType.})('}')(739,740) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(740,743) + TemplElseImpl(TemplElementType.ELSE)(743,780) + PsiElement(TemplTokenType.})('}')(743,744) + PsiWhiteSpace(' ')(744,745) + PsiElement(TemplTokenType.GO_ELSE)('else')(745,749) + PsiWhiteSpace(' ')(749,750) + PsiElement(TemplTokenType.GO_IF)('if')(750,752) + PsiWhiteSpace(' ')(752,753) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(753,754) + PsiWhiteSpace(' ')(754,755) + PsiElement(TemplTokenType.GO_FRAGMENT)('==')(755,757) + PsiWhiteSpace(' ')(757,758) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(758,759) + PsiWhiteSpace(' ')(759,760) + PsiElement(TemplTokenType.{)('{\n')(760,762) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(762,780) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t\t')(762,765) + TemplExprImpl(TemplElementType.EXPR)(765,777) + PsiElement(TemplTokenType.{)('{')(765,766) + PsiElement(TemplTokenType.GO_EXPR)(' "ElseIf" ')(766,776) + PsiElement(TemplTokenType.})('}')(776,777) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(777,780) + PsiElement(TemplTokenType.})('}')(780,781) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n\t
\n')(781,797) + PsiWhiteSpace('\t\t')(797,799) + TemplIfCondImpl(TemplElementType.IF_COND)(799,956) + PsiElement(TemplTokenType.GO_IF)('if')(799,801) + PsiWhiteSpace(' ')(801,802) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(802,803) + PsiWhiteSpace(' ')(803,804) + PsiElement(TemplTokenType.GO_FRAGMENT)('==')(804,806) + PsiWhiteSpace(' ')(806,807) + PsiElement(TemplTokenType.GO_FRAGMENT)('2')(807,808) + PsiWhiteSpace(' ')(808,809) + PsiElement(TemplTokenType.{)('{\n')(809,811) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(811,825) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t\t')(811,814) + TemplExprImpl(TemplElementType.EXPR)(814,822) + PsiElement(TemplTokenType.{)('{')(814,815) + PsiElement(TemplTokenType.GO_EXPR)(' "If" ')(815,821) + PsiElement(TemplTokenType.})('}')(821,822) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(822,825) + TemplElseImpl(TemplElementType.ELSE)(825,901) + PsiElement(TemplTokenType.})('}')(825,826) + PsiWhiteSpace(' ')(826,827) + PsiElement(TemplTokenType.GO_ELSE)('else')(827,831) + PsiWhiteSpace(' ')(831,832) + PsiElement(TemplTokenType.GO_IF)('if')(832,834) + PsiWhiteSpace(' ')(834,835) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(835,836) + PsiWhiteSpace(' ')(836,837) + PsiElement(TemplTokenType.GO_FRAGMENT)('==')(837,839) + PsiWhiteSpace(' ')(839,840) + PsiElement(TemplTokenType.GO_FRAGMENT)('3')(840,841) + PsiWhiteSpace(' ')(841,842) + PsiElement(TemplTokenType.{)('{\n')(842,844) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(844,901) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t
\n ')(844,873) + TemplExprImpl(TemplElementType.EXPR)(873,885) + PsiElement(TemplTokenType.{)('{')(873,874) + PsiElement(TemplTokenType.GO_EXPR)(' "ElseIf" ')(874,884) + PsiElement(TemplTokenType.})('}')(884,885) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t
\n\t\t')(885,901) + TemplElseImpl(TemplElementType.ELSE)(901,922) + PsiElement(TemplTokenType.})('}')(901,902) + PsiWhiteSpace(' ')(902,903) + PsiElement(TemplTokenType.GO_ELSE)('else')(903,907) + PsiWhiteSpace(' ')(907,908) + PsiElement(TemplTokenType.GO_IF)('if')(908,910) + PsiWhiteSpace(' ')(910,911) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(911,912) + PsiWhiteSpace(' ')(912,913) + PsiElement(TemplTokenType.GO_FRAGMENT)('==')(913,915) + PsiWhiteSpace(' ')(915,916) + PsiElement(TemplTokenType.GO_FRAGMENT)('4')(916,917) + PsiWhiteSpace(' ')(917,918) + PsiElement(TemplTokenType.{)('{\n')(918,920) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(920,922) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t')(920,922) + TemplElseImpl(TemplElementType.ELSE)(922,955) + PsiElement(TemplTokenType.})('}')(922,923) + PsiWhiteSpace(' ')(923,924) + PsiElement(TemplTokenType.GO_ELSE)('else')(924,928) + PsiWhiteSpace(' ')(928,929) + PsiElement(TemplTokenType.GO_IF)('if')(929,931) + PsiWhiteSpace(' ')(931,932) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(932,933) + PsiWhiteSpace(' ')(933,934) + PsiElement(TemplTokenType.GO_FRAGMENT)('==')(934,936) + PsiWhiteSpace(' ')(936,937) + PsiElement(TemplTokenType.GO_FRAGMENT)('1')(937,938) + PsiWhiteSpace(' ')(938,939) + PsiElement(TemplTokenType.{)('{\n')(939,941) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(941,955) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t\t')(941,944) + TemplExprImpl(TemplElementType.EXPR)(944,952) + PsiElement(TemplTokenType.{)('{')(944,945) + PsiElement(TemplTokenType.GO_EXPR)(' "OK" ')(945,951) + PsiElement(TemplTokenType.})('}')(951,952) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t')(952,955) + PsiElement(TemplTokenType.})('}')(955,956) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n')(956,965) + PsiElement(TemplTokenType.})('}')(965,966) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(966,968) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(968,1054) + PsiElement(TemplTokenType.templ)('templ')(968,973) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' loops(items []string) ')(973,996) + PsiElement(TemplTokenType.{)('{')(996,997) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(997,1053) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(997,998) + PsiWhiteSpace('\t')(998,999) + TemplForLoopImpl(TemplElementType.FOR_LOOP)(999,1052) + PsiElement(TemplTokenType.GO_FOR)('for')(999,1002) + PsiWhiteSpace(' ')(1002,1003) + PsiElement(TemplTokenType.GO_FRAGMENT)('_,')(1003,1005) + PsiWhiteSpace(' ')(1005,1006) + PsiElement(TemplTokenType.GO_FRAGMENT)('item')(1006,1010) + PsiWhiteSpace(' ')(1010,1011) + PsiElement(TemplTokenType.GO_FRAGMENT)(':=')(1011,1013) + PsiWhiteSpace(' ')(1013,1014) + PsiElement(TemplTokenType.GO_FRAGMENT)('range')(1014,1019) + PsiWhiteSpace(' ')(1019,1020) + PsiElement(TemplTokenType.GO_FRAGMENT)('items')(1020,1025) + PsiWhiteSpace(' ')(1025,1026) + PsiElement(TemplTokenType.{)('{\n')(1026,1028) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1028,1051) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\t\t
')(1028,1035) + TemplExprImpl(TemplElementType.EXPR)(1035,1043) + PsiElement(TemplTokenType.{)('{')(1035,1036) + PsiElement(TemplTokenType.GO_EXPR)(' item ')(1036,1042) + PsiElement(TemplTokenType.})('}')(1042,1043) + PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n\t')(1043,1051) + PsiElement(TemplTokenType.})('}')(1051,1052) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(1052,1053) + PsiElement(TemplTokenType.})('}')(1053,1054) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1054,1056) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(1056,1219) + PsiElement(TemplTokenType.templ)('templ')(1056,1061) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' render(input string) ')(1061,1083) + PsiElement(TemplTokenType.{)('{')(1083,1084) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1084,1218) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(1084,1085) + PsiWhiteSpace('\t')(1085,1086) + TemplSwitchStmtImpl(TemplElementType.SWITCH_STMT)(1086,1217) + PsiElement(TemplTokenType.GO_SWITCH)('switch')(1086,1092) + PsiWhiteSpace(' ')(1092,1093) + PsiElement(TemplTokenType.GO_FRAGMENT)('input')(1093,1098) + PsiWhiteSpace(' ')(1098,1099) + PsiElement(TemplTokenType.{)('{\n')(1099,1101) + TemplSwitchCaseImpl(TemplElementType.SWITCH_CASE)(1101,1133) + PsiElement(TemplTokenType.GO_CASE_FRAGMENT)('\t\tcase "a":')(1101,1112) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1112,1133) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(1112,1116) + TemplExprImpl(TemplElementType.EXPR)(1116,1132) + PsiElement(TemplTokenType.{)('{')(1116,1117) + PsiElement(TemplTokenType.GO_EXPR)(' "it was 'a'" ')(1117,1131) + PsiElement(TemplTokenType.})('}')(1131,1132) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(1132,1133) + TemplSwitchCaseImpl(TemplElementType.SWITCH_CASE)(1133,1173) + PsiElement(TemplTokenType.GO_CASE_FRAGMENT)('\t\tcase "b":')(1133,1144) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1144,1173) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t
It was 'b'
\n')(1144,1173) + TemplSwitchDefaultImpl(TemplElementType.SWITCH_DEFAULT)(1173,1216) + PsiElement(TemplTokenType.GO_DEFAULT_FRAGMENT)('\t\tdefault:')(1173,1183) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1183,1216) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\t\t')(1183,1187) + TemplExprImpl(TemplElementType.EXPR)(1187,1214) + PsiElement(TemplTokenType.{)('{')(1187,1188) + PsiElement(TemplTokenType.GO_EXPR)(' "it was something else" ')(1188,1213) + PsiElement(TemplTokenType.})('}')(1213,1214) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(1214,1216) + PsiElement(TemplTokenType.})('}')(1216,1217) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(1217,1218) + PsiElement(TemplTokenType.})('}')(1218,1219) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1219,1221) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(1221,1427) + PsiElement(TemplTokenType.templ)('templ')(1221,1226) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' attributeEscaping(url string) ')(1226,1257) + PsiElement(TemplTokenType.{)('{')(1257,1258) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1258,1426) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
\n\t\ttext\n\t
\n\t
\n\t\tClick\n\t
\n')(1294,1426) + PsiElement(TemplTokenType.})('}')(1426,1427) \ No newline at end of file diff --git a/src/test/testData/ParsingTestComplexAttributes.txt b/src/test/testData/ParsingTestComplexAttributes.txt index 2310cdb..972b6a5 100644 --- a/src/test/testData/ParsingTestComplexAttributes.txt +++ b/src/test/testData/ParsingTestComplexAttributes.txt @@ -1,6 +1,6 @@ Templ File(0,646) - TemplGoRootImpl(TemplElementType.GO_ROOT)(0,31) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('package testcomplexattributes\n\n')(0,31) + PsiElement(TemplTokenType.GO_PACKAGE_FRAGMENT)('package testcomplexattributes')(0,29) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(29,31) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(31,646) PsiElement(TemplTokenType.templ)('templ')(31,36) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' ComplexAttributes() ')(36,57) diff --git a/src/test/testData/ParsingTestComplexSyntax.templ b/src/test/testData/ParsingTestComplexSyntax.templ index e6eea56..fa7dd75 100644 --- a/src/test/testData/ParsingTestComplexSyntax.templ +++ b/src/test/testData/ParsingTestComplexSyntax.templ @@ -1,6 +1,6 @@ package main -struct Data { +type Data struct { message string } @@ -14,6 +14,7 @@ templ test(comp templ.Component) { @comp {
Children
} + @comp
} diff --git a/src/test/testData/ParsingTestComplexSyntax.txt b/src/test/testData/ParsingTestComplexSyntax.txt index 30f07ee..61fe7e0 100644 --- a/src/test/testData/ParsingTestComplexSyntax.txt +++ b/src/test/testData/ParsingTestComplexSyntax.txt @@ -1,80 +1,75 @@ -Templ File(0,506) - TemplGoRootImpl(TemplElementType.GO_ROOT)(0,50) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('package main\n\nstruct Data {\n message string\n}\n\n')(0,50) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(50,143) - PsiElement(TemplTokenType.templ)('templ')(50,55) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' (d Data) Method(greeting string) ')(55,89) - PsiElement(TemplTokenType.{)('{')(89,90) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(90,142) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
')(90,97) - TemplExprImpl(TemplElementType.EXPR)(97,110) - PsiElement(TemplTokenType.{)('{')(97,98) - PsiElement(TemplTokenType.GO_EXPR)(' d.message ')(98,109) - PsiElement(TemplTokenType.})('}')(109,110) - PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n\t
')(110,123) - TemplExprImpl(TemplElementType.EXPR)(123,135) - PsiElement(TemplTokenType.{)('{')(123,124) - PsiElement(TemplTokenType.GO_EXPR)(' greeting ')(124,134) - PsiElement(TemplTokenType.})('}')(134,135) - PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n')(135,142) - PsiElement(TemplTokenType.})('}')(142,143) - TemplGoRootImpl(TemplElementType.GO_ROOT)(143,145) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(143,145) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(145,260) - PsiElement(TemplTokenType.templ)('templ')(145,150) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' test(comp templ.Component) ')(150,178) - PsiElement(TemplTokenType.{)('{')(178,179) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(179,259) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n ')(179,198) - TemplComponentImpl(TemplElementType.COMPONENT)(198,247) - PsiElement(TemplTokenType.@)('@')(198,199) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('comp')(199,203) - TemplComponentChildrenImpl(TemplElementType.COMPONENT_CHILDREN)(203,247) - PsiElement(TemplTokenType.COMPONENT_CHILDREN_START)(' ')(203,204) - PsiElement(TemplTokenType.{)('{')(204,205) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(205,246) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
Children
\n ')(205,246) - PsiElement(TemplTokenType.})('}')(246,247) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(247,259) - PsiElement(TemplTokenType.})('}')(259,260) - TemplGoRootImpl(TemplElementType.GO_ROOT)(260,262) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(260,262) - TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(262,506) - PsiElement(TemplTokenType.templ)('templ')(262,267) - PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Hello() ')(267,276) - PsiElement(TemplTokenType.{)('{')(276,277) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(277,505) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(277,279) - TemplComponentImpl(TemplElementType.COMPONENT)(279,504) - PsiElement(TemplTokenType.@)('@')(279,280) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('Data')(280,284) - TemplComponentStructLiteralImpl(TemplElementType.COMPONENT_STRUCT_LITERAL)(284,342) - PsiElement(TemplTokenType.{)('{')(284,285) - PsiElement(TemplTokenType.GO_COMPONENT_STRUCT_LITERAL)('\n\t message: "You can implement methods on a type.",\n\t')(285,341) - PsiElement(TemplTokenType.})('}')(341,342) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('.Method')(342,349) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(349,358) - PsiElement(TemplTokenType.()('(')(349,350) - PsiElement(TemplTokenType.GO_COMPONENT_IMPORT_PARAMS)('"hello"')(350,357) - PsiElement(TemplTokenType.))(')')(357,358) - TemplComponentChildrenImpl(TemplElementType.COMPONENT_CHILDREN)(358,504) - PsiElement(TemplTokenType.COMPONENT_CHILDREN_START)(' ')(358,359) - PsiElement(TemplTokenType.{)('{')(359,360) - TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(360,503) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t ')(360,366) - TemplComponentImpl(TemplElementType.COMPONENT)(366,444) - PsiElement(TemplTokenType.@)('@')(366,367) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('test')(367,371) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(371,444) - PsiElement(TemplTokenType.()('(')(371,372) - PsiElement(TemplTokenType.GO_COMPONENT_IMPORT_PARAMS)('Data{ message: "You can implement methods on a type." }.Method("hello"')(372,442) - PsiElement(TemplTokenType.))('))')(442,444) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n ')(444,471) - TemplExprImpl(TemplElementType.EXPR)(471,486) - PsiElement(TemplTokenType.{)('{')(471,472) - PsiElement(TemplTokenType.GO_EXPR)(' children... ')(472,485) - PsiElement(TemplTokenType.})('}')(485,486) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n\t')(486,503) - PsiElement(TemplTokenType.})('}')(503,504) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(504,505) - PsiElement(TemplTokenType.})('}')(505,506) +Templ File(0,525) + PsiElement(TemplTokenType.GO_PACKAGE_FRAGMENT)('package main')(0,12) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\ntype Data struct {\n message string\n}\n\n')(12,55) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(55,148) + PsiElement(TemplTokenType.templ)('templ')(55,60) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' (d Data) Method(greeting string) ')(60,94) + PsiElement(TemplTokenType.{)('{')(94,95) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(95,147) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
')(95,102) + TemplExprImpl(TemplElementType.EXPR)(102,115) + PsiElement(TemplTokenType.{)('{')(102,103) + PsiElement(TemplTokenType.GO_EXPR)(' d.message ')(103,114) + PsiElement(TemplTokenType.})('}')(114,115) + PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n\t
')(115,128) + TemplExprImpl(TemplElementType.EXPR)(128,140) + PsiElement(TemplTokenType.{)('{')(128,129) + PsiElement(TemplTokenType.GO_EXPR)(' greeting ')(129,139) + PsiElement(TemplTokenType.})('}')(139,140) + PsiElement(TemplTokenType.HTML_FRAGMENT)('
\n')(140,147) + PsiElement(TemplTokenType.})('}')(147,148) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(148,150) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(150,279) + PsiElement(TemplTokenType.templ)('templ')(150,155) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' test(comp templ.Component) ')(155,183) + PsiElement(TemplTokenType.{)('{')(183,184) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(184,278) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(184,195) + PsiWhiteSpace(' ')(195,203) + TemplComponentImpl(TemplElementType.COMPONENT)(203,252) + PsiElement(TemplTokenType.@)('@')(203,204) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('comp')(204,208) + PsiWhiteSpace(' ')(208,209) + TemplComponentChildrenImpl(TemplElementType.COMPONENT_CHILDREN)(209,252) + PsiElement(TemplTokenType.{)('{')(209,210) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(210,251) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
Children
\n ')(210,251) + PsiElement(TemplTokenType.})('}')(251,252) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(252,253) + PsiWhiteSpace(' ')(253,261) + TemplComponentImpl(TemplElementType.COMPONENT)(261,266) + PsiElement(TemplTokenType.@)('@')(261,262) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('comp')(262,266) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n')(266,278) + PsiElement(TemplTokenType.})('}')(278,279) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(279,281) + TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(281,525) + PsiElement(TemplTokenType.templ)('templ')(281,286) + PsiElement(TemplTokenType.DECL_GO_TOKEN)(' Hello() ')(286,295) + PsiElement(TemplTokenType.{)('{')(295,296) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(296,524) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(296,297) + PsiWhiteSpace('\t')(297,298) + TemplComponentImpl(TemplElementType.COMPONENT)(298,523) + PsiElement(TemplTokenType.@)('@')(298,299) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('Data{\n\t message: "You can implement methods on a type.",\n\t}.Method("hello")')(299,377) + PsiWhiteSpace(' ')(377,378) + TemplComponentChildrenImpl(TemplElementType.COMPONENT_CHILDREN)(378,523) + PsiElement(TemplTokenType.{)('{')(378,379) + TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(379,522) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(379,380) + PsiWhiteSpace('\t ')(380,385) + TemplComponentImpl(TemplElementType.COMPONENT)(385,463) + PsiElement(TemplTokenType.@)('@')(385,386) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('test(Data{ message: "You can implement methods on a type." }.Method("hello"))')(386,463) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n ')(463,490) + TemplExprImpl(TemplElementType.EXPR)(490,505) + PsiElement(TemplTokenType.{)('{')(490,491) + PsiElement(TemplTokenType.GO_EXPR)(' ')(491,492) + PsiElement(TemplTokenType.TEMPL_FRAGMENT)('children...')(492,503) + PsiElement(TemplTokenType.GO_EXPR)(' ')(503,504) + PsiElement(TemplTokenType.})('}')(504,505) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n
\n\t')(505,522) + PsiElement(TemplTokenType.})('}')(522,523) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(523,524) + PsiElement(TemplTokenType.})('}')(524,525) \ No newline at end of file diff --git a/src/test/testData/ParsingTestCssUsage.txt b/src/test/testData/ParsingTestCssUsage.txt index 0f24f61..be63daf 100644 --- a/src/test/testData/ParsingTestCssUsage.txt +++ b/src/test/testData/ParsingTestCssUsage.txt @@ -1,26 +1,18 @@ Templ File(0,2760) - TemplGoRootImpl(TemplElementType.GO_ROOT)(0,36) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('package testcssusage\n\nimport "fmt"\n\n')(0,36) + PsiElement(TemplTokenType.GO_PACKAGE_FRAGMENT)('package testcssusage')(0,20) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\nimport "fmt"\n\n')(20,36) PsiComment(TemplTokenType.LINE_COMMENT)('// Constant class.')(36,54) - TemplGoRootImpl(TemplElementType.GO_ROOT)(54,55) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(54,55) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(54,55) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(55,187) PsiElement(TemplTokenType.templ)('templ')(55,60) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' StyleTagsAreSupported() ')(60,85) PsiElement(TemplTokenType.{)('{')(85,86) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(86,186) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\n\t
Style tags are supported
\n')(125,186) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t\n\t
Style tags are supported
\n')(86,186) PsiElement(TemplTokenType.})('}')(186,187) - TemplGoRootImpl(TemplElementType.GO_ROOT)(187,189) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(187,189) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(187,189) PsiComment(TemplTokenType.LINE_COMMENT)('// CSS components.')(189,207) - TemplGoRootImpl(TemplElementType.GO_ROOT)(207,232) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\nconst red = "#00ff00"\n\n')(207,232) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\nconst red = "#00ff00"\n\n')(207,232) TemplCssDeclImpl(TemplElementType.CSS_DECL)(232,276) PsiElement(TemplTokenType.css)('css')(232,235) PsiWhiteSpace(' ')(235,236) @@ -31,69 +23,49 @@ Templ File(0,2760) PsiElement(TemplTokenType.{)('{')(256,257) PsiElement(TemplTokenType.CSS_PROPERTIES)('\n\tcolor: { red };\n')(257,275) PsiElement(TemplTokenType.})('}')(275,276) - TemplGoRootImpl(TemplElementType.GO_ROOT)(276,278) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(276,278) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(276,278) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(278,386) PsiElement(TemplTokenType.templ)('templ')(278,283) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' CSSComponentsAreSupported() ')(283,312) PsiElement(TemplTokenType.{)('{')(312,313) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(313,385) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
CSS components are supported
\n')(349,385) PsiElement(TemplTokenType.})('}')(385,386) - TemplGoRootImpl(TemplElementType.GO_ROOT)(386,388) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(386,388) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(386,388) PsiComment(TemplTokenType.LINE_COMMENT)('// Both CSS components and constants are supported.')(388,439) - TemplGoRootImpl(TemplElementType.GO_ROOT)(439,440) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(439,440) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(439,440) PsiComment(TemplTokenType.LINE_COMMENT)('// Only string names are really required. There is no need to use templ.Class or templ.SafeClass.')(440,537) - TemplGoRootImpl(TemplElementType.GO_ROOT)(537,538) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(537,538) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(537,538) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(538,1043) PsiElement(TemplTokenType.templ)('templ')(538,543) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' CSSComponentsAndConstantsAreSupported() ')(543,584) PsiElement(TemplTokenType.{)('{')(584,585) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(585,1042) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
Both CSS components and constants are supported
\n\t')(691,761) PsiComment(TemplTokenType.LINE_COMMENT)('// The following is also valid, but not required - you can put the class names in directly.')(761,852) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
Both CSS components and constants are supported
\n')(973,1042) PsiElement(TemplTokenType.})('}')(1042,1043) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1043,1045) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1043,1045) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1043,1045) PsiComment(TemplTokenType.LINE_COMMENT)('// Maps can be used to determine if a class should be added or not.')(1045,1112) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1112,1113) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(1112,1113) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(1112,1113) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(1113,1300) PsiElement(TemplTokenType.templ)('templ')(1113,1118) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' MapsCanBeUsedToConditionallySetClasses() ')(1118,1160) PsiElement(TemplTokenType.{)('{')(1160,1161) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1161,1299) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
Maps can be used to determine if a class should be added or not.
\n')(1227,1299) PsiElement(TemplTokenType.})('}')(1299,1300) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1300,1302) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1300,1302) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1300,1302) PsiComment(TemplTokenType.LINE_COMMENT)('// The templ.KV function can be used to add a class if a condition is true.')(1302,1377) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1377,1379) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1377,1379) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1377,1379) TemplCssDeclImpl(TemplElementType.CSS_DECL)(1379,1408) PsiElement(TemplTokenType.css)('css')(1379,1382) PsiWhiteSpace(' ')(1382,1383) @@ -104,8 +76,7 @@ Templ File(0,2760) PsiElement(TemplTokenType.{)('{')(1387,1388) PsiElement(TemplTokenType.CSS_PROPERTIES)('\n\tfont-size: 12pt;\n')(1388,1407) PsiElement(TemplTokenType.})('}')(1407,1408) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1408,1410) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1408,1410) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1408,1410) TemplCssDeclImpl(TemplElementType.CSS_DECL)(1410,1439) PsiElement(TemplTokenType.css)('css')(1410,1413) PsiWhiteSpace(' ')(1413,1414) @@ -116,59 +87,43 @@ Templ File(0,2760) PsiElement(TemplTokenType.{)('{')(1418,1419) PsiElement(TemplTokenType.CSS_PROPERTIES)('\n\tfont-size: 14pt;\n')(1419,1438) PsiElement(TemplTokenType.})('}')(1438,1439) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1439,1441) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1439,1441) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1439,1441) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(1441,1630) PsiElement(TemplTokenType.templ)('templ')(1441,1446) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' KVCanBeUsedToConditionallySetClasses() ')(1446,1486) PsiElement(TemplTokenType.{)('{')(1486,1487) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1487,1629) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
KV can be used to conditionally set classes.
\n')(1577,1629) PsiElement(TemplTokenType.})('}')(1629,1630) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1630,1632) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1630,1632) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1630,1632) PsiComment(TemplTokenType.LINE_COMMENT)('// Pseudo attributes can be used without any special syntax.')(1632,1692) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1692,1693) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(1692,1693) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(1692,1693) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(1693,1928) PsiElement(TemplTokenType.templ)('templ')(1693,1698) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' PsuedoAttributesAndComplexClassNamesAreSupported() ')(1698,1750) PsiElement(TemplTokenType.{)('{')(1750,1751) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1751,1927) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
Psuedo attributes and complex class names are supported.
\n')(1863,1927) PsiElement(TemplTokenType.})('}')(1927,1928) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1928,1930) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1928,1930) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(1928,1930) PsiComment(TemplTokenType.LINE_COMMENT)('// Class names are HTML escaped.')(1930,1962) - TemplGoRootImpl(TemplElementType.GO_ROOT)(1962,1963) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(1962,1963) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(1962,1963) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(1963,2084) PsiElement(TemplTokenType.templ)('templ')(1963,1968) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' ClassNamesAreHTMLEscaped() ')(1968,1996) PsiElement(TemplTokenType.{)('{')(1996,1997) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(1997,2083) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
Class names are HTML escaped.
\n')(2046,2083) PsiElement(TemplTokenType.})('}')(2083,2084) - TemplGoRootImpl(TemplElementType.GO_ROOT)(2084,2086) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2084,2086) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2084,2086) PsiComment(TemplTokenType.LINE_COMMENT)('// CSS components can be used with arguments.')(2086,2131) - TemplGoRootImpl(TemplElementType.GO_ROOT)(2131,2133) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2131,2133) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2131,2133) TemplCssDeclImpl(TemplElementType.CSS_DECL)(2133,2203) PsiElement(TemplTokenType.css)('css')(2133,2136) PsiWhiteSpace(' ')(2136,2137) @@ -180,90 +135,65 @@ Templ File(0,2760) PsiElement(TemplTokenType.{)('{')(2158,2159) PsiElement(TemplTokenType.CSS_PROPERTIES)('\n\twidth: { fmt.Sprintf("%d%%", percent) };\n')(2159,2202) PsiElement(TemplTokenType.})('}')(2202,2203) - TemplGoRootImpl(TemplElementType.GO_ROOT)(2203,2205) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2203,2205) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2203,2205) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(2205,2407) PsiElement(TemplTokenType.templ)('templ')(2205,2210) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' CSSComponentsCanBeUsedWithArguments() ')(2210,2249) PsiElement(TemplTokenType.{)('{')(2249,2250) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(2250,2406) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t
CSS components can be used with arguments.
\n\t
CSS components can be used with arguments.
\n')(2356,2406) PsiElement(TemplTokenType.})('}')(2406,2407) - TemplGoRootImpl(TemplElementType.GO_ROOT)(2407,2409) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2407,2409) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n\n')(2407,2409) PsiComment(TemplTokenType.LINE_COMMENT)('// Combine all tests.')(2409,2430) - TemplGoRootImpl(TemplElementType.GO_ROOT)(2430,2431) - PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(2430,2431) + PsiElement(TemplTokenType.GO_ROOT_FRAGMENT)('\n')(2430,2431) TemplHtmlDeclImpl(TemplElementType.HTML_DECL)(2431,2760) PsiElement(TemplTokenType.templ)('templ')(2431,2436) PsiElement(TemplTokenType.DECL_GO_TOKEN)(' TestComponent() ')(2436,2453) PsiElement(TemplTokenType.{)('{')(2453,2454) TemplHtmlDeclBodyImpl(TemplElementType.HTML_DECL_BODY)(2454,2759) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2454,2456) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2454,2455) + PsiWhiteSpace('\t')(2455,2456) TemplComponentImpl(TemplElementType.COMPONENT)(2456,2480) PsiElement(TemplTokenType.@)('@')(2456,2457) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('StyleTagsAreSupported')(2457,2478) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2478,2480) - PsiElement(TemplTokenType.()('(')(2478,2479) - PsiElement(TemplTokenType.))(')')(2479,2480) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2480,2482) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('StyleTagsAreSupported()')(2457,2480) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2480,2481) + PsiWhiteSpace('\t')(2481,2482) TemplComponentImpl(TemplElementType.COMPONENT)(2482,2510) PsiElement(TemplTokenType.@)('@')(2482,2483) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('CSSComponentsAreSupported')(2483,2508) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2508,2510) - PsiElement(TemplTokenType.()('(')(2508,2509) - PsiElement(TemplTokenType.))(')')(2509,2510) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2510,2512) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('CSSComponentsAreSupported()')(2483,2510) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2510,2511) + PsiWhiteSpace('\t')(2511,2512) TemplComponentImpl(TemplElementType.COMPONENT)(2512,2552) PsiElement(TemplTokenType.@)('@')(2512,2513) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('CSSComponentsAndConstantsAreSupported')(2513,2550) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2550,2552) - PsiElement(TemplTokenType.()('(')(2550,2551) - PsiElement(TemplTokenType.))(')')(2551,2552) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2552,2554) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('CSSComponentsAndConstantsAreSupported()')(2513,2552) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2552,2553) + PsiWhiteSpace('\t')(2553,2554) TemplComponentImpl(TemplElementType.COMPONENT)(2554,2595) PsiElement(TemplTokenType.@)('@')(2554,2555) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('MapsCanBeUsedToConditionallySetClasses')(2555,2593) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2593,2595) - PsiElement(TemplTokenType.()('(')(2593,2594) - PsiElement(TemplTokenType.))(')')(2594,2595) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2595,2597) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('MapsCanBeUsedToConditionallySetClasses()')(2555,2595) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2595,2596) + PsiWhiteSpace('\t')(2596,2597) TemplComponentImpl(TemplElementType.COMPONENT)(2597,2636) PsiElement(TemplTokenType.@)('@')(2597,2598) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('KVCanBeUsedToConditionallySetClasses')(2598,2634) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2634,2636) - PsiElement(TemplTokenType.()('(')(2634,2635) - PsiElement(TemplTokenType.))(')')(2635,2636) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2636,2638) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('KVCanBeUsedToConditionallySetClasses()')(2598,2636) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2636,2637) + PsiWhiteSpace('\t')(2637,2638) TemplComponentImpl(TemplElementType.COMPONENT)(2638,2689) PsiElement(TemplTokenType.@)('@')(2638,2639) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('PsuedoAttributesAndComplexClassNamesAreSupported')(2639,2687) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2687,2689) - PsiElement(TemplTokenType.()('(')(2687,2688) - PsiElement(TemplTokenType.))(')')(2688,2689) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2689,2691) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('PsuedoAttributesAndComplexClassNamesAreSupported()')(2639,2689) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2689,2690) + PsiWhiteSpace('\t')(2690,2691) TemplComponentImpl(TemplElementType.COMPONENT)(2691,2718) PsiElement(TemplTokenType.@)('@')(2691,2692) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('ClassNamesAreHTMLEscaped')(2692,2716) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2716,2718) - PsiElement(TemplTokenType.()('(')(2716,2717) - PsiElement(TemplTokenType.))(')')(2717,2718) - PsiElement(TemplTokenType.HTML_FRAGMENT)('\n\t')(2718,2720) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('ClassNamesAreHTMLEscaped()')(2692,2718) + PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2718,2719) + PsiWhiteSpace('\t')(2719,2720) TemplComponentImpl(TemplElementType.COMPONENT)(2720,2758) PsiElement(TemplTokenType.@)('@')(2720,2721) - PsiElement(TemplTokenType.COMPONENT_REFERENCE)('CSSComponentsCanBeUsedWithArguments')(2721,2756) - TemplComponentParamsImpl(TemplElementType.COMPONENT_PARAMS)(2756,2758) - PsiElement(TemplTokenType.()('(')(2756,2757) - PsiElement(TemplTokenType.))(')')(2757,2758) + PsiElement(TemplTokenType.COMPONENT_REFERENCE)('CSSComponentsCanBeUsedWithArguments()')(2721,2758) PsiElement(TemplTokenType.HTML_FRAGMENT)('\n')(2758,2759) - PsiElement(TemplTokenType.})('}')(2759,2760) + PsiElement(TemplTokenType.})('}')(2759,2760) \ No newline at end of file