summaryrefslogtreecommitdiff
path: root/java/java-psi-api/src
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2013-05-06 10:36:42 -0700
committerTor Norbye <tnorbye@google.com>2013-05-06 10:36:42 -0700
commitf56a0fff1a336635c966bffc25e16af9a4e6e988 (patch)
tree19e53b8f61e9fc94d35d5d6d97cc1499cad1cc59 /java/java-psi-api/src
parent8fb0021093e7d978cc06043ba4c06b0a47778294 (diff)
downloadidea-f56a0fff1a336635c966bffc25e16af9a4e6e988.tar.gz
Snapshot 36a7a0702ddda30083713c9b8f140495d5f09d32 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: Ia9068e36d373808400a123a395b037bdb6940a17
Diffstat (limited to 'java/java-psi-api/src')
-rw-r--r--java/java-psi-api/src/com/intellij/psi/GenericsUtil.java12
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java11
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java6
3 files changed, 22 insertions, 7 deletions
diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
index 8a6bb464e63d..06d40370d5b7 100644
--- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
@@ -234,8 +234,16 @@ public class GenericsUtil {
}
@Nullable
- public static PsiType getVariableTypeByExpressionType(@Nullable final PsiType type) {
+ public static PsiType getVariableTypeByExpressionType(@Nullable PsiType type) {
+ return getVariableTypeByExpressionType(type, true);
+ }
+
+ @Nullable
+ public static PsiType getVariableTypeByExpressionType(@Nullable PsiType type, final boolean openCaptured) {
if (type == null) return null;
+ if (type instanceof PsiCapturedWildcardType) {
+ type = ((PsiCapturedWildcardType)type).getWildcard();
+ }
PsiType transformed = type.accept(new PsiTypeVisitor<PsiType>() {
@Override
public PsiType visitArrayType(PsiArrayType arrayType) {
@@ -271,7 +279,7 @@ public class GenericsUtil {
@Override
public PsiType visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) {
- return capturedWildcardType.getWildcard().accept(this);
+ return openCaptured ? capturedWildcardType.getWildcard().accept(this) : capturedWildcardType;
}
@Override
diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
index 672a01334f47..9cce64d95310 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
@@ -325,7 +325,7 @@ public class TypeConversionUtil {
PsiClass[] supers = derived.getSupers();
if (manager.areElementsEquivalent(base, derived)) {
derivedSubstitutor = getSuperClassSubstitutor(derived, derived, derivedSubstitutor);
- return areSameArgumentTypes(derived, baseResult.getSubstitutor(), derivedSubstitutor);
+ return areSameArgumentTypes(derived, baseResult.getSubstitutor(), derivedSubstitutor, 1);
}
else if (base.isInheritor(derived, true)) {
derivedSubstitutor = getSuperClassSubstitutor(derived, derived, derivedSubstitutor);
@@ -355,11 +355,18 @@ public class TypeConversionUtil {
}
private static boolean areSameArgumentTypes(PsiClass aClass, PsiSubstitutor substitutor1, PsiSubstitutor substitutor2) {
+ return areSameArgumentTypes(aClass, substitutor1, substitutor2, 0);
+ }
+
+ private static boolean areSameArgumentTypes(PsiClass aClass,
+ PsiSubstitutor substitutor1,
+ PsiSubstitutor substitutor2,
+ int level) {
for (PsiTypeParameter typeParameter : PsiUtil.typeParametersIterable(aClass)) {
PsiType typeArg1 = substitutor1.substitute(typeParameter);
PsiType typeArg2 = substitutor2.substitute(typeParameter);
if (typeArg1 == null || typeArg2 == null) return true;
- if (TypesDistinctProver.provablyDistinct(typeArg1, typeArg2)) return false;
+ if (TypesDistinctProver.provablyDistinct(typeArg1, typeArg2, level)) return false;
final PsiClass class1 = PsiUtil.resolveClassInType(typeArg1);
if (class1 instanceof PsiTypeParameter) {
diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
index 5d2c6aab7467..df1be5851ec1 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
@@ -35,7 +35,7 @@ public class TypesDistinctProver {
return provablyDistinct(type1, type2, 0);
}
- private static boolean provablyDistinct(PsiType type1, PsiType type2, int level) {
+ protected static boolean provablyDistinct(PsiType type1, PsiType type2, int level) {
if (type1 instanceof PsiClassType && ((PsiClassType)type1).resolve() instanceof PsiTypeParameter) return false;
if (type2 instanceof PsiClassType && ((PsiClassType)type2).resolve() instanceof PsiTypeParameter) return false;
if (type1 instanceof PsiWildcardType) {
@@ -43,9 +43,9 @@ public class TypesDistinctProver {
return provablyDistinct((PsiWildcardType)type1, (PsiWildcardType)type2);
}
+ if (level > 1) return true;
if (type2 instanceof PsiCapturedWildcardType) {
- return ((PsiWildcardType)type1).isExtends() && level > 0 ||
- provablyDistinct((PsiWildcardType)type1, ((PsiCapturedWildcardType)type2).getWildcard());
+ return provablyDistinct((PsiWildcardType)type1, ((PsiCapturedWildcardType)type2).getWildcard());
}
if (type2 instanceof PsiClassType) {