diff options
author | Tor Norbye <tnorbye@google.com> | 2013-05-06 10:36:42 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-05-06 10:36:42 -0700 |
commit | f56a0fff1a336635c966bffc25e16af9a4e6e988 (patch) | |
tree | 19e53b8f61e9fc94d35d5d6d97cc1499cad1cc59 /java/java-psi-api/src | |
parent | 8fb0021093e7d978cc06043ba4c06b0a47778294 (diff) | |
download | idea-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')
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) { |