diff options
Diffstat (limited to 'java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java')
-rw-r--r-- | java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java index 8130b864ad9a..c94709ee164a 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java @@ -28,6 +28,8 @@ public class PsiCapturedWildcardType extends PsiType.Stub { @NotNull private final PsiElement myContext; @Nullable private final PsiTypeParameter myParameter; + private PsiType myUpperBound; + @NotNull public static PsiCapturedWildcardType create(@NotNull PsiWildcardType existential, @NotNull PsiElement context) { return create(existential, context, null); @@ -40,11 +42,28 @@ public class PsiCapturedWildcardType extends PsiType.Stub { return new PsiCapturedWildcardType(existential, context, parameter); } - private PsiCapturedWildcardType(@NotNull PsiWildcardType existential, @NotNull PsiElement context, @Nullable PsiTypeParameter parameter) { + private PsiCapturedWildcardType(@NotNull PsiWildcardType existential, + @NotNull PsiElement context, + @Nullable PsiTypeParameter parameter) { super(PsiAnnotation.EMPTY_ARRAY); myExistential = existential; myContext = context; myParameter = parameter; + if (parameter != null) { + final PsiClassType[] boundTypes = parameter.getExtendsListTypes(); + if (boundTypes.length > 0) { + PsiType result = null; + for (PsiType type : boundTypes) { + if (result == null) { + result = type; + } + else { + result = GenericsUtil.getGreatestLowerBound(result, type); + } + } + myUpperBound = result; + } + } } @Override @@ -128,10 +147,14 @@ public class PsiCapturedWildcardType extends PsiType.Stub { return PsiWildcardType.createSuper(myContext.getManager(), ((PsiCapturedWildcardType)bound).getUpperBound()); } else { - return PsiType.getJavaLangObject(myContext.getManager(), getResolveScope()); + return myUpperBound != null ? myUpperBound : PsiType.getJavaLangObject(myContext.getManager(), getResolveScope()); } } + public void setUpperBound(PsiType upperBound) { + myUpperBound = upperBound; + } + @NotNull public PsiWildcardType getWildcard() { return myExistential; @@ -141,4 +164,8 @@ public class PsiCapturedWildcardType extends PsiType.Stub { public PsiElement getContext() { return myContext; } + + public PsiTypeParameter getTypeParameter() { + return myParameter; + } } |