From c0c1dee9e6495dc07d4b32580496e4b30b3801f2 Mon Sep 17 00:00:00 2001 From: Timo von Holtz Date: Fri, 10 Sep 2021 13:32:35 +0200 Subject: [PATCH] Use better implementation of hashCode when available --- sum_data_types_generator/lib/common.dart | 37 ++++++++++++------- .../lib/data_classes.dart | 2 +- sum_data_types_generator/lib/sum_types.dart | 2 +- sum_data_types_generator/pubspec.yaml | 9 +++-- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/sum_data_types_generator/lib/common.dart b/sum_data_types_generator/lib/common.dart index 53e1559..171c3a6 100644 --- a/sum_data_types_generator/lib/common.dart +++ b/sum_data_types_generator/lib/common.dart @@ -2,6 +2,7 @@ import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:meta/meta.dart'; +import 'package:pub_semver/pub_semver.dart'; import 'package:source_gen/source_gen.dart'; import 'package:sum_data_types/sum_data_types.dart'; @@ -167,11 +168,13 @@ class CodgenConfig { final bool genToString; final bool genEqHashCode; final bool nnbd; + final bool hashCodeImpl; const CodgenConfig({ bool? toString, bool? eqHashCode, required this.nnbd, + required this.hashCodeImpl, }) : genToString = toString ?? true, genEqHashCode = eqHashCode ?? true; } @@ -217,6 +220,7 @@ class CommonClassModel { toString: genToString, eqHashCode: genEqHashCode, nnbd: lib.featureSet.isEnabled(Feature.non_nullable), + hashCodeImpl: lib.languageVersion.effective >= Version(2, 14,0), ); final mixinName = clazz.name; @@ -281,19 +285,26 @@ String eqImpl(String className, List fieldNames) { }'''; } -String hashCodeImpl(List fieldNames) { - if (fieldNames.isEmpty) { +String hashCodeImpl(CodgenConfig config, List fieldNames) { + if (config.hashCodeImpl) { + final updates = fieldNames.map((name) => 'this.$name,').join(); + return '''@override + int get hashCode => Object.hashAll([$updates]); + '''; + } else { + if (fieldNames.isEmpty) { + return '''@override + int get hashCode => 0; + '''; + } + const result = r'__result$'; + final updates = + fieldNames.map((name) => '$result = 37 * $result + this.$name.hashCode;').join('\n'); return '''@override - int get hashCode => 0; - '''; + int get hashCode { + var $result = 17; + $updates + return $result; + }'''; } - const result = r'__result$'; - final updates = - fieldNames.map((name) => '$result = 37 * $result + this.$name.hashCode;').join('\n'); - return '''@override - int get hashCode { - var $result = 17; - $updates - return $result; - }'''; } diff --git a/sum_data_types_generator/lib/data_classes.dart b/sum_data_types_generator/lib/data_classes.dart index 037a773..22329f6 100644 --- a/sum_data_types_generator/lib/data_classes.dart +++ b/sum_data_types_generator/lib/data_classes.dart @@ -220,7 +220,7 @@ class DataClassGenerator extends GeneratorForAnnotation { ${clazz.config.genEqHashCode ? eqImpl(clazz.className, clazz.fieldNames) : ''} - ${clazz.config.genEqHashCode ? hashCodeImpl(clazz.fieldNames) : ''} + ${clazz.config.genEqHashCode ? hashCodeImpl(clazz.config, clazz.fieldNames) : ''} ${clazz.config.genToString ? toStringMethod : ''} }'''; diff --git a/sum_data_types_generator/lib/sum_types.dart b/sum_data_types_generator/lib/sum_types.dart index 52bfaaf..160a5d4 100644 --- a/sum_data_types_generator/lib/sum_types.dart +++ b/sum_data_types_generator/lib/sum_types.dart @@ -290,7 +290,7 @@ class SumTypeGenerator extends GeneratorForAnnotation { ${clazz.config.genEqHashCode ? eqImpl(clazz.className, clazz.internalFieldNames) : ''} - ${clazz.config.genEqHashCode ? hashCodeImpl(clazz.internalFieldNames) : ''} + ${clazz.config.genEqHashCode ? hashCodeImpl(clazz.config, clazz.internalFieldNames) : ''} ${clazz.config.genToString ? toStringMethod : ''} } diff --git a/sum_data_types_generator/pubspec.yaml b/sum_data_types_generator/pubspec.yaml index 9f15e70..96d9530 100644 --- a/sum_data_types_generator/pubspec.yaml +++ b/sum_data_types_generator/pubspec.yaml @@ -7,12 +7,13 @@ environment: sdk: '>=2.12.0 <3.0.0' dependencies: - analyzer: ^1.3.0 - pedantic: ^1.8.0 + analyzer: ^2.2.0 build: ^2.0.0 meta: ^1.1.7 - sum_data_types: ^0.1.1 + pedantic: ^1.8.0 + pub_semver: ^2.0.0 source_gen: ^1.0.0 + sum_data_types: ^0.1.1 dev_dependencies: - build_runner: ^1.12.2 + build_runner: ^2.1.2