diff --git a/src/com/afcastano/intellij/autovalue/actions/AddMissingMethodsToBuilderAction.java b/src/com/afcastano/intellij/autovalue/actions/AddMissingMethodsToBuilderAction.java index 7758dd4..6f6a875 100644 --- a/src/com/afcastano/intellij/autovalue/actions/AddMissingMethodsToBuilderAction.java +++ b/src/com/afcastano/intellij/autovalue/actions/AddMissingMethodsToBuilderAction.java @@ -43,16 +43,7 @@ public void update(AnActionEvent e) { return; } - PsiClass targetClass = factory.getTargetClass(); - - if(targetClass == null) { - e.getPresentation().setEnabled(false); - return; - } - - boolean isAnnotated = factory.containsAutoValueAnnotation(); - e.getPresentation().setEnabled(isAnnotated); - + e.getPresentation().setEnabled(true); } private void processClass(final AutoValueFactory factory) { diff --git a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java index c6e0ec6..bf6a4d3 100644 --- a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java +++ b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java @@ -5,6 +5,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; @@ -17,8 +18,11 @@ import com.intellij.psi.PsiParameter; import com.intellij.psi.PsiStatement; import com.intellij.psi.PsiType; -import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.ImmutableList; + +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -26,8 +30,12 @@ public class AutoValueFactory { private static Logger LOG = Logger.getInstance(AutoValueFactory.class); - private static final String AUTOVALUE_CLASS_NAME = "com.google.auto.value.AutoValue"; - + private static final ImmutableList SUPPORTED_AUTOVALUE_LIBRARIES = + ContainerUtil.immutableList( + "com.google.auto.value.AutoValue", + "auto.parcel.AutoParcel", + "auto.parcelgson.AutoParcelGson" + ); private PsiType builderType; private PsiClass builderClass; @@ -36,7 +44,7 @@ public class AutoValueFactory { private PsiElementFactory factory; private PsiJavaFile javaFile; private Project project; - private PsiClass autoValueAnnotationClass; + private PsiAnnotation autoValueAnnotation; private PsiMethod buildMehtod; public AutoValueFactory(AnActionEvent e) { @@ -56,10 +64,20 @@ public AutoValueFactory(AnActionEvent e) { throw new RuntimeException("No class selected"); } - this.targetClass = loadTargetClass(editor); + this.targetClass = loadTargetClass(editor, javaFile); + + if (targetClass == null) { + throw new RuntimeException("Target class not found"); + } + + this.autoValueAnnotation = findAutoValueAnnotationClass(targetClass); + + if (autoValueAnnotation == null) { + throw new RuntimeException("No auto value annotation detected"); + } + this.project = e.getProject(); factory = JavaPsiFacade.getElementFactory(project); - } public PsiClass getTargetClass() { @@ -93,7 +111,7 @@ public PsiClass getBuilderClass() { modifierList.setModifierProperty("public", true); modifierList.setModifierProperty("static", true); modifierList.setModifierProperty("abstract", true); - modifierList.addAnnotation("AutoValue.Builder"); + modifierList.addAnnotation(autoValueAnnotation.getQualifiedName() + ".Builder"); this.builderClass = newBuilderClass; @@ -147,8 +165,10 @@ public PsiMethod newBuilderFactoryMethod() { generatedName = generatedName + getTargetClass().getName(); - PsiStatement returnStatement = factory - .createStatementFromText("return new AutoValue_" + generatedName + ".Builder();", getTargetClass()); + String autoValueAnnotationName = StringUtil.getShortName(autoValueAnnotation.getQualifiedName()); + String returnStatementText = "return new " + autoValueAnnotationName + "_" + generatedName + ".Builder();"; + + PsiStatement returnStatement = factory.createStatementFromText(returnStatementText, getTargetClass()); builderMethod.getBody().add(returnStatement); return builderMethod; @@ -163,26 +183,25 @@ public PsiType getBuilderType() { return builderType; } - public PsiClass getAutoValueAnnotationClass() { - if (autoValueAnnotationClass == null) { - autoValueAnnotationClass = JavaPsiFacade.getInstance(getProject()) - .findClass(AUTOVALUE_CLASS_NAME, GlobalSearchScope.allScope(project)); - } - - return autoValueAnnotationClass; - } - public boolean containsBuilderClass() { return findExistingBuilderClass(getTargetClass()) != null; } - public boolean containsAutoValueAnnotation() { - return getTargetClass().getModifierList().findAnnotation(AUTOVALUE_CLASS_NAME) != null; + @Nullable + private PsiAnnotation findAutoValueAnnotationClass(PsiClass targetClass) { + for (String autoValueAnnotationName : SUPPORTED_AUTOVALUE_LIBRARIES) { + PsiAnnotation autoValueAnnotation = getTargetClass().getModifierList().findAnnotation(autoValueAnnotationName); + if (autoValueAnnotation != null) { + return autoValueAnnotation; + } + } + + return null; } - private PsiClass loadTargetClass(Editor editor) { + private PsiClass loadTargetClass(Editor editor, PsiJavaFile javaFile) { int caretOffset = editor.getCaretModel().getOffset(); - PsiElement element = this.javaFile.findElementAt(caretOffset); + PsiElement element = javaFile.findElementAt(caretOffset); return PsiTreeUtil.getParentOfType(element, PsiClass.class); }