package ru.naumen.gintonic.context.quickfix.bindings;
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.TrackedStatement;
import ru.naumen.gintonic.guice.GuiceConstants;
import ru.naumen.gintonic.guice.GuiceModule;
import ru.naumen.gintonic.plugin.icons.Icons;
import ru.naumen.gintonic.project.source.references.SourceCodeReference;
import ru.naumen.gintonic.utils.ASTParserUtils;
import ru.naumen.gintonic.utils.MethodDeclarationUtils;
public class ProposalBindingCreation implements IJavaCompletionProposal {
private final ITypeBinding sourceType;
private final GuiceModule guiceModule;
private final ITypeBinding interfaceBinding;
private final boolean annotated;
public ProposalBindingCreation(ITypeBinding sourceType,
ITypeBinding interfaceBinding,
GuiceModule guiceModule,
boolean annotated) {
this.sourceType = sourceType;
this.interfaceBinding = interfaceBinding;
this.guiceModule = guiceModule;
this.annotated = annotated;
}
@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() {
String typeName = guiceModule.getPrimaryTypeName();
if (annotated) {
String displayString = "Create an annotated binding to "
+ interfaceBinding.getName() + " in "
+ typeName + "";
return displayString;
}
String displayString = "Create a linked binding to "
+ interfaceBinding.getName() + " in "
+ typeName + "";
return displayString;
}
@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(sourceType);
refactorator.addImport(interfaceBinding);
final boolean isParameterizedType = interfaceBinding.isParameterizedType();
if (isParameterizedType) {
refactorator.addImport(GuiceConstants.TYPE_LITERAL);
}
MethodDeclaration configureMethodDeclaration = MethodDeclarationUtils.getConfigureMethodDeclaration(compilationUnitAstNode);
if (configureMethodDeclaration != null) {
String statementAsString;
if (isParameterizedType) {
statementAsString = "bind(new TypeLiteral<"
+ interfaceBinding.getName() + ">(){})";
}
else {
statementAsString = "bind(" + interfaceBinding.getName()
+ ".class)";
}
if (annotated) {
statementAsString = statementAsString + ".annotatedWith(X)";
}
statementAsString += ".to(" + sourceType.getName() + ".class);";
TrackedStatement trackedStatement = refactorator.addAsLastStatementInMethod(
configureMethodDeclaration,
statementAsString);
refactorator.refactor(null);
int startPosition = trackedStatement.getStartPosition();
sourceCodeReference.jump(startPosition);
}
}
@Override
public int getRelevance() {
return 0;
}
}