diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/mirrors.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/mirrors.kt new file mode 100644 index 000000000000..720860eeaad2 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/mirrors.kt @@ -0,0 +1,13 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic + +import com.intellij.psi.PsiParameter +import com.intellij.psi.PsiType + +private open class PsiParameterMirror(original: PsiParameter) : PsiParameter by original + +fun PsiParameter.withType(newType: PsiType): PsiParameter { + return object : PsiParameterMirror(this) { + override fun getType(): PsiType = newType + } +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrTraitUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrTraitUtil.java index 129554bf2d0e..0d76c08df0d0 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrTraitUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrTraitUtil.java @@ -1,6 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.util; import com.intellij.codeInsight.AnnotationUtil; @@ -9,6 +7,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.compiled.ClsClassImpl; +import com.intellij.psi.impl.light.LightMethodBuilder; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.InheritanceUtil; @@ -22,7 +21,6 @@ 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.psi.impl.GrAnnotationUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightField; -import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder; import org.jetbrains.plugins.groovy.lang.resolve.GroovyTraitFieldsFileIndex; import org.jetbrains.plugins.groovy.lang.resolve.GroovyTraitFieldsFileIndex.TraitFieldDescriptor; import org.jetbrains.plugins.groovy.lang.resolve.GroovyTraitMethodsFileIndex; @@ -33,6 +31,7 @@ import java.util.Map; import static com.intellij.psi.PsiModifier.ABSTRACT; import static org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierFlags.*; +import static org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.MirrorsKt.withType; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.GROOVY_TRAIT; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.GROOVY_TRAIT_IMPLEMENTED; @@ -120,12 +119,12 @@ public class GrTraitUtil { } private static PsiMethod createTraitMethodFromCompiledHelperMethod(PsiMethod compiledMethod, ClsClassImpl trait) { - final GrLightMethodBuilder result = new GrLightMethodBuilder(trait.getManager(), compiledMethod.getName()); + final LightMethodBuilder result = new LightMethodBuilder(trait.getManager(), compiledMethod.getName()); result.setOriginInfo("via @Trait"); result.addModifier(PsiModifier.STATIC); for (PsiTypeParameter parameter : compiledMethod.getTypeParameters()) { - result.getTypeParameterList().addParameter(parameter); + result.addTypeParameter(parameter); } final PsiTypeVisitor corrector = createCorrector(compiledMethod, trait); @@ -134,18 +133,16 @@ public class GrTraitUtil { for (int i = 1; i < methodParameters.length; i++) { final PsiParameter originalParameter = methodParameters[i]; final PsiType correctedType = originalParameter.getType().accept(corrector); - final String name = originalParameter.getName(); - assert name != null : compiledMethod; - result.addParameter(name, correctedType, false); + result.addParameter(withType(originalParameter, correctedType)); } for (PsiClassType type : compiledMethod.getThrowsList().getReferencedTypes()) { final PsiType correctedType = type.accept(corrector); - result.getThrowsList().addReference(correctedType instanceof PsiClassType ? (PsiClassType)correctedType : type); + result.addException(correctedType instanceof PsiClassType ? (PsiClassType)correctedType : type); } final PsiType originalType = compiledMethod.getReturnType(); - result.setReturnType(originalType == null ? null : originalType.accept(corrector)); + result.setMethodReturnType(originalType == null ? null : originalType.accept(corrector)); final PsiClass traitSource = trait.getSourceMirrorClass(); final PsiMethod sourceMethod = traitSource == null ? null : traitSource.findMethodBySignature(result, false); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveCompiledTraitTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveCompiledTraitTest.groovy index 640458a63a82..2bdd24ef3568 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveCompiledTraitTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveCompiledTraitTest.groovy @@ -1,6 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.resolve import com.intellij.openapi.module.Module @@ -305,6 +303,28 @@ class CC implements somepackage.TT { ) } + void 'test static trait method with @DelegatesTo(type)'() { + configureTraitInheritor() + def method = resolveByText '''\ +def usage(ExternalConcrete ec) { + ec.delegatesTo { toUpperCase() } +} +''', PsiMethod + assert method.name == 'toUpperCase' + assert method.containingClass.qualifiedName == 'java.lang.String' + } + + void 'test static trait method with @ClosureParams(FromString)'() { + configureTraitInheritor() + def method = resolveByText '''\ +def usage(ExternalConcrete ec) { + ec.closureParams { it.toUpperCase() } +} +''', PsiMethod + assert method.name == 'toUpperCase' + assert method.containingClass.qualifiedName == 'java.lang.String' + } + private PsiClass configureTraitInheritor() { myFixture.addFileToProject "inheritors.groovy", '''\ class PojoInheritor extends somepackage.Pojo {} diff --git a/plugins/groovy/testdata/lib/some-library-src.jar b/plugins/groovy/testdata/lib/some-library-src.jar index 8fb098e65a7f..a6e97e7c2053 100644 Binary files a/plugins/groovy/testdata/lib/some-library-src.jar and b/plugins/groovy/testdata/lib/some-library-src.jar differ diff --git a/plugins/groovy/testdata/lib/some-library.jar b/plugins/groovy/testdata/lib/some-library.jar index 303c7470512b..56d0901efa35 100644 Binary files a/plugins/groovy/testdata/lib/some-library.jar and b/plugins/groovy/testdata/lib/some-library.jar differ