mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 11:50:54 +07:00
lvti: guard SOE (IDEA-181104)
This commit is contained in:
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.intellij.psi.impl.source;
|
||||
|
||||
import com.intellij.openapi.util.RecursionGuard;
|
||||
import com.intellij.openapi.util.RecursionManager;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
@@ -50,6 +52,7 @@ public class JavaVarTypeUtil {
|
||||
}
|
||||
|
||||
private static class UpwardProjectionTypeVisitor extends PsiTypeVisitorEx<PsiType> {
|
||||
private static RecursionGuard upwardGuard = RecursionManager.createGuard("upwardProjectionGuard");
|
||||
@Override
|
||||
public PsiType visitType(PsiType type) {
|
||||
return type;
|
||||
@@ -110,8 +113,11 @@ public class JavaVarTypeUtil {
|
||||
|
||||
}
|
||||
else {
|
||||
PsiType U = ai.accept(this);
|
||||
if (!U.equalsToText(CommonClassNames.JAVA_LANG_OBJECT) && tryUpperBound(aClass, parameter, U)) {
|
||||
PsiType U = upwardGuard.doPreventingRecursion(ai, true, () -> ai.accept(this));
|
||||
if (U == null) {
|
||||
targetSubstitutor = targetSubstitutor.put(parameter, PsiWildcardType.createUnbounded(manager));
|
||||
}
|
||||
else if (!U.equalsToText(CommonClassNames.JAVA_LANG_OBJECT) && tryUpperBound(aClass, parameter, U)) {
|
||||
targetSubstitutor = targetSubstitutor.put(parameter, PsiWildcardType.createExtends(manager, U));
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -56,4 +56,12 @@ class C extends B {}
|
||||
class X<T extends S, S> {
|
||||
T get() {return null;}
|
||||
void add(T t) {}
|
||||
}
|
||||
|
||||
class RecursiveBound {
|
||||
class C<T extends Comparable<T>> { }
|
||||
|
||||
void test(C<? super Integer> c) {
|
||||
var x = c;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user