[groovy] delegate @Bindable support methods documentation to methods of PropertyChangeSupport

This commit is contained in:
Daniil Ovchinnikov
2016-05-20 19:19:40 +03:00
parent b965e1c9d7
commit f4c3f72c97
4 changed files with 23 additions and 2 deletions
@@ -19,11 +19,13 @@ import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightMethodBuilder;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.GroovyLanguage;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import org.jetbrains.plugins.groovy.transformations.AstTransformationSupport;
import org.jetbrains.plugins.groovy.transformations.TransformationContext;
@@ -33,6 +35,7 @@ public class BindableTransformContributor implements AstTransformationSupport {
private static final String BINDABLE_FQN = "groovy.beans.Bindable";
private static final String PCL_FQN = "java.beans.PropertyChangeListener";
private static final String PCS_FQN = "java.beans.PropertyChangeSupport";
public static final String ORIGIN_INFO = "via @Bindable";
private static boolean isApplicable(@NotNull GrTypeDefinition clazz) {
@@ -56,7 +59,8 @@ public class BindableTransformContributor implements AstTransformationSupport {
final PsiManager manager = clazz.getManager();
final GlobalSearchScope scope = clazz.getResolveScope();
final PsiType pclType = JavaPsiFacade.getInstance(clazz.getProject()).getElementFactory().createTypeByFQClassName(PCL_FQN, scope);
final JavaPsiFacade facade = JavaPsiFacade.getInstance(clazz.getProject());
final PsiType pclType = facade.getElementFactory().createTypeByFQClassName(PCL_FQN, scope);
final PsiArrayType pclArrayType = new PsiArrayType(pclType);
final PsiType stringType = PsiType.getJavaLangString(manager, scope);
final PsiType objectType = PsiType.getJavaLangObject(manager, scope);
@@ -108,9 +112,14 @@ public class BindableTransformContributor implements AstTransformationSupport {
.addParameter("name", stringType)
);
PsiClass docDelegate = facade.findClass(PCS_FQN, context.getCodeClass().getResolveScope());
for (LightMethodBuilder method : methods) {
method.addModifier(PsiModifier.PUBLIC);
method.setOriginInfo(ORIGIN_INFO);
if (docDelegate == null) continue;
PsiMethod[] originalMethods = docDelegate.findMethodsBySignature(method, false);
method.putUserData(ResolveUtil.DOCUMENTATION_DELEGATE, ArrayUtil.getFirstElement(originalMethods));
}
context.addMethods(methods);
@@ -16,12 +16,15 @@
package org.jetbrains.plugins.groovy
import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.JavaSdk
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ContentEntry
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.vfs.JarFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor
import org.jetbrains.annotations.NotNull
@@ -36,7 +39,12 @@ class GroovyLightProjectDescriptor extends DefaultLightProjectDescriptor {
public static final GroovyLightProjectDescriptor GROOVY_2_2 = new GroovyLightProjectDescriptor(mockGroovy2_2LibraryName)
public static final GroovyLightProjectDescriptor GROOVY_2_3 = new GroovyLightProjectDescriptor(mockGroovy2_3LibraryName)
public static final GroovyLightProjectDescriptor GROOVY_LATEST = new GroovyLightProjectDescriptor(bundledGroovyJar as String)
public static final GroovyLightProjectDescriptor GROOVY_LATEST_REAL_JDK = new GroovyLightProjectDescriptor(bundledGroovyJar as String) {
@Override
Sdk getSdk() {
return JavaSdk.getInstance().createJdk("TEST_JDK", IdeaTestUtil.requireRealJdkHome(), false)
}
}
private final String myLibPath
protected GroovyLightProjectDescriptor(String libPath) {
@@ -16,6 +16,7 @@
package org.jetbrains.plugins.groovy
import com.intellij.testFramework.EdtTestUtil
import com.intellij.testFramework.LightProjectDescriptor
import groovy.transform.CompileStatic
import org.junit.rules.TestRule
import org.junit.runner.Description
@@ -26,6 +27,7 @@ class SetupRule implements TestRule {
final LightGroovyTestCase testCase = new LightGroovyTestCase() {
String basePath = ""
LightProjectDescriptor projectDescriptor = GroovyLightProjectDescriptor.GROOVY_LATEST_REAL_JDK
}
@Override
@@ -25,6 +25,7 @@ import groovy.transform.CompileStatic
import org.jetbrains.plugins.groovy.SetupRule
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil
import org.jetbrains.plugins.groovy.lang.resolve.ast.bindable.BindableTransformContributor
import org.junit.Before
import org.junit.Rule
@@ -86,6 +87,7 @@ class GrBindableSupportTest {
assert method
assert method.containingClass == clazz
assert method.originInfo == BindableTransformContributor.ORIGIN_INFO
assert method.getUserData(ResolveUtil.DOCUMENTATION_DELEGATE)
}
}