Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(hive_generator): Apply analyzer 5.0.0 or higher #1085

Merged
merged 4 commits into from
Oct 13, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,17 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
dart-channel: ["2.12.0", "2.13.0"]
dart-channel: [dev, beta, stable]
jukqaz marked this conversation as resolved.
Show resolved Hide resolved
steps:
- uses: actions/checkout@v1
- uses: dart-lang/setup-dart@v1
with:
sdk: ${{ matrix.dart-channel }}
- name: Install dependencies
run: pub get
run: dart pub get
working-directory: hive_generator/example
- name: Generate build_runner output
run: pub run build_runner build --delete-conflicting-outputs
run: dart run build_runner build --delete-conflicting-outputs
working-directory: hive_generator/example

check-score:
Expand Down
5 changes: 3 additions & 2 deletions hive_generator/lib/src/builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ class AdapterField {
}

abstract class Builder {
final ClassElement cls;
final InterfaceElement interface;
final List<AdapterField> getters;
final List<AdapterField> setters;

Builder(this.cls, this.getters, [this.setters = const <AdapterField>[]]);
Builder(this.interface, this.getters,
[this.setters = const <AdapterField>[]]);

String buildRead();

Expand Down
13 changes: 7 additions & 6 deletions hive_generator/lib/src/class_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ import 'type_helper.dart';

class ClassBuilder extends Builder {
ClassBuilder(
ClassElement cls,
InterfaceElement interface,
List<AdapterField> getters,
List<AdapterField> setters,
) : super(cls, getters, setters);
) : super(interface, getters, setters);

var hiveListChecker = const TypeChecker.fromRuntime(HiveList);
var listChecker = const TypeChecker.fromRuntime(List);
Expand All @@ -27,15 +27,16 @@ class ClassBuilder extends Builder {

@override
String buildRead() {
var constr = cls.constructors.firstOrNullWhere((it) => it.name.isEmpty);
var constr =
interface.constructors.firstOrNullWhere((it) => it.name.isEmpty);
check(constr != null, 'Provide an unnamed constructor.');

// The remaining fields to initialize.
var fields = setters.toList();

// Empty classes
if (constr!.parameters.isEmpty && fields.isEmpty) {
return 'return ${cls.name}();';
return 'return ${interface.name}();';
}

var code = StringBuffer();
Expand All @@ -45,7 +46,7 @@ class ClassBuilder extends Builder {
for (int i = 0; i < numOfFields; i++)
reader.readByte(): reader.read(),
};
return ${cls.name}(
return ${interface.name}(
''');

for (var param in constr.parameters) {
Expand Down Expand Up @@ -128,7 +129,7 @@ class ClassBuilder extends Builder {
}
// The suffix is not needed with nnbd on $cast becauuse it short circuits,
// otherwise it is needed.
var castWithSuffix = isLibraryNNBD(cls) ? '$cast' : '$suffix$cast';
var castWithSuffix = isLibraryNNBD(interface) ? '$cast' : '$suffix$cast';
return '$suffix.map((dynamic e)=> ${_cast(arg, 'e')})$castWithSuffix';
} else {
return '$suffix.cast<${_displayString(arg)}>()';
Expand Down
15 changes: 8 additions & 7 deletions hive_generator/lib/src/enum_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,29 @@ import 'package:hive_generator/src/builder.dart';
import 'package:hive_generator/src/helper.dart';

class EnumBuilder extends Builder {
EnumBuilder(ClassElement cls, List<AdapterField> getters)
: super(cls, getters);
EnumBuilder(InterfaceElement interface, List<AdapterField> getters)
: super(interface, getters);

@override
String buildRead() {
check(getters.isNotEmpty, '${cls.name} does not have any enum value.');
check(
getters.isNotEmpty, '${interface.name} does not have any enum value.');

var code = StringBuffer();
code.writeln('switch (reader.readByte()) {');

for (var field in getters) {
code.writeln('''
case ${field.index}:
return ${cls.name}.${field.name};''');
return ${interface.name}.${field.name};''');
}

var defaultField = getters.firstWhere(
(it) => it.defaultValue?.toBoolValue() == true,
orElse: () => getters.first);
code.writeln('''
code.writeln('''
default:
return ${cls.name}.${defaultField.name};
return ${interface.name}.${defaultField.name};
}''');

return code.toString();
Expand All @@ -37,7 +38,7 @@ class EnumBuilder extends Builder {

for (var field in getters) {
code.writeln('''
case ${cls.name}.${field.name}:
case ${interface.name}.${field.name}:
writer.writeByte(${field.index});
break;''');
}
Expand Down
7 changes: 0 additions & 7 deletions hive_generator/lib/src/helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,6 @@ bool isLibraryNNBD(Element element) {
}
}

Iterable<ClassElement> getTypeAndAllSupertypes(ClassElement cls) {
var types = <ClassElement>{};
types.add(cls);
types.addAll(cls.allSupertypes.map((it) => it.element));
return types;
}

void check(bool condition, Object error) {
if (!condition) {
// ignore: only_throw_errors
Expand Down
36 changes: 18 additions & 18 deletions hive_generator/lib/src/type_adapter_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ class TypeAdapterGenerator extends GeneratorForAnnotation<HiveType> {
@override
Future<String> generateForAnnotatedElement(
Element element, ConstantReader annotation, BuildStep buildStep) async {
var cls = getClass(element);
var interface = getInterface(element);
var library = await buildStep.inputLibrary;
var gettersAndSetters = getAccessors(cls, library);
var gettersAndSetters = getAccessors(interface, library);

var getters = gettersAndSetters[0];
verifyFieldIndices(getters);
Expand All @@ -35,23 +35,23 @@ class TypeAdapterGenerator extends GeneratorForAnnotation<HiveType> {

var typeId = getTypeId(annotation);

var adapterName = getAdapterName(cls.name, annotation);
var builder = cls.isEnum
? EnumBuilder(cls, getters)
: ClassBuilder(cls, getters, setters);
var adapterName = getAdapterName(interface.name, annotation);
var builder = interface is EnumElement
? EnumBuilder(interface, getters)
: ClassBuilder(interface, getters, setters);

return '''
class $adapterName extends TypeAdapter<${cls.name}> {
class $adapterName extends TypeAdapter<${interface.name}> {
@override
final int typeId = $typeId;

@override
${cls.name} read(BinaryReader reader) {
${interface.name} read(BinaryReader reader) {
${builder.buildRead()}
}

@override
void write(BinaryWriter writer, ${cls.name} obj) {
void write(BinaryWriter writer, ${interface.name} obj) {
${builder.buildWrite()}
}

Expand All @@ -68,18 +68,18 @@ class TypeAdapterGenerator extends GeneratorForAnnotation<HiveType> {
''';
}

ClassElement getClass(Element element) {
InterfaceElement getInterface(Element element) {
check(element.kind == ElementKind.CLASS || element.kind == ElementKind.ENUM,
'Only classes or enums are allowed to be annotated with @HiveType.');

return element as ClassElement;
return element as InterfaceElement;
}

Set<String> getAllAccessorNames(ClassElement cls) {
Set<String> getAllAccessorNames(InterfaceElement interface) {
var accessorNames = <String>{};

var supertypes = cls.allSupertypes.map((it) => it.element);
for (var type in [cls, ...supertypes]) {
var supertypes = interface.allSupertypes.map((it) => it.element2);
for (var type in [interface, ...supertypes]) {
for (var accessor in type.accessors) {
if (accessor.isSetter) {
var name = accessor.name;
Expand All @@ -94,13 +94,13 @@ class TypeAdapterGenerator extends GeneratorForAnnotation<HiveType> {
}

List<List<AdapterField>> getAccessors(
ClassElement cls, LibraryElement library) {
var accessorNames = getAllAccessorNames(cls);
InterfaceElement interface, LibraryElement library) {
var accessorNames = getAllAccessorNames(interface);

var getters = <AdapterField>[];
var setters = <AdapterField>[];
for (var name in accessorNames) {
var getter = cls.lookUpGetter(name, library);
var getter = interface.lookUpGetter(name, library);
if (getter != null) {
var getterAnn =
getHiveFieldAnn(getter.variable) ?? getHiveFieldAnn(getter);
Expand All @@ -115,7 +115,7 @@ class TypeAdapterGenerator extends GeneratorForAnnotation<HiveType> {
}
}

var setter = cls.lookUpSetter('$name=', library);
var setter = interface.lookUpSetter('$name=', library);
if (setter != null) {
var setterAnn =
getHiveFieldAnn(setter.variable) ?? getHiveFieldAnn(setter);
Expand Down
2 changes: 1 addition & 1 deletion hive_generator/lib/src/type_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ String literalToString(DartObject object, List<String> typeInformation) {
} else if (object.type is FunctionType) {
badType = 'Function';
} else if (!reader.isLiteral) {
badType = object.type!.element!.name;
badType = object.type!.element2!.name;
}

if (badType != null) {
Expand Down
2 changes: 1 addition & 1 deletion hive_generator/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ dependencies:
build: ^2.0.0
source_gen: ^1.0.0
hive: ^2.0.4
analyzer: ">=1.0.0 <5.0.0"
analyzer: ">=5.0.0"
jukqaz marked this conversation as resolved.
Show resolved Hide resolved
source_helper: ^1.1.0

dev_dependencies:
Expand Down