IDEA-160941 (Inspection 'Unnecessary call to String.valueOf()' should be smarter)
authorBas Leijdekkers <basleijdekkers@gmail.com>
Fri, 9 Sep 2016 13:08:47 +0000 (15:08 +0200)
committerBas Leijdekkers <basleijdekkers@gmail.com>
Fri, 9 Sep 2016 13:09:25 +0000 (15:09 +0200)
plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java
plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryCallToStringValueOfInspection.java
plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_valueof/UnnecessaryCallToStringValueOf.java

index c72f1991f3b9cb3dc8577a75a0b3d31b527d969c..5a33055004a3e1143f8376fb625fd1390c5078bd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-20164 Bas Leijdekkers
+ * Copyright 2005-2016 Bas Leijdekkers
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -504,25 +504,18 @@ public class ExpressionUtils {
         return true;
       }
       final PsiExpression[] operands = polyadicExpression.getOperands();
-      int index = -1;
+      boolean expressionSeen = false;
       for (int i = 0, length = operands.length; i < length; i++) {
         final PsiExpression operand = operands[i];
         if (PsiTreeUtil.isAncestor(operand, expression, false)) {
-          index = i;
-          break;
+          if (i > 0) return true;
+          expressionSeen = true;
         }
-      }
-      if (index > 0) {
-        if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING, operands[index - 1].getType())) {
-          return true;
-        }
-      } else if (operands.length > 1) {
-        if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING, operands[index + 1].getType())) {
-          return true;
+        else if ((!expressionSeen || i == 1) && TypeUtils.isJavaLangString(operand.getType())) {
+          return false;
         }
-      } else {
-        return true;
       }
+      return true;
     } else if (parent instanceof PsiExpressionList) {
       final PsiExpressionList expressionList = (PsiExpressionList)parent;
       final PsiElement grandParent = expressionList.getParent();
index e8de80f35f7d855c5d57c26b83d57eda6b66c7cb..473f77255e4a6254c28e67ba29ab89d01acd1003 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008-2015 Bas Leijdekkers
+ * Copyright 2008-2016 Bas Leijdekkers
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -129,21 +129,23 @@ public class UnnecessaryCallToStringValueOfInspection extends BaseInspection imp
           return;
         }
       }
-      final boolean throwable = TypeUtils.expressionHasTypeOrSubtype(argument, "java.lang.Throwable");
-      if (ExpressionUtils.isConversionToStringNecessary(expression, throwable)) {
-        return;
-      }
-      final PsiMethod method = expression.resolveMethod();
-      if (method == null) {
-        return;
-      }
-      final PsiClass aClass = method.getContainingClass();
-      if (aClass == null) {
-        return;
-      }
-      final String qualifiedName = aClass.getQualifiedName();
-      if (!CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName)) {
-        return;
+      else if (!TypeUtils.isJavaLangString(argumentType)) {
+        final boolean throwable = TypeUtils.expressionHasTypeOrSubtype(argument, "java.lang.Throwable");
+        if (ExpressionUtils.isConversionToStringNecessary(expression, throwable)) {
+          return;
+        }
+        final PsiMethod method = expression.resolveMethod();
+        if (method == null) {
+          return;
+        }
+        final PsiClass aClass = method.getContainingClass();
+        if (aClass == null) {
+          return;
+        }
+        final String qualifiedName = aClass.getQualifiedName();
+        if (!CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName)) {
+          return;
+        }
       }
       registerError(expression, calculateReplacementText(argument));
     }
index 4ad2df198e46ac8674f85aa04f100358a094a6a9..61db1e98baba00cae9bffba8cce78e6166e7c906 100644 (file)
@@ -44,4 +44,10 @@ public class UnnecessaryCallToStringValueOf {
       org.slf4j.LoggerFactory.getLogger(UnnecessaryCallToStringValueOf.class).info("this: {}", String.valueOf(e));
     }
   }
+
+  void smarter() {
+    String f = <warning descr="'String.valueOf(\"statistics\")' can be simplified to '\"statistics\"'">String.valueOf("statistics")</warning> +
+               ':' +
+               <warning descr="'String.valueOf(1)' can be simplified to '1'">String.valueOf(1)</warning>;
+  }
 }
\ No newline at end of file