From 3c52ef78a1566db1767d271fb4d38bf97a167efd Mon Sep 17 00:00:00 2001 From: Tim Lehmann Date: Thu, 28 Aug 2025 12:37:16 +0200 Subject: [PATCH] vibed fix for enums --- hive_generator/example/lib/types.g.dart | 88 +++++++++---------- hive_generator/lib/src/builder.dart | 2 +- hive_generator/lib/src/class_builder.dart | 2 +- hive_generator/lib/src/enum_builder.dart | 2 +- .../lib/src/type_adapter_generator.dart | 10 +-- .../test/type_adapter_generator_test.dart | 60 +++++++++++++ 6 files changed, 112 insertions(+), 52 deletions(-) diff --git a/hive_generator/example/lib/types.g.dart b/hive_generator/example/lib/types.g.dart index 8cca919d8..1b0bdb735 100644 --- a/hive_generator/example/lib/types.g.dart +++ b/hive_generator/example/lib/types.g.dart @@ -6,50 +6,6 @@ part of 'types.dart'; // TypeAdapterGenerator // ************************************************************************** -class Enum1Adapter extends TypeAdapter { - @override - final int typeId = 3; - - @override - Enum1 read(BinaryReader reader) { - switch (reader.readByte()) { - case 0: - return Enum1.emumValue1; - case 1: - return Enum1.emumValue2; - case 2: - return Enum1.emumValue3; - default: - return Enum1.emumValue2; - } - } - - @override - void write(BinaryWriter writer, Enum1 obj) { - switch (obj) { - case Enum1.emumValue1: - writer.writeByte(0); - break; - case Enum1.emumValue2: - writer.writeByte(1); - break; - case Enum1.emumValue3: - writer.writeByte(2); - break; - } - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is Enum1Adapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} - class Class1Adapter extends TypeAdapter { @override final int typeId = 1; @@ -163,3 +119,47 @@ class EmptyClassAdapter extends TypeAdapter { runtimeType == other.runtimeType && typeId == other.typeId; } + +class Enum1Adapter extends TypeAdapter { + @override + final int typeId = 3; + + @override + Enum1 read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return Enum1.emumValue1; + case 1: + return Enum1.emumValue2; + case 2: + return Enum1.emumValue3; + default: + return Enum1.emumValue2; + } + } + + @override + void write(BinaryWriter writer, Enum1 obj) { + switch (obj) { + case Enum1.emumValue1: + writer.writeByte(0); + break; + case Enum1.emumValue2: + writer.writeByte(1); + break; + case Enum1.emumValue3: + writer.writeByte(2); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is Enum1Adapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/hive_generator/lib/src/builder.dart b/hive_generator/lib/src/builder.dart index c523cb389..f8d350bb6 100644 --- a/hive_generator/lib/src/builder.dart +++ b/hive_generator/lib/src/builder.dart @@ -12,7 +12,7 @@ class AdapterField { } abstract class Builder { - final ClassElement cls; + final InterfaceElement cls; final List getters; final List setters; diff --git a/hive_generator/lib/src/class_builder.dart b/hive_generator/lib/src/class_builder.dart index 8b9ce0202..548a63323 100644 --- a/hive_generator/lib/src/class_builder.dart +++ b/hive_generator/lib/src/class_builder.dart @@ -13,7 +13,7 @@ import 'type_helper.dart'; class ClassBuilder extends Builder { ClassBuilder( - ClassElement cls, + InterfaceElement cls, List getters, List setters, ) : super(cls, getters, setters); diff --git a/hive_generator/lib/src/enum_builder.dart b/hive_generator/lib/src/enum_builder.dart index 8dee4f3c2..6a54ed97b 100644 --- a/hive_generator/lib/src/enum_builder.dart +++ b/hive_generator/lib/src/enum_builder.dart @@ -3,7 +3,7 @@ import 'package:hive_generator/src/builder.dart'; import 'package:hive_generator/src/helper.dart'; class EnumBuilder extends Builder { - EnumBuilder(ClassElement cls, List getters) + EnumBuilder(InterfaceElement cls, List getters) : super(cls, getters); @override diff --git a/hive_generator/lib/src/type_adapter_generator.dart b/hive_generator/lib/src/type_adapter_generator.dart index bae597023..aa7c64c03 100644 --- a/hive_generator/lib/src/type_adapter_generator.dart +++ b/hive_generator/lib/src/type_adapter_generator.dart @@ -36,7 +36,7 @@ class TypeAdapterGenerator extends GeneratorForAnnotation { var typeId = getTypeId(annotation); var adapterName = getAdapterName(cls.name, annotation); - var builder = cls.isDartCoreEnum + var builder = cls.kind == ElementKind.ENUM ? EnumBuilder(cls, getters) : ClassBuilder(cls, getters, setters); @@ -68,14 +68,14 @@ class TypeAdapterGenerator extends GeneratorForAnnotation { '''; } - ClassElement getClass(Element element) { + InterfaceElement getClass(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 getAllAccessorNames(ClassElement cls) { + Set getAllAccessorNames(InterfaceElement cls) { var accessorNames = {}; var supertypes = cls.allSupertypes.map((it) => it.element); @@ -94,7 +94,7 @@ class TypeAdapterGenerator extends GeneratorForAnnotation { } List> getAccessors( - ClassElement cls, LibraryElement library) { + InterfaceElement cls, LibraryElement library) { var accessorNames = getAllAccessorNames(cls); var getters = []; diff --git a/hive_generator/test/type_adapter_generator_test.dart b/hive_generator/test/type_adapter_generator_test.dart index 13f59c294..5869dca3c 100644 --- a/hive_generator/test/type_adapter_generator_test.dart +++ b/hive_generator/test/type_adapter_generator_test.dart @@ -1,6 +1,43 @@ +import 'package:analyzer/dart/element/element.dart'; import 'package:hive_generator/src/type_adapter_generator.dart'; import 'package:test/test.dart'; +// Mock enum element that simulates EnumElementImpl +class MockEnumElement implements Element { + @override + ElementKind get kind => ElementKind.ENUM; + + @override + String get name => 'TestEnum'; + + @override + noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +// Mock class element +class MockClassElement implements Element, InterfaceElement { + @override + ElementKind get kind => ElementKind.CLASS; + + @override + String get name => 'TestClass'; + + @override + noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +// Mock interface element for enum +class MockEnumInterfaceElement implements Element, InterfaceElement { + @override + ElementKind get kind => ElementKind.ENUM; + + @override + String get name => 'TestEnum'; + + @override + noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + void main() { group('generateName', () { test('.generateName()', () { @@ -9,4 +46,27 @@ void main() { 'SomeClassAdapter'); }); }); + + group('getClass', () { + final generator = TypeAdapterGenerator(); + + test('handles class elements correctly', () { + final classElement = MockClassElement(); + final result = generator.getClass(classElement); + expect(result, isA()); + }); + + test('handles enum elements correctly now', () { + final enumElement = MockEnumInterfaceElement(); + final result = generator.getClass(enumElement); + expect(result, isA()); + }); + + test('accepts enum elements based on ElementKind check', () { + final enumElement = MockEnumElement(); + // This should not throw when checking the kind + expect(enumElement.kind, ElementKind.ENUM); + expect(enumElement.kind == ElementKind.CLASS || enumElement.kind == ElementKind.ENUM, isTrue); + }); + }); }