Skip to content

Commit

Permalink
Merge pull request #5 from IO-Design-Team/feature/set-support
Browse files Browse the repository at this point in the history
Feature/set-support
  • Loading branch information
Rexios80 authored Jul 5, 2024
2 parents daa5c74 + 5e67964 commit 35147de
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 48 deletions.
4 changes: 4 additions & 0 deletions hive_generator/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.3.0

- Adds support for Sets

## 1.2.1

- Fix `analyzer` dependency conflicts with Flutter
Expand Down
17 changes: 17 additions & 0 deletions hive_generator/example/lib/types.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> list;

@HiveField(1)
final Set<String> set;

@HiveField(2)
final List<Set<String>> nestedList;

@HiveField(3)
final Set<List<String>> nestedSet;
}
43 changes: 43 additions & 0 deletions hive_generator/example/lib/types.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 18 additions & 35 deletions hive_generator/lib/src/class_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)}>()';
}
Expand All @@ -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<T> on Iterable<T> {
Expand Down
11 changes: 0 additions & 11 deletions hive_generator/lib/src/helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
4 changes: 2 additions & 2 deletions hive_generator/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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/

Expand All @@ -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

Expand Down

0 comments on commit 35147de

Please sign in to comment.