IDEA-161217 (False positive 'Unnecessary call to String.valueOf()')
authorBas Leijdekkers <basleijdekkers@gmail.com>
Wed, 14 Sep 2016 15:45:36 +0000 (17:45 +0200)
committerBas Leijdekkers <basleijdekkers@gmail.com>
Wed, 14 Sep 2016 15:47:02 +0000 (17:47 +0200)
plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryCallToStringValueOfInspection.java
plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_valueof/UnnecessaryCallToStringValueOf.java

index 473f77255e4a6254c28e67ba29ab89d01acd1003..dc430d006fcab5181517ce679fcf003d2193dacb 100644 (file)
@@ -120,7 +120,7 @@ public class UnnecessaryCallToStringValueOfInspection extends BaseInspection imp
       if (arguments.length != 1) {
         return;
       }
-      final PsiExpression argument = arguments[0];
+      final PsiExpression argument = ParenthesesUtils.stripParentheses(arguments[0]);
       final PsiType argumentType = argument.getType();
       if (argumentType instanceof PsiArrayType) {
         final PsiArrayType arrayType = (PsiArrayType)argumentType;
@@ -129,23 +129,27 @@ public class UnnecessaryCallToStringValueOfInspection extends BaseInspection imp
           return;
         }
       }
-      else if (!TypeUtils.isJavaLangString(argumentType)) {
+      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;
+      }
+      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;
-        }
+      }
+      if (argument instanceof PsiReferenceExpression || argument instanceof PsiMethodCallExpression){
+        // don't warn because unwrapping when null would change semantics
+        return;
       }
       registerError(expression, calculateReplacementText(argument));
     }
index 61db1e98baba00cae9bffba8cce78e6166e7c906..73cd24224ad2027f984d3baa716959b389144206 100644 (file)
@@ -50,4 +50,12 @@ public class UnnecessaryCallToStringValueOf {
                ':' +
                <warning descr="'String.valueOf(1)' can be simplified to '1'">String.valueOf(1)</warning>;
   }
+
+  void regression() {
+    String s = "" + Integer.valueOf("asdf") + String.valueOf((nothing()));
+  }
+
+  Object nothing() {
+    return null;
+  }
 }
\ No newline at end of file