mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-228815: Ignore self-referencing arguments in assignment expressions
GitOrigin-RevId: 168e15e507bbf8e70eb9de0236b13bf341821dd5
This commit is contained in:
committed by
intellij-monorepo-bot
parent
f4f79a3f33
commit
4f19475fad
@@ -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(",
|
||||
|
||||
+24
-5
@@ -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<GrMethodCall>()?.takeIf { it.invokedExpression === element }
|
||||
if (enclosingCall is GrMethodCall) {
|
||||
val enclosingMethod: GrMethod? = enclosingCall.parentOfType<GrMethod>()?.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<GrMethod>()?.takeIf { it.name == anchorElement.name }
|
||||
val bannedIdentifiers: Array<String> = 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
|
||||
}
|
||||
|
||||
}
|
||||
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user