From 4f19475fadf2d261b666b0229534da1d8b64115f Mon Sep 17 00:00:00 2001 From: "Konstantin.Nisht" Date: Wed, 22 Apr 2020 19:26:18 +0300 Subject: [PATCH] IDEA-228815: Ignore self-referencing arguments in assignment expressions GitOrigin-RevId: 168e15e507bbf8e70eb9de0236b13bf341821dd5 --- .../openapi/util/RecursionManager.java | 3 -- .../style/inference/search/searchUtils.kt | 29 +++++++++++++++---- .../generate/GroovyGenerateMembersTest.groovy | 2 -- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/RecursionManager.java b/platform/util/src/com/intellij/openapi/util/RecursionManager.java index e929acb4cdb0..0bcced3cbb72 100644 --- a/platform/util/src/com/intellij/openapi/util/RecursionManager.java +++ b/platform/util/src/com/intellij/openapi/util/RecursionManager.java @@ -361,9 +361,6 @@ public class RecursionManager { "com.intellij.lang.ecmascript6.psi.impl.ES6ImportSpecifierImpl.multiResolve(", "com.intellij.lang.javascript.psi.types.JSTypeBaseImpl.substitute(", - // IDEA-228815 - "org.jetbrains.plugins.groovy.intentions.style.inference.InferenceProcessKt.runInferenceProcess(", - // IDEA-228814 "com.intellij.psi.infos.MethodCandidateInfo.getPertinentApplicabilityLevel(", "com.intellij.psi.ThreadLocalTypes.performWithTypes(", diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/inference/search/searchUtils.kt b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/inference/search/searchUtils.kt index b83f42cff3f9..9050aec29ade 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/inference/search/searchUtils.kt +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/inference/search/searchUtils.kt @@ -8,11 +8,13 @@ import com.intellij.psi.PsiReference import com.intellij.psi.search.* import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.util.parentOfType +import com.intellij.psi.util.parentOfTypes import com.intellij.util.Processor import com.intellij.util.containers.map2Array import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement import org.jetbrains.plugins.groovy.lang.psi.GroovyRecursiveElementVisitor import org.jetbrains.plugins.groovy.lang.psi.api.GrFunctionalExpression +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression 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.api.statements.expressions.GrReferenceExpression @@ -70,18 +72,35 @@ private class ScopeFilteringRequestProcessor(private val anchorElement: GrMethod if (arguments?.contains(enclosingClosure) == true && call.callReference?.methodName == anchorElement.name) { return true } - val enclosingCall: GrMethodCall? = element.parentOfType()?.takeIf { it.invokedExpression === element } - if (enclosingCall is GrMethodCall) { - val enclosingMethod: GrMethod? = enclosingCall.parentOfType()?.takeIf { it.name == anchorElement.name } + if (checkSelfReferencesInArguments(element)) { + return true + } + return delegateProcessor.processTextOccurrence(element, offsetInElement, consumer) + } + + fun checkSelfReferencesInArguments(element: PsiElement): Boolean { + val expressionWithArguments: GrExpression? = element.parentOfTypes(GrMethodCall::class, GrAssignmentExpression::class) ?: return false + val isCorrectlyPointing = when (expressionWithArguments) { + is GrMethodCall -> expressionWithArguments.invokedExpression === element + is GrAssignmentExpression -> expressionWithArguments.lValue === element + else -> return false + } + if (isCorrectlyPointing) { + val enclosingMethod: GrMethod? = expressionWithArguments.parentOfType()?.takeIf { it.name == anchorElement.name } val bannedIdentifiers: Array = enclosingMethod?.parameters?.map2Array { it.name } ?: emptyArray() val collisionFinder = CollisionFinder(anchorElement.name, *bannedIdentifiers) - if (enclosingCall.expressionArguments.any { argument -> collisionFinder.apply { argument.accept(this) }.foundCollision }) { + val arguments = when (expressionWithArguments) { + is GrMethodCall -> expressionWithArguments.expressionArguments + is GrAssignmentExpression -> arrayOf(expressionWithArguments.rValue) + else -> return false + } + if (arguments.any { argument -> collisionFinder.apply { argument.accept(this) }.foundCollision }) { // there should be provided some connection between method return type and its argument, // but currently this option is absent return true } } - return delegateProcessor.processTextOccurrence(element, offsetInElement, consumer) + return false } } \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy index 22ea8dcc764b..81e89013e5e2 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy @@ -18,7 +18,6 @@ package org.jetbrains.plugins.groovy.lang.actions.generate import com.intellij.codeInsight.generation.* import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project -import com.intellij.openapi.util.RecursionManager import com.intellij.psi.PsiClass import com.intellij.psi.impl.source.PostprocessReformattingAspect import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase @@ -244,7 +243,6 @@ class Test { } void testSetter3() { - RecursionManager.disableMissedCacheAssertions(testRootDisposable) myFixture.configureByText 'a.groovy', ''' class Test { static foo