private static void buildTemplateAndRun()

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);
      }
    });
  }