|
| 1 | +/* |
| 2 | + * Minecraft Development for IntelliJ |
| 3 | + * |
| 4 | + * https://mcdev.io/ |
| 5 | + * |
| 6 | + * Copyright (C) 2025 minecraft-dev |
| 7 | + * |
| 8 | + * This program is free software: you can redistribute it and/or modify |
| 9 | + * it under the terms of the GNU Lesser General Public License as published |
| 10 | + * by the Free Software Foundation, version 3.0 only. |
| 11 | + * |
| 12 | + * This program is distributed in the hope that it will be useful, |
| 13 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | + * GNU General Public License for more details. |
| 16 | + * |
| 17 | + * You should have received a copy of the GNU Lesser General Public License |
| 18 | + * along with this program. If not, see <https://www.gnu.org/licenses/>. |
| 19 | + */ |
| 20 | + |
| 21 | +package com.demonwav.mcdev.platform.mcp.ct.gen; |
| 22 | + |
| 23 | +import com.intellij.lexer.*; |
| 24 | +import com.intellij.psi.tree.IElementType; |
| 25 | +import static com.demonwav.mcdev.platform.mcp.ct.gen.psi.CtTypes.*; |
| 26 | +import static com.intellij.psi.TokenType.*; |
| 27 | + |
| 28 | +%% |
| 29 | + |
| 30 | +%{ |
| 31 | + public CtLexer() { |
| 32 | + this((java.io.Reader)null); |
| 33 | + } |
| 34 | +%} |
| 35 | + |
| 36 | +%public |
| 37 | +%class CtLexer |
| 38 | +%implements FlexLexer |
| 39 | +%function advance |
| 40 | +%type IElementType |
| 41 | + |
| 42 | +%s HEADER |
| 43 | +%s AW_ENTRY |
| 44 | +%s AW_CLASS_NAME |
| 45 | +%s AW_MEMBER_NAME |
| 46 | +%s AW_TYPES |
| 47 | +%s ITF_ENTRY_KEY |
| 48 | +%s ITF_ENTRY_VALUE |
| 49 | +%s SIGNATURE |
| 50 | + |
| 51 | +%unicode |
| 52 | + |
| 53 | +HEADER_NAME=accessWidener|classTweaker |
| 54 | +HEADER_VERSION_ELEMENT=v\d+ |
| 55 | +HEADER_NAMESPACE_ELEMENT=named|intermediary |
| 56 | +PRIMITIVE=[ZBCSIFDJV] |
| 57 | +CLASS_VALUE=L[^;\n]+; |
| 58 | +SIGNATURE_CLASS_VALUE_START=L[^;<\n]+ |
| 59 | +TYPE_VARIABLE=T[^;\n]+; |
| 60 | +ACCESS_ELEMENT=accessible|transitive-accessible|extendable|transitive-extendable|mutable|transitive-mutable |
| 61 | +INJECT_INTERFACE_ELEMENT=inject-interface|transitive-inject-interface |
| 62 | +CLASS_ELEMENT=class |
| 63 | +METHOD_ELEMENT=method |
| 64 | +FIELD_ELEMENT=field |
| 65 | +NAME_ELEMENT=\w+|<init> |
| 66 | +CLASS_NAME_ELEMENT=(\w+\/)*\w+(\$\w+)* |
| 67 | +COMMENT=#.* |
| 68 | +CRLF=\n|\r|\r\n |
| 69 | +WHITE_SPACE=\s |
| 70 | + |
| 71 | +%% |
| 72 | + |
| 73 | +<YYINITIAL> { |
| 74 | + {HEADER_NAME} { yybegin(HEADER); return HEADER_NAME; } |
| 75 | + {ACCESS_ELEMENT} { yybegin(AW_ENTRY); return ACCESS_ELEMENT; } |
| 76 | + {INJECT_INTERFACE_ELEMENT} { yybegin(ITF_ENTRY_KEY); return INJECT_INTERFACE_ELEMENT; } |
| 77 | +} |
| 78 | + |
| 79 | +<HEADER> { |
| 80 | + {HEADER_VERSION_ELEMENT} { return HEADER_VERSION_ELEMENT; } |
| 81 | + {HEADER_NAMESPACE_ELEMENT} { return HEADER_NAMESPACE_ELEMENT; } |
| 82 | +} |
| 83 | + |
| 84 | +<AW_ENTRY> { |
| 85 | + {CLASS_ELEMENT} { yybegin(AW_CLASS_NAME); return CLASS_ELEMENT; } |
| 86 | + {METHOD_ELEMENT} { yybegin(AW_CLASS_NAME); return METHOD_ELEMENT; } |
| 87 | + {FIELD_ELEMENT} { yybegin(AW_CLASS_NAME); return FIELD_ELEMENT; } |
| 88 | +} |
| 89 | + |
| 90 | +<AW_CLASS_NAME> { |
| 91 | + {CLASS_NAME_ELEMENT} { yybegin(AW_MEMBER_NAME); return CLASS_NAME_ELEMENT; } |
| 92 | +} |
| 93 | + |
| 94 | +<AW_MEMBER_NAME> { |
| 95 | + {NAME_ELEMENT} { yybegin(AW_TYPES); return NAME_ELEMENT; } |
| 96 | +} |
| 97 | + |
| 98 | +<AW_TYPES> { |
| 99 | + "(" { return OPEN_PAREN; } |
| 100 | + ")" { return CLOSE_PAREN; } |
| 101 | + "[" { return OPEN_BRACKET; } |
| 102 | + {CLASS_VALUE} { return CLASS_VALUE; } |
| 103 | + {PRIMITIVE} { return PRIMITIVE; } |
| 104 | +} |
| 105 | + |
| 106 | +<ITF_ENTRY_KEY> { |
| 107 | + {CLASS_NAME_ELEMENT} { yybegin(ITF_ENTRY_VALUE); return CLASS_NAME_ELEMENT; } |
| 108 | +} |
| 109 | + |
| 110 | +<ITF_ENTRY_VALUE> { |
| 111 | + {CLASS_NAME_ELEMENT} { yybegin(SIGNATURE); return CLASS_NAME_ELEMENT; } |
| 112 | +} |
| 113 | + |
| 114 | +<SIGNATURE> { |
| 115 | + "<" { return LESS_THAN; } |
| 116 | + ">" { return GREATER_THAN; } |
| 117 | + "[" { return OPEN_BRACKET; } |
| 118 | + "+" { return PLUS; } |
| 119 | + "-" { return MINUS; } |
| 120 | + "*" { return ASTERISK; } |
| 121 | + {SIGNATURE_CLASS_VALUE_START} { return SIGNATURE_CLASS_VALUE_START; } |
| 122 | + ";" { return SIGNATURE_CLASS_VALUE_END; } |
| 123 | + {PRIMITIVE} { return PRIMITIVE; } |
| 124 | + {TYPE_VARIABLE} { return TYPE_VARIABLE; } |
| 125 | +} |
| 126 | + |
| 127 | +{CRLF} { yybegin(YYINITIAL); return CRLF; } |
| 128 | +{WHITE_SPACE} { return WHITE_SPACE; } |
| 129 | + |
| 130 | +{COMMENT} { return COMMENT; } |
| 131 | +[^] { return BAD_CHARACTER; } |
0 commit comments