From 824db4c08b55718dbfa616c48f93600dcae509cd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 18 Jun 2019 21:24:00 +0200 Subject: [PATCH] method handle api: fix unboxing procedure (IDEA-216386) GitOrigin-RevId: 5c470feb24984e06add5aa62bfada43b96ae4964 --- .../impl/JavaReflectionReferenceUtil.java | 24 ++++--------------- .../invokeHandleSignature/StaticMethod.java | 1 + .../JavaLangInvokeHandleSignatureTest.kt | 6 ++--- 3 files changed, 9 insertions(+), 22 deletions(-) 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 a4ab0e5a6a2d..79f8a43b54fa 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 @@ -16,10 +16,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.impl.JavaConstantExpressionEvaluator; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiTypesUtil; -import com.intellij.psi.util.PsiUtilCore; -import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.psi.util.*; import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtilRt; import com.intellij.util.ObjectUtils; @@ -166,8 +163,10 @@ public class JavaReflectionReferenceUtil { 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) { + final PsiType[] classTypeArguments = ((PsiClassType)type).getParameters(); + final PsiPrimitiveType unboxedType = classTypeArguments.length == 1 + ? PsiPrimitiveType.getUnboxedType(classTypeArguments[0]) : null; + if (unboxedType != null && field.getContainingClass() == PsiUtil.resolveClassInClassTypeOnly(classTypeArguments[0])) { return ReflectiveType.create(unboxedType, true); } } @@ -301,19 +300,6 @@ 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.getElementFactory(psiClass.getProject()); - 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/invokeHandleSignature/StaticMethod.java b/java/java-tests/testData/inspection/invokeHandleSignature/StaticMethod.java index cc56ec686d6e..f16af0c68d30 100644 --- a/java/java-tests/testData/inspection/invokeHandleSignature/StaticMethod.java +++ b/java/java-tests/testData/inspection/invokeHandleSignature/StaticMethod.java @@ -5,6 +5,7 @@ class Main { MethodHandles.Lookup l = MethodHandles.lookup(); l.findStatic(Test.class, "method1", MethodType.methodType(void.class)); + l.findStatic(Test.class, "method1", MethodType.methodType(Void.TYPE)); l.findStatic(Test.class, "method2", MethodType.methodType(String.class, String.class)); l.findStatic(Test.class, "method3", MethodType.methodType(String.class, String.class, String[].class)); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/JavaLangInvokeHandleSignatureTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInspection/JavaLangInvokeHandleSignatureTest.kt index 254f3ab23f01..e0d1b8fd9e72 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/JavaLangInvokeHandleSignatureTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/JavaLangInvokeHandleSignatureTest.kt @@ -25,10 +25,10 @@ import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase */ class JavaLangInvokeHandleSignatureTest : LightJavaCodeInsightFixtureTestCase() { - override fun getBasePath() = JavaTestUtil.getRelativeJavaTestDataPath() + "/inspection/invokeHandleSignature" + override fun getBasePath() = "${JavaTestUtil.getRelativeJavaTestDataPath()}/inspection/invokeHandleSignature" override fun getProjectDescriptor(): LightProjectDescriptor { - return LightJavaCodeInsightFixtureTestCase.JAVA_9 + return JAVA_9 } override fun setUp() { @@ -53,6 +53,6 @@ class JavaLangInvokeHandleSignatureTest : LightJavaCodeInsightFixtureTestCase() fun testSpecial() = doTest() private fun doTest() { - myFixture.testHighlighting(getTestName(false) + ".java") + myFixture.testHighlighting("${getTestName(false)}.java") } }