From d5d11703dd7bcdeab9fa1e7a99fa2ae48a9d7fde Mon Sep 17 00:00:00 2001 From: David Martos Date: Tue, 18 Apr 2023 14:23:15 +0200 Subject: [PATCH 1/8] Fix unrelated_type_equality_checks when comparing enums --- lib/src/util/dart_type_utilities.dart | 9 ++++++++- test_data/rules/unrelated_type_equality_checks.dart | 10 ++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart index c6987bbb1..5dafaa50e 100644 --- a/lib/src/util/dart_type_utilities.dart +++ b/lib/src/util/dart_type_utilities.dart @@ -288,8 +288,15 @@ extension on TypeSystem { // Otherwise, they might be related. return false; } else { + var sameSupertypes = leftElement.supertype == rightElement.supertype; + + // Unrelated enums have Object as supertype so they need to be checked separately . + if (sameSupertypes && leftElement is EnumElement) { + return true; + } + return (leftElement.supertype?.isDartCoreObject ?? false) || - leftElement.supertype != rightElement.supertype; + !sameSupertypes; } } } diff --git a/test_data/rules/unrelated_type_equality_checks.dart b/test_data/rules/unrelated_type_equality_checks.dart index 012475b5c..992e7c21d 100644 --- a/test_data/rules/unrelated_type_equality_checks.dart +++ b/test_data/rules/unrelated_type_equality_checks.dart @@ -178,6 +178,13 @@ void function30() { if (c.determinant == callable2) print('someFunction30'); // OK } +void function31() { + var x = EnumOpKind1.delete; + if (x == EnumOpKind1.delete) print('delete'); // OK + if (x == EnumOpKind2.delete) print('delete'); // LINT + if (x == 'delete') print('delete'); // LINT +} + class ClassBase {} class DerivedClass1 extends ClassBase {} @@ -203,3 +210,6 @@ class ClassWCall { } class SubClassWCall extends ClassWCall {} + +enum EnumOpKind1 { insert, update, delete } +enum EnumOpKind2 { upsert, delete } \ No newline at end of file From 6f2cf894738c0a985a8b7ae980b5284e375fe600 Mon Sep 17 00:00:00 2001 From: David Martos Date: Tue, 18 Apr 2023 14:27:07 +0200 Subject: [PATCH 2/8] format --- lib/src/util/dart_type_utilities.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart index 5dafaa50e..78596ea95 100644 --- a/lib/src/util/dart_type_utilities.dart +++ b/lib/src/util/dart_type_utilities.dart @@ -289,7 +289,7 @@ extension on TypeSystem { return false; } else { var sameSupertypes = leftElement.supertype == rightElement.supertype; - + // Unrelated enums have Object as supertype so they need to be checked separately . if (sameSupertypes && leftElement is EnumElement) { return true; From 5ecde1e91f915b9f135326b5eafc41b312187413 Mon Sep 17 00:00:00 2001 From: David Martos Date: Tue, 18 Apr 2023 15:50:39 +0200 Subject: [PATCH 3/8] Fix Mixin --- lib/src/util/dart_type_utilities.dart | 5 +++-- test_data/rules/unrelated_type_equality_checks.dart | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart index 78596ea95..1aba66fde 100644 --- a/lib/src/util/dart_type_utilities.dart +++ b/lib/src/util/dart_type_utilities.dart @@ -290,8 +290,9 @@ extension on TypeSystem { } else { var sameSupertypes = leftElement.supertype == rightElement.supertype; - // Unrelated enums have Object as supertype so they need to be checked separately . - if (sameSupertypes && leftElement is EnumElement) { + // Unrelated Enums or Mixins have the same supertype, but they are not the same element, so + // they are unrelated. + if (true && (leftElement is EnumElement || leftElement is MixinElement)) { return true; } diff --git a/test_data/rules/unrelated_type_equality_checks.dart b/test_data/rules/unrelated_type_equality_checks.dart index 992e7c21d..5bd4a9e2d 100644 --- a/test_data/rules/unrelated_type_equality_checks.dart +++ b/test_data/rules/unrelated_type_equality_checks.dart @@ -185,12 +185,18 @@ void function31() { if (x == 'delete') print('delete'); // LINT } +void someFunction32(Mixin m1, Mixin2 m2) { + if (m1 == m2) print('someFunction32'); // LINT +} + class ClassBase {} class DerivedClass1 extends ClassBase {} mixin Mixin {} +mixin Mixin2 {} + class DerivedClass2 extends ClassBase with Mixin {} class DerivedClass3 extends ClassBase implements Mixin {} From 538f4c7499c86ee145823fd07273f0a434165e99 Mon Sep 17 00:00:00 2001 From: David Martos Date: Tue, 18 Apr 2023 15:52:38 +0200 Subject: [PATCH 4/8] add test case --- test_data/rules/unrelated_type_equality_checks.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/test_data/rules/unrelated_type_equality_checks.dart b/test_data/rules/unrelated_type_equality_checks.dart index 5bd4a9e2d..4443779bd 100644 --- a/test_data/rules/unrelated_type_equality_checks.dart +++ b/test_data/rules/unrelated_type_equality_checks.dart @@ -186,6 +186,7 @@ void function31() { } void someFunction32(Mixin m1, Mixin2 m2) { + if (m1 == m1) print('someFunction32'); // OK if (m1 == m2) print('someFunction32'); // LINT } From 5d51edf1d2b5abdf14d486cca9cc0c31baf677e5 Mon Sep 17 00:00:00 2001 From: David Martos Date: Tue, 18 Apr 2023 17:43:36 +0200 Subject: [PATCH 5/8] remove true && --- lib/src/util/dart_type_utilities.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart index 1aba66fde..6620ae52f 100644 --- a/lib/src/util/dart_type_utilities.dart +++ b/lib/src/util/dart_type_utilities.dart @@ -292,7 +292,7 @@ extension on TypeSystem { // Unrelated Enums or Mixins have the same supertype, but they are not the same element, so // they are unrelated. - if (true && (leftElement is EnumElement || leftElement is MixinElement)) { + if (sameSupertypes && (leftElement is EnumElement || leftElement is MixinElement)) { return true; } From e770cb22f7d0a0518d1dc730fcab2ecaf8047674 Mon Sep 17 00:00:00 2001 From: David Martos Date: Tue, 18 Apr 2023 23:01:25 +0200 Subject: [PATCH 6/8] add more test cases --- .../rules/unrelated_type_equality_checks.dart | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/test_data/rules/unrelated_type_equality_checks.dart b/test_data/rules/unrelated_type_equality_checks.dart index 4443779bd..367bab00f 100644 --- a/test_data/rules/unrelated_type_equality_checks.dart +++ b/test_data/rules/unrelated_type_equality_checks.dart @@ -167,7 +167,7 @@ void function23() { } void function30() { - ClassWMethod c = ClassWMethod(); + ClassWMethod c = ClassWMethod(); if (c.determinant == 0.0) print('someFunction30'); // LINT if (c.determinant == double) print('someFunction30'); // LINT if (c.determinant == c.determinspider) print('someFunction30'); // OK @@ -181,11 +181,22 @@ void function30() { void function31() { var x = EnumOpKind1.delete; if (x == EnumOpKind1.delete) print('delete'); // OK + if (x == EnumOpKind1.update) print('update'); // OK if (x == EnumOpKind2.delete) print('delete'); // LINT if (x == 'delete') print('delete'); // LINT } -void someFunction32(Mixin m1, Mixin2 m2) { +void function32() { + var x = EnumImplements.a; + if (x == EnumImplements.a) print('a'); // OK + if (x == EnumImplements.b) print('b'); // OK + if (x == EnumMixin.b) print('b'); // LINT + + var y = EnumMixin.a; + if (y == EnumImplements.a) print('a'); // LINT +} + +void someFunction33(Mixin m1, Mixin2 m2) { if (m1 == m1) print('someFunction32'); // OK if (m1 == m2) print('someFunction32'); // LINT } @@ -219,4 +230,9 @@ class ClassWCall { class SubClassWCall extends ClassWCall {} enum EnumOpKind1 { insert, update, delete } -enum EnumOpKind2 { upsert, delete } \ No newline at end of file + +enum EnumOpKind2 { upsert, delete } + +enum EnumImplements implements ClassBase { a, b, c } + +enum EnumMixin with Mixin { a, b, c } From 7b51224086a977dbd84c265013dc742987ceaad3 Mon Sep 17 00:00:00 2001 From: David Martos Date: Tue, 18 Apr 2023 23:55:15 +0200 Subject: [PATCH 7/8] format --- lib/src/util/dart_type_utilities.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart index 6620ae52f..dd4994ef5 100644 --- a/lib/src/util/dart_type_utilities.dart +++ b/lib/src/util/dart_type_utilities.dart @@ -292,7 +292,8 @@ extension on TypeSystem { // Unrelated Enums or Mixins have the same supertype, but they are not the same element, so // they are unrelated. - if (sameSupertypes && (leftElement is EnumElement || leftElement is MixinElement)) { + if (sameSupertypes && + (leftElement is EnumElement || leftElement is MixinElement)) { return true; } From c73c127d044511a8ec511404340bce841fe39891 Mon Sep 17 00:00:00 2001 From: David Martos Date: Wed, 19 Apr 2023 00:06:39 +0200 Subject: [PATCH 8/8] remove mixin logic --- lib/src/util/dart_type_utilities.dart | 5 ++--- test_data/rules/unrelated_type_equality_checks.dart | 7 ------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/src/util/dart_type_utilities.dart b/lib/src/util/dart_type_utilities.dart index dd4994ef5..15f10738b 100644 --- a/lib/src/util/dart_type_utilities.dart +++ b/lib/src/util/dart_type_utilities.dart @@ -290,10 +290,9 @@ extension on TypeSystem { } else { var sameSupertypes = leftElement.supertype == rightElement.supertype; - // Unrelated Enums or Mixins have the same supertype, but they are not the same element, so + // Unrelated Enums have the same supertype, but they are not the same element, so // they are unrelated. - if (sameSupertypes && - (leftElement is EnumElement || leftElement is MixinElement)) { + if (sameSupertypes && leftElement is EnumElement) { return true; } diff --git a/test_data/rules/unrelated_type_equality_checks.dart b/test_data/rules/unrelated_type_equality_checks.dart index 367bab00f..c0dfdc516 100644 --- a/test_data/rules/unrelated_type_equality_checks.dart +++ b/test_data/rules/unrelated_type_equality_checks.dart @@ -196,19 +196,12 @@ void function32() { if (y == EnumImplements.a) print('a'); // LINT } -void someFunction33(Mixin m1, Mixin2 m2) { - if (m1 == m1) print('someFunction32'); // OK - if (m1 == m2) print('someFunction32'); // LINT -} - class ClassBase {} class DerivedClass1 extends ClassBase {} mixin Mixin {} -mixin Mixin2 {} - class DerivedClass2 extends ClassBase with Mixin {} class DerivedClass3 extends ClassBase implements Mixin {}