@Override
 protected void addExprVariable(@NotNull PsiElement expr, Template template) {
   final FindViewByIdMacro toStringIfNeedMacro = new FindViewByIdMacro();
   MacroCallNode macroCallNode = new MacroCallNode(toStringIfNeedMacro);
   macroCallNode.addParameter(new ConstantNode(expr.getText()));
   template.addVariable("expr", macroCallNode, false);
 }
  private static Template generateTemplate(
      Project project, String exprText, final PsiType[] suggestedTypes) {
    final TemplateManager templateManager = TemplateManager.getInstance(project);
    final Template template = templateManager.createTemplate("", "");
    template.setToReformat(true);

    Set<LookupElement> itemSet = new LinkedHashSet<>();
    for (PsiType type : suggestedTypes) {
      itemSet.add(PsiTypeLookupItem.createLookupItem(type, null));
    }
    final LookupElement[] lookupItems = itemSet.toArray(new LookupElement[itemSet.size()]);

    final Result result =
        suggestedTypes.length > 0 ? new PsiTypeResult(suggestedTypes[0], project) : null;

    Expression expr =
        new Expression() {
          @Override
          public LookupElement[] calculateLookupItems(ExpressionContext context) {
            return lookupItems.length > 1 ? lookupItems : null;
          }

          @Override
          public Result calculateResult(ExpressionContext context) {
            return result;
          }

          @Override
          public Result calculateQuickResult(ExpressionContext context) {
            return null;
          }
        };
    template.addTextSegment("((");
    template.addVariable(TYPE_TEMPLATE_VARIABLE, expr, expr, true);
    template.addTextSegment(")" + exprText + ")");
    template.addEndVariable();

    return template;
  }
 @Override
 protected void setVariables(@NotNull Template template, @NotNull PsiElement element) {
   MacroCallNode node = new MacroCallNode(new VariableOfTypeMacro());
   node.addParameter(new ConstantNode(CONTEXT.toString()));
   template.addVariable("context", node, new ConstantNode(""), false);
 }