"</profile>");
}
+ public void testMergedCallToSuspiciousStringMethodInspections() throws Exception {
+ checkMergedNoChanges("<profile version=\"1.0\">\n" +
+ " <option name=\"myName\" value=\"" + PROFILE + "\" />\n" +
+ " <inspection_tool class=\"StringCompareTo\" enabled=\"true\" level=\"WARNING\" enabled_by_default=\"true\" />\n" +
+ " <inspection_tool class=\"StringEquals\" enabled=\"true\" level=\"WARNING\" enabled_by_default=\"true\" />\n" +
+ " <inspection_tool class=\"StringEqualsIgnoreCase\" enabled=\"true\" level=\"WARNING\" enabled_by_default=\"true\" />\n" +
+ "</profile>" );
+ }
+
public void testMergedMisspelledInspections() throws Exception {
checkMergedNoChanges("<profile version=\"1.0\">\n" +
" <option name=\"myName\" value=\"" + PROFILE + "\" />\n" +
<inspectionElementsMerger implementation="com.siyeh.ig.junit.MalformedSetUpTearDownInspectionMerger"/>
<inspectionElementsMerger implementation="com.siyeh.ig.inheritance.MethodDoesntCallSuperMethodInspectionMerger"/>
<inspectionElementsMerger implementation="com.siyeh.ig.threading.WaitNotifyNotInSynchronizedContextInspectionMerger"/>
+ <inspectionElementsMerger implementation="com.siyeh.ig.internationalization.CallToSuspiciousStringMethodInspectionMerger"/>
<!--group.names.abstraction.issues-->
<localInspection groupPath="Java" language="JAVA" shortName="BooleanParameter" bundle="com.siyeh.InspectionGadgetsBundle" key="boolean.parameter.display.name"
level="WARNING" implementationClass="com.siyeh.ig.initialization.ThisEscapedInConstructorInspection"/>
<!--group.names.internationalization.issues-->
+ <localInspection groupPath="Java" language="JAVA" shortName="CallToSuspiciousStringMethod" bundle="com.siyeh.InspectionGadgetsBundle"
+ key="call.to.suspicious.string.method.display.name" groupBundle="messages.InspectionsBundle"
+ groupKey="group.names.internationalization.issues" enabledByDefault="false" level="WARNING"
+ implementationClass="com.siyeh.ig.internationalization.CallToSuspiciousStringMethodInspection"/>
<localInspection groupPath="Java" language="JAVA" shortName="CharacterComparison" bundle="com.siyeh.InspectionGadgetsBundle" key="character.comparison.display.name"
groupBundle="messages.InspectionsBundle" groupKey="group.names.internationalization.issues" enabledByDefault="false"
level="WARNING" implementationClass="com.siyeh.ig.internationalization.CharacterComparisonInspection"/>
key="instantiating.simpledateformat.without.locale.display.name" groupBundle="messages.InspectionsBundle"
groupKey="group.names.internationalization.issues" enabledByDefault="false" level="WARNING"
implementationClass="com.siyeh.ig.internationalization.SimpleDateFormatWithoutLocaleInspection"/>
- <localInspection groupPath="Java" language="JAVA" suppressId="CallToStringCompareTo" shortName="StringCompareTo" bundle="com.siyeh.InspectionGadgetsBundle"
- key="string.compareto.call.display.name" groupBundle="messages.InspectionsBundle"
- groupKey="group.names.internationalization.issues" enabledByDefault="false" level="WARNING"
- implementationClass="com.siyeh.ig.internationalization.StringCompareToInspection"/>
<localInspection groupPath="Java" language="JAVA" shortName="StringConcatenation" bundle="com.siyeh.InspectionGadgetsBundle" key="string.concatenation.display.name"
groupBundle="messages.InspectionsBundle" groupKey="group.names.internationalization.issues" enabledByDefault="false"
level="WARNING" implementationClass="com.siyeh.ig.internationalization.StringConcatenationInspection"/>
- <localInspection groupPath="Java" language="JAVA" suppressId="CallToStringEqualsIgnoreCase" shortName="StringEqualsIgnoreCase" bundle="com.siyeh.InspectionGadgetsBundle"
- key="string.equalsignorecase.call.display.name" groupBundle="messages.InspectionsBundle"
- groupKey="group.names.internationalization.issues" enabledByDefault="false" level="WARNING"
- implementationClass="com.siyeh.ig.internationalization.StringEqualsIgnoreCaseInspection"/>
- <localInspection groupPath="Java" language="JAVA" suppressId="CallToStringEquals" shortName="StringEquals" bundle="com.siyeh.InspectionGadgetsBundle"
- key="string.equals.call.display.name" groupBundle="messages.InspectionsBundle"
- groupKey="group.names.internationalization.issues" enabledByDefault="false" level="WARNING"
- implementationClass="com.siyeh.ig.internationalization.StringEqualsInspection"/>
<localInspection groupPath="Java" language="JAVA" suppressId="StringToUpperCaseOrToLowerCaseWithoutLocale" shortName="StringToUpperWithoutLocale"
bundle="com.siyeh.InspectionGadgetsBundle" key="string.touppercase.tolowercase.without.locale.display.name"
groupBundle="messages.InspectionsBundle" groupKey="group.names.internationalization.issues" enabledByDefault="false"
key="unnecessary.unicode.escape.display.name" groupBundle="messages.InspectionsBundle"
groupKey="group.names.internationalization.issues" enabledByDefault="false" level="WARNING"
implementationClass="com.siyeh.ig.internationalization.UnnecessaryUnicodeEscapeInspection"/>
-<localInspection groupPath="Java" language="JAVA" shortName="ImplicitDefaultCharsetUsage" bundle="com.siyeh.InspectionGadgetsBundle"
+ <localInspection groupPath="Java" language="JAVA" shortName="ImplicitDefaultCharsetUsage" bundle="com.siyeh.InspectionGadgetsBundle"
key="implicit.default.charset.usage.display.name" groupBundle="messages.InspectionsBundle"
groupKey="group.names.internationalization.issues" enabledByDefault="false" level="WARNING"
implementationClass="com.siyeh.ig.internationalization.ImplicitDefaultCharsetUsageInspection"/>
call.to.numeric.tostring.problem.descriptor=Numeric <code>#ref()</code> called in an internationalized context #loc
instantiating.simpledateformat.without.locale.display.name=Instantiating a SimpleDateFormat without a Locale
instantiating.simpledateformat.without.locale.problem.descriptor=Instantiating a <code>#ref</code> without specifying a Locale in an internationalized context #loc
-string.compareto.call.display.name=Call to 'String.compareTo()'
-string.compareto.call.problem.descriptor=<code>String.#ref()</code> called using internationalized strings #loc
string.concatenation.display.name=String concatenation
string.concatenation.problem.descriptor=String concatenation <code>#ref</code> in an internationalized context #loc
string.concatenation.ignore.system.out.option=Ignore for 'System.out.print' arguments
ignore.in.annotations=Ignore in annotations
ignore.in.tostring=Ignore inside toString() methods
ignore.as.initial.capacity=Ignore initial capacity for StringBuilders and Collections
-string.equalsignorecase.call.display.name=Call to 'String.equalsIgnoreCase()'
-string.equalsignorecase.call.problem.descriptor=<code>String.#ref()</code> using internationalized strings #loc
-string.equals.call.display.name=Call to 'String.equals()'
-string.equals.call.problem.descriptor=<code>String.#ref()</code> using internationalized strings #loc
string.touppercase.tolowercase.without.locale.display.name=Call to 'String.toUpperCase()' or 'toLowerCase()' without a Locale
string.touppercase.tolowercase.without.locale.problem.descriptor=<code>String.#ref()</code> called without specifying a Locale using internationalized strings #loc
use.stringtokenizer.display.name=Use of StringTokenizer
junit5.assertions.converter.display.name=Obsolete assertions in JUnit 5 tests
junit5.converter.display.name=JUnit4 test can be JUnit5
junit5.converter.fix.name=Migrate to JUnit5
+call.to.suspicious.string.method.display.name=Call to suspicious String method
+call.to.suspicious.string.method.problem.descriptor=<code>String.#ref()</code> called in internationalized context #loc
/*
- * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers
+ * Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import com.siyeh.ig.DelegatingFix;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.MethodCallUtils;
-import com.siyeh.ig.psiutils.TypeUtils;
+import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
-public class StringEqualsInspection extends BaseInspection {
+/**
+ * @author Bas Leijdekkers
+ */
+public class CallToSuspiciousStringMethodInspection extends BaseInspection {
- @Override
+ @Nls
@NotNull
- public String getID() {
- return "CallToStringEquals";
+ @Override
+ public String getDisplayName() {
+ return InspectionGadgetsBundle.message("call.to.suspicious.string.method.display.name");
}
- @Override
@NotNull
- public String getDisplayName() {
- return InspectionGadgetsBundle.message(
- "string.equals.call.display.name");
+ @Override
+ protected String buildErrorString(Object... infos) {
+ return InspectionGadgetsBundle.message("call.to.suspicious.string.method.problem.descriptor");
}
@Override
- @NotNull
- public String buildErrorString(Object... infos) {
- return InspectionGadgetsBundle.message(
- "string.equals.call.problem.descriptor");
+ public BaseInspectionVisitor buildVisitor() {
+ return new CallToSuspiciousStringMethodVisitor();
}
@Override
@NotNull
protected InspectionGadgetsFix[] buildFixes(Object... infos) {
- final PsiMethodCallExpression methodCallExpression =
- (PsiMethodCallExpression)infos[0];
- final List<InspectionGadgetsFix> result = new ArrayList();
- final PsiReferenceExpression methodExpression =
- methodCallExpression.getMethodExpression();
- final PsiModifierListOwner annotatableQualifier =
- NonNlsUtils.getAnnotatableQualifier(
- methodExpression);
+ final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)infos[0];
+ final List<InspectionGadgetsFix> result = new ArrayList<>();
+ final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression();
+ final PsiModifierListOwner annotatableQualifier = NonNlsUtils.getAnnotatableQualifier(methodExpression);
if (annotatableQualifier != null) {
final InspectionGadgetsFix fix =
- createAddAnnotationFix(annotatableQualifier);
+ new DelegatingFix(new AddAnnotationPsiFix(AnnotationUtil.NON_NLS, annotatableQualifier, PsiNameValuePair.EMPTY_ARRAY));
result.add(fix);
}
- final PsiModifierListOwner annotatableArgument =
- NonNlsUtils.getAnnotatableArgument(
- methodCallExpression);
+ final PsiModifierListOwner annotatableArgument = NonNlsUtils.getAnnotatableArgument(methodCallExpression);
if (annotatableArgument != null) {
final InspectionGadgetsFix fix =
- createAddAnnotationFix(annotatableArgument);
+ new DelegatingFix(new AddAnnotationPsiFix(AnnotationUtil.NON_NLS, annotatableArgument, PsiNameValuePair.EMPTY_ARRAY));
result.add(fix);
}
return result.toArray(new InspectionGadgetsFix[result.size()]);
}
- private static DelegatingFix createAddAnnotationFix(PsiModifierListOwner annotatableQualifier) {
- return new DelegatingFix(new AddAnnotationPsiFix(
- AnnotationUtil.NON_NLS, annotatableQualifier,PsiNameValuePair.EMPTY_ARRAY));
- }
-
- @Override
- public BaseInspectionVisitor buildVisitor() {
- return new StringEqualsVisitor();
- }
-
- private static class StringEqualsVisitor extends BaseInspectionVisitor {
+ private static class CallToSuspiciousStringMethodVisitor extends BaseInspectionVisitor {
@Override
- public void visitMethodCallExpression(
- @NotNull PsiMethodCallExpression expression) {
- super.visitMethodCallExpression(expression);
- if (!MethodCallUtils.isEqualsCall(expression)) {
+ public void visitMethodCallExpression(PsiMethodCallExpression expression) {
+ if (!MethodCallUtils.isEqualsCall(expression) &&
+ !MethodCallUtils.isEqualsIgnoreCaseCall(expression) &&
+ !MethodCallUtils.isCompareToCall(expression) &&
+ !MethodCallUtils.isCompareToIgnoreCaseCall(expression)) {
return;
}
final PsiMethod method = expression.resolveMethod();
if (method == null) {
return;
}
- final PsiParameterList paramList = method.getParameterList();
- final PsiParameter[] parameters = paramList.getParameters();
- final PsiType parameterType = parameters[0].getType();
- if (!TypeUtils.isJavaLangObject(parameterType)) {
- return;
- }
final PsiClass aClass = method.getContainingClass();
if (aClass == null) {
return;
if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) {
return;
}
- final PsiReferenceExpression methodExpression =
- expression.getMethodExpression();
- final PsiExpression qualifier =
- methodExpression.getQualifierExpression();
+
+ final PsiReferenceExpression methodExpression = expression.getMethodExpression();
+ final PsiExpression qualifier = methodExpression.getQualifierExpression();
if (NonNlsUtils.isNonNlsAnnotated(qualifier)) {
return;
}
final PsiExpressionList argumentList = expression.getArgumentList();
final PsiExpression[] arguments = argumentList.getExpressions();
- if (arguments.length != 1) {
- return;
- }
- if (NonNlsUtils.isNonNlsAnnotated(arguments[0])) {
+ if (arguments.length != 1 || NonNlsUtils.isNonNlsAnnotated(arguments[0])) {
return;
}
registerMethodCallError(expression, expression);
}
}
-}
\ No newline at end of file
+}
--- /dev/null
+/*
+ * Copyright 2000-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.siyeh.ig.internationalization;
+
+import com.intellij.codeInspection.ex.InspectionElementsMerger;
+
+/**
+ * @author Bas Leijdekkers
+ */
+public class CallToSuspiciousStringMethodInspectionMerger extends InspectionElementsMerger {
+
+ @Override
+ public String getMergedToolName() {
+ return "CallToSuspiciousStringMethod";
+ }
+
+ @Override
+ public String[] getSourceToolNames() {
+ return new String[] {
+ "StringEquals",
+ "StringEqualsIgnoreCase",
+ "StringCompareTo"
+ };
+ }
+
+ @Override
+ public String[] getSuppressIds() {
+ return new String[] {
+ "CallToStringEquals",
+ "CallToStringEqualsIgnoreCase",
+ "CallToStringCompareTo"
+ };
+ }
+}
/*
- * Copyright 2007-2015 Bas Leijdekkers
+ * Copyright 2007-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.
import com.siyeh.ig.psiutils.MethodUtils;
import org.jetbrains.annotations.Nullable;
-public class NonNlsUtils {
+class NonNlsUtils {
- private static final Key<Boolean> KEY = new Key("IG_NON_NLS_ANNOTATED_USE");
+ private static final Key<Boolean> KEY = new Key<>("IG_NON_NLS_ANNOTATED_USE");
private NonNlsUtils() {
}
+++ /dev/null
-/*
- * Copyright 2003-2010 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.siyeh.ig.internationalization;
-
-import com.intellij.codeInsight.AnnotationUtil;
-import com.intellij.codeInsight.intention.AddAnnotationPsiFix;
-import com.intellij.psi.*;
-import com.siyeh.HardcodedMethodConstants;
-import com.siyeh.InspectionGadgetsBundle;
-import com.siyeh.ig.BaseInspection;
-import com.siyeh.ig.BaseInspectionVisitor;
-import com.siyeh.ig.DelegatingFix;
-import com.siyeh.ig.InspectionGadgetsFix;
-import com.siyeh.ig.psiutils.MethodUtils;
-import com.siyeh.ig.psiutils.TypeUtils;
-import org.intellij.lang.annotations.Pattern;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class StringCompareToInspection extends BaseInspection {
-
- @Pattern(VALID_ID_PATTERN)
- @Override
- @NotNull
- public String getID() {
- return "CallToStringCompareTo";
- }
-
- @Override
- @NotNull
- public String getDisplayName() {
- return InspectionGadgetsBundle.message(
- "string.compareto.call.display.name");
- }
-
- @Override
- @NotNull
- public String buildErrorString(Object... infos) {
- return InspectionGadgetsBundle.message(
- "string.compareto.call.problem.descriptor");
- }
-
- @Override
- @NotNull
- protected InspectionGadgetsFix[] buildFixes(Object... infos) {
- final PsiMethodCallExpression methodCallExpression =
- (PsiMethodCallExpression)infos[0];
- final List<InspectionGadgetsFix> result = new ArrayList<>();
- final PsiReferenceExpression methodExpression =
- methodCallExpression.getMethodExpression();
- final PsiModifierListOwner annotatableQualifier =
- NonNlsUtils.getAnnotatableQualifier(
- methodExpression);
- if (annotatableQualifier != null) {
- final InspectionGadgetsFix fix = new DelegatingFix(
- new AddAnnotationPsiFix(AnnotationUtil.NON_NLS,
- annotatableQualifier,PsiNameValuePair.EMPTY_ARRAY));
- result.add(fix);
- }
- final PsiModifierListOwner annotatableArgument =
- NonNlsUtils.getAnnotatableArgument(
- methodCallExpression);
- if (annotatableArgument != null) {
- final InspectionGadgetsFix fix = new DelegatingFix(
- new AddAnnotationPsiFix(AnnotationUtil.NON_NLS,
- annotatableArgument,PsiNameValuePair.EMPTY_ARRAY));
- result.add(fix);
- }
- return result.toArray(new InspectionGadgetsFix[result.size()]);
- }
-
- @Override
- public BaseInspectionVisitor buildVisitor() {
- return new StringCompareToVisitor();
- }
-
- private static class StringCompareToVisitor extends BaseInspectionVisitor {
-
- @Override
- public void visitMethodCallExpression(
- @NotNull PsiMethodCallExpression expression) {
- super.visitMethodCallExpression(expression);
- if (!isStringCompareTo(expression)) {
- return;
- }
- final PsiReferenceExpression methodExpression =
- expression.getMethodExpression();
- final PsiExpression qualifier =
- methodExpression.getQualifierExpression();
- if (NonNlsUtils.isNonNlsAnnotated(qualifier)) {
- return;
- }
- final PsiExpressionList argumentList = expression.getArgumentList();
- final PsiExpression[] arguments = argumentList.getExpressions();
- if (arguments.length != 1) {
- return;
- }
- if (NonNlsUtils.isNonNlsAnnotated(arguments[0])) {
- return;
- }
- registerMethodCallError(expression, expression);
- }
-
- private static boolean isStringCompareTo(
- PsiMethodCallExpression expression) {
- final PsiReferenceExpression methodExpression =
- expression.getMethodExpression();
- final String name = methodExpression.getReferenceName();
- if (!HardcodedMethodConstants.COMPARE_TO.equals(name)) {
- return false;
- }
- final PsiMethod method = expression.resolveMethod();
- if (!MethodUtils.isCompareTo(method)) {
- return false;
- }
- final PsiParameterList parameterList = method.getParameterList();
- final PsiParameter[] parameters = parameterList.getParameters();
- final PsiType parameterType = parameters[0].getType();
- if (!TypeUtils.isJavaLangObject(parameterType) &&
- !TypeUtils.isJavaLangString(parameterType)) {
- return false;
- }
- final PsiClass aClass = method.getContainingClass();
- if (aClass == null) {
- return false;
- }
- final String className = aClass.getQualifiedName();
- return CommonClassNames.JAVA_LANG_STRING.equals(className);
- }
- }
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright 2003-2010 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.siyeh.ig.internationalization;
-
-import com.intellij.codeInsight.AnnotationUtil;
-import com.intellij.codeInsight.intention.AddAnnotationPsiFix;
-import com.intellij.psi.*;
-import com.siyeh.HardcodedMethodConstants;
-import com.siyeh.InspectionGadgetsBundle;
-import com.siyeh.ig.BaseInspection;
-import com.siyeh.ig.BaseInspectionVisitor;
-import com.siyeh.ig.DelegatingFix;
-import com.siyeh.ig.InspectionGadgetsFix;
-import com.siyeh.ig.psiutils.TypeUtils;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class StringEqualsIgnoreCaseInspection extends BaseInspection {
-
- @Override
- @NotNull
- public String getID() {
- return "CallToStringEqualsIgnoreCase";
- }
-
- @Override
- @NotNull
- public String getDisplayName() {
- return InspectionGadgetsBundle.message(
- "string.equalsignorecase.call.display.name");
- }
-
- @Override
- @NotNull
- public String buildErrorString(Object... infos) {
- return InspectionGadgetsBundle.message(
- "string.equalsignorecase.call.problem.descriptor");
- }
-
- @Override
- @NotNull
- protected InspectionGadgetsFix[] buildFixes(Object... infos) {
- final PsiMethodCallExpression methodCallExpression =
- (PsiMethodCallExpression)infos[0];
- final List<InspectionGadgetsFix> result = new ArrayList();
- final PsiReferenceExpression methodExpression =
- methodCallExpression.getMethodExpression();
- final PsiModifierListOwner annotatableQualifier =
- NonNlsUtils.getAnnotatableQualifier(methodExpression);
- if (annotatableQualifier != null) {
- final InspectionGadgetsFix fix =
- createAddAnnotationFix(annotatableQualifier);
- result.add(fix);
- }
- final PsiModifierListOwner annotatableArgument =
- NonNlsUtils.getAnnotatableArgument(
- methodCallExpression);
- if (annotatableArgument != null) {
- final InspectionGadgetsFix fix =
- createAddAnnotationFix(annotatableArgument);
- result.add(fix);
- }
- return result.toArray(new InspectionGadgetsFix[result.size()]);
- }
-
- private static DelegatingFix createAddAnnotationFix(PsiModifierListOwner annotatableQualifier) {
- return new DelegatingFix(new AddAnnotationPsiFix(
- AnnotationUtil.NON_NLS, annotatableQualifier,PsiNameValuePair.EMPTY_ARRAY));
- }
-
- @Override
- public BaseInspectionVisitor buildVisitor() {
- return new StringEqualsIgnoreCaseVisitor();
- }
-
- private static class StringEqualsIgnoreCaseVisitor
- extends BaseInspectionVisitor {
-
- @Override
- public void visitMethodCallExpression(
- @NotNull PsiMethodCallExpression expression) {
- super.visitMethodCallExpression(expression);
- final PsiReferenceExpression methodExpression =
- expression.getMethodExpression();
- final String methodName = methodExpression.getReferenceName();
- if (!HardcodedMethodConstants.EQUALS_IGNORE_CASE.equals(
- methodName)) {
- return;
- }
- final PsiMethod method = expression.resolveMethod();
- if (method == null) {
- return;
- }
- final PsiParameterList parameterList = method.getParameterList();
- if (parameterList.getParametersCount() != 1) {
- return;
- }
- final PsiParameter[] parameters = parameterList.getParameters();
- final PsiType parameterType = parameters[0].getType();
- if (!TypeUtils.isJavaLangString(parameterType)) {
- return;
- }
- final PsiClass aClass = method.getContainingClass();
- if (aClass == null) {
- return;
- }
- final String className = aClass.getQualifiedName();
- if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) {
- return;
- }
- final PsiExpression qualifier =
- methodExpression.getQualifierExpression();
- if (NonNlsUtils.isNonNlsAnnotated(qualifier)) {
- return;
- }
- final PsiExpressionList argumentList = expression.getArgumentList();
- final PsiExpression[] arguments = argumentList.getExpressions();
- if (arguments.length != 1) {
- return;
- }
- if (NonNlsUtils.isNonNlsAnnotated(arguments[0])) {
- return;
- }
- registerMethodCallError(expression, expression);
- }
- }
-}
\ No newline at end of file
--- /dev/null
+<html>
+<body>
+Reports any call of <b>equals()</b>, <b>equalsIgnoreCase()</b>, <b>compareTo()</b> or <b>compareToIgnoreCase()</b> on <b>String</b> objects.
+Such calls are usually incorrect in an internationalized environment.
+<!-- tooltip end -->
+<p>
+
+</body>
+</html>
\ No newline at end of file
+++ /dev/null
-<html>
-<body>
-Reports any call of <b>compareTo()</b> on <b>String</b> objects. Such calls are usually
-incorrect in an internationalized environment.
-<!-- tooltip end -->
-<p>
-
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<html>
-<body>
-Reports any call of <b>equals()</b> on <b>String</b> objects. Such calls are usually
-incorrect in an internationalized environment.
-<!-- tooltip end -->
-<p>
-
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-<html>
-<body>
-Reports any call of <b>equalsIgnoreCase()</b> on <b>String</b> objects. Such calls are usually
-incorrect in an internationalized environment.
-<!-- tooltip end -->
-<p>
-
-</body>
-</html>
\ No newline at end of file
+++ /dev/null
-package com.siyeh.igtest.internationalization;
-
-public class StringCompareToInspection
-{
- public StringCompareToInspection()
- {
- }
-
- public void foo()
- {
- "foo".compareTo("bar");
- }
-}
\ No newline at end of file
+++ /dev/null
-package com.siyeh.igtest.internationalization;
-
-public class StringEqualsIgnoreCaseInspection
-{
- public StringEqualsIgnoreCaseInspection()
- {
- }
-
- public void foo()
- {
- "foo".equalsIgnoreCase("bar");
- }
-}
\ No newline at end of file
+++ /dev/null
-package com.siyeh.igtest.internationalization;
-
-public class StringEqualsInspection
-{
- public StringEqualsInspection()
- {
- }
-
- public void foo()
- {
- "foo".equals("bar");
- }
-}
\ No newline at end of file
--- /dev/null
+class CallToSuspiciousStringMethod {
+
+ void m(String a, String b) {
+ a.<warning descr="'String.equals()' called in internationalized context">equals</warning>(b);
+ a.<warning descr="'String.equalsIgnoreCase()' called in internationalized context">equalsIgnoreCase</warning>(b);
+ a.<warning descr="'String.compareTo()' called in internationalized context">compareTo</warning>(b);
+ a.<warning descr="'String.compareToIgnoreCase()' called in internationalized context">compareToIgnoreCase</warning>(b);
+ }
+
+ @SuppressWarnings({"CallToStringCompareTo", "CallToStringEquals", "CallToStringEqualsIgnoreCase"})
+ void n(String a, String b) {
+ a.equals(b);
+ a.equalsIgnoreCase(b);
+ a.compareTo(b);
+ //noinspection CallToSuspiciousStringMethod
+ a.compareToIgnoreCase(b);
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright 2000-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.siyeh.ig.internationalization;
+
+import com.intellij.codeInspection.InspectionProfileEntry;
+import com.siyeh.ig.LightInspectionTestCase;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Bas Leijdekkers
+ */
+public class CallToSuspiciousStringMethodInspectionTest extends LightInspectionTestCase {
+
+ public void testCallToSuspiciousStringMethod() {
+ doTest();
+ }
+
+ @Nullable
+ @Override
+ protected InspectionProfileEntry getInspection() {
+ return new CallToSuspiciousStringMethodInspection();
+ }
+}
\ No newline at end of file