mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
[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:
committed by
intellij-monorepo-bot
parent
cfffe7e49e
commit
1df10af0b5
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user