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 {