From 1422e30cd07fb6922b4e0ce0e0e07ce8f2f908db Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Wed, 7 Nov 2018 17:48:25 +0300 Subject: [PATCH] [groovy] pass arguments into AccessorProcessor instead of types --- .../expressions/GrReferenceExpressionReference.kt | 4 +--- .../groovy/lang/psi/util/GroovyPropertyUtils.java | 3 ++- .../groovy/lang/resolve/AccessorResolveResult.kt | 4 +++- .../plugins/groovy/lang/resolve/ResolveUtil.java | 2 +- .../groovy/lang/resolve/api/JustTypeArgument.kt | 6 ++++++ .../lang/resolve/processors/AccessorProcessor.kt | 15 ++++++++++++--- .../resolve/processors/GroovyLValueProcessor.kt | 6 +++--- .../resolve/processors/GroovyRValueProcessor.kt | 5 ++--- .../processors/GroovyResolverProcessor.java | 4 ++-- 9 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/JustTypeArgument.kt diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionReference.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionReference.kt index 8c705224b98e..fe00279495b3 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionReference.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionReference.kt @@ -63,9 +63,7 @@ class GrRValueExpressionReference(ref: GrReferenceExpressionImpl) : GrReferenceE class GrLValueExpressionReference(ref: GrReferenceExpressionImpl, private val argument: Argument?) : GrReferenceExpressionReference(ref) { override fun buildProcessor(name: String, place: PsiElement, kinds: Set): GrResolverProcessor<*> { - return GroovyLValueProcessor(name, place, kinds) { - if (argument == null) null else arrayOf(argument.type) - } + return GroovyLValueProcessor(name, place, kinds, if (argument == null) null else listOf(argument)) } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java index b18dded76003..f786729ec212 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java @@ -28,6 +28,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAc import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; +import org.jetbrains.plugins.groovy.lang.resolve.api.Argument; import org.jetbrains.plugins.groovy.lang.resolve.processors.AccessorProcessor; import java.beans.Introspector; @@ -80,7 +81,7 @@ public class GroovyPropertyUtils { final GrExpression fromText = GroovyPsiElementFactory.getInstance(context.getProject()).createExpressionFromText("this", context); return findPropertySetter(fromText.getType(), propertyName, context); } - final AccessorProcessor processor = new AccessorProcessor(propertyName, PropertyKind.SETTER, () -> null, context); + final AccessorProcessor processor = new AccessorProcessor(propertyName, PropertyKind.SETTER, (List)null, context); ResolveUtil.processAllDeclarations(type, processor, ResolveState.initial(), context); return PsiImplUtil.extractUniqueElement(processor.getResultsArray()); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/AccessorResolveResult.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/AccessorResolveResult.kt index a980e35ebe33..83250f5b6698 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/AccessorResolveResult.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/AccessorResolveResult.kt @@ -3,6 +3,7 @@ package org.jetbrains.plugins.groovy.lang.resolve import com.intellij.psi.* import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.isApplicable +import org.jetbrains.plugins.groovy.lang.resolve.api.Argument import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint import org.jetbrains.plugins.groovy.lang.resolve.processors.SubstitutorComputer @@ -10,7 +11,7 @@ class AccessorResolveResult( element: PsiMethod, place: PsiElement, state: ResolveState, - argumentTypes: Array? + arguments: List? ) : BaseGroovyResolveResult(element, place, state) { private val receiverType = state[ClassHint.THIS_TYPE] @@ -23,6 +24,7 @@ class AccessorResolveResult( override fun getSubstitutor(): PsiSubstitutor = fullSubstitutor private val applicability by lazy { + val argumentTypes = arguments?.map { it.type }?.toTypedArray() isApplicable(argumentTypes, element, substitutor, place, true) } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java index f586eb35ad28..79b01d841729 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java @@ -719,7 +719,7 @@ public class ResolveUtil { //search for getters for (PropertyKind kind : Arrays.asList(PropertyKind.GETTER, PropertyKind.BOOLEAN_GETTER)) { - AccessorProcessor propertyProcessor = new AccessorProcessor(methodName, kind, () -> PsiType.EMPTY_ARRAY, place); + AccessorProcessor propertyProcessor = new AccessorProcessor(methodName, kind, Collections.emptyList(), place); processAllDeclarations(thisType, propertyProcessor, state, place); final List candidates = propertyProcessor.getResults(); //can be only one candidate final List applicable = new ArrayList<>(); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/JustTypeArgument.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/JustTypeArgument.kt new file mode 100644 index 000000000000..be14bbcdc70f --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/JustTypeArgument.kt @@ -0,0 +1,6 @@ +// 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.api + +import com.intellij.psi.PsiType + +class JustTypeArgument(override val type: PsiType?) : Argument diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/AccessorProcessor.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/AccessorProcessor.kt index e5fcd2586eab..ad01f31a4611 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/AccessorProcessor.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/AccessorProcessor.kt @@ -13,17 +13,26 @@ import org.jetbrains.plugins.groovy.lang.psi.util.checkKind import org.jetbrains.plugins.groovy.lang.psi.util.getAccessorName import org.jetbrains.plugins.groovy.lang.resolve.AccessorResolveResult import org.jetbrains.plugins.groovy.lang.resolve.GrResolverProcessor +import org.jetbrains.plugins.groovy.lang.resolve.api.Argument +import org.jetbrains.plugins.groovy.lang.resolve.api.JustTypeArgument import org.jetbrains.plugins.groovy.lang.resolve.imports.importedNameKey class AccessorProcessor( propertyName: String, private val propertyKind: PropertyKind, - argumentTypes: () -> Array?, + private val arguments: List?, private val place: PsiElement ) : ProcessorWithCommonHints(), GrResolverProcessor { + @Deprecated("don't use this constructor") + constructor( + propertyName: String, + propertyKind: PropertyKind, + arguments: () -> Array?, + place: PsiElement + ) : this(propertyName, propertyKind, arguments()?.map { JustTypeArgument(it) }, place) + private val accessorName = propertyKind.getAccessorName(propertyName) - private val argumentTypes by lazy(LazyThreadSafetyMode.NONE, argumentTypes) init { nameHint(accessorName) @@ -41,7 +50,7 @@ class AccessorProcessor( element = element, place = place, state = state, - argumentTypes = argumentTypes + arguments = arguments ) return true diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyLValueProcessor.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyLValueProcessor.kt index af0a181382ff..fd18b2ddc92f 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyLValueProcessor.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyLValueProcessor.kt @@ -3,19 +3,19 @@ package org.jetbrains.plugins.groovy.lang.resolve.processors import com.intellij.lang.java.beans.PropertyKind import com.intellij.psi.PsiElement -import com.intellij.psi.PsiType import org.jetbrains.plugins.groovy.lang.psi.util.isPropertyName import org.jetbrains.plugins.groovy.lang.resolve.GrResolverProcessor +import org.jetbrains.plugins.groovy.lang.resolve.api.Argument class GroovyLValueProcessor( name: String, place: PsiElement, kinds: Set, - argumentTypes: () -> Array? + arguments: List? ) : AccessorAwareResolverProcessor(name, place, kinds) { override val accessorProcessors: Collection> = if (name.isPropertyName()) { - listOf(AccessorProcessor(name, PropertyKind.SETTER, argumentTypes, place)) + listOf(AccessorProcessor(name, PropertyKind.SETTER, arguments, place)) } else { emptyList() diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyRValueProcessor.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyRValueProcessor.kt index 2988f2b7441f..be9f716ff26b 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyRValueProcessor.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyRValueProcessor.kt @@ -3,7 +3,6 @@ package org.jetbrains.plugins.groovy.lang.resolve.processors import com.intellij.lang.java.beans.PropertyKind import com.intellij.psi.PsiElement -import com.intellij.psi.PsiType import org.jetbrains.plugins.groovy.lang.psi.util.isPropertyName import org.jetbrains.plugins.groovy.lang.resolve.GrResolverProcessor @@ -15,8 +14,8 @@ class GroovyRValueProcessor( override val accessorProcessors: Collection> = if (name.isPropertyName()) listOf( - AccessorProcessor(name, PropertyKind.GETTER, { PsiType.EMPTY_ARRAY }, place), - AccessorProcessor(name, PropertyKind.BOOLEAN_GETTER, { PsiType.EMPTY_ARRAY }, place) + AccessorProcessor(name, PropertyKind.GETTER, emptyList(), place), + AccessorProcessor(name, PropertyKind.BOOLEAN_GETTER, emptyList(), place) ) else { emptyList() diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java index 20a70376b96c..ebd6e5972aef 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/processors/GroovyResolverProcessor.java @@ -84,8 +84,8 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem ); } return ContainerUtil.newArrayList( - new AccessorProcessor(myName, PropertyKind.GETTER, () -> PsiType.EMPTY_ARRAY, myRef), - new AccessorProcessor(myName, PropertyKind.BOOLEAN_GETTER, () -> PsiType.EMPTY_ARRAY, myRef) + new AccessorProcessor(myName, PropertyKind.GETTER, Collections.emptyList(), myRef), + new AccessorProcessor(myName, PropertyKind.BOOLEAN_GETTER, Collections.emptyList(), myRef) ); }