package ru.naumen.gintonic.context.quickfix.modules;
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.InstallModuleStatement;
import ru.naumen.gintonic.utils.ASTNodeUtils;
import ru.naumen.gintonic.utils.StringUtils;
/**
* Enables the user to install the selected guice module (the source module) in
* another guice module (the target module).
*
* <h5>How is the quick fix activated?</h5>
*
* The quick fix is triggered if the covering node implements
* {@link StringUtils#GUICE_MODULE}
*
* <h5>How do you discover the target module?</h5>
*
* We collect all modules in the package of the source module and in the parent
* package. A proposal ("Install SourceModule in TargetModule") is shown for
* every discovered target module.
*
* @author tmajunke
*/
public class QuickFixInstallModule 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 guiceModuleSource = ASTNodeUtils.getTypeBindingIfGuiceModuleCovered(coveringNode);
if (guiceModuleSource == null) {
return;
}
GuiceIndex guiceIndex = GuiceIndex.get();
IPackageBinding currentPackageBinding = guiceModuleSource.getPackage();
List<GuiceModule> guiceModules = guiceIndex.getGuiceModulesInAndBelowPackage(
currentPackageBinding,
guiceModuleSource.getQualifiedName(),
2);
if (guiceModules.isEmpty()) {
return;
}
/**
* Create a proposal for each target module.
*/
for (GuiceModule guiceModuleTarget : guiceModules) {
/* Check if the module is already installed */
List<InstallModuleStatement> installedModules = guiceModuleTarget.getInstalledModules();
if (installedModules != null) {
String qualifiedName = guiceModuleSource.getQualifiedName();
boolean alreadyInstalled = false;
for (InstallModuleStatement installModuleStatement : installedModules) {
String moduleName = installModuleStatement.getModuleNameFullyQualified();
if (moduleName.equals(qualifiedName)) {
alreadyInstalled = true;
}
}
if (!alreadyInstalled) {
addInstallModuleProposal(
proposals,
guiceModuleSource,
guiceModuleTarget);
}
} else {
addInstallModuleProposal(
proposals,
guiceModuleSource,
guiceModuleTarget);
}
}
}
private void addInstallModuleProposal(
List<IJavaCompletionProposal> proposals,
ITypeBinding guiceModuleSource, GuiceModule guiceModuleTarget) {
ProposalInstallModule proposalInstallModule = new ProposalInstallModule(
guiceModuleSource,
guiceModuleTarget);
proposals.add(proposalInstallModule);
}
}