summaryrefslogtreecommitdiff
path: root/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java
diff options
context:
space:
mode:
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.java31
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;
+ }
}