package ru.naumen.gintonic.context.quickfix.modules; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import ru.naumen.gintonic.context.refactor.Refactorator; import ru.naumen.gintonic.guice.GuiceModule; import ru.naumen.gintonic.plugin.icons.Icons; import ru.naumen.gintonic.templates.InstallModuleTemplate; import ru.naumen.gintonic.utils.ASTParserUtils; public class ProposalInstallModule implements IJavaCompletionProposal { private final class AddInstallModuleStatement extends ASTVisitor { private final Refactorator refactorator; private AddInstallModuleStatement(Refactorator refactorator) { this.refactorator = refactorator; } @SuppressWarnings("synthetic-access") @Override public boolean visit(MethodDeclaration method) { SimpleName simpleName = method.getName(); String methodNameAsString = simpleName.toString(); if (methodNameAsString.equals("configure")) { InstallModuleTemplate binding = new InstallModuleTemplate(); String installModuleStatement = binding.generate(guiceModuleSource.getName()); refactorator.addAsLastStatementInMethod(method, installModuleStatement); } return super.visit(method); } } private ITypeBinding guiceModuleSource; private GuiceModule guiceModuleTarget; public ProposalInstallModule(ITypeBinding guiceModuleSource, GuiceModule guiceModuleTarget) { this.guiceModuleSource = guiceModuleSource; this.guiceModuleTarget = guiceModuleTarget; } @Override public Point getSelection(IDocument document) { return null; } @Override public Image getImage() { return Icons.ginTonicDefaultIconSmall; } /** * Brief description of the action appears in the QuickfixProposal selection! */ @Override public String getDisplayString() { return "Install '" + guiceModuleSource.getName() + "' in '" + guiceModuleTarget.getPrimaryTypeName() + "'"; } /** * Detailed description of the action, immersed in a window right next to the QuickfixProposal selection on! */ @Override public String getAdditionalProposalInfo() { return null; } @Override public IContextInformation getContextInformation() { return null; } @Override public void apply(IDocument document) { ICompilationUnit compilationUnit = guiceModuleTarget.getSourceCodeReference().resolveICompilationUnit(); CompilationUnit compilationUnitAstNode = ASTParserUtils.parseCompilationUnitAst3(compilationUnit); Refactorator refactorator = Refactorator.create(compilationUnit, compilationUnitAstNode, compilationUnitAstNode.getAST()); refactorator.addImport(guiceModuleSource.getQualifiedName()); compilationUnitAstNode.accept(new AddInstallModuleStatement(refactorator)); refactorator.refactor(null); } @Override public int getRelevance() { return 0; } }