diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/bindable/BindableTransformContributor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/bindable/BindableTransformContributor.java index db5f59be50af..3be140816762 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/bindable/BindableTransformContributor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/bindable/BindableTransformContributor.java @@ -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); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyLightProjectDescriptor.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyLightProjectDescriptor.groovy index c538cef6a9ff..1907a08eae1b 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyLightProjectDescriptor.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyLightProjectDescriptor.groovy @@ -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) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/SetupRule.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/SetupRule.groovy index 3a57b30a4f6d..bed76348d2f3 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/SetupRule.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/SetupRule.groovy @@ -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 diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/transformations/GrBindableSupportTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/transformations/GrBindableSupportTest.groovy index f0289c8ed36f..6aa8e9060fed 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/transformations/GrBindableSupportTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/transformations/GrBindableSupportTest.groovy @@ -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) } }