diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaReflectionReferenceUtil.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaReflectionReferenceUtil.java
index 14844bb0b70f..c6aaaeda6eee 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaReflectionReferenceUtil.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaReflectionReferenceUtil.java
@@ -91,6 +91,7 @@ public class JavaReflectionReferenceUtil {
public static final String LOAD_CLASS = "loadClass";
public static final String GET_CLASS = "getClass";
public static final String NEW_INSTANCE = "newInstance";
+ public static final String TYPE = "TYPE";
private static final RecursionGuard ourGuard = RecursionManager.createGuard("JavaLangClassMemberReference");
@@ -144,6 +145,19 @@ public class JavaReflectionReferenceUtil {
final PsiClassType.ClassResolveResult resolveResult = ((PsiClassType)type).resolveGenerics();
final PsiClass resolvedElement = resolveResult.getElement();
if (!isJavaLangClass(resolvedElement)) return null;
+
+ if (context instanceof PsiReferenceExpression && TYPE.equals(((PsiReferenceExpression)context).getReferenceName())) {
+ final PsiElement resolved = ((PsiReferenceExpression)context).resolve();
+ if (resolved instanceof PsiField) {
+ final PsiField field = (PsiField)resolved;
+ if (field.hasModifierProperty(PsiModifier.FINAL) && field.hasModifierProperty(PsiModifier.STATIC)) {
+ final PsiPrimitiveType unboxedType = tryUnbox(field.getContainingClass(), (PsiClassType)type);
+ if (unboxedType != null) {
+ return ReflectiveType.create(unboxedType);
+ }
+ }
+ }
+ }
final PsiTypeParameter[] parameters = resolvedElement.getTypeParameters();
if (parameters.length == 1) {
final PsiType typeArgument = resolveResult.getSubstitutor().substitute(parameters[0]);
@@ -281,6 +295,19 @@ public class JavaReflectionReferenceUtil {
return assignment != null ? assignment.getRExpression() : null;
}
+ @Nullable
+ private static PsiPrimitiveType tryUnbox(@Nullable PsiClass psiClass, @NotNull PsiClassType originalType) {
+ if (psiClass != null && TypeConversionUtil.isPrimitiveWrapper(psiClass.getQualifiedName())) {
+ final PsiElementFactory factory = JavaPsiFacade.getInstance(psiClass.getProject()).getElementFactory();
+ final PsiClassType classType = factory.createType(psiClass, PsiSubstitutor.EMPTY, originalType.getLanguageLevel());
+ final PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(classType);
+ if (unboxedType != null) {
+ return unboxedType;
+ }
+ }
+ return null;
+ }
+
private static PsiClass findClass(@NotNull String qualifiedName, @NotNull PsiElement context) {
final Project project = context.getProject();
return JavaPsiFacade.getInstance(project).findClass(qualifiedName, GlobalSearchScope.allScope(project));
diff --git a/java/java-tests/testData/inspection/javaReflectionMemberAccess/ConstructorExists.java b/java/java-tests/testData/inspection/javaReflectionMemberAccess/ConstructorExists.java
index 8cfa2866caee..b7b9a83a2109 100644
--- a/java/java-tests/testData/inspection/javaReflectionMemberAccess/ConstructorExists.java
+++ b/java/java-tests/testData/inspection/javaReflectionMemberAccess/ConstructorExists.java
@@ -24,6 +24,10 @@ class ConstructorExists {
C.class.getConstructor(int.class);
C.class.getConstructor(boolean.class);
+
+ A.class.getConstructor(Integer.TYPE);
+ A.class.getConstructor(Boolean.TYPE);
+ A.class.getConstructor(Double.TYPE);
}
static class A {
diff --git a/java/java-tests/testData/inspection/javaReflectionMemberAccess/MethodExists.java b/java/java-tests/testData/inspection/javaReflectionMemberAccess/MethodExists.java
index b2562329dae1..0e60af5c37ea 100644
--- a/java/java-tests/testData/inspection/javaReflectionMemberAccess/MethodExists.java
+++ b/java/java-tests/testData/inspection/javaReflectionMemberAccess/MethodExists.java
@@ -68,6 +68,10 @@ class MethodExists {
C.class.getMethod("c", int.class);
C.class.getMethod("c", boolean.class);
C.class.getMethod("d", int.class);
+
+ A.class.getMethod("a1", Integer.TYPE);
+ A.class.getMethod("a2", Integer.TYPE);
+ A.class.getMethod("a1", Boolean.TYPE);
}
static class A {