[java-completion] ChainCompletionContext: attempt to fix sporadic failures like

com.intellij.openapi.util.RecursionManager$CachingPreventedException: Caching disabled due to recursion prevention, please get rid of cyclic dependencies. Preventions: [ignoreDumbMode->RELIABLE_DATA_ONLY]
  at com.intellij.openapi.util.RecursionManager$2.mayCacheNow(RecursionManager.java:190)
  at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:85)

GitOrigin-RevId: 0eebe6b51eb7dc0516e30d7f388fdb04ff6b9e8f
This commit is contained in:
Tagir Valeev
2024-06-18 11:44:21 +02:00
committed by intellij-monorepo-bot
parent cfffe7e49e
commit 1df10af0b5
2 changed files with 14 additions and 21 deletions

View File

@@ -15,12 +15,9 @@ import com.intellij.openapi.util.Couple;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Objects;
import java.util.stream.Collectors;
public final class MethodChainLookupRangingHelper {
@NotNull
@@ -101,15 +98,16 @@ public final class MethodChainLookupRangingHelper {
@NotNull
private static LookupElement createQualifierLookupElement(@NotNull PsiClass qualifierClass,
@NotNull ChainCompletionContext context) {
PsiNamedElement element = context.getQualifiers(qualifierClass).findFirst().orElse(null);
PsiClassType type = JavaPsiFacade.getElementFactory(qualifierClass.getProject()).createType(qualifierClass);
PsiNamedElement element = context.getQualifierIfPresent(type);
if (element == null) {
return new ChainCompletionNewVariableLookupElement(qualifierClass, context);
} else {
if (element instanceof PsiVariable) {
return new VariableLookupItem((PsiVariable)element);
if (element instanceof PsiVariable var) {
return new VariableLookupItem(var);
}
else if (element instanceof PsiMethod) {
return createMethodLookupElement((PsiMethod)element);
else if (element instanceof PsiMethod method) {
return createMethodLookupElement(method);
}
throw new AssertionError("unexpected element: " + element);
}
@@ -123,8 +121,7 @@ public final class MethodChainLookupRangingHelper {
for (PsiParameter parameter : method.getParameterList().getParameters()) {
PsiType type = parameter.getType();
if (!ChainCompletionContext.isWidelyUsed(type)) {
Collection<PsiElement> contextVariables = context.getQualifiers(type).collect(Collectors.toList());
PsiElement contextVariable = ContainerUtil.getFirstItem(contextVariables, null);
PsiNamedElement contextVariable = context.getQualifierIfPresent(type);
if (contextVariable != null) {
matchedParametersInContext++;
continue;

View File

@@ -4,6 +4,7 @@ package com.intellij.compiler.chainsSearch.context;
import com.intellij.compiler.CompilerReferenceService;
import com.intellij.compiler.backwardRefs.CompilerReferenceServiceEx;
import com.intellij.compiler.chainsSearch.MethodCall;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.NotNullLazyValue;
@@ -18,6 +19,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -31,7 +33,6 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public final class ChainCompletionContext {
private static final String[] WIDELY_USED_CLASS_NAMES = new String[]{
@@ -145,19 +146,14 @@ public final class ChainCompletionContext {
}
public boolean hasQualifier(@Nullable PsiClass targetClass) {
return getQualifiers(targetClass).findAny().isPresent();
return targetClass != null && getQualifierIfPresent(JavaPsiFacade.getElementFactory(myProject).createType(targetClass)) != null;
}
public Stream<PsiNamedElement> getQualifiers(@Nullable PsiClass targetClass) {
if (targetClass == null) return Stream.empty();
return getQualifiers(JavaPsiFacade.getElementFactory(myProject).createType(targetClass));
}
public Stream<PsiNamedElement> getQualifiers(@NotNull PsiType targetType) {
return myContextElements.stream().filter(e -> {
public @Nullable PsiNamedElement getQualifierIfPresent(@NotNull PsiType targetType) {
return DumbService.getInstance(myProject).computeWithAlternativeResolveEnabled(() -> ContainerUtil.find(myContextElements, e -> {
PsiType elementType = getType(e);
return elementType != null && targetType.isAssignableFrom(elementType);
});
}));
}
public @Nullable PsiClass resolvePsiClass(@NotNull CompilerRef.NamedCompilerRef aClass) {