From b5cc1cd4ea30a2208dd307e97e029975fd5bbc6d Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 29 Sep 2016 12:45:46 +0200 Subject: [PATCH] IG: introduce isAutoBoxed() utility method --- .../siyeh/ig/jdk/AutoBoxingInspection.java | 54 +--------------- .../siyeh/ig/psiutils/ExpressionUtils.java | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 52 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoBoxingInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoBoxingInspection.java index 6776fa0f79ab..6bf6904762d3 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoBoxingInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoBoxingInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2016 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ */ package com.siyeh.ig.jdk; -import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.openapi.project.Project; @@ -56,14 +55,6 @@ public class AutoBoxingInspection extends BaseInspection { s_boxingClasses.put("char", CommonClassNames.JAVA_LANG_CHARACTER); } - @NonNls static final Set convertableBoxedClassNames = new HashSet<>(); - - static { - convertableBoxedClassNames.add(CommonClassNames.JAVA_LANG_BYTE); - convertableBoxedClassNames.add(CommonClassNames.JAVA_LANG_CHARACTER); - convertableBoxedClassNames.add(CommonClassNames.JAVA_LANG_SHORT); - } - @Override @NotNull public String getDisplayName() { @@ -323,50 +314,9 @@ public class AutoBoxingInspection extends BaseInspection { } private void checkExpression(@NotNull PsiExpression expression) { - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiParenthesizedExpression) { + if (!ExpressionUtils.isAutoBoxed(expression)) { return; } - if (parent instanceof PsiExpressionList) { - final PsiElement grandParent = parent.getParent(); - if (grandParent instanceof PsiMethodCallExpression) { - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)grandParent; - final PsiMethod method = methodCallExpression.resolveMethod(); - if (method != null && - AnnotationUtil.isAnnotated(method, Collections.singletonList("java.lang.invoke.MethodHandle.PolymorphicSignature"))) { - return; - } - } - } - final PsiType expressionType = expression.getType(); - if (expressionType == null || expressionType.equals(PsiType.VOID) || !TypeConversionUtil.isPrimitiveAndNotNull(expressionType)) { - return; - } - final PsiPrimitiveType primitiveType = (PsiPrimitiveType)expressionType; - final PsiClassType boxedType = primitiveType.getBoxedType(expression); - if (boxedType == null) { - return; - } - final PsiType expectedType = ExpectedTypeUtils.findExpectedType(expression, false, true); - if (expectedType == null || ClassUtils.isPrimitive(expectedType)) { - return; - } - if (!expectedType.isAssignableFrom(boxedType)) { - // JLS 5.2 Assignment Conversion - // check if a narrowing primitive conversion is applicable - if (!(expectedType instanceof PsiClassType) || !PsiUtil.isConstantExpression(expression)) { - return; - } - final PsiClassType classType = (PsiClassType)expectedType; - final String className = classType.getCanonicalText(); - if (!convertableBoxedClassNames.contains(className)) { - return; - } - if (!PsiType.BYTE.equals(expressionType) && !PsiType.CHAR.equals(expressionType) && - !PsiType.SHORT.equals(expressionType) && !PsiType.INT.equals(expressionType)) { - return; - } - } if (ignoreAddedToCollection && isAddedToCollection(expression)) { return; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java index 4f884ba32133..7f29761897a9 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java @@ -15,20 +15,34 @@ */ package com.siyeh.ig.psiutils; +import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.ConstantExpressionUtil; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + public class ExpressionUtils { + @NonNls static final Set convertableBoxedClassNames = new HashSet<>(3); + static { + convertableBoxedClassNames.add(CommonClassNames.JAVA_LANG_BYTE); + convertableBoxedClassNames.add(CommonClassNames.JAVA_LANG_CHARACTER); + convertableBoxedClassNames.add(CommonClassNames.JAVA_LANG_SHORT); + } + private ExpressionUtils() {} @Nullable @@ -723,4 +737,52 @@ public class ExpressionUtils { public static boolean isLiteral(PsiElement element, Object value) { return element instanceof PsiLiteralExpression && value.equals(((PsiLiteralExpression)element).getValue()); } + + public static boolean isAutoBoxed(@NotNull PsiExpression expression) { + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiParenthesizedExpression) { + return false; + } + if (parent instanceof PsiExpressionList) { + final PsiElement grandParent = parent.getParent(); + if (grandParent instanceof PsiMethodCallExpression) { + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)grandParent; + final PsiMethod method = methodCallExpression.resolveMethod(); + if (method != null && + AnnotationUtil.isAnnotated(method, Collections.singletonList("java.lang.invoke.MethodHandle.PolymorphicSignature"))) { + return false; + } + } + } + final PsiType expressionType = expression.getType(); + if (expressionType == null || expressionType.equals(PsiType.VOID) || !TypeConversionUtil.isPrimitiveAndNotNull(expressionType)) { + return false; + } + final PsiPrimitiveType primitiveType = (PsiPrimitiveType)expressionType; + final PsiClassType boxedType = primitiveType.getBoxedType(expression); + if (boxedType == null) { + return false; + } + final PsiType expectedType = ExpectedTypeUtils.findExpectedType(expression, false, true); + if (expectedType == null || ClassUtils.isPrimitive(expectedType)) { + return false; + } + if (!expectedType.isAssignableFrom(boxedType)) { + // JLS 5.2 Assignment Conversion + // check if a narrowing primitive conversion is applicable + if (!(expectedType instanceof PsiClassType) || !PsiUtil.isConstantExpression(expression)) { + return false; + } + final PsiClassType classType = (PsiClassType)expectedType; + final String className = classType.getCanonicalText(); + if (!convertableBoxedClassNames.contains(className)) { + return false; + } + if (!PsiType.BYTE.equals(expressionType) && !PsiType.CHAR.equals(expressionType) && + !PsiType.SHORT.equals(expressionType) && !PsiType.INT.equals(expressionType)) { + return false; + } + } + return true; + } } \ No newline at end of file