package ru.naumen.gintonic.context.quickfix.bindings;
import java.util.Map;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
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.context.refactor.TrackedMethodDeclaration;
import ru.naumen.gintonic.guice.GuiceConstants;
import ru.naumen.gintonic.guice.GuiceModule;
import ru.naumen.gintonic.guice.annotations.GuiceClassAnnotation;
import ru.naumen.gintonic.guice.annotations.IGuiceAnnotation;
import ru.naumen.gintonic.plugin.icons.Icons;
import ru.naumen.gintonic.project.source.references.SourceCodeReference;
import ru.naumen.gintonic.templates.ProviderMethodTemplate;
import ru.naumen.gintonic.utils.ASTParserUtils;
import ru.naumen.gintonic.utils.MapUtils;
import ru.naumen.gintonic.utils.MethodDeclarationUtils;
import ru.naumen.gintonic.utils.Preconditions;
public class ProposalProviderMethodCreation implements IJavaCompletionProposal {
private final GuiceModule guiceModule;
private final ITypeBinding type;
private final IGuiceAnnotation guiceAnnotation;
private final String variableName;
public ProposalProviderMethodCreation(GuiceModule guiceModule,
ITypeBinding typeBindingWithoutProvider,
IGuiceAnnotation guiceAnnotation,
String variableName) {
Preconditions.checkNotNull(guiceModule);
Preconditions.checkNotNull(typeBindingWithoutProvider);
Preconditions.checkNotNull(variableName);
this.guiceModule = guiceModule;
this.type = typeBindingWithoutProvider;
this.guiceAnnotation = guiceAnnotation;
this.variableName = variableName;
}
@Override
public Point getSelection(IDocument document) {
return null;
}
@Override
public Image getImage() {
return Icons.ginTonicIconCreate;
}
@Override
/**
* Kurz Beschreibung der Aktion,taucht in der QuickfixProposal-Auswahl auf!
*/
public String getDisplayString() {
return "Create provider method in " + guiceModule.getPrimaryTypeName();
}
@Override
/**
* Ausfuehrliche Beschreibung der Aktion, taucht in einem Fenster rechts
* neben der QuickfixProposal-Auswahl auf!
*/
public String getAdditionalProposalInfo() {
return null;
}
@Override
public IContextInformation getContextInformation() {
return null;
}
@Override
public void apply(IDocument document) {
SourceCodeReference sourceCodeReference = guiceModule.getSourceCodeReference();
ICompilationUnit compilationUnit = sourceCodeReference.resolveICompilationUnit();
CompilationUnit compilationUnitAstNode = ASTParserUtils.parseCompilationUnitAst3(compilationUnit);
final Refactorator refactorator = Refactorator.create(
compilationUnit,
compilationUnitAstNode,
compilationUnitAstNode.getAST());
refactorator.addImport(GuiceConstants.PROVIDES);
refactorator.addImport(type.getQualifiedName());
if (guiceAnnotation != null) {
refactorator.addImport(guiceAnnotation.getTypeToImport());
}
MethodDeclaration configureMethodDeclaration = MethodDeclarationUtils.getConfigureMethodDeclaration(compilationUnitAstNode);
if (configureMethodDeclaration != null) {
String providerMethodDecl = getMethodCode();
TrackedMethodDeclaration trackedMethodDeclaration = refactorator.addMethod(providerMethodDecl);
refactorator.refactor(null);
int startPosition = trackedMethodDeclaration.getStartPosition();
sourceCodeReference.jump(startPosition);
}
}
/**
* @return
*/
private String getMethodCode() {
ProviderMethodTemplate template = new ProviderMethodTemplate();
Map<String, String> arguments = MapUtils.newHashMap();
arguments.put("type", type.getName());
if (guiceAnnotation != null && guiceAnnotation instanceof GuiceClassAnnotation) {
GuiceClassAnnotation classAnnotation = (GuiceClassAnnotation) guiceAnnotation;
arguments.put("annotation", "@" + classAnnotation.getName());
}
arguments.put("variablename", variableName);
String providerMethodDecl = template.generate(arguments);
return providerMethodDecl;
}
@Override
public int getRelevance() {
return 0;
}
}