diff --git a/.gitignore b/.gitignore index a0c1195..b4d49a2 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ # so this line is commented out by default. #.vscode/ +*.g.dart *.morphy.dart *.morphy2.dart @@ -32,7 +33,7 @@ .packages .pub-cache/ .pub/ -/build/ +*/build/ .fvm/ # Flutter macos @@ -55,4 +56,5 @@ app.*.map.json /android/app/release # Ignore pub lock files -pubspec.lock \ No newline at end of file +pubspec.lock + diff --git a/example/pubspec.yaml b/example/pubspec.yaml index ffabb11..7b1d835 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -14,9 +14,9 @@ dependencies: dev_dependencies: morphy: path: ../morphy - build_runner: ^2.7.0 - test: ^1.25.0 - json_serializable: ^6.9.4 + build_runner: ^2.8.0 + test: ^1.26.3 + json_serializable: ^6.11.1 json_annotation: ^4.9.0 diff --git a/morphy/lib/src/MorphyGenerator.dart b/morphy/lib/src/MorphyGenerator.dart index 05c8e6e..a70de0b 100644 --- a/morphy/lib/src/MorphyGenerator.dart +++ b/morphy/lib/src/MorphyGenerator.dart @@ -1,10 +1,10 @@ import 'dart:async'; -import 'package:analyzer/dart/element/element2.dart'; +import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; ////import 'package:analyzer_models/analyzer_models.dart'; -import 'package:build/src/builder/build_step.dart'; +import 'package:build/src/build_step.dart'; import 'package:dartx/dartx.dart'; import 'package:morphy/src/common/GeneratorForAnnotationX.dart'; import 'package:morphy/src/common/NameType.dart'; @@ -29,38 +29,49 @@ import 'package:source_gen/source_gen.dart'; // return (classFields + superTypeFields).distinctBy((x) => x.name).toList(); //} -class MorphyGenerator extends GeneratorForAnnotationX { +class MorphyGenerator + extends GeneratorForAnnotationX { @override - FutureOr generateForAnnotatedElement(Element2 ce, ConstantReader annotation, BuildStep buildStep, List allClasses) { + FutureOr generateForAnnotatedElement( + Element ce, + ConstantReader annotation, + BuildStep buildStep, + List allClasses, + ) { var sb = StringBuffer(); // sb.writeln("//RULES: you must use implements, not extends"); - if (ce is! ClassElement2) { + if (ce is! ClassElement) { throw Exception("not a class"); } - var hasConstConstructor = ce.constructors2.any((e) => e.isConst); + var hasConstConstructor = ce.constructors.any((e) => e.isConst); - if (ce.supertype?.element3.name3 != "Object") { + if (ce.supertype?.element.name != "Object") { throw Exception("you must use implements, not extends"); } var docComment = ce.documentationComment; - var isAbstract = ce.name3!.startsWith("\$\$"); - var allFields = getAllFields(ce.allSupertypes, ce).where((x) => x.name != "hashCode").toList(); + var isAbstract = ce.name!.startsWith("\$\$"); + var allFields = getAllFields( + ce.allSupertypes, + ce, + ).where((x) => x.name != "hashCode").toList(); - var className = ce.name3!; + var className = ce.name!; var interfaces = ce.interfaces .map( (e) => // InterfaceWithComment( - e.element3.name3!, // + e.element.name!, // e.typeArguments.map((e) => e.toString()).toList(), - e.element3.typeParameters2.map((x) => x.name3!).toList(), - e.element3.fields2.map((e) => NameType(e.name3!, e.type.toString())).toList(), - comment: e.element3.documentationComment, + e.element.typeParameters.map((x) => x.name!).toList(), + e.element.fields + .map((e) => NameType(e.name!, e.type.toString())) + .toList(), + comment: e.element.documentationComment, ), ) // .toList(); @@ -69,8 +80,14 @@ class MorphyGenerator extends GeneratorForAnnotationX NameTypeClassComment(e.name3!, e.bound == null ? null : e.bound.toString(), null)) // + var classGenerics = ce.typeParameters + .map( + (e) => NameTypeClassComment( + e.name3!, + e.bound == null ? null : e.bound.toString(), + null, + ), + ) // .toList(); var allFieldsDistinct = getDistinctFields(allFields, interfaces); @@ -82,16 +99,26 @@ class MorphyGenerator extends GeneratorForAnnotationX NameType(x.name3!, x.bound?.getDisplayString())).toList(), - getAllFields(el.allSupertypes, el).where((x) => x.name != 'hashCode').toList(), + (el as InterfaceElement).name!, // or .name + (el as TypeParameterizedElement).typeParameters + .map( + (TypeParameterElement x) => + NameType(x.name!, x.bound?.getDisplayString()), + ) + .toList(), + getAllFields( + el.allSupertypes, + el, + ).where((x) => x.name != 'hashCode').toList(), true, ); }) @@ -104,15 +131,24 @@ class MorphyGenerator extends GeneratorForAnnotationX(ce.interfaces, (x) => x.interfaces) // Only keep real classes; avoids casts on mixins/extension types. - .where((t) => t.element3 is ClassElement2) + .where((t) => t.element is ClassElement) .map((t) { - final cls = t.element3 as ClassElement2; // also a TypeParameterizedElement2 - final tparams = (cls as TypeParameterizedElement2).typeParameters2; + final cls = + t.element as ClassElement; // also a TypeParameterizedElement2 + final tparams = (cls as TypeParameterizedElement).typeParameters; return Interface.fromGenerics( - cls.name3!, // class name - tparams.map((TypeParameterElement2 p) => NameType(p.name3!, p.bound?.getDisplayString())).toList(), - getAllFields(cls.allSupertypes, cls).where((x) => x.name != 'hashCode').toList(), + cls.name!, // class name + tparams + .map( + (TypeParameterElement p) => + NameType(p.name!, p.bound?.getDisplayString()), + ) + .toList(), + getAllFields( + cls.allSupertypes, + cls, + ).where((x) => x.name != 'hashCode').toList(), ); }) .union(typesExplicit) @@ -120,7 +156,22 @@ class MorphyGenerator extends GeneratorForAnnotationX=3.8.0 <4.0.0" dependencies: - analyzer: ">=7.5.9 <8.0.0" - build: ^3.0.0 - source_gen: ^3.0.0 + analyzer: ^8.2.0 + build: ^4.0.0 + source_gen: ^4.0.1 morphy_annotation: ^1.4.2 dartx: ^1.2.0 dev_dependencies: - test: ^1.25.0 + test: ^1.26.3 # morphy_annotation: ^1.4.2 diff --git a/morphy_annotation/pubspec.yaml b/morphy_annotation/pubspec.yaml index 225c278..d15db1c 100644 --- a/morphy_annotation/pubspec.yaml +++ b/morphy_annotation/pubspec.yaml @@ -7,10 +7,10 @@ environment: sdk: ">=3.8.0 <4.0.0" dependencies: - collection: ^1.15.0 + collection: ^1.19.1 dartx: ^1.2.0 - json_annotation: ^4.8.0 + json_annotation: ^4.9.0 quiver: ^3.2.2 dev_dependencies: - test: ^1.25.0 \ No newline at end of file + test: ^1.26.3 \ No newline at end of file