diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index f670c15af41..92da75bc49c 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -3389,6 +3389,15 @@ language="kotlin" /> + + diff --git a/idea/resources/inspectionDescriptions/KotlinEqualsBetweenInconvertibleTypes.html b/idea/resources/inspectionDescriptions/KotlinEqualsBetweenInconvertibleTypes.html new file mode 100644 index 00000000000..794e3f4a930 --- /dev/null +++ b/idea/resources/inspectionDescriptions/KotlinEqualsBetweenInconvertibleTypes.html @@ -0,0 +1,5 @@ + + +This inspection reports equals() between objects of inconvertible primitive / enum / string types. + + \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinEqualsBetweenInconvertibleTypesInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinEqualsBetweenInconvertibleTypesInspection.kt new file mode 100644 index 00000000000..f002be94526 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinEqualsBetweenInconvertibleTypesInspection.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.inspections + +import com.intellij.codeInspection.ProblemsHolder +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.callExpressionVisitor +import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.typeUtil.isEnum +import org.jetbrains.kotlin.types.typeUtil.makeNotNullable +import org.jetbrains.kotlin.util.OperatorNameConventions + +class KotlinEqualsBetweenInconvertibleTypesInspection : AbstractKotlinInspection() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean) = callExpressionVisitor(fun(call) { + val callee = call.calleeExpression as? KtSimpleNameExpression ?: return + val identifier = callee.getReferencedNameAsName() + if (identifier != OperatorNameConventions.EQUALS) return + val receiver = call.getQualifiedExpressionForSelector()?.receiverExpression ?: return + val argument = call.valueArguments.singleOrNull()?.getArgumentExpression() ?: return + if (call.analyze(BodyResolveMode.PARTIAL).isInconvertibleTypes(receiver, argument)) { + holder.registerProblem(callee, "'equals()' between objects of inconvertible types") + } + }) + + companion object { + fun BindingContext.isInconvertibleTypes(expr1: KtExpression?, expr2: KtExpression?): Boolean { + val type1 = expr1?.getTargetType(this) ?: return false + val type2 = expr2?.getTargetType(this) ?: return false + return type1 != type2 + } + + private fun KtExpression.getTargetType(context: BindingContext): KotlinType? { + return context.getType(this)?.takeIf { + KotlinBuiltIns.isPrimitiveTypeOrNullablePrimitiveType(it) || KotlinBuiltIns.isStringOrNullableString(it) || it.isEnum() + }?.makeNotNullable() + } + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt index 494936194bb..f00e00cc78d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.inspections.AbstractApplicabilityBasedInspection +import org.jetbrains.kotlin.idea.inspections.KotlinEqualsBetweenInconvertibleTypesInspection import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.intentions.conventionNameCalls.isAnyEquals import org.jetbrains.kotlin.idea.intentions.isOperatorOrCompatible @@ -155,6 +156,11 @@ class ReplaceCallWithBinaryOperatorInspection : AbstractApplicabilityBasedInspec return when (identifier) { OperatorNameConventions.EQUALS -> { if (!dotQualified.isAnyEquals()) return null + with(KotlinEqualsBetweenInconvertibleTypesInspection) { + val receiver = dotQualified.receiverExpression + val argument = dotQualified.callExpression?.valueArguments?.singleOrNull()?.getArgumentExpression() + if (dotQualified.analyze(BodyResolveMode.PARTIAL).isInconvertibleTypes(receiver, argument)) return null + } val prefixExpression = dotQualified.getWrappingPrefixExpressionIfAny() if (prefixExpression != null && prefixExpression.operationToken == KtTokens.EXCL) KtTokens.EXCLEQ else KtTokens.EQEQ diff --git a/idea/testData/inspectionsLocal/conventionNameCalls/replaceCallWithBinaryOperator/equalsBetweenInconvertibleTypes.kt b/idea/testData/inspectionsLocal/conventionNameCalls/replaceCallWithBinaryOperator/equalsBetweenInconvertibleTypes.kt new file mode 100644 index 00000000000..b11c0309389 --- /dev/null +++ b/idea/testData/inspectionsLocal/conventionNameCalls/replaceCallWithBinaryOperator/equalsBetweenInconvertibleTypes.kt @@ -0,0 +1,3 @@ +// PROBLEM: none + +val x = 2.equals("") \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/.inspection b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/.inspection new file mode 100644 index 00000000000..3c8ce3740ae --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.KotlinEqualsBetweenInconvertibleTypesInspection \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum.kt new file mode 100644 index 00000000000..868c8402870 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum.kt @@ -0,0 +1,8 @@ +// PROBLEM: none + +fun test(x: E1, y: E1): Boolean { + return x.equals(y) +} + +enum class E1 + diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum2.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum2.kt new file mode 100644 index 00000000000..711f36787c6 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum2.kt @@ -0,0 +1,9 @@ +// FIX: none + +fun test(x: E1, y: E2): Boolean { + return x.equals(y) +} + +enum class E1 + +enum class E2 \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqInt.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqInt.kt new file mode 100644 index 00000000000..6b40502047a --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqInt.kt @@ -0,0 +1,7 @@ +// FIX: none + +fun test(x: E1, y: Int): Boolean { + return x.equals(y) +} + +enum class E1 \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqString.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqString.kt new file mode 100644 index 00000000000..7bfca80381e --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqString.kt @@ -0,0 +1,7 @@ +// FIX: none + +fun test(x: E1, y: String): Boolean { + return x.equals(y) +} + +enum class E1 \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqUserType.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqUserType.kt new file mode 100644 index 00000000000..10d63634262 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqUserType.kt @@ -0,0 +1,9 @@ +// PROBLEM: none + +fun test(x: E1, y: Foo): Boolean { + return x.equals(y) +} + +class Foo + +enum class E1 \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqEnum.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqEnum.kt new file mode 100644 index 00000000000..7b4a68cc614 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqEnum.kt @@ -0,0 +1,7 @@ +// FIX: none + +fun test(x: Int, y: E1): Boolean { + return x.equals(y) +} + +enum class E1 \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqInt.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqInt.kt new file mode 100644 index 00000000000..75ea4c94990 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqInt.kt @@ -0,0 +1,5 @@ +// PROBLEM: none + +fun test(x: Int, y: Int): Boolean { + return x.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqLong.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqLong.kt new file mode 100644 index 00000000000..a02372977d6 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqLong.kt @@ -0,0 +1,5 @@ +// FIX: none + +fun test(x: Int, y: Long): Boolean { + return x.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqString.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqString.kt new file mode 100644 index 00000000000..d56f00e3b8c --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqString.kt @@ -0,0 +1,5 @@ +// FIX: none + +fun test(x: Int, y: String): Boolean { + return x.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqUserType.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqUserType.kt new file mode 100644 index 00000000000..779234bcbef --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqUserType.kt @@ -0,0 +1,7 @@ +// PROBLEM: none + +fun test(x: Int, y: Foo): Boolean { + return x.equals(y) +} + +class Foo \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableEnumEqString.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableEnumEqString.kt new file mode 100644 index 00000000000..e8b40b2fdf1 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableEnumEqString.kt @@ -0,0 +1,6 @@ +// FIX: none +enum class E1 + +fun test(x: E1?, y: String): Boolean? { + return x?.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableIntEqString.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableIntEqString.kt new file mode 100644 index 00000000000..49fbf00b4e6 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableIntEqString.kt @@ -0,0 +1,4 @@ +// FIX: none +fun test(x: Int?, y: String): Boolean? { + return x?.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqInt.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqInt.kt new file mode 100644 index 00000000000..fdb2c4af94d --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqInt.kt @@ -0,0 +1,4 @@ +// FIX: none +fun test(x: String?, y: Int): Boolean? { + return x?.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqString.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqString.kt new file mode 100644 index 00000000000..ddb761ebc2f --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqString.kt @@ -0,0 +1,4 @@ +// PROBLEM: none +fun test() { + System.getProperty("some")?.equals("true") +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqEnum.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqEnum.kt new file mode 100644 index 00000000000..f3d8403aad5 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqEnum.kt @@ -0,0 +1,7 @@ +// FIX: none + +fun test(x: String, y: E1): Boolean { + return x.equals(y) +} + +enum class E1 \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqInt.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqInt.kt new file mode 100644 index 00000000000..caac7259221 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqInt.kt @@ -0,0 +1,5 @@ +// FIX: none + +fun test(x: String, y: Int): Boolean { + return x.equals(y) +} diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableEnum.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableEnum.kt new file mode 100644 index 00000000000..c4e39c9ebb7 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableEnum.kt @@ -0,0 +1,6 @@ +// FIX: none +enum class E1 + +fun test(x: String, y: E1?): Boolean? { + return x.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableInt.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableInt.kt new file mode 100644 index 00000000000..937a871f427 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableInt.kt @@ -0,0 +1,4 @@ +// FIX: none +fun test(x: String, y: Int?): Boolean? { + return x.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableString.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableString.kt new file mode 100644 index 00000000000..ce9ad1a9e62 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableString.kt @@ -0,0 +1,4 @@ +// PROBLEM: none +fun test(x: String, y: String?): Boolean? { + return x.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqString.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqString.kt new file mode 100644 index 00000000000..340723f1256 --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqString.kt @@ -0,0 +1,5 @@ +// PROBLEM: none + +fun test(x: String, y: String): Boolean { + return x.equals(y) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqUserType.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqUserType.kt new file mode 100644 index 00000000000..1bce5a660db --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqUserType.kt @@ -0,0 +1,7 @@ +// PROBLEM: none + +fun test(x: String, y: Foo): Boolean { + return x.equals(y) +} + +class Foo \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/userTypeEqInt.kt b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/userTypeEqInt.kt new file mode 100644 index 00000000000..6af6c2cfb4b --- /dev/null +++ b/idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/userTypeEqInt.kt @@ -0,0 +1,7 @@ +// PROBLEM: none + +fun test(x: Foo, y: Int): Boolean { + return x.equals(y) +} + +class Foo \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index ac03d185338..8fbc501bb4e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -2492,6 +2492,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/conventionNameCalls/replaceCallWithBinaryOperator/equals.kt"); } + @TestMetadata("equalsBetweenInconvertibleTypes.kt") + public void testEqualsBetweenInconvertibleTypes() throws Exception { + runTest("idea/testData/inspectionsLocal/conventionNameCalls/replaceCallWithBinaryOperator/equalsBetweenInconvertibleTypes.kt"); + } + @TestMetadata("equalsCompareTo.kt") public void testEqualsCompareTo() throws Exception { runTest("idea/testData/inspectionsLocal/conventionNameCalls/replaceCallWithBinaryOperator/equalsCompareTo.kt"); @@ -3608,6 +3613,129 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class EqualsBetweenInconvertibleTypes extends AbstractLocalInspectionTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInEqualsBetweenInconvertibleTypes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true); + } + + @TestMetadata("enumEqEnum.kt") + public void testEnumEqEnum() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum.kt"); + } + + @TestMetadata("enumEqEnum2.kt") + public void testEnumEqEnum2() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqEnum2.kt"); + } + + @TestMetadata("enumEqInt.kt") + public void testEnumEqInt() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqInt.kt"); + } + + @TestMetadata("enumEqString.kt") + public void testEnumEqString() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqString.kt"); + } + + @TestMetadata("enumEqUserType.kt") + public void testEnumEqUserType() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/enumEqUserType.kt"); + } + + @TestMetadata("intEqEnum.kt") + public void testIntEqEnum() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqEnum.kt"); + } + + @TestMetadata("intEqInt.kt") + public void testIntEqInt() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqInt.kt"); + } + + @TestMetadata("intEqLong.kt") + public void testIntEqLong() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqLong.kt"); + } + + @TestMetadata("intEqString.kt") + public void testIntEqString() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqString.kt"); + } + + @TestMetadata("intEqUserType.kt") + public void testIntEqUserType() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/intEqUserType.kt"); + } + + @TestMetadata("nullableEnumEqString.kt") + public void testNullableEnumEqString() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableEnumEqString.kt"); + } + + @TestMetadata("nullableIntEqString.kt") + public void testNullableIntEqString() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableIntEqString.kt"); + } + + @TestMetadata("nullableStringEqInt.kt") + public void testNullableStringEqInt() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqInt.kt"); + } + + @TestMetadata("nullableStringEqString.kt") + public void testNullableStringEqString() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/nullableStringEqString.kt"); + } + + @TestMetadata("stringEqEnum.kt") + public void testStringEqEnum() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqEnum.kt"); + } + + @TestMetadata("stringEqInt.kt") + public void testStringEqInt() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqInt.kt"); + } + + @TestMetadata("stringEqNullableEnum.kt") + public void testStringEqNullableEnum() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableEnum.kt"); + } + + @TestMetadata("stringEqNullableInt.kt") + public void testStringEqNullableInt() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableInt.kt"); + } + + @TestMetadata("stringEqNullableString.kt") + public void testStringEqNullableString() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqNullableString.kt"); + } + + @TestMetadata("stringEqString.kt") + public void testStringEqString() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqString.kt"); + } + + @TestMetadata("stringEqUserType.kt") + public void testStringEqUserType() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/stringEqUserType.kt"); + } + + @TestMetadata("userTypeEqInt.kt") + public void testUserTypeEqInt() throws Exception { + runTest("idea/testData/inspectionsLocal/equalsBetweenInconvertibleTypes/userTypeEqInt.kt"); + } + } + @TestMetadata("idea/testData/inspectionsLocal/explicitThis") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)