package ru.naumen.gintonic.context.quickfix.providers; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.ParameterizedType; import org.eclipse.jdt.core.dom.Type; 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.injection.InjectionPoint; import ru.naumen.gintonic.guice.injection.InjectionPointDao; import ru.naumen.gintonic.utils.ITypeBindingUtils; /** * @author tmajunke */ public class QuickFixProviderConversion extends AbstractGinTonicQuickFix { @Override public void addProposals(IInvocationContext context, List<IJavaCompletionProposal> proposals) throws CoreException { InjectionPointDao injectionPointDao = new InjectionPointDao(); InjectionPoint guiceFieldDeclaration = injectionPointDao.getGuiceFieldDeclarationIfFieldDeclaration(context.getCoveringNode(), context.getASTRoot()); if (guiceFieldDeclaration == null) { return; } ITypeBinding typeBinding = guiceFieldDeclaration.getTargetTypeBinding(); /* Check if the declaration is already a provider declaration. */ boolean isProviderType = ITypeBindingUtils.isGuiceProviderType(typeBinding); FieldDeclaration fieldDeclaration = guiceFieldDeclaration.getFieldDeclaration(); if (isProviderType) { /** * * <pre> * <code>Provider<Cat> * providerType = Provider<Cat> * providedType = Cat * </code> * </pre> */ ParameterizedType providerType = (ParameterizedType) fieldDeclaration.getType(); @SuppressWarnings("unchecked") List<Type> typeArguments = providerType.typeArguments(); Type providedType = typeArguments.get(0); ProposalRemoveProvider proposalRemove = new ProposalRemoveProvider( context.getCompilationUnit(), context.getASTRoot(), fieldDeclaration, providerType, providedType); proposals.add(proposalRemove); }else{ /* * Now we know that its a field declaration annotated with @Inject. We * also checked that it's not a Provider declaration. So we can provide * a proposal for it. */ ProposalConvertToProvider proposalConvertToProvider = new ProposalConvertToProvider( context.getCompilationUnit(), context.getASTRoot(), fieldDeclaration); proposals.add(proposalConvertToProvider); } } }