diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryCallToStringValueOfInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryCallToStringValueOfInspection.java index 473f77255e4a..dc430d006fca 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryCallToStringValueOfInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryCallToStringValueOfInspection.java @@ -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)); } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_valueof/UnnecessaryCallToStringValueOf.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_valueof/UnnecessaryCallToStringValueOf.java index 61db1e98baba..73cd24224ad2 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_valueof/UnnecessaryCallToStringValueOf.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_valueof/UnnecessaryCallToStringValueOf.java @@ -50,4 +50,12 @@ public class UnnecessaryCallToStringValueOf { ':' + String.valueOf(1); } + + void regression() { + String s = "" + Integer.valueOf("asdf") + String.valueOf((nothing())); + } + + Object nothing() { + return null; + } } \ No newline at end of file