diff options
Diffstat (limited to 'java/java-psi-api/src')
8 files changed, 53 insertions, 7 deletions
diff --git a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java index 78f29c4c8488..4e47c4466813 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java @@ -21,6 +21,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtil; import gnu.trove.THashSet; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -328,6 +329,7 @@ public class AnnotationUtil { * @param annotations annotations qualified names or patterns. Patterns can have '*' at the end * @return <code>true</code> if annotated of at least one annotation from the annotations list */ + @Contract("null,_ -> false") public static boolean checkAnnotatedUsingPatterns(@Nullable PsiModifierListOwner owner, @NotNull Collection<String> annotations) { final PsiModifierList modList; if (owner == null || (modList = owner.getModifierList()) == null) return false; 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 52888f123215..c835a4171f74 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -153,7 +153,7 @@ public class GenericsUtil { PsiType type2, Set<Couple<PsiType>> compared, PsiManager manager, - PsiClass nestedLayer, + PsiClass nestedLayer, PsiTypeParameter parameter) { Couple<PsiType> types = Couple.of(type1, type2); if (compared.contains(types)) { @@ -549,6 +549,14 @@ public class GenericsUtil { return false; } } + + final PsiClass extendsBoundClass = PsiUtil.resolveClassInClassTypeOnly(extendsBound); + final PsiClass boundBoundClass = PsiUtil.resolveClassInClassTypeOnly(boundBound); + if (boundBoundClass != null && extendsBoundClass != null && !boundBoundClass.isInterface() && !extendsBoundClass.isInterface()) { + return !InheritanceUtil.isInheritorOrSelf(boundBoundClass, extendsBoundClass, true) && + !InheritanceUtil.isInheritorOrSelf(extendsBoundClass, boundBoundClass, true); + } + return !TypeConversionUtil.areTypesConvertible(boundBound, extendsBound) && !TypeConversionUtil.areTypesConvertible(extendsBound, boundBound); } diff --git a/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java b/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java index 1b4be9766b6f..e6c38aa5a186 100644 --- a/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java +++ b/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java @@ -307,3 +307,4 @@ public interface JVMElementFactory { */ boolean isValidLocalVariableName(@NotNull String name); } + 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; + } } diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java index 0b0e09684128..9729425dee81 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java @@ -323,7 +323,9 @@ public class PsiMethodReferenceUtil { final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType); final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult); final MethodSignature signature = interfaceMethod != null ? interfaceMethod.getSignature(LambdaUtil.getSubstitutor(interfaceMethod, resolveResult)) : null; - LOG.assertTrue(signature != null); + if (signature == null) { + return false; + } final PsiType[] parameterTypes = signature.getParameterTypes(); final QualifierResolveResult qualifierResolveResult = getQualifierResolveResult(methodRef); return (method.getParameterList().getParametersCount() + 1 == parameterTypes.length || diff --git a/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java b/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java index 747f4f8034c3..888f1c24bf11 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java @@ -31,8 +31,6 @@ import static com.intellij.util.ObjectUtils.notNull; /** * Service for validating and parsing Java identifiers. - * - * @see com.intellij.psi.JavaPsiFacade#getNameHelper() */ public abstract class PsiNameHelper { diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java index a69e11a9d3cc..b38bb494c1e7 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java @@ -722,7 +722,7 @@ public final class PsiUtil extends PsiUtilCore { } public static void checkIsIdentifier(@NotNull PsiManager manager, String text) throws IncorrectOperationException{ - if (!JavaPsiFacade.getInstance(manager.getProject()).getNameHelper().isIdentifier(text)){ + if (!PsiNameHelper.getInstance(manager.getProject()).isIdentifier(text)){ throw new IncorrectOperationException(PsiBundle.message("0.is.not.an.identifier", text) ); } } 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 42f1494bad2e..d7a60cc4cb88 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 @@ -862,6 +862,14 @@ public class TypeConversionUtil { if (left instanceof PsiPrimitiveType && !PsiType.NULL.equals(left)) { return right instanceof PsiClassType && isAssignable(left, right); } + + if (left instanceof PsiIntersectionType) { + for (PsiType lConjunct : ((PsiIntersectionType)left).getConjuncts()) { + if (!boxingConversionApplicable(lConjunct, right)) return false; + } + return true; + } + return left instanceof PsiClassType && right instanceof PsiPrimitiveType && !PsiType.NULL.equals(right) |