summaryrefslogtreecommitdiff
path: root/java/java-psi-api/src/com/intellij/psi
diff options
context:
space:
mode:
Diffstat (limited to 'java/java-psi-api/src/com/intellij/psi')
-rw-r--r--java/java-psi-api/src/com/intellij/psi/GenericsUtil.java10
-rw-r--r--java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java1
-rw-r--r--java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java31
-rw-r--r--java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java4
-rw-r--r--java/java-psi-api/src/com/intellij/psi/PsiNameHelper.java2
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java2
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java8
7 files changed, 51 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 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)