package ru.naumen.gintonic.context.quickfix.bindings; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.IPackageBinding; import org.eclipse.jdt.core.dom.ITypeBinding; 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.injection.InjectionPoint; import ru.naumen.gintonic.guice.injection.InjectionPointDao; import ru.naumen.gintonic.guice.statements.BindingDefinition; import ru.naumen.gintonic.utils.ITypeBindingUtils; import ru.naumen.gintonic.utils.SetUtils; /** * @author tmajunke */ public class QuickFixProviderMethodCreation extends AbstractGinTonicQuickFix { @Override public void addProposals(IInvocationContext context, List<IJavaCompletionProposal> proposals) throws CoreException { CompilationUnit astRoot = context.getASTRoot(); InjectionPointDao injectionPointDao = new InjectionPointDao(); InjectionPoint injectionPoint = injectionPointDao.getGuiceFieldDeclarationIfFieldDeclaration(context.getCoveringNode(), astRoot); if (injectionPoint != null) { ITypeBinding typeBindingWithoutProvider = ITypeBindingUtils.removeSurroundingProvider(injectionPoint.getTargetTypeBinding()); GuiceIndex guiceIndex = GuiceIndex.get(); IPackageBinding currentPackageBinding = astRoot.getPackage().resolveBinding(); String packageToLookForGuiceModules = currentPackageBinding.getName(); List<BindingDefinition> bindingStatements = guiceIndex.getBindingDefinitions( typeBindingWithoutProvider, injectionPoint.getGuiceAnnotation(), SetUtils.newHashSet(packageToLookForGuiceModules)); /* * We do not show the proposal if the package module already * contains a binding to this type. We ignore that bindings in * not-package-modules might exist. */ if (bindingStatements.isEmpty()) { List<GuiceModule> guiceModulesInPackage = guiceIndex.getGuiceModulesInAndBelowPackage(currentPackageBinding); for (GuiceModule guiceModule : guiceModulesInPackage) { ProposalProviderMethodCreation proposal = new ProposalProviderMethodCreation( guiceModule, typeBindingWithoutProvider, injectionPoint.getGuiceAnnotation(), injectionPoint.getVariableName()); proposals.add(proposal); } } } } }