diff --git a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java index eb3c54ab0019..873821f2adce 100644 --- a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java +++ b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/I18nInspection.java @@ -20,8 +20,6 @@ import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.MethodSignature; -import com.intellij.psi.util.MethodSignatureUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.introduceField.IntroduceConstantHandler; @@ -31,6 +29,8 @@ import com.intellij.ui.FieldPanel; import com.intellij.ui.ScrollPaneFactory; import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.ExceptionUtils; +import com.siyeh.ig.psiutils.ExpressionUtils; +import com.siyeh.ig.psiutils.MethodCallUtils; import gnu.trove.THashSet; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -725,40 +725,18 @@ public class I18nInspection extends AbstractBaseJavaLocalInspectionTool implemen } private static boolean isInNonNlsEquals(PsiExpression expression, final Set nonNlsTargets) { - if (!(expression.getParent().getParent() instanceof PsiMethodCallExpression)) { - return false; - } - final PsiMethodCallExpression call = (PsiMethodCallExpression)expression.getParent().getParent(); - final PsiReferenceExpression methodExpression = call.getMethodExpression(); - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (qualifier != expression) { - return false; - } - if (!"equals".equals(methodExpression.getReferenceName())) { - return false; - } - final PsiElement resolved = methodExpression.resolve(); - if (!(resolved instanceof PsiMethod)) { - return false; - } - PsiType objectType = PsiType.getJavaLangObject(resolved.getManager(), resolved.getResolveScope()); - MethodSignature equalsSignature = MethodSignatureUtil.createMethodSignature("equals", - new PsiType[]{objectType}, - PsiTypeParameter.EMPTY_ARRAY, - PsiSubstitutor.EMPTY); - if (!equalsSignature.equals(((PsiMethod)resolved).getSignature(PsiSubstitutor.EMPTY))) { - return false; - } + final PsiMethodCallExpression call = ExpressionUtils.getCallForQualifier(expression); + if (call == null || !MethodCallUtils.isEqualsCall(call)) return false; final PsiExpression[] expressions = call.getArgumentList().getExpressions(); - if (expressions.length != 1) { - return false; - } - final PsiExpression arg = expressions[0]; + if (expressions.length != 1) return false; + final PsiExpression arg = PsiUtil.skipParenthesizedExprDown(expressions[0]); PsiReferenceExpression ref = null; if (arg instanceof PsiReferenceExpression) { ref = (PsiReferenceExpression)arg; } - else if (arg instanceof PsiMethodCallExpression) ref = ((PsiMethodCallExpression)arg).getMethodExpression(); + else if (arg instanceof PsiMethodCallExpression) { + ref = ((PsiMethodCallExpression)arg).getMethodExpression(); + } if (ref != null) { final PsiElement resolvedEntity = ref.resolve(); if (resolvedEntity instanceof PsiModifierListOwner) { @@ -813,7 +791,7 @@ public class I18nInspection extends AbstractBaseJavaLocalInspectionTool implemen private static boolean isNonNlsCall(PsiMethodCallExpression grParent, Set nonNlsTargets) { final PsiReferenceExpression methodExpression = grParent.getMethodExpression(); - final PsiExpression qualifier = methodExpression.getQualifierExpression(); + final PsiExpression qualifier = PsiUtil.skipParenthesizedExprDown(methodExpression.getQualifierExpression()); if (qualifier instanceof PsiReferenceExpression) { final PsiElement resolved = ((PsiReferenceExpression)qualifier).resolve(); if (resolved instanceof PsiModifierListOwner) { diff --git a/plugins/java-i18n/testData/inspections/i18n/nonNlsEquals/expected.xml b/plugins/java-i18n/testData/inspections/i18n/nonNlsEquals/expected.xml new file mode 100644 index 000000000000..98a1b0a67d57 --- /dev/null +++ b/plugins/java-i18n/testData/inspections/i18n/nonNlsEquals/expected.xml @@ -0,0 +1,22 @@ + + + + Test.java + 4 + testNonNlsEquals + <default> + + Hard coded strings + Hard coded string literal: "bar" + + + Test.java + 6 + testNonNlsEquals + <default> + + Hard coded strings + Hard coded string literal: "bar" + + + diff --git a/plugins/java-i18n/testData/inspections/i18n/nonNlsEquals/src/Test.java b/plugins/java-i18n/testData/inspections/i18n/nonNlsEquals/src/Test.java new file mode 100644 index 000000000000..3b3d31fc929d --- /dev/null +++ b/plugins/java-i18n/testData/inspections/i18n/nonNlsEquals/src/Test.java @@ -0,0 +1,10 @@ +class Foo { + void test(@org.jetbrains.annotations.NonNls String s, String s1) { + if (s.equals("bar")) {} + if (s1.equals("bar")) {} + if ("bar".equals(s)) {} + if ("bar".equals(s1)) {} + if (("bar").equals((s))) {} + if ((s).equals(("bar"))) {} + } +} \ No newline at end of file diff --git a/plugins/java-i18n/testSrc/com/intellij/codeInspection/i18n/I18NInspectionTest.java b/plugins/java-i18n/testSrc/com/intellij/codeInspection/i18n/I18NInspectionTest.java index 994af349059d..140e46a7cd5e 100644 --- a/plugins/java-i18n/testSrc/com/intellij/codeInspection/i18n/I18NInspectionTest.java +++ b/plugins/java-i18n/testSrc/com/intellij/codeInspection/i18n/I18NInspectionTest.java @@ -44,6 +44,7 @@ public class I18NInspectionTest extends LightCodeInsightFixtureTestCase { public void testVarargNonNlsParameter() { doTest(); } public void testInitializerInAnonymousClass() { doTest(); } public void testNonNlsArray() { doTest(); } + public void testNonNlsEquals() { doTest(); } public void testParameterInNewAnonymousClass() { doTest(); } public void testConstructorCallOfNonNlsVariable() { doTest(); } public void testSwitchOnNonNlsString() { doTest(); }