From a419878b2ad3452a2aa37a61d704346cc7c48321 Mon Sep 17 00:00:00 2001 From: "Victor J. Reventos" Date: Sat, 30 Jan 2016 22:39:15 -0600 Subject: [PATCH 1/5] Show the temporary coupling. --- .../intellij/autovalue/actions/AutoValueFactory.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java index c6e0ec6..a68b34b 100644 --- a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java +++ b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java @@ -56,7 +56,7 @@ public AutoValueFactory(AnActionEvent e) { throw new RuntimeException("No class selected"); } - this.targetClass = loadTargetClass(editor); + this.targetClass = loadTargetClass(editor, javaFile); this.project = e.getProject(); factory = JavaPsiFacade.getElementFactory(project); @@ -180,9 +180,9 @@ public boolean containsAutoValueAnnotation() { return getTargetClass().getModifierList().findAnnotation(AUTOVALUE_CLASS_NAME) != 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); } From 70b72dfa553a975b5d9c9359168b69ffc79d6a1a Mon Sep 17 00:00:00 2001 From: "Victor J. Reventos" Date: Sat, 30 Jan 2016 22:49:18 -0600 Subject: [PATCH 2/5] Removed unused method. --- .../intellij/autovalue/actions/AutoValueFactory.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java index a68b34b..7e0fb4c 100644 --- a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java +++ b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java @@ -163,15 +163,6 @@ 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; } From 4ade49a83da5d21b6ef20e7925ac414f7ba561d1 Mon Sep 17 00:00:00 2001 From: "Victor J. Reventos" Date: Sat, 30 Jan 2016 22:56:16 -0600 Subject: [PATCH 3/5] Supporting the three AutoValue libraries. --- .../autovalue/actions/AutoValueFactory.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java index 7e0fb4c..42be92e 100644 --- a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java +++ b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java @@ -17,8 +17,9 @@ 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 java.util.ArrayList; import java.util.List; @@ -26,8 +27,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; @@ -168,7 +173,13 @@ public boolean containsBuilderClass() { } public boolean containsAutoValueAnnotation() { - return getTargetClass().getModifierList().findAnnotation(AUTOVALUE_CLASS_NAME) != null; + for (String autoValueAnnotationName : SUPPORTED_AUTOVALUE_LIBRARIES) { + if (getTargetClass().getModifierList().findAnnotation(autoValueAnnotationName) != null) { + return true; + } + } + + return false; } private PsiClass loadTargetClass(Editor editor, PsiJavaFile javaFile) { From 5c69d2151bcde794a328381cb527058ae74dd43c Mon Sep 17 00:00:00 2001 From: "Victor J. Reventos" Date: Sun, 31 Jan 2016 00:05:51 -0600 Subject: [PATCH 4/5] Generating the correct names based on the library being used. For example for AutoParcel the builder should be annotated with @AutoParcel.Builder and the builder method should return "new AutoParcel_ClassName.Builder();" --- .../AddMissingMethodsToBuilderAction.java | 11 +----- .../autovalue/actions/AutoValueFactory.java | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 15 deletions(-) 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 42be92e..50c0faf 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; @@ -21,6 +22,8 @@ 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; @@ -41,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) { @@ -62,9 +65,19 @@ public AutoValueFactory(AnActionEvent e) { } 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() { @@ -98,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; @@ -152,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; @@ -182,6 +197,18 @@ public boolean containsAutoValueAnnotation() { return false; } + @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, PsiJavaFile javaFile) { int caretOffset = editor.getCaretModel().getOffset(); PsiElement element = javaFile.findElementAt(caretOffset); From 0ad1ae1b30bbdbda944b1e521dbbd8f0fcd29931 Mon Sep 17 00:00:00 2001 From: "Victor J. Reventos" Date: Sun, 31 Jan 2016 00:12:03 -0600 Subject: [PATCH 5/5] Removed containsAutoValueAnnotation(), since the annotation is being searched and validated on the constructor. --- .../intellij/autovalue/actions/AutoValueFactory.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java index 50c0faf..bf6a4d3 100644 --- a/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java +++ b/src/com/afcastano/intellij/autovalue/actions/AutoValueFactory.java @@ -187,16 +187,6 @@ public boolean containsBuilderClass() { return findExistingBuilderClass(getTargetClass()) != null; } - public boolean containsAutoValueAnnotation() { - for (String autoValueAnnotationName : SUPPORTED_AUTOVALUE_LIBRARIES) { - if (getTargetClass().getModifierList().findAnnotation(autoValueAnnotationName) != null) { - return true; - } - } - - return false; - } - @Nullable private PsiAnnotation findAutoValueAnnotationClass(PsiClass targetClass) { for (String autoValueAnnotationName : SUPPORTED_AUTOVALUE_LIBRARIES) {