[groovy] transformations api enchancements:
authorDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Tue, 8 Nov 2016 14:29:12 +0000 (17:29 +0300)
committerDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Tue, 8 Nov 2016 15:27:40 +0000 (18:27 +0300)
- add MemberBuilder.constructor()
- add TransformationContext.getClassType()
- store important stuff inside transformation context

plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/TransformationContext.java
plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/TransformationContextImpl.java
plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/TransformationUtil.kt
plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/dsl/MemberBuilder.kt

index ddaebc48144e15b4c15609854d1678a5d56ab660..10c068181009bc2b866f5d0243cf4c19fe9043d2 100644 (file)
@@ -28,12 +28,23 @@ import org.jetbrains.plugins.groovy.transformations.dsl.MemberBuilder;
 import java.util.Collection;
 import java.util.List;
 
-@SuppressWarnings("unused")
 public interface TransformationContext {
 
+  @NotNull
+  Project getProject();
+
+  @NotNull
+  PsiManager getManager();
+
+  @NotNull
+  JavaPsiFacade getPsiFacade();
+
   @NotNull
   GrTypeDefinition getCodeClass();
 
+  @NotNull
+  PsiClassType getClassType();
+
   @NotNull
   Collection<PsiMethod> getMethods();
 
@@ -54,21 +65,6 @@ public interface TransformationContext {
     return ContainerUtil.concat(getExtendsTypes(), getImplementsTypes());
   }
 
-  @NotNull
-  default Project getProject() {
-    return getCodeClass().getProject();
-  }
-
-  @NotNull
-  default JavaPsiFacade getPsiFacade() {
-    return JavaPsiFacade.getInstance(getProject());
-  }
-
-  @NotNull
-  default PsiManager getManager() {
-    return getCodeClass().getManager();
-  }
-
   @NotNull
   default GlobalSearchScope getResolveScope() {
     return getCodeClass().getResolveScope();
@@ -83,10 +79,6 @@ public interface TransformationContext {
   @Nullable
   PsiAnnotation getAnnotation(@NotNull String fqn);
 
-  default boolean hasAnnotation(@NotNull String fqn) {
-    return getAnnotation(fqn) != null;
-  }
-
   default boolean isInheritor(@NotNull String fqn) {
     PsiClass baseClass = getPsiFacade().findClass(fqn, getResolveScope());
     return baseClass != null && isInheritor(baseClass);
index 87b1bc329af50622ec357dca5a34d03ada9c3f08..35cc7e57802cd4e9a7a79c761d093d09240900ea 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.jetbrains.plugins.groovy.transformations;
 
+import com.intellij.openapi.project.Project;
 import com.intellij.psi.*;
 import com.intellij.psi.impl.light.LightMethodBuilder;
 import com.intellij.psi.impl.light.LightPsiClassBuilder;
@@ -42,7 +43,12 @@ import static org.jetbrains.plugins.groovy.lang.psi.util.GrClassImplUtil.expandR
 
 public class TransformationContextImpl implements TransformationContext {
 
+  private final @NotNull Project myProject;
+  private final @NotNull PsiManager myPsiManager;
+  private final @NotNull JavaPsiFacade myPsiFacade;
   private final @NotNull GrTypeDefinition myCodeClass;
+  private final @NotNull PsiClassType myClassType;
+
   private final LinkedList<PsiMethod> myMethods = ContainerUtil.newLinkedList();
   private final Collection<GrField> myFields = ContainerUtil.newArrayList();
   private final Collection<PsiClass> myInnerClasses = ContainerUtil.newArrayList();
@@ -60,7 +66,12 @@ public class TransformationContextImpl implements TransformationContext {
   });
 
   public TransformationContextImpl(@NotNull GrTypeDefinition codeClass) {
+    myProject = codeClass.getProject();
+    myPsiManager = codeClass.getManager();
+    myPsiFacade = JavaPsiFacade.getInstance(myProject);
     myCodeClass = codeClass;
+    myClassType = getPsiFacade().getElementFactory().createType(getCodeClass());
+
     ContainerUtil.addAll(myFields, codeClass.getCodeFields());
     ContainerUtil.addAll(myMethods, flatten(map(codeClass.getCodeMethods(), m -> expandReflectedMethods(m))));
     ContainerUtil.addAll(myInnerClasses, codeClass.getCodeInnerClasses());
@@ -68,12 +79,36 @@ public class TransformationContextImpl implements TransformationContext {
     ContainerUtil.addAll(myExtendsTypes, GrClassImplUtil.getReferenceListTypes(codeClass.getExtendsClause()));
   }
 
+  @NotNull
+  @Override
+  public Project getProject() {
+    return myProject;
+  }
+
+  @NotNull
+  @Override
+  public PsiManager getManager() {
+    return myPsiManager;
+  }
+
+  @NotNull
+  @Override
+  public JavaPsiFacade getPsiFacade() {
+    return myPsiFacade;
+  }
+
   @Override
   @NotNull
   public GrTypeDefinition getCodeClass() {
     return myCodeClass;
   }
 
+  @NotNull
+  @Override
+  public PsiClassType getClassType() {
+    return myClassType;
+  }
+
   @Override
   @NotNull
   public Collection<GrField> getFields() {
index 95e7d91e5bfbb92b4f838ddef17c59969a93c192..0ecd602165a03c3fe4155495850a42e816783064 100644 (file)
@@ -61,3 +61,5 @@ fun isUnderTransformation(clazz: PsiClass?): Boolean {
 }
 
 infix operator fun TransformationContext.plusAssign(method: PsiMethod) = addMethod(method)
+
+infix operator fun TransformationContext.plusAssign(field: GrField) = addField(field)
index bfca87476cca71abc4682c082beece2ee1c18a03..4108d7a8809c295b60f5184a23c8f21186e18291 100644 (file)
@@ -24,4 +24,7 @@ class MemberBuilder(val context: TransformationContext) {
     return GrLightMethodBuilder(context.manager, name).apply(builder)
   }
 
+  fun constructor(builder: GrLightMethodBuilder.() -> Unit): GrLightMethodBuilder {
+    return GrLightMethodBuilder(context.codeClass).apply(builder)
+  }
 }
\ No newline at end of file