package ru.naumen.gintonic.context.quickfix.modules;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.dom.ASTNode;
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.utils.ICompilationUnitUtils;
import ru.naumen.gintonic.utils.ITypeBindingUtils;
/**
* Enables the user to create a new guice module derived from a java class
* (let's call it the source class).
*
* <h5>How is the quick fix activated?</h5>
*
* The quick fix is triggered if
*
* <ul>
*
* <li>the covering node is on a class declaration and</li>
* <li>a guice module with the same name does not exist and</li>
* <li>the source class is not a guice module</li>
*
* </ul>
*
* <pre>
* <code>
* public class Person {
* </code>
* </pre>
*
* <h5>What name do you give the new guice module?</h5>
*
* We simply append 'Module' to the source class name:
*
* <pre>
* <code>
* Person => PersonModule
* X => XModule
* </code>
* </pre>
*
*
* <h5>Where is the guice module created?</h5>
*
* In the same package as the source class.
*
* @author tmajunke
*/
public class QuickFixCreateGuiceModule extends AbstractGinTonicQuickFix {
@Override
public void addProposals(IInvocationContext context,
List<IJavaCompletionProposal> proposals) throws CoreException {
ASTNode coveringNode = context.getCoveringNode();
ASTNode parentNode = coveringNode.getParent();
if (!(parentNode instanceof TypeDeclaration)) {
return;
}
TypeDeclaration typeDecl = (TypeDeclaration) parentNode;
ITypeBinding typeDeclBinding = typeDecl.resolveBinding();
/* Make sure the source class is not a guice module! */
boolean isGuiceModule = ITypeBindingUtils.isGuiceAbstractModuleType(typeDeclBinding);
if (isGuiceModule) {
return;
}
ICompilationUnit compilationUnit = context.getCompilationUnit();
/*
* Den Klassennamen der Compilation Unit ermitteln.
*
* Wir leiten den Namen des Guice Moduls aus der Compilation Unit ab
* (z.B Person => PersonModule)
*/
IType targetClassType = compilationUnit.findPrimaryType();
String targetClassName = targetClassType.getElementName();
String guiceModuleName = targetClassName + "Module";
/*
* Dann bentigen wir noch das package um das Module zu erzeugen.
*/
IPackageFragment packageFragment = (IPackageFragment) compilationUnit.getParent();
ICompilationUnit guiceModuleCompilationUnit = packageFragment.getCompilationUnit(guiceModuleName
+ ICompilationUnitUtils.JAVA_EXTENSION);
/*
* Falls wir kein existierendes Module mit gleichem Namen finden, dann
* zeigen wir einen QuickFix an, mit der eben dieses erzeugt werden
* kann.
*/
if (!guiceModuleCompilationUnit.exists()) {
ProposalCreateGuiceModule createGuiceModule = new ProposalCreateGuiceModule(
packageFragment,
guiceModuleName);
proposals.add(createGuiceModule);
}
}
}