package ru.naumen.gintonic.context.quickfix.bindings; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.IPackageBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.ui.text.java.IInvocationContext; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; import ru.naumen.gintonic.context.quickfix.AbstractGinTonicQuickFix; import ru.naumen.gintonic.guice.GuiceIndex; import ru.naumen.gintonic.guice.GuiceModule; import ru.naumen.gintonic.guice.statements.BindingDefinition; import ru.naumen.gintonic.utils.ASTNodeUtils; import ru.naumen.gintonic.utils.ITypeBindingUtils; /** * Enables the user to create a linked binding for the selected type (the * source module) in a nearby guice module (the target module). * * <h5>How is the quick fix activated?</h5> * * <h5>How do you discover the target module?</h5> * * @author tmajunke */ public class QuickFixBindingCreation extends AbstractGinTonicQuickFix { @Override public void addProposals(IInvocationContext context, List<IJavaCompletionProposal> proposals) throws CoreException { ASTNode coveringNode = context.getCoveringNode(); TypeDeclaration typeDeclaration = ASTNodeUtils.getTypeDeclaration(coveringNode); if (typeDeclaration == null) { return; } ITypeBinding sourceType = ASTNodeUtils.getTypeBindingIfNotAGuiceModule(coveringNode); if (sourceType == null) { return; } GuiceIndex guiceIndex = GuiceIndex.get(); IPackageBinding currentPackageBinding = sourceType.getPackage(); if (!ITypeBindingUtils.isConcreteType(sourceType)) { return; } List<GuiceModule> guiceModulesInAndBelowPackage = guiceIndex.getGuiceModulesInAndBelowPackage( currentPackageBinding); if (guiceModulesInAndBelowPackage.size() == 0) { return; } ITypeBinding[] interfaces = sourceType.getInterfaces(); for (ITypeBinding interfaceBinding : interfaces) { List<BindingDefinition> bindingStatements = guiceIndex.getBindingDefinitions( interfaceBinding, null); if (bindingStatements.size() == 0) { /* * No binding at all found and we get a target module where to * create the binding. */ for (GuiceModule guiceModule : guiceModulesInAndBelowPackage) { ProposalBindingCreation proposalBindingCreation = new ProposalBindingCreation( sourceType, interfaceBinding, guiceModule, false); proposals.add(proposalBindingCreation); } } else { for (GuiceModule guiceModule : guiceModulesInAndBelowPackage) { ProposalBindingCreation proposalBindingCreation = new ProposalBindingCreation( sourceType, interfaceBinding, guiceModule, false); proposals.add(proposalBindingCreation); } } } } }