in src/org/intellij/grammar/refactor/BnfIntroduceTokenHandler.java [142:206]
private static void buildTemplateAndRun(Project project,
Editor editor,
BnfFile bnfFile, List<BnfExpression> occurrences,
String tokenName,
String tokenText,
Set<String> tokenNames) throws StartMarkAction.AlreadyStartedException {
StartMarkAction startAction = StartMarkAction.start(editor, project, REFACTORING_NAME);
BnfListEntry entry = addTokenDefinition(project, bnfFile, tokenName, tokenText, tokenNames);
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument());
TemplateBuilderImpl builder = new TemplateBuilderImpl(bnfFile);
PsiElement tokenId = Objects.requireNonNull(entry.getId());
PsiElement tokenValue = Objects.requireNonNull(entry.getLiteralExpression());
if (tokenName == null) {
builder.replaceElement(tokenId, "TokenName", new TextExpression(tokenId.getText()), true);
}
builder.replaceElement(tokenValue, "TokenText", new TextExpression(tokenValue.getText()), true);
for (BnfExpression occurrence : occurrences) {
builder.replaceElement(occurrence, "Other", new Expression() {
@Override
public @Nullable Result calculateResult(ExpressionContext context) {
TemplateState state = TemplateManagerImpl.getTemplateState(context.getEditor());
assert state != null;
TextResult text = Objects.requireNonNull(state.getVariableValue("TokenText"));
String curText = GrammarUtil.unquote(text.getText());
if (ParserGeneratorUtil.isRegexpToken(curText)) {
return state.getVariableValue("TokenName");
}
else {
return new TextResult("'" + curText + "'");
}
}
@Override
public @Nullable Result calculateQuickResult(ExpressionContext context) {
return calculateResult(context);
}
@Override
public LookupElement[] calculateLookupItems(ExpressionContext context) {
return LookupElement.EMPTY_ARRAY;
}
}, false);
}
RangeMarker caretMarker = editor.getDocument().createRangeMarker(0, editor.getCaretModel().getOffset());
caretMarker.setGreedyToRight(true);
editor.getCaretModel().moveToOffset(0);
Template template = builder.buildInlineTemplate();
template.setToShortenLongNames(false);
template.setToReformat(false);
TemplateManager.getInstance(project).startTemplate(editor, template, new TemplateEditingAdapter() {
@Override
public void templateFinished(@NotNull Template template, boolean brokenOff) {
handleTemplateFinished(project, editor, caretMarker, startAction);
}
@Override
public void templateCancelled(Template template) {
handleTemplateFinished(project, editor, caretMarker, startAction);
}
});
}