From 3effccaf3a1d733c2a4ac7e5e5d6af9b1a4f4ff0 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Wed, 7 Nov 2018 19:41:41 +0300 Subject: [PATCH] [groovy] use Argument instead of PsiType in call references --- .../expressions/path/GrIndexPropertyImpl.java | 11 +++-- .../groovy/lang/psi/util/indexPropertyUtil.kt | 4 ++ .../lang/resolve/api/LazyTypeArgument.kt | 9 ++++ .../plugins/groovy/lang/resolve/api/api.kt | 4 +- .../resolve/impl/GrImplicitCallReference.kt | 3 +- .../groovy/lang/resolve/impl/arguments.kt | 48 +++++++++++++++++++ .../lang/resolve/impl/callReferenceImpl.kt | 6 +-- .../references/GrIndexPropertyReference.kt | 15 ++---- .../resolve/references/GrOperatorReference.kt | 3 +- .../resolve/references/GrSafeCastReference.kt | 3 +- 10 files changed, 82 insertions(+), 24 deletions(-) create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/LazyTypeArgument.kt create mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/arguments.kt diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java index 52e1d365fbb0..1db879c8b4ea 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrIndexPropertyImpl.java @@ -17,6 +17,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpres import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrIndexProperty; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.GrExpressionImpl; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyIndexPropertyUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.RValue; import org.jetbrains.plugins.groovy.lang.resolve.references.GrGetAtReference; import org.jetbrains.plugins.groovy.lang.resolve.references.GrIndexPropertyReference; import org.jetbrains.plugins.groovy.lang.resolve.references.GrPutAtReference; @@ -24,7 +25,7 @@ import org.jetbrains.plugins.groovy.lang.resolve.references.GrPutAtReference; import static org.jetbrains.plugins.groovy.lang.psi.GroovyElementTypes.T_Q; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyIndexPropertyUtil.isClassLiteral; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyIndexPropertyUtil.isSimpleArrayAccess; -import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyLValueUtil.isLValue; +import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyLValueUtil.getRValue; import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyLValueUtil.isRValue; import static org.jetbrains.plugins.groovy.lang.resolve.ReferencesKt.referenceArray; @@ -37,9 +38,11 @@ public class GrIndexPropertyImpl extends GrExpressionImpl implements GrIndexProp () -> isRValue(this) && isIndexAccess() ? new GrGetAtReference(this) : null ); - private final NullableLazyValue myLValueReference = AtomicNullableLazyValue.createValue( - () -> isLValue(this) && isIndexAccess() ? new GrPutAtReference(this) : null - ); + private final NullableLazyValue myLValueReference = AtomicNullableLazyValue.createValue(() -> { + if (!isIndexAccess()) return null; + RValue rValue = getRValue(this); + return rValue == null?null : new GrPutAtReference(this, rValue.getArgument()); + }); private final NotNullLazyValue myReferences = AtomicNotNullLazyValue.createValue( () -> referenceArray(getRValueReference(), getLValueReference()) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/indexPropertyUtil.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/indexPropertyUtil.kt index 47913a478be4..a75c657546c5 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/indexPropertyUtil.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/indexPropertyUtil.kt @@ -18,6 +18,8 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.GrImmediateTupleType import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil.getClassReferenceFromExpression +import org.jetbrains.plugins.groovy.lang.resolve.api.Argument +import org.jetbrains.plugins.groovy.lang.resolve.api.LazyTypeArgument fun GrIndexProperty.isSimpleArrayAccess(): Boolean { return getSimpleArrayAccessType() != null @@ -77,6 +79,8 @@ fun GrIndexProperty.getArgumentListType(): PsiType? { return GrImmediateTupleType(types, JavaPsiFacade.getInstance(project), resolveScope) } +fun GrIndexProperty.getArgumentListArgument(): Argument = LazyTypeArgument { getArgumentListType() } + fun GrIndexProperty.getArgumentTypes(rhs: Boolean): Array? { val argumentListType = getArgumentListType() ?: return null if (rhs) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/LazyTypeArgument.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/LazyTypeArgument.kt new file mode 100644 index 000000000000..6a43adf29445 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/LazyTypeArgument.kt @@ -0,0 +1,9 @@ +// 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 LazyTypeArgument(typeComputable: () -> PsiType?) : Argument { + + override val type: PsiType? by lazy(typeComputable) +} \ No newline at end of file diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/api.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/api.kt index 63ff4d4df22c..1b930e66b1c8 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/api.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/api/api.kt @@ -1,6 +1,4 @@ // 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 - -typealias Arguments = List +typealias Arguments = List diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GrImplicitCallReference.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GrImplicitCallReference.kt index 916e71882fa3..4a7562b93a2d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GrImplicitCallReference.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/GrImplicitCallReference.kt @@ -4,7 +4,6 @@ package org.jetbrains.plugins.groovy.lang.resolve.impl import com.intellij.psi.PsiType import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression -import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil.getArgumentTypes import org.jetbrains.plugins.groovy.lang.resolve.api.Arguments import org.jetbrains.plugins.groovy.lang.resolve.api.GroovyMethodCallReferenceBase @@ -22,5 +21,5 @@ class GrImplicitCallReference(element: GrMethodCall) : GroovyMethodCallReference override val methodName: String get() = "call" - override val arguments: Arguments? get() = getArgumentTypes(element.argumentList)?.toList() + override val arguments: Arguments? get() = element.getArguments() } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/arguments.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/arguments.kt new file mode 100644 index 000000000000..59e15fc38494 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/arguments.kt @@ -0,0 +1,48 @@ +// 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.impl + +import com.intellij.psi.PsiElement +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrSpreadArgument +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall +import org.jetbrains.plugins.groovy.lang.psi.impl.GrMapType +import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType +import org.jetbrains.plugins.groovy.lang.resolve.api.* +import java.util.* + +fun GrMethodCall.getArguments(): Arguments? { + val argumentList = argumentList + return getArguments(argumentList.namedArguments, argumentList.expressionArguments, closureArguments, this) +} + +private fun getArguments(namedArguments: Array, + expressionArguments: Array, + closureArguments: Array, + context: PsiElement): Arguments? { + val result = ArrayList() + if (namedArguments.isNotEmpty()) { + result += LazyTypeArgument { + GrMapType.createFromNamedArgs(context, namedArguments) + } + } + + for (expression in expressionArguments) { + if (expression is GrSpreadArgument) { + val type = expression.argument.type as? GrTupleType ?: return null + type.componentTypes.mapTo(result) { + JustTypeArgument(it) + } + } + else { + result += ExpressionArgument(expression) + } + } + + closureArguments.mapTo(result) { + ExpressionArgument(it) + } + + return result +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt index 0865646395d4..d5601792aba1 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/impl/callReferenceImpl.kt @@ -1,18 +1,18 @@ // 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.impl +import com.intellij.psi.PsiType import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult import org.jetbrains.plugins.groovy.lang.psi.impl.GrTupleType import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil -import org.jetbrains.plugins.groovy.lang.resolve.api.Arguments import org.jetbrains.plugins.groovy.lang.resolve.api.GroovyMethodCallReference fun GroovyMethodCallReference.resolveImpl(incomplete: Boolean): Collection { val receiver = receiver ?: TypesUtil.getJavaLangObject(element) val methodName = methodName - fun resolveWithArguments(args: Arguments?): Array { + fun resolveWithArguments(args: List?): Array { return if (args == null) { ResolveUtil.getMethodCandidates(receiver, methodName, element, incomplete) } @@ -21,7 +21,7 @@ fun GroovyMethodCallReference.resolveImpl(incomplete: Boolean): Collection { val result = SmartList() diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/references/GrSafeCastReference.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/references/GrSafeCastReference.kt index 6550bcac785b..e860c438c2dc 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/references/GrSafeCastReference.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/references/GrSafeCastReference.kt @@ -7,6 +7,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrSafeCa import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.HardcodedGroovyMethodConstants.AS_TYPE import org.jetbrains.plugins.groovy.lang.resolve.api.Arguments import org.jetbrains.plugins.groovy.lang.resolve.api.GroovyMethodCallReferenceBase +import org.jetbrains.plugins.groovy.lang.resolve.api.LazyTypeArgument import org.jetbrains.plugins.groovy.lang.resolve.wrapClassType class GrSafeCastReference(element: GrSafeCastExpression) : GroovyMethodCallReferenceBase(element) { @@ -17,5 +18,5 @@ class GrSafeCastReference(element: GrSafeCastExpression) : GroovyMethodCallRefer override val methodName: String get() = AS_TYPE - override val arguments: Arguments? get() = listOf(wrapClassType(element.castTypeElement?.type, element)) + override val arguments: Arguments? get() = listOf(LazyTypeArgument { wrapClassType(element.castTypeElement?.type, element) }) }