diff --git a/hive_generator/CHANGELOG.md b/hive_generator/CHANGELOG.md index be9e90d6..1aa338e1 100644 --- a/hive_generator/CHANGELOG.md +++ b/hive_generator/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.0 + +- Adds support for Sets + ## 1.2.1 - Fix `analyzer` dependency conflicts with Flutter diff --git a/hive_generator/example/lib/types.dart b/hive_generator/example/lib/types.dart index 4ff1e5cf..72eb8742 100644 --- a/hive_generator/example/lib/types.dart +++ b/hive_generator/example/lib/types.dart @@ -61,3 +61,20 @@ enum Enum1 { class EmptyClass { EmptyClass(); } + +@HiveType(typeId: 5) +class IterableClass { + IterableClass(this.list, this.set, this.nestedList, this.nestedSet); + + @HiveField(0) + final List list; + + @HiveField(1) + final Set set; + + @HiveField(2) + final List> nestedList; + + @HiveField(3) + final Set> nestedSet; +} diff --git a/hive_generator/example/lib/types.g.dart b/hive_generator/example/lib/types.g.dart index 6eaca206..fb559bc3 100644 --- a/hive_generator/example/lib/types.g.dart +++ b/hive_generator/example/lib/types.g.dart @@ -122,6 +122,49 @@ class EmptyClassAdapter extends TypeAdapter { typeId == other.typeId; } +class IterableClassAdapter extends TypeAdapter { + @override + final int typeId = 5; + + @override + IterableClass read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return IterableClass( + (fields[0] as List).cast(), + (fields[1] as Set).cast(), + (fields[2] as List).map((e) => (e as Set).cast()).toList(), + (fields[3] as Set).map((e) => (e as List).cast()).toSet(), + ); + } + + @override + void write(BinaryWriter writer, IterableClass obj) { + writer + ..writeByte(4) + ..writeByte(0) + ..write(obj.list) + ..writeByte(1) + ..write(obj.set) + ..writeByte(2) + ..write(obj.nestedList) + ..writeByte(3) + ..write(obj.nestedSet); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is IterableClassAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + class Enum1Adapter extends TypeAdapter { @override final int typeId = 3; diff --git a/hive_generator/lib/src/class_builder.dart b/hive_generator/lib/src/class_builder.dart index dce37931..3faec4c0 100644 --- a/hive_generator/lib/src/class_builder.dart +++ b/hive_generator/lib/src/class_builder.dart @@ -19,23 +19,23 @@ class ClassBuilder extends Builder { super.setters, ); - /// TODO: Document this! - var hiveListChecker = const TypeChecker.fromRuntime(HiveList); + /// [TypeChecker] for [HiveList]. + final hiveListChecker = const TypeChecker.fromRuntime(HiveList); - /// TODO: Document this! - var listChecker = const TypeChecker.fromRuntime(List); + /// [TypeChecker] for [List]. + final listChecker = const TypeChecker.fromRuntime(List); - /// TODO: Document this! - var mapChecker = const TypeChecker.fromRuntime(Map); + /// [TypeChecker] for [Map]. + final mapChecker = const TypeChecker.fromRuntime(Map); - /// TODO: Document this! - var setChecker = const TypeChecker.fromRuntime(Set); + /// [TypeChecker] for [Set]. + final setChecker = const TypeChecker.fromRuntime(Set); - /// TODO: Document this! - var iterableChecker = const TypeChecker.fromRuntime(Iterable); + /// [TypeChecker] for [Iterable]. + final iterableChecker = const TypeChecker.fromRuntime(Iterable); - /// TODO: Document this! - var uint8ListChecker = const TypeChecker.fromRuntime(Uint8List); + /// [TypeChecker] for [Uint8List]. + final uint8ListChecker = const TypeChecker.fromRuntime(Uint8List); @override String buildRead() { @@ -110,9 +110,10 @@ class ClassBuilder extends Builder { final suffix = _suffixFromType(type); if (hiveListChecker.isAssignableFromType(type)) { return '($variable as HiveList$suffix)$suffix.castHiveList()'; - } else if (iterableChecker.isAssignableFromType(type) && - !isUint8List(type)) { + } else if (listChecker.isAssignableFromType(type) && !isUint8List(type)) { return '($variable as List$suffix)${_castIterable(type)}'; + } else if (setChecker.isAssignableFromType(type)) { + return '($variable as Set$suffix)${_castIterable(type)}'; } else if (mapChecker.isAssignableFromType(type)) { return '($variable as Map$suffix)${_castMap(type)}'; } else if (type.isDartCoreInt) { @@ -148,10 +149,8 @@ class ClassBuilder extends Builder { } else if (setChecker.isAssignableFromType(type)) { cast = '.toSet()'; } - // The suffix is not needed with nnbd on $cast becauuse it short circuits, - // otherwise it is needed. - final castWithSuffix = isLibraryNNBD(cls) ? cast : '$suffix$cast'; - return '$suffix.map((dynamic e)=> ${_cast(arg, 'e')})$castWithSuffix'; + + return '$suffix.map((e) => ${_cast(arg, 'e')})$cast'; } else { return '$suffix.cast<${_displayString(arg)}>()'; } @@ -177,30 +176,14 @@ class ClassBuilder extends Builder { code.writeln('writer'); code.writeln('..writeByte(${getters.length})'); for (final field in getters) { - final value = _convertIterable(field.type, 'obj.${field.name}'); code.writeln(''' ..writeByte(${field.index}) - ..write($value)'''); + ..write(obj.${field.name})'''); } code.writeln(';'); return code.toString(); } - - String _convertIterable(DartType type, String accessor) { - if (listChecker.isAssignableFromType(type)) { - return accessor; - } else - // Using assignable because Set? and Iterable? are not exactly Set and - // Iterable - if (setChecker.isAssignableFromType(type) || - iterableChecker.isAssignableFromType(type)) { - final suffix = _accessorSuffixFromType(type); - return '$accessor$suffix.toList()'; - } else { - return accessor; - } - } } extension _FirstOrNullWhere on Iterable { diff --git a/hive_generator/lib/src/helper.dart b/hive_generator/lib/src/helper.dart index c7ed6ab9..d50d14e2 100644 --- a/hive_generator/lib/src/helper.dart +++ b/hive_generator/lib/src/helper.dart @@ -29,17 +29,6 @@ HiveFieldInfo? getHiveFieldAnn(Element? element) { ); } -/// TODO: Document this! -bool isLibraryNNBD(Element element) { - final dartVersion = element.library!.languageVersion.effective; - // Libraries with the dart version >= 2.12 are nnbd - if (dartVersion.major >= 2 && dartVersion.minor >= 12) { - return true; - } else { - return false; - } -} - /// TODO: Document this! void check(bool condition, Object error) { if (!condition) { diff --git a/hive_generator/pubspec.yaml b/hive_generator/pubspec.yaml index 34ffdb56..95b3da56 100644 --- a/hive_generator/pubspec.yaml +++ b/hive_generator/pubspec.yaml @@ -1,6 +1,6 @@ name: hive_ce_generator description: Extension for Hive. Automatically generates TypeAdapters to store any class. -version: 1.2.1 +version: 1.3.0 homepage: https://github.com/IO-Design-Team/hive_ce/tree/main/hive_generator documentation: https://docs.hivedb.dev/ @@ -10,7 +10,7 @@ environment: dependencies: build: ^2.0.0 source_gen: ^1.0.0 - hive_ce: ^2.3.0 + hive_ce: ^2.4.0 analyzer: ^6.0.0 source_helper: ^1.1.0