IG: introduce isAutoBoxed() utility method
authorBas Leijdekkers <basleijdekkers@gmail.com>
Thu, 29 Sep 2016 10:45:46 +0000 (12:45 +0200)
committerBas Leijdekkers <basleijdekkers@gmail.com>
Thu, 29 Sep 2016 14:50:34 +0000 (16:50 +0200)
plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoBoxingInspection.java
plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java

index 6776fa0f79ab587a2b41a8417b1a0681cea6f3f5..6bf6904762d30813f5315863338e7be514d9212e 100644 (file)
@@ -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<String> 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) {
-        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) {
+      if (!ExpressionUtils.isAutoBoxed(expression)) {
         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;
       }
index 4f884ba32133d29d80dc3fef0fc2b1831b3ef04d..7f29761897a967acced4e77fab2ec6bf1bf2c5bd 100644 (file)
  */
 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<String> 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