method handle api: fix unboxing procedure (IDEA-216386)

GitOrigin-RevId: 5c470feb24984e06add5aa62bfada43b96ae4964
This commit is contained in:
Anna Kozlova
2019-07-02 06:52:16 +03:00
committed by intellij-monorepo-bot
parent 715448dd8b
commit 824db4c08b
3 changed files with 9 additions and 22 deletions
@@ -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));
@@ -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));
@@ -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")
}
}