private static void setupFunctionParameters(@NotNull Template template, @NotNull List<GoExpression> args, PsiFile file) { Map<String, GoImportSpec> importMap = ((GoFile)file).getImportedPackagesMap(); template.addTextSegment("("); for (int i = 0; i < args.size(); i++) { GoExpression e = args.get(i); template.addVariable(GoRefactoringUtil.createParameterNameSuggestedExpression(e), true); template.addTextSegment(" "); String type = convertType(file, e.getGoType(null), importMap); template.addVariable(new ConstantNode(type), true); if (i != args.size() - 1) template.addTextSegment(", "); } template.addTextSegment(")"); }
private static void setupFunctionResult(@NotNull Template template, @Nullable GoType type) { if (type instanceof GoTypeList) { template.addTextSegment(" ("); List<GoType> list = ((GoTypeList)type).getTypeList(); for (int i = 0; i < list.size(); i++) { template.addVariable(new ConstantNode(list.get(i).getText()), true); if (i < list.size() - 1) template.addTextSegment(", "); } template.addTextSegment(")"); return; } if (type != null) { template.addTextSegment(" "); template.addVariable(new ConstantNode(type.getText()), true); } }
@Override public void invoke(@NotNull Project project, @NotNull PsiFile file, @Nullable("is null when called from inspection") Editor editor, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { if (editor == null) { LOG.error("Cannot run quick fix without editor: " + getClass().getSimpleName(), AttachmentFactory.createAttachment(file.getVirtualFile())); return; } if (!(startElement instanceof GoCallExpr)) return; GoCallExpr call = (GoCallExpr)startElement; List<GoExpression> args = call.getArgumentList().getExpressionList(); GoType resultType = ContainerUtil.getFirstItem(GoTypeUtil.getExpectedTypes(call)); PsiElement anchor = PsiTreeUtil.findPrevParent(file, call); Template template = TemplateManager.getInstance(project).createTemplate("", ""); template.addTextSegment("\nfunc " + myName); setupFunctionParameters(template, args, file); setupFunctionResult(template, resultType); template.addTextSegment(" {\n\t"); template.addEndVariable(); template.addTextSegment("\n}"); int offset = anchor.getTextRange().getEndOffset(); editor.getCaretModel().moveToOffset(offset); startTemplate(editor, template, project); }
if (index == -1) break; template.addTextSegment(templateText.substring(from, index)); template.addTextSegment(templateText.substring(from, templateText.length())); template.setToIndent(true); template.setToReformat(true);