in src/org/intellij/jflex/psi/impl/JFlexJavaCodeInjector.java [37:111]
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
if (!(context instanceof JFlexJavaCodeInjectionHostImpl)) return;
if (!Options.INJECT_JAVA_IN_JFLEX.get()) return;
PsiFile file = context.getContainingFile();
Map<IElementType, String> options = collectOptions(file);
boolean isPublic = options.containsKey(JFlexTypes.FLEX_OPT_PUBLIC);
boolean isFinal = options.containsKey(JFlexTypes.FLEX_OPT_FINAL);
String lexerClass = ObjectUtils.notNull(StringUtil.nullize(options.get(JFlexTypes.FLEX_OPT_CLASS)), "Lexer");
String returnType = ObjectUtils.notNull(StringUtil.nullize(options.get(JFlexTypes.FLEX_OPT_TYPE)), "int");
String implementsStr = ObjectUtils.notNull(StringUtil.nullize(options.get(JFlexTypes.FLEX_OPT_IMPLEMENTS)), "");
JFlexRule lastRule = SyntaxTraverser.revPsiTraverser()
.withRoot(PsiTreeUtil.findChildOfType(file, JFlexLexicalRulesSectionImpl.class))
.filter(JFlexRule.class).filter(o -> o.getJavaCode() != null).first();
int ruleCount = 0;
registrar.startInjecting(JavaLanguage.INSTANCE);
JBIterable<JFlexJavaCodeInjectionHostImpl> s = SyntaxTraverser.psiTraverser(file).filter(JFlexJavaCodeInjectionHostImpl.class);
for (JFlexJavaCodeInjectionHostImpl host : s) {
PsiElement hostParent = host.getParent();
if (hostParent instanceof JFlexUserCodeSection) {
StringBuilder sb = new StringBuilder("\n");
sb.append("/** @noinspection ALL*/");
if (isPublic) sb.append("public ");
if (isFinal) sb.append("final ");
sb.append("class ").append(lexerClass);
if (implementsStr.isEmpty()) sb.append(" implements ").append(implementsStr);
sb.append(" {\n\n");
JBIterable<JFlexStateDefinition> states = SyntaxTraverser.psiTraverser(
PsiTreeUtil.findChildOfType(file, JFlexDeclarationsSection.class)).filter(JFlexStateDefinition.class);
sb.append(" public static final int YYINITIAL = 0;\n");
int i = 1;
for (JFlexStateDefinition element : states) {
sb.append(" public static final int ").append(element.getName()).append(" = ").append(i += 2).append(";\n");
}
sb.append("\n");
sb.append(" public ").append(lexerClass).append("(java.io.Reader in) {}\n");
sb.append(" private int zzState, zzLexicalState;\n");
sb.append(" private int zzStartRead, zzEndRead, zzCurrentPos, zzMarkedPos;\n");
sb.append(" private void yybegin(int state) {}\n");
sb.append(" private void yypushback(int pos) {}\n");
sb.append(" private int yystate() { return 0; }\n");
sb.append(" private int yylength() { return 0; }\n");
sb.append(" private char yycharat(int pos) { return 0; }\n");
sb.append("\n");
registrar.addPlace(null, sb.toString(), host, new TextRange(0, host.getTextLength()));
}
else if (hostParent instanceof JFlexOption) {
IElementType optionType = PsiUtilCore.getElementType(hostParent.getFirstChild());
if (optionType == JFlexTypes.FLEX_OPT_CODE1) {
registrar.addPlace(null, null, host, new TextRange(0, host.getTextLength()));
}
else if (optionType == JFlexTypes.FLEX_OPT_INIT1) {
registrar.addPlace("\n {\n", "\n }\n", host, new TextRange(0, host.getTextLength()));
}
else if (optionType == JFlexTypes.FLEX_OPT_EOF1 || optionType == JFlexTypes.FLEX_OPT_EOFVAL1) {
registrar.addPlace("\n void yy_do_eof() {\n", "\n }\n", host, new TextRange(0, host.getTextLength()));
}
}
else if (hostParent instanceof JFlexRule) {
String prefix = ruleCount == 0 ?
"\n" +
" public " + returnType + " advance() throws java.io.IOException {\n" +
" switch(zzLexicalState) {" : "";
String suffix = hostParent == lastRule ?
"""
}
return null;
}
}""" : null;