From 1ca5b1b16816f4dc0115e23e4165df426ae69d54 Mon Sep 17 00:00:00 2001 From: gmpassos Date: Fri, 15 Aug 2025 19:12:38 -0300 Subject: [PATCH 1/6] - Comment `#dependency_validator: ^5.0.2` (incompatible with `analyzer: ^8.1.1`). --- .github/workflows/dart.yml | 4 +++- CHANGELOG.md | 3 +++ lib/src/reflection_factory_base.dart | 2 +- pubspec.yaml | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 975a222..81ff423 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -30,8 +30,10 @@ jobs: run: dart format -o none --set-exit-if-changed . - name: dart analyze run: dart analyze --fatal-infos --fatal-warnings . + - name: activate dependency_validator + run: dart pub global activate dependency_validator - name: dependency_validator - run: dart run dependency_validator + run: dart pub global run dependency_validator - name: dart pub publish --dry-run run: dart pub publish --dry-run diff --git a/CHANGELOG.md b/CHANGELOG.md index c1b753a..c671f9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.6.0 +- Comment `#dependency_validator: ^5.0.2` (incompatible with `analyzer: ^8.1.1`). + ## 2.5.3 - `ReflectionBuilder`: improve use of `const` for generated code. diff --git a/lib/src/reflection_factory_base.dart b/lib/src/reflection_factory_base.dart index beb5ffc..575961e 100644 --- a/lib/src/reflection_factory_base.dart +++ b/lib/src/reflection_factory_base.dart @@ -20,7 +20,7 @@ import 'reflection_factory_utils.dart'; /// Class with all registered reflections ([ClassReflection]). class ReflectionFactory { // ignore: constant_identifier_names - static const String VERSION = '2.5.3'; + static const String VERSION = '2.6.0'; static final ReflectionFactory _instance = ReflectionFactory._(); diff --git a/pubspec.yaml b/pubspec.yaml index 8da3bc6..dea2582 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: reflection_factory description: Allows Dart reflection with an easy approach, even for third-party classes, using code generation portable for all Dart platforms. -version: 2.5.3 +version: 2.6.0 homepage: https://github.com/gmpassos/reflection_factory environment: @@ -25,7 +25,7 @@ dev_dependencies: lints: ^5.1.1 pubspec_parse: ^1.5.0 data_serializer: ^1.2.1 - dependency_validator: ^4.1.3 + #dependency_validator: ^5.0.2 test: ^1.26.3 coverage: ^1.15.0 benchmark: ^0.3.0 From 3e6d4743330b709c423eeaaaba3a41bc7d9f187c Mon Sep 17 00:00:00 2001 From: gmpassos Date: Fri, 15 Aug 2025 19:15:06 -0300 Subject: [PATCH 2/6] actions/checkout@v5 --- .github/workflows/dart.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 81ff423..a2961c8 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v5 - uses: dart-lang/setup-dart@v1 with: sdk: ${{ env.DART_VERSION }} @@ -42,7 +42,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v5 - uses: dart-lang/setup-dart@v1 with: sdk: ${{ env.DART_VERSION }} @@ -61,7 +61,7 @@ jobs: dart pub global activate coverage dart pub global run coverage:format_coverage --packages=.dart_tool/package_config.json --report-on=lib --lcov -o ./coverage/lcov.info -i ./coverage - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v5 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} with: @@ -76,7 +76,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v5 - uses: dart-lang/setup-dart@v1 - name: Dart version run: | From a6865bcae4c9d4051582b718579a0bf9deb8fb02 Mon Sep 17 00:00:00 2001 From: gmpassos Date: Fri, 15 Aug 2025 19:16:31 -0300 Subject: [PATCH 3/6] - Migrate to `analyzer: ^8.1.1` and `build: ^3.0.2`. - build: ^3.0.2 - analyzer: ^8.1.1 - dart_style: ^3.1.2 - mime: ^2.0.0 - collection: ^1.19.1 - logging: ^1.3.0 - build_runner: ^2.7.0 - build_test: ^3.3.2 - lints: ^6.0.0 --- CHANGELOG.md | 14 + lib/src/analyzer/input_analyzer.dart | 43 +- lib/src/analyzer/library.dart | 48 +- lib/src/analyzer/type_checker.dart | 12 +- lib/src/analyzer/utils.dart | 2 +- lib/src/reflection_factory_builder.dart | 202 ++- lib/src/reflection_factory_json.dart | 5 +- pubspec.yaml | 17 +- test/reflection_factory_build_test.dart | 1693 +++++++++++++---------- 9 files changed, 1237 insertions(+), 799 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c671f9f..20acfa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,18 @@ ## 2.6.0 + +- Migrate to `analyzer: ^8.1.1` and `build: ^3.0.2`. + +- build: ^3.0.2 +- analyzer: ^8.1.1 +- dart_style: ^3.1.2 +- mime: ^2.0.0 +- collection: ^1.19.1 +- logging: ^1.3.0 + +- build_runner: ^2.7.0 +- build_test: ^3.3.2 +- lints: ^6.0.0 + - Comment `#dependency_validator: ^5.0.2` (incompatible with `analyzer: ^8.1.1`). ## 2.5.3 diff --git a/lib/src/analyzer/input_analyzer.dart b/lib/src/analyzer/input_analyzer.dart index b6c9757..44b3c4d 100644 --- a/lib/src/analyzer/input_analyzer.dart +++ b/lib/src/analyzer/input_analyzer.dart @@ -251,14 +251,21 @@ class InputAnalyzerResolved { if (result is LibraryElementResult) { var libraryElement = result.element; + if (libraryElement.classes.isEmpty) { + libraryElement = await _resolveLibraryElement(libraryElement); + } + mainLibraries.add(libraryElement); } } if (libraryName.isNotEmpty) { - var library = await resolver.findLibraryByName(libraryName); - if (library != null) { - mainLibraries.add(library); + var libraryElement = await resolver.findLibraryByName(libraryName); + if (libraryElement != null) { + if (libraryElement.classes.isEmpty) { + libraryElement = await _resolveLibraryElement(libraryElement); + } + mainLibraries.add(libraryElement); } } @@ -287,6 +294,16 @@ class InputAnalyzerResolved { return candidateClasses; } + // Attempt to load a `LibraryElement` with sub-elements resolved: + Future _resolveLibraryElement( + LibraryElement libraryElement) async { + var libraryAssetId = await resolver.assetIdForElement(libraryElement); + var libraryElementResolved = await resolver.libraryFor( + libraryAssetId, + ); + return libraryElementResolved; + } + Future hasCodeToGenerate() async { final libraryReader = await this.libraryReader; @@ -353,13 +370,13 @@ class InputAnalyzerResolved { throw StateError( "Code generated but NO reflection part directive was found for input file: $inputId\n" - " > Can't generate ONE of the output files:\n" + " » Can't generate ONE of the output files:\n" " -- $genSiblingId\n" " -- $genSubId\n" - " > Please ADD one of the directives below to the input file:\n" + " » Please ADD one of the directives below to the input file:\n" " part '${outputsPaths.siblingPath}';\n" " part '${outputsPaths.subPath}';\n" - " > Found part directives:\n" + " » Found part directives:\n" "${gParts.map((e) => ' -- $e').join('\n')}\n"); } @@ -440,16 +457,13 @@ extension _LibraryElementExtension on LibraryElement { List get exportedClasses => _exportedClasses[this] ??= UnmodifiableListView( - topLevelElements.whereType().toList(growable: false)); + fragments.expand((e) => e.classes.map((c) => c.element))); static final Expando> _allExports = Expando>(); List get allExports => _allExports[this] ??= - UnmodifiableListView(definingCompilationUnit.libraryExports - .map((e) => e.exportedLibrary) - .nonNulls - .toList(growable: false)); + UnmodifiableListView(exportedLibraries.nonNulls.toList(growable: false)); static final Expando> _allExportedClasses = Expando>(); @@ -461,9 +475,8 @@ extension _LibraryElementExtension on LibraryElement { Expando>(); Set get allImportedClasses => - _allImportedClasses[this] ??= UnmodifiableSetView(units - .expand((e) => - e.library.importedLibraries.expand((e) => e.exportedClasses)) + _allImportedClasses[this] ??= UnmodifiableSetView(fragments + .expand((e) => e.importedLibraries.expand((e) => e.exportedClasses)) .toSet()); static final Expando> _allUnitsClasses = @@ -471,7 +484,7 @@ extension _LibraryElementExtension on LibraryElement { Set get allUnitsClasses => _allUnitsClasses[this] ??= UnmodifiableSetView( - units.expand((e) => e.library.exportedClasses).toSet()); + fragments.expand((e) => e.classes.map((c) => c.element)).toSet()); static final Expando> _allClassesFromExportedClassesUnits = Expando>(); diff --git a/lib/src/analyzer/library.dart b/lib/src/analyzer/library.dart index e51299c..c4e0849 100644 --- a/lib/src/analyzer/library.dart +++ b/lib/src/analyzer/library.dart @@ -15,13 +15,40 @@ class AnnotatedElement { const AnnotatedElement(this.annotation, this.element); } +extension LibraryElementExtension on LibraryElement { + String get libraryName { + var name = this.name; + if (name != null && name.isNotEmpty) return name; + + var uri = firstFragment.source.uri; + return uri.toString(); + } + + Iterable get topLevelFragments sync* { + for (var unit in fragments) { + yield* unit.classes; + yield* unit.enums; + yield* unit.extensions; + yield* unit.extensionTypes; + yield* unit.functions; + yield* unit.mixins; + yield* unit.topLevelVariables; + yield* unit.typeAliases; + } + } + + Iterable get topLevelElements => + topLevelFragments.map((e) => e.element); +} + class LibraryReader { final LibraryElement element; LibraryReader(this.element); /// All the compilation unit of this element ([CompilationUnitElement]). - Iterable get allParts => element.definingCompilationUnit.parts; + Iterable get allParts => + element.fragments.expand((e) => e.partIncludes); /// All of the declarations in this library. Iterable get allElements => element.topLevelElements; @@ -57,7 +84,7 @@ class LibraryReader { elements = allElements; } - return elements.where((e) => e.metadata.isNotEmpty); + return elements.where((e) => e.metadata.annotations.isNotEmpty); } /// All of the declarations in this library annotated with [checker]. @@ -67,8 +94,8 @@ class LibraryReader { /// All of the elements names in this library /// (classes, enums, mixins, functions, extensions, typeAliases, topLevelVariables). - Iterable get elementsNames => element.units - .expand((CompilationUnitElement cu) => [ + Iterable get elementsNames => element.fragments + .expand((cu) => [ ...cu.classes.map((e) => e.name), ...cu.enums.map((e) => e.name), ...cu.mixins.map((e) => e.name), @@ -81,10 +108,11 @@ class LibraryReader { /// All of the elements representing classes in this library. Iterable get classes => - element.units.expand((CompilationUnitElement cu) => cu.classes); + element.fragments.expand((cu) => cu.classes.map((c) => c.element)); /// All of the elements representing enums in this library. - Iterable get enums => element.units.expand((cu) => cu.enums); + Iterable get enums => + element.fragments.expand((cu) => cu.enums.map((c) => c.element)); } extension ElementExtension on Element { @@ -116,3 +144,11 @@ extension IterableElementExtension on Iterable { where((e) => e.isAnnotatedWith(checker, throwOnUnresolved: throwOnUnresolved)); } + +extension ConstructorElementExtension on ConstructorElement { + String get codeName { + var name = this.name; + if (name == null || name == 'new') return ''; + return name; + } +} diff --git a/lib/src/analyzer/type_checker.dart b/lib/src/analyzer/type_checker.dart index 8255a6e..5f172ff 100644 --- a/lib/src/analyzer/type_checker.dart +++ b/lib/src/analyzer/type_checker.dart @@ -48,7 +48,7 @@ abstract class TypeChecker { Element element, { bool throwOnUnresolved = true, }) { - if (element.metadata.isEmpty) { + if (element.metadata.annotations.isEmpty) { return null; } final results = @@ -70,7 +70,7 @@ abstract class TypeChecker { Element element, { bool throwOnUnresolved = true, }) { - if (element.metadata.isEmpty) { + if (element.metadata.annotations.isEmpty) { return null; } final results = @@ -91,7 +91,7 @@ abstract class TypeChecker { int annotationIndex, { bool throwOnUnresolved = true, }) { - final annotation = element.metadata[annotationIndex]; + final annotation = element.metadata.annotations[annotationIndex]; final result = annotation.computeConstantValue(); if (result == null && throwOnUnresolved) { @@ -119,7 +119,8 @@ abstract class TypeChecker { bool Function(DartType) predicate, { bool throwOnUnresolved = true, }) sync* { - for (var i = 0; i < element.metadata.length; i++) { + final annotations = element.metadata.annotations; + for (var i = 0; i < annotations.length; i++) { final value = _computeConstantValue( element, i, @@ -274,7 +275,8 @@ class UnresolvedAnnotationException implements Exception { final parsedLibrary = annotatedElement.session! .getParsedLibraryByElement(annotatedElement.library!) as ParsedLibraryResult; - final declaration = parsedLibrary.getElementDeclaration(annotatedElement); + final declaration = + parsedLibrary.getFragmentDeclaration(annotatedElement.firstFragment); if (declaration == null) { return null; } diff --git a/lib/src/analyzer/utils.dart b/lib/src/analyzer/utils.dart index f922681..d863a11 100644 --- a/lib/src/analyzer/utils.dart +++ b/lib/src/analyzer/utils.dart @@ -20,7 +20,7 @@ String computePartUrl(AssetId input, AssetId output) => String urlOfElement(Element element) => element.kind == ElementKind.DYNAMIC ? 'dart:core#dynamic' // using librarySource.uri – in case the element is in a part - : normalizeUrl(element.librarySource!.uri) + : normalizeUrl(element.library!.uri) .replace(fragment: element.name) .toString(); diff --git a/lib/src/reflection_factory_builder.dart b/lib/src/reflection_factory_builder.dart index 1ae6d79..674d7e2 100644 --- a/lib/src/reflection_factory_builder.dart +++ b/lib/src/reflection_factory_builder.dart @@ -6,11 +6,12 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; -import 'package:analyzer/dart/element/visitor.dart'; +import 'package:analyzer/dart/element/visitor2.dart'; import 'package:build/build.dart'; import 'package:collection/collection.dart'; import 'package:dart_style/dart_style.dart'; import 'package:reflection_factory/reflection_factory.dart'; +import 'package:logging/logging.dart' show Logger; import 'analyzer/input_analyzer.dart'; import 'analyzer/library.dart'; @@ -18,6 +19,9 @@ import 'analyzer/type_checker.dart'; /// The reflection builder. class ReflectionBuilder implements Builder { + /// The [ReflectionBuilder] global [Logger]. + static Logger get logger => log; + /// If `true` builds the reflection code in verbose mode. final bool verbose; @@ -37,12 +41,37 @@ class ReflectionBuilder implements Builder { String get version => ReflectionFactory.VERSION; @override - String toString({String indent = ''}) { - return '${indent}ReflectionBuilder[$version]:\n' - '$indent -- Dart: ${Platform.version}\n' - '$indent -- verbose: $verbose\n' - '$indent -- sequential: $sequential\n' - '$indent -- buildStepTimeout: ${buildStepTimeout.toHumanReadable()}\n'; + String toString({ + bool verbose = false, + bool multiline = false, + String indent = '', + }) { + if (!verbose) { + return 'ReflectionBuilder[$version]'; + } + + var dartVersion = Platform.version; + + if (!multiline) { + var parts = dartVersion.split(RegExp(r'\s+')); + if (parts.length > 2) { + parts = parts.sublist(0, 2); + } + dartVersion = parts.join(' '); + } + + var infos = [ + 'Dart: $dartVersion', + 'verbose: $verbose', + 'sequential: $sequential', + 'buildStepTimeout: ${buildStepTimeout.toHumanReadable()}', + ].join(multiline ? '\n$indent» ' : ', '); + + if (multiline) { + infos = '\n$indent» $infos\n$indent'; + } + + return '${indent}ReflectionBuilder[$version]{$infos}'; } @override @@ -116,7 +145,7 @@ class ReflectionBuilder implements Builder { void _onBuildTimeout(BuildStep buildStep) { log.warning( - 'Build timeout (${buildStepTimeout.toHumanReadable()}): ${buildStep.inputId} >> Will continue with the next `BuildStep`...'); + 'Build timeout (${buildStepTimeout.toHumanReadable()}): ${buildStep.inputId} » Will continue with the next `BuildStep`...'); } Future _buildImpl(BuildStep buildStep) async { @@ -162,9 +191,12 @@ class ReflectionBuilder implements Builder { final libraryReader = await inputAnalyzer.libraryReader; final inputLib = libraryReader.element; - if (inputLib.name == 'reflection_factory' || - inputLib.name.startsWith('reflection_factory.') || - inputLib.name.startsWith('reflection_factory_')) { + var inputLibName = inputLib.libraryName; + + if (inputLibName == 'reflection_factory' || + inputLibName.startsWith('reflection_factory.') || + inputLibName.startsWith('reflection_factory_') || + inputLibName.startsWith('package:reflection_factory/')) { return; } @@ -264,14 +296,18 @@ class ReflectionBuilder implements Builder { final elapsedTime = DateTime.now().difference(initTime); if (codeKeys != null) { - log.info(' >> GENERATED:\n' - ' -- Elements: $codeKeys\n' - ' -- File: $genId\n' - ' -- Time: ${elapsedTime.inMilliseconds} ms\n\n'); + log.info( + ' » GENERATED:\n' + ' -- Elements: $codeKeys\n' + ' -- File: $genId\n' + ' -- Time: ${elapsedTime.inMilliseconds} ms\n\n', + ); } else { - log.info(' >> CACHED:\n' - ' -- File: $genId\n' - ' -- Time: ${elapsedTime.inMilliseconds} ms\n\n'); + log.info( + ' » CACHED:\n' + ' -- File: $genId\n' + ' -- Time: ${elapsedTime.inMilliseconds} ms\n\n', + ); } if (verbose) { @@ -434,7 +470,9 @@ class ReflectionBuilder implements Builder { var ignoreMethods = {...ignoreMethods1, ...ignoreMethods2}; if (reflectionProxyName.isEmpty) { - reflectionProxyName = annotatedClass.name; + reflectionProxyName = annotatedClass.name ?? + (throw StateError( + "Can't determine `reflectionProxyName`: $annotatedClass")); } log.info(' \n' @@ -584,7 +622,8 @@ class ReflectionBuilder implements Builder { List classesTypes, String reflectionBridgeExtensionName, Map reflectionClassNames) { - var bridgeClassName = annotatedClass.name; + var bridgeClassName = annotatedClass.name ?? + (throw StateError("Can't define `bridgeClassName`: $annotatedClass")); var bridgeExtensionName = _buildReflectionExtensionName( bridgeClassName, reflectionBridgeExtensionName); @@ -1035,7 +1074,7 @@ String _buildReflectionExtensionName( return '$className\$reflectionExtension'; } -class _EnumTree extends RecursiveElementVisitor { +class _EnumTree extends RecursiveElementVisitor2 { final Element _enumElement; final String reflectionClassName; @@ -1099,9 +1138,9 @@ class _EnumTree extends RecursiveElementVisitor { } List get staticFieldsNames => - staticFields.map((e) => e.name).toList(); + staticFields.map((e) => e.name).nonNulls.toList(); - List get fieldsNames => fields.map((e) => e.name).toList(); + List get fieldsNames => fields.map((e) => e.name).nonNulls.toList(); bool hasStaticField(String filedName) => staticFields.where((m) => m.name == filedName).isNotEmpty; @@ -1266,7 +1305,7 @@ class _EnumTree extends RecursiveElementVisitor { } Map _toFieldEntries(Set fields) { - return Map.fromEntries(fields.map((e) => MapEntry(e.name, _Field(e)))); + return Map.fromEntries(fields.map((e) => MapEntry(e.name!, _Field(e)))); } String buildReflectionExtension() { @@ -1330,7 +1369,7 @@ class _EnumTree extends RecursiveElementVisitor { } } -class _ClassTree extends RecursiveElementVisitor { +class _ClassTree extends RecursiveElementVisitor2 { final _TypeAliasTable typeAliasTable; final ClassElement _classElement; @@ -1356,7 +1395,7 @@ class _ClassTree extends RecursiveElementVisitor { this.optimizeReflectionInstances, this.languageVersion, {this.verbose = false}) - : className = _classElement.name { + : className = _classElement.name! { scan(_classElement); } @@ -1426,7 +1465,7 @@ class _ClassTree extends RecursiveElementVisitor { ConstructorElement? get emptyConstructor { var noArgsConstructors = constructors - .where((e) => e.name.isNotEmpty && e.parameters.isEmpty) + .where((e) => e.codeName.isNotEmpty && e.formalParameters.isEmpty) .toList(); if (noArgsConstructors.isEmpty) { @@ -1435,7 +1474,7 @@ class _ClassTree extends RecursiveElementVisitor { return noArgsConstructors[0]; } else { var found = noArgsConstructors.firstWhereOrNull((e) { - var name = e.name.toLowerCase(); + var name = e.codeName.toLowerCase(); return name == 'empty' || name == 'create' || name == 'def'; }); @@ -1450,7 +1489,7 @@ class _ClassTree extends RecursiveElementVisitor { ConstructorElement? get noRequiredArgsConstructor { var noArgsConstructors = constructors .where((e) => - e.name.isNotEmpty && + e.codeName.isNotEmpty && e.normalParameters.isEmpty && e.optionalParameters.where((p) => p.required).isEmpty && e.namedParameters.values.where((p) => p.required).isEmpty) @@ -1462,7 +1501,7 @@ class _ClassTree extends RecursiveElementVisitor { return noArgsConstructors[0]; } else { var found = noArgsConstructors.firstWhereOrNull((e) { - var name = e.name.toLowerCase(); + var name = e.codeName.toLowerCase(); return name == 'empty' || name == 'create' || name == 'def'; }); @@ -1476,7 +1515,7 @@ class _ClassTree extends RecursiveElementVisitor { @override T? visitConstructorElement(ConstructorElement element) { - if (element.isPrivate || !isValidMethodName(element.name)) { + if (element.isPrivate || !isValidMethodName(element.codeName)) { return super.visitConstructorElement(element); } @@ -1490,11 +1529,11 @@ class _ClassTree extends RecursiveElementVisitor { final Set staticMethods = {}; List get staticMethodsNames => - staticMethods.map((e) => e.name).toList(); + staticMethods.map((e) => e.name).nonNulls.toList(); final Set methods = {}; - List get methodsNames => methods.map((e) => e.name).toList(); + List get methodsNames => methods.map((e) => e.name).nonNulls.toList(); bool hasMethod(String methodName) => methods.where((m) => m.name == methodName).isNotEmpty; @@ -1525,7 +1564,7 @@ class _ClassTree extends RecursiveElementVisitor { @override T? visitMethodElement(MethodElement element) { - if (element.isPrivate || !isValidMethodName(element.name)) { + if (element.isPrivate || !isValidMethodName(element.name ?? '')) { return super.visitMethodElement(element); } @@ -1543,11 +1582,11 @@ class _ClassTree extends RecursiveElementVisitor { final Set staticFields = {}; List get staticFieldsNames => - staticFields.map((e) => e.name).toList(); + staticFields.map((e) => e.name).nonNulls.toList(); final Set fields = {}; - List get fieldsNames => fields.map((e) => e.name).toList(); + List get fieldsNames => fields.map((e) => e.name).nonNulls.toList(); bool hasField(String filedName) => fields.where((m) => m.name == filedName).isNotEmpty; @@ -2067,7 +2106,7 @@ class _ClassTree extends RecursiveElementVisitor { } Map _toFieldEntries(Set fields) { - return Map.fromEntries(fields.map((e) => MapEntry(e.name, _Field(e)))); + return Map.fromEntries(fields.map((e) => MapEntry(e.name!, _Field(e)))); } void _buildCallMethodToJson(StringBuffer str) { @@ -2252,13 +2291,13 @@ class _ClassTree extends RecursiveElementVisitor { Map _toConstructorEntries( _ClassTree classTree, Set elements) { return Map.fromEntries(elements.map((c) { - return MapEntry(c.name, _Constructor(classTree, c)); + return MapEntry(c.codeName, _Constructor(classTree, c)); })); } Map _toMethodsEntries(Set elements) { return Map.fromEntries(elements.map((m) { - return MapEntry(m.name, _Method(this, m)); + return MapEntry(m.name!, _Method(this, m)); })); } @@ -2487,7 +2526,7 @@ class _ClassTree extends RecursiveElementVisitor { var call = StringBuffer(); call.write("onCall( this, '${proxyMethod.name}', {\n"); - for (var p in method.parameters) { + for (var p in method.formalParameters) { if (ignoreParametersTypes.containsType(p.type)) continue; var name = p.name; call.write(" '${p.name}': $name,\n"); @@ -2566,28 +2605,28 @@ class _ProxyMethod { final String name; final DartType returnType; - final List parameters; + final List parameters; final List typeParameters; _ProxyMethod( this.name, this.returnType, this.parameters, this.typeParameters); factory _ProxyMethod.fromMethodElement(MethodElement method) { - return _ProxyMethod(method.name, method.returnType, - method.parameters.toList(), method.typeParameters.toList()); + return _ProxyMethod(method.name!, method.returnType, + method.formalParameters.toList(), method.typeParameters.toList()); } List get typeParametersNames => - typeParameters.map((e) => e.name).toList(); + typeParameters.map((e) => e.name).nonNulls.toList(); - List get positionalParameters => parameters + List get positionalParameters => parameters .where((p) => p.isPositional && !p.isOptionalPositional) .toList(); - List get positionalOptionalParameters => + List get positionalOptionalParameters => parameters.where((p) => p.isOptionalPositional).toList(); - List get namedParameters => + List get namedParameters => parameters.where((p) => p.isNamed).toList(); bool get returnAcceptsNull => returnType.isNullable; @@ -2626,7 +2665,7 @@ class _ProxyMethod { var parametersStr = StringBuffer(); for (var p in typeParameters) { - var pStr = p.getDisplayString(); + var pStr = p.displayString(); if (pStr.startsWith('{') || pStr.startsWith('[')) { pStr = pStr.substring(1, pStr.length - 1).trim(); } @@ -2676,15 +2715,17 @@ class _ProxyMethod { return parametersStr.toString(); } - void _writeParameters(StringBuffer parametersStr, - List parameters, Set ignoreParametersTypes) { + void _writeParameters( + StringBuffer parametersStr, + List parameters, + Set ignoreParametersTypes) { for (int i = 0; i < parameters.length; i++) { var e = parameters[i]; if (ignoreParametersTypes.containsType(e.type)) continue; if (i > 0) parametersStr.write(', '); - var pStr = e.getDisplayString(); + var pStr = e.displayString(); if (pStr.startsWith('{') || pStr.startsWith('[')) { pStr = pStr.substring(1, pStr.length - 1).trim(); } @@ -2741,7 +2782,7 @@ class _Element { return null; } - var enclosingElement = element.enclosingElement3; + var enclosingElement = element.enclosingElement; if (enclosingElement is InterfaceElement) { return enclosingElement.thisType; @@ -2757,17 +2798,17 @@ class _Element { List _annotationsImpl() { var element = _element; - var metadata = List.from(element.metadata); + var metadata = List.from(element.metadata.annotations); if (element is FieldElement) { var getter = element.getter; if (getter != null) { - metadata.addAll(getter.metadata); + metadata.addAll(getter.metadata.annotations); } var setter = element.setter; if (setter != null) { - metadata.addAll(setter.metadata); + metadata.addAll(setter.metadata.annotations); } } @@ -2795,7 +2836,7 @@ class _Element { } class _Parameter extends _Element { - final ParameterElement parameterElement; + final FormalParameterElement parameterElement; final int parameterIndex; final DartType type; @@ -2834,7 +2875,7 @@ class _Constructor extends _Element { _TypeAliasTable get typeAliasTable => classTree.typeAliasTable; - String get name => constructorElement.name; + String get name => constructorElement.codeName; bool get returnNullable => constructorElement.returnType.isNullable; @@ -3001,7 +3042,7 @@ class _Method extends _Element { _TypeAliasTable get typeAliasTable => classTree.typeAliasTable; - String get name => methodElement.name; + String get name => methodElement.name!; bool get returnNullable => methodElement.returnType.isNullable; @@ -3058,7 +3099,7 @@ class _Field extends _Element { _Field(this.fieldElement) : super(fieldElement); - String get name => fieldElement.name; + String get name => fieldElement.name!; bool get isDartCore => fieldElement.type.isDartCore; @@ -3410,7 +3451,9 @@ extension _DartTypeExtension on DartType { if (self is FunctionType) { var alias = self.alias; if (alias != null && alias.typeArguments.isEmpty) { - var name = alias.element.name; + var name = alias.element.name ?? + (throw StateError( + "Can't resolve `FunctionType` alias name: $alias")); return name; } else { var functionType = self.getDisplayStringNoNullability(); @@ -3605,13 +3648,14 @@ extension _DartTypeExtension on DartType { } extension _ConstructorElementExtension on ConstructorElement { - List<_Parameter> parametersWhere(bool Function(ParameterElement p) filter) { + List<_Parameter> parametersWhere( + bool Function(FormalParameterElement p) filter) { var list = <_Parameter>[]; var i = 0; - for (var p in parameters) { + for (var p in formalParameters) { if (filter(p)) { var param = _Parameter( - p, i, p.type, p.name, p.type.isNullable, p.isRequiredNamed); + p, i, p.type, p.name!, p.type.isNullable, p.isRequiredNamed); list.add(param); } i++; @@ -3630,35 +3674,55 @@ extension _ConstructorElementExtension on ConstructorElement { parametersWhere((p) => p.isNamed).map((e) => MapEntry(e.name, e))); } +extension _FormalParameterElementExtension on FormalParameterElement { + bool get isNormal => isRequiredPositional; +} + extension _FunctionTypeExtension on FunctionType { + List get normalParameterNames => formalParameters + .where((p) => p.isNormal) + .map((p) => p.name) + .nonNulls + .toList(); + List<_Parameter> get normalParameters { + final normalParameterNames = this.normalParameterNames; + final normalParameterTypes = this.normalParameterTypes; return List<_Parameter>.generate(normalParameterNames.length, (i) { var n = normalParameterNames[i]; var t = normalParameterTypes[i]; - var p = parameters[i]; + var p = formalParameters[i]; return _Parameter(p, i, t, n, t.isNullable, true); }); } + List get optionalParameterNames => formalParameters + .where((p) => p.isOptionalPositional) + .map((p) => p.name) + .nonNulls + .toList(); + List<_Parameter> get optionalParameters { + final optionalParameterNames = this.optionalParameterNames; + final optionalParameterTypes = this.optionalParameterTypes; return List<_Parameter>.generate(optionalParameterNames.length, (i) { var n = optionalParameterNames[i]; var t = optionalParameterTypes[i]; var idx = normalParameterNames.length + i; - var p = parameters[idx]; + var p = formalParameters[idx]; return _Parameter(p, idx, t, n, t.isNullable, false); }); } Map get namedParameters { var map = {}; - var normalParametersLength = normalParameterNames.length; - var namedParametersLength = namedParameterTypes.length; + final normalParametersLength = normalParameterNames.length; + final namedParametersLength = namedParameterTypes.length; for (var i = 0; i < namedParametersLength; ++i) { var idx = normalParametersLength + i; - var p = parameters[idx]; - var key = p.name; + var p = formalParameters[idx]; + var key = p.name!; var type = p.type; var required = p.isRequiredNamed; var parameter = _Parameter(p, idx, type, key, type.isNullable, required); diff --git a/lib/src/reflection_factory_json.dart b/lib/src/reflection_factory_json.dart index 1251e63..cd03a68 100644 --- a/lib/src/reflection_factory_json.dart +++ b/lib/src/reflection_factory_json.dart @@ -644,7 +644,8 @@ class _JsonEncoder extends dart_convert.Converter } } - Object? _valueToJson(o, String? fieldName, bool duplicatedEntitiesAsID) { + Object? _valueToJson( + Object? o, String? fieldName, bool duplicatedEntitiesAsID) { if (o == null) { return null; } else if (o is String || o is num || o is bool) { @@ -833,7 +834,7 @@ class _JsonEncoder extends dart_convert.Converter return _entityToJson(o, oType, duplicatedEntitiesAsID); } - Object? _entityToJson(o, Type oType, bool duplicatedEntitiesAsID) { + Object? _entityToJson(Object? o, Type oType, bool duplicatedEntitiesAsID) { var classReflection = ReflectionFactory().getRegisterClassReflection(oType); if (classReflection != null) { diff --git a/pubspec.yaml b/pubspec.yaml index dea2582..e7889ed 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,22 +7,23 @@ environment: sdk: '>=3.6.0 <4.0.0' dependencies: - build: ^2.4.2 - analyzer: ^6.11.0 - dart_style: ^3.0.1 + build: ^3.0.2 + analyzer: ^8.1.1 + dart_style: ^3.1.2 meta: ^1.17.0 - mime: ^1.0.6 + mime: ^2.0.0 base_codecs: ^1.0.1 pub_semver: ^2.2.0 path: ^1.9.1 - collection: ^1.19.0 + collection: ^1.19.1 yaml: ^3.1.3 source_span: ^1.10.1 + logging: ^1.3.0 dev_dependencies: - build_runner: ^2.4.15 - build_test: ^2.2.3 - lints: ^5.1.1 + build_runner: ^2.7.0 + build_test: ^3.3.2 + lints: ^6.0.0 pubspec_parse: ^1.5.0 data_serializer: ^1.2.1 #dependency_validator: ^5.0.2 diff --git a/test/reflection_factory_build_test.dart b/test/reflection_factory_build_test.dart index babd36b..809de8b 100644 --- a/test/reflection_factory_build_test.dart +++ b/test/reflection_factory_build_test.dart @@ -2,20 +2,38 @@ @Tags(['build', 'slow']) library; +import 'dart:io' as io; + import 'package:build/build.dart'; import 'package:build_test/build_test.dart'; +import 'package:logging/logging.dart' + show LogRecord, Level, hierarchicalLoggingEnabled; import 'package:reflection_factory/builder.dart'; import 'package:reflection_factory/src/reflection_factory_builder.dart'; import 'package:test/test.dart'; +void _printToConsole(Object? o) { + if (o == null) return; + + if (o is LogRecord && o.level >= Level.SEVERE) { + io.stderr.write('$o\n'); + } else { + io.stdout.write('$o\n'); + } +} + void main() { + hierarchicalLoggingEnabled = true; + tearDown(() { // Increment this after each test so the next test has it's own package _pkgCacheCount++; }); group('ReflectionBuilder', () { - setUp(() {}); + setUp(() { + ReflectionBuilder.logger.level = Level.ALL; + }); test('NO Reflection: TestEmpty', () async { var builder = ReflectionBuilder(verbose: true); @@ -28,17 +46,20 @@ void main() { class TestEmpty {} - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: {}, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -57,36 +78,46 @@ void main() { @EnableReflection() class TestEmpty {} - ''' + ''', }; - await testBuilder( + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + + var res = await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('TestEmpty\$reflection'), - contains('TestEmpty\$reflectionExtension'), - isNot( - contains("Map getJsonFieldsVisibleValues(")), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')", + ), + ), + allOf( + contains('TestEmpty\$reflection'), + contains('TestEmpty\$reflectionExtension'), + isNot( + contains("Map getJsonFieldsVisibleValues("), + ), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); + + expect(res.buildResult.status.name, equals('success')); }); test('EnableReflection: TestEmpty', () async { @@ -102,34 +133,43 @@ void main() { @EnableReflection() class \$TestSpecial {} - ''' + ''', }; - await testBuilder( + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + + var res = await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('\$TestSpecial\$reflection'), - contains('\$TestSpecial\$reflectionExtension'), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')", + ), + ), + allOf( + contains('\$TestSpecial\$reflection'), + contains('\$TestSpecial\$reflectionExtension'), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); + + expect(res.buildResult.status.name, equals('success')); }); test('EnableReflection: User', () async { @@ -212,53 +252,73 @@ void main() { } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('User\$reflection'), - contains('User\$reflectionExtension'), - ), - matches(RegExp( - r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)")), - allOf( - contains("TestAnnotation(['static method', 'version checker'])"), - contains("TestAnnotation(['method', 'password checker'])"), - contains("TestAnnotation(['static field', 'version'])"), - contains("TestAnnotation(['field', 'email'])"), - contains("TestAnnotation(['parameter', 'pass'])"), - isNot(matches(RegExp( - r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\('))), - matches(RegExp( - r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)')), - ), - allOf( - contains("JsonField.hidden()"), - contains("JsonField.visible()"), - contains("Map getJsonFieldsVisibleValues("), - contains("case 'tojson':"), - contains("case 'getfield':"), - contains("case 'setfield':"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')", + ), + ), + allOf( + contains('User\$reflection'), + contains('User\$reflectionExtension'), + ), + matches( + RegExp( + r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)", + ), + ), + allOf( + contains( + "TestAnnotation(['static method', 'version checker'])", + ), + contains("TestAnnotation(['method', 'password checker'])"), + contains("TestAnnotation(['static field', 'version'])"), + contains("TestAnnotation(['field', 'email'])"), + contains("TestAnnotation(['parameter', 'pass'])"), + isNot( + matches( + RegExp( + r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', + ), + ), + ), + matches( + RegExp( + r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)', + ), + ), + ), + allOf( + contains("JsonField.hidden()"), + contains("JsonField.visible()"), + contains("Map getJsonFieldsVisibleValues("), + contains("case 'tojson':"), + contains("case 'getfield':"), + contains("case 'setfield':"), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -303,56 +363,84 @@ void main() { } } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/reflection/foo.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of '../foo.dart'"), - ), - allOf( - contains('Domain\$reflection'), - contains('Domain\$reflectionExtension'), - ), - allOf( - contains('bool get hasDefaultConstructor => true;'), - contains( - 'Domain? createInstanceWithDefaultConstructor() => Domain();'), - contains('bool get hasEmptyConstructor => true;'), - contains( - 'Domain? createInstanceWithEmptyConstructor() => Domain.empty();'), - contains('bool get hasNoRequiredArgsConstructor => true;'), - contains( - 'Domain? createInstanceWithNoRequiredArgsConstructor() => Domain.empty();'), - ), - matches(RegExp( - r"'suffix':\s*__PR\(\s*__TR.tString\s*,\s*'suffix'\s*,\s*false\s*,\s*false\s*,\s*'net'\s*\)")), + '$_pkgName|lib/reflection/foo.g.dart': decodedMatches( allOf( - matches(RegExp( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of '../foo.dart'"), + ), + allOf( + contains('Domain\$reflection'), + contains('Domain\$reflectionExtension'), + ), + allOf( + contains('bool get hasDefaultConstructor => true;'), + contains( + 'Domain? createInstanceWithDefaultConstructor() => Domain();', + ), + contains('bool get hasEmptyConstructor => true;'), + contains( + 'Domain? createInstanceWithEmptyConstructor() => Domain.empty();', + ), + contains('bool get hasNoRequiredArgsConstructor => true;'), + contains( + 'Domain? createInstanceWithNoRequiredArgsConstructor() => Domain.empty();', + ), + ), + matches( + RegExp( + r"'suffix':\s*__PR\(\s*__TR.tString\s*,\s*'suffix'\s*,\s*false\s*,\s*false\s*,\s*'net'\s*\)", + ), + ), + allOf( + matches( + RegExp( r"case 'callfx':.*?const <__PR>\[\s*__PR\(\s*__TR\(Fx\), 'f', true, false\)\s*\]", - dotAll: true)), - matches(RegExp( + dotAll: true, + ), + ), + matches( + RegExp( r"case 'callallfx':.*?__PR\(\s*__TR>\(\s*List, <__TI>\[__TI.tFunction\]\),\s*'fxs',\s*false,\s*true,\s*\)", - dotAll: true)), - matches(RegExp( - r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(')), - matches(RegExp( - r'Object\?\s+toJson\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJson\(null, null, duplicatedEntitiesAsID\)')), - matches(RegExp( - r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)'))), - )), + dotAll: true, + ), + ), + matches( + RegExp( + r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', + ), + ), + matches( + RegExp( + r'Object\?\s+toJson\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJson\(null, null, duplicatedEntitiesAsID\)', + ), + ), + matches( + RegExp( + r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)', + ), + ), + ), + ), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -375,23 +463,31 @@ void main() { bool equalsName(String name) => this.name == name; } - ''' + ''', }; - var packageAssetReader = await PackageAssetReader.currentIsolate(); - - expectLater( - () => testBuilder( - builder, - sourceAssets, - reader: packageAssetReader, - generateFor: {'$_pkgName|lib/foo.dart'}, - onLog: (msg) { - print(msg); - }, - ), - throwsA(isA().having((e) => e.message, - 'NO part directive', contains('NO reflection part directive ')))); + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + + var logs = []; + + var res = await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, + onLog: (msg) { + _printToConsole(msg); + logs.add(msg); + }, + ); + + expect(res.buildResult.status.name, equals('failure')); + + var logsSevere = logs.where((r) => r.level == Level.SEVERE).toList(); + + expect(logsSevere, isNotEmpty); + expect(logsSevere.join('\n'), contains('NO reflection part directive ')); }); test('EnableReflection[super class]', () async { @@ -428,50 +524,71 @@ void main() { Set> opAMethod() => >{[]}; } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - ), - allOf([ - contains('Op\$reflection'), - contains('Op\$reflectionExtension'), - contains('OpA\$reflection'), - contains('OpA\$reflectionExtension'), - ]), - allOf( - matches(RegExp( - r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(')), - matches(RegExp( - r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(')), - ), - allOf( - contains("case 'type':"), - contains("case 'value':"), - contains("_fieldsNames = const ['type', 'value']"), - contains("_supperTypes = const [Op, WithType];"), - matches(RegExp( - r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)")), - matches(RegExp( - r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)")), - matches(RegExp( - r"__TR>\(\s*Set, <__TR>\[__TR.tListDynamic\]\)")), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf([ + contains('Op\$reflection'), + contains('Op\$reflectionExtension'), + contains('OpA\$reflection'), + contains('OpA\$reflectionExtension'), + ]), + allOf( + matches( + RegExp( + r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', + ), + ), + matches( + RegExp( + r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(', + ), + ), + ), + allOf( + contains("case 'type':"), + contains("case 'value':"), + contains("_fieldsNames = const ['type', 'value']"), + contains("_supperTypes = const [Op, WithType];"), + matches( + RegExp( + r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)", + ), + ), + matches( + RegExp( + r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)", + ), + ), + matches( + RegExp( + r"__TR>\(\s*Set, <__TR>\[__TR.tListDynamic\]\)", + ), + ), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -502,41 +619,53 @@ void main() { } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), - ), - allOf( - contains('User\$reflection'), - contains('User\$reflectionExtension'), - ), - matches(RegExp( - r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)")), - allOf( - matches(RegExp(r"typedef __RCD1 = \(bool, String\?\);")), - matches( - RegExp(r"MethodReflection\(")), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')", + ), + ), + allOf( + contains('User\$reflection'), + contains('User\$reflectionExtension'), + ), matches( - RegExp(r"'checkPassword',\s+const __TR<__RCD1>\(__RCD1\),")), + RegExp( + r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)", + ), + ), + allOf( + matches(RegExp(r"typedef __RCD1 = \(bool, String\?\);")), + matches( + RegExp(r"MethodReflection\("), + ), + matches( + RegExp(r"'checkPassword',\s+const __TR<__RCD1>\(__RCD1\),"), + ), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -582,42 +711,58 @@ void main() { } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), - ), - allOf( - contains('User\$reflection'), - contains('User\$reflectionExtension'), - ), - allOf( - matches(RegExp(r"typedef\s+__RCD1\s+=\s+\(dynamic,\s+Info\);")), - matches(RegExp( - r"case\s+'base1':\s+return\s+MethodReflection\(")), - matches(RegExp( - r"case\s+'base2':\s+return\s+MethodReflection\(")), - matches(RegExp( - r"case\s+'info':\s+return\s+MethodReflection\(")), - matches(RegExp(r"__TR<__RCD1>\(__RCD1\),")), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')", + ), + ), + allOf( + contains('User\$reflection'), + contains('User\$reflectionExtension'), + ), + allOf( + matches(RegExp(r"typedef\s+__RCD1\s+=\s+\(dynamic,\s+Info\);")), + matches( + RegExp( + r"case\s+'base1':\s+return\s+MethodReflection\(", + ), + ), + matches( + RegExp( + r"case\s+'base2':\s+return\s+MethodReflection\(", + ), + ), + matches( + RegExp( + r"case\s+'info':\s+return\s+MethodReflection\(", + ), + ), + matches(RegExp(r"__TR<__RCD1>\(__RCD1\),")), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -639,43 +784,51 @@ void main() { } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('Validator\$reflection'), - contains('Validator\$reflectionExtension'), - contains("typedef __RCD1 = ({String? error, bool ok});"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')", + ), + ), + allOf( + contains('Validator\$reflection'), + contains('Validator\$reflectionExtension'), + contains("typedef __RCD1 = ({String? error, bool ok});"), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); - test('EnableReflection(reflectionClassName, reflectionExtensionName)', - () async { - var builder = ReflectionBuilder(verbose: true); + test( + 'EnableReflection(reflectionClassName, reflectionExtensionName)', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/foo.dart': ''' + var sourceAssets = { + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -701,32 +854,44 @@ void main() { } } - ''' - }; - - await testBuilder( - builder, - sourceAssets, - reader: await PackageAssetReader.currentIsolate(), - generateFor: {'$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('RefUser'), - contains('RefUserExt'), - matches( - RegExp(r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(')), - matches(RegExp( - r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(')), - )) - }, - onLog: (msg) { - print(msg); - }, - //packageConfig: packageConfig, - ); - }); + ''', + }; + + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('RefUser'), + contains('RefUserExt'), + matches( + RegExp( + r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', + ), + ), + matches( + RegExp( + r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(', + ), + ), + ), + ), + }, + onLog: (msg) { + _printToConsole(msg); + }, + //packageConfig: packageConfig, + ); + }, + ); test('EnableReflection + source with part file', () async { var builder = ReflectionBuilder(verbose: true); @@ -759,24 +924,29 @@ void main() { Foo(this.a, this.b); } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart', '$_pkgName|lib/foo_extra.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('Foo\$reflection'), - contains('FooExtra\$reflection'), - )) + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('Foo\$reflection'), + contains('FooExtra\$reflection'), + ), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -801,38 +971,46 @@ void main() { Foo(this.n, {this.status = Status.a}); } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf([ + contains('Status\$reflection'), + contains('Status\$reflectionExtension'), + contains('Foo\$reflection'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains( + 'final Expando _objectReflections', + ), + contains('factory Status\$reflection([Status? object]) {'), + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), ), - allOf([ - contains('Status\$reflection'), - contains('Status\$reflectionExtension'), - contains('Foo\$reflection'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Status\$reflection([Status? object]) {'), - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -857,39 +1035,49 @@ void main() { Foo(this.n, {this.status = Status.a}); } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf([ + contains('Status\$reflection'), + contains('Status\$reflectionExtension'), + contains('Foo\$reflection'), + contains('Foo\$reflectionExtension'), + ]), + isNot( + anyOf([ + contains( + 'final Expando _objectReflections', + ), + contains('factory Status\$reflection([Status? object]) {'), + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + contains('// Dependency reflections:'), + ]), + ), ), - allOf([ - contains('Status\$reflection'), - contains('Status\$reflectionExtension'), - contains('Foo\$reflection'), - contains('Foo\$reflectionExtension'), - ]), - isNot(anyOf([ - contains('final Expando _objectReflections'), - contains('factory Status\$reflection([Status? object]) {'), - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - contains('// Dependency reflections:'), - ])), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -922,59 +1110,70 @@ void main() { Status s; Foo(this.n, {this.status = Status.a}); } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/status.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'status.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'status.dart'"), + ), + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains( + 'final Expando _objectReflections', + ), + contains('factory Status\$reflection([Status? object]) {'), + ]), ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Status\$reflection([Status? object]) {'), - ]), - )), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1013,59 +1212,70 @@ void main() { Wrapper s; Foo(this.n, {this.status = Status.a}); } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/status.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'status.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'status.dart'"), + ), + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains( + 'final Expando _objectReflections', + ), + contains('factory Status\$reflection([Status? object]) {'), + ]), ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Status\$reflection([Status? object]) {'), - ]), - )), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1100,69 +1310,81 @@ void main() { Foo(this.n); } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/status.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'status.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'status.dart'"), + ), + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains( + 'final Expando _objectReflections', + ), + contains('factory Status\$reflection([Status? object]) {'), + ]), ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Status\$reflection([Status? object]) {'), - ]), - )), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); - test('EnableReflection + import + type recursion [2 source files]', - () async { - var builder = ReflectionBuilder(verbose: true); + test( + 'EnableReflection + import + type recursion [2 source files]', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/status.dart': ''' + var sourceAssets = { + '$_pkgName|lib/status.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -1188,7 +1410,7 @@ void main() { } ''', - '$_pkgName|lib/foo.dart': ''' + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -1204,62 +1426,74 @@ void main() { Foo(this.n, {this.status = Status.a, this.w}); } - ''' - }; - - await testBuilder( - builder, - sourceAssets, - reader: await PackageAssetReader.currentIsolate(), - generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'status.dart'"), + ''', + }; + + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/status.reflection.g.dart': decodedMatches( + allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'status.dart'"), + ), + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains( + 'final Expando _objectReflections', + ), + contains('factory Status\$reflection([Status? object]) {'), + ]), + ), ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Status\$reflection([Status? object]) {'), - ]), - )), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), + ), ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), - )), - }, - onLog: (msg) { - print(msg); - }, - ); - }); + }, + onLog: (msg) { + _printToConsole(msg); + }, + ); + }, + ); test('ReflectionBridge', () async { var builder = ReflectionBuilder(verbose: true); @@ -1287,25 +1521,30 @@ void main() { } } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('User\$reflection'), - contains('User\$reflectionExtension'), - contains('UserReflection\$reflectionExtension'), - )) + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('User\$reflection'), + contains('User\$reflectionExtension'), + contains('UserReflection\$reflectionExtension'), + ), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, //packageConfig: packageConfig, ); @@ -1342,47 +1581,55 @@ void main() { } } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('UserRef'), - contains('UserRefExt'), - contains('BridgeExt'), - )) + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('UserRef'), + contains('UserRefExt'), + contains('BridgeExt'), + ), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); - void testClassProxyLlibraryPath(bool sequential) async { - var builder = reflectionFactory(BuilderOptions({ - 'verbose': true, - 'sequential': sequential, - 'timeout': '45 sec', - })); + void testClassProxyLibraryPath(bool sequential) async { + var builder = reflectionFactory( + BuilderOptions({ + 'verbose': true, + 'sequential': sequential, + 'timeout': '45 sec', + }), + ); expect(builder.verbose, isTrue); expect(builder.sequential, equals(sequential)); expect(builder.buildStepTimeout, equals(Duration(seconds: 45))); expect( - builder.toString(), - allOf( - contains('verbose: true'), - contains('sequential: $sequential'), - contains('buildStepTimeout: 45 sec'), - )); + builder.toString(verbose: true), + allOf( + contains('verbose: true'), + contains('sequential: $sequential'), + contains('buildStepTimeout: 45 sec'), + ), + ); var sourceAssets = { '$_pkgName|lib/simple_api.dart': ''' @@ -1457,74 +1704,95 @@ void main() { ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: { '$_pkgName|lib/simple_api.dart', '$_pkgName|lib/foo.dart', '$_pkgName|lib/extra_api.dart', }, outputs: { - '$_pkgName|lib/reflection/simple_api.g.dart': decodedMatches(allOf( + '$_pkgName|lib/reflection/simple_api.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of '../simple_api.dart'"), - contains('SimpleAPI\$reflection'), - ), - )), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains('SimpleAPIProxy\$reflectionProxy'), - ), - allOf( - contains('void nothing() {'), - isNot(contains('void ignore1() {')), - contains('int compute() {'), - contains('int computeSum(int a, int? b) {'), - contains('Future? computeMultiply(int a, int b) {'), - contains( - 'FutureOr? computeDivide(int a, int b, Future future) {'), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of '../simple_api.dart'"), + contains('SimpleAPI\$reflection'), + ), ), + ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('int computeSum3(int a, {int? b, int? c}) {'), - contains( - 'Future computeFunctionAsync(FutureOr Function() callback) {'), - matches(RegExp( - "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," - .replaceAll('\n', r'\s+') - .replaceAll('(', r'\(') - .replaceAll(')', r'\)'))), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains('SimpleAPIProxy\$reflectionProxy'), + ), + allOf( + contains('void nothing() {'), + isNot(contains('void ignore1() {')), + contains('int compute() {'), + contains('int computeSum(int a, int? b) {'), + contains('Future? computeMultiply(int a, int b) {'), + contains( + 'FutureOr? computeDivide(int a, int b, Future future) {', + ), + ), + allOf( + contains('int computeSum3(int a, {int? b, int? c}) {'), + contains( + 'Future computeFunctionAsync(FutureOr Function() callback) {', + ), + matches( + RegExp( + "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," + .replaceAll('\n', r'\s+') + .replaceAll('(', r'\(') + .replaceAll(')', r'\)'), + ), + ), + ), ), - )), - '$_pkgName|lib/reflection/extra_api.g.dart': decodedMatches(allOf( + ), + '$_pkgName|lib/reflection/extra_api.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of '../extra_api.dart'"), - contains('ExtraAPI\$reflection'), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of '../extra_api.dart'"), + contains('ExtraAPI\$reflection'), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); } - test('ClassProxy: SimpleAPI (through libraryPath) +sequential', - () => testClassProxyLlibraryPath(true)); + test( + 'ClassProxy: SimpleAPI (through libraryPath) +sequential', + () => testClassProxyLibraryPath(true), + ); - test('ClassProxy: SimpleAPI (through libraryPath) -sequential', - () => testClassProxyLlibraryPath(false)); + test( + 'ClassProxy: SimpleAPI (through libraryPath) -sequential', + () => testClassProxyLibraryPath(false), + ); test('ClassProxy: SimpleAPI', () async { var builder = ReflectionBuilder(verbose: true); @@ -1566,44 +1834,54 @@ void main() { String toString() => 'SimpleAPI{ name: \$name }'; } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - contains('SimpleAPIProxy\$reflectionProxy'), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('void nothing() {'), - contains('int compute() {'), - contains('int computeSum(int a, int? b) {'), - contains('Future? computeMultiply(int a, int b) {'), - contains('FutureOr? computeDivide(int a, int b) {'), - ), - allOf( - contains('int computeSum3(int a, {int? b, int? c}) {'), - contains( - 'Future computeFunctionAsync(FutureOr Function() callback) {'), - matches(RegExp( - "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," - .replaceAll('\n', r'\s+') - .replaceAll('(', r'\(') - .replaceAll(')', r'\)'))), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + contains('SimpleAPIProxy\$reflectionProxy'), + ), + allOf( + contains('void nothing() {'), + contains('int compute() {'), + contains('int computeSum(int a, int? b) {'), + contains('Future? computeMultiply(int a, int b) {'), + contains('FutureOr? computeDivide(int a, int b) {'), + ), + allOf( + contains('int computeSum3(int a, {int? b, int? c}) {'), + contains( + 'Future computeFunctionAsync(FutureOr Function() callback) {', + ), + matches( + RegExp( + "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," + .replaceAll('\n', r'\s+') + .replaceAll('(', r'\(') + .replaceAll(')', r'\)'), + ), + ), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1641,34 +1919,40 @@ void main() { String toString() => 'SimpleAPI{ name: \$name }'; } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - ), - allOf( - contains('SimpleAPIProxy\$reflectionProxy'), - contains('Future nothing() {'), - contains('Future compute() {'), - contains('Future computeSum(int a, int b) {'), - contains('Future? computeMultiply(int a, int b) {'), - contains('Future computeDivide(int a, int b) {'), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf( + contains('SimpleAPIProxy\$reflectionProxy'), + contains('Future nothing() {'), + contains('Future compute() {'), + contains('Future computeSum(int a, int b) {'), + contains('Future? computeMultiply(int a, int b) {'), + contains('Future computeDivide(int a, int b) {'), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1709,43 +1993,50 @@ void main() { Wrapper(this.value); } - ''' + ''', }; + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + await testBuilder( builder, sourceAssets, - reader: await PackageAssetReader.currentIsolate(), + readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - ), - allOf( - contains('SimpleAPIProxy\$reflectionProxy'), - contains('void nothing() {'), - contains('int compute() {'), - contains('int computeSum(int a, int b) {'), - contains('Future computeMultiply(int a, int b) {'), + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf( + contains('SimpleAPIProxy\$reflectionProxy'), + contains('void nothing() {'), + contains('int compute() {'), + contains('int computeSum(int a, int b) {'), + contains('Future computeMultiply(int a, int b) {'), + ), ), - )), + ), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); - test('ClassProxy: SimpleAPI (alwaysReturnFuture+traverseReturnTypes)', - () async { - var builder = ReflectionBuilder(verbose: true); + test( + 'ClassProxy: SimpleAPI (alwaysReturnFuture+traverseReturnTypes)', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/foo.dart': ''' + var sourceAssets = { + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -1777,44 +2068,51 @@ void main() { Wrapper(this.value); } - ''' - }; - - await testBuilder( - builder, - sourceAssets, - reader: await PackageAssetReader.currentIsolate(), - generateFor: {'$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - ), - allOf( - contains('SimpleAPIProxy\$reflectionProxy'), - contains('Future nothing() {'), - contains('Future compute() {'), - contains('Future computeSum(int a, int b) {'), - contains('Future computeMultiply(int a, int b) {'), + ''', + }; + + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf( + contains('SimpleAPIProxy\$reflectionProxy'), + contains('Future nothing() {'), + contains('Future compute() {'), + contains('Future computeSum(int a, int b) {'), + contains('Future computeMultiply(int a, int b) {'), + ), + ), ), - )), - }, - onLog: (msg) { - print(msg); - }, - ); - }); + }, + onLog: (msg) { + _printToConsole(msg); + }, + ); + }, + ); test( - 'ClassProxy: MimeTypeResolverProxy (libraryPath: package:mime/mime.dart)', - () async { - var builder = ReflectionBuilder(verbose: true); + 'ClassProxy: MimeTypeResolverProxy (libraryPath: package:mime/mime.dart)', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/foo.dart': ''' + var sourceAssets = { + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -1824,36 +2122,45 @@ void main() { class MimeTypeResolverProxy implements ClassProxyListener { } - ''' - }; - - await testBuilder( - builder, - sourceAssets, - reader: await PackageAssetReader.currentIsolate(), - generateFor: {'$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), - contains("part of 'foo.dart'"), - ), - allOf( - contains('MimeTypeResolverProxy\$reflectionProxy'), - contains( - 'String? lookup(String path, {List? headerBytes}) {'), - contains( - 'void addExtension(String extension, String mimeType) {'), + ''', + }; + + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); + + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', + ), + contains("part of 'foo.dart'"), + ), + allOf( + contains('MimeTypeResolverProxy\$reflectionProxy'), + contains( + 'String? lookup(String path, {List? headerBytes}) {', + ), + contains( + 'void addExtension(String extension, String mimeType) {', + ), + ), + ), ), - )), - }, - onLog: (msg) { - print(msg); - }, - ); - }); + }, + onLog: (msg) { + _printToConsole(msg); + }, + ); + }, + ); }); } From 94dbc3234975a9d63bc37fe00da0a525a10ddb51 Mon Sep 17 00:00:00 2001 From: gmpassos Date: Fri, 15 Aug 2025 19:17:24 -0300 Subject: [PATCH 4/6] - Dart CI: `DART_VERSION: "3.8.3"` --- .github/workflows/dart.yml | 2 +- CHANGELOG.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index a2961c8..5d71c4b 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -1,7 +1,7 @@ name: Dart CI env: - DART_VERSION: "3.6.2" + DART_VERSION: "3.8.3" on: push: diff --git a/CHANGELOG.md b/CHANGELOG.md index 20acfa4..6a9e981 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ - Comment `#dependency_validator: ^5.0.2` (incompatible with `analyzer: ^8.1.1`). +- Dart CI: `DART_VERSION: "3.8.3"` + ## 2.5.3 - `ReflectionBuilder`: improve use of `const` for generated code. From 4f81f0d5673e73bd5751a4629b9217fb3cb4e353 Mon Sep 17 00:00:00 2001 From: gmpassos Date: Fri, 15 Aug 2025 19:20:18 -0300 Subject: [PATCH 5/6] reflection --- example/reflection_factory_bridge_example.reflection.g.dart | 4 ++-- example/reflection_factory_example.reflection.g.dart | 4 ++-- test/src/reflection/user_with_reflection.g.dart | 4 ++-- test/src/user_reflection_bridge.reflection.g.dart | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/example/reflection_factory_bridge_example.reflection.g.dart b/example/reflection_factory_bridge_example.reflection.g.dart index fdf56d7..f52ce72 100644 --- a/example/reflection_factory_bridge_example.reflection.g.dart +++ b/example/reflection_factory_bridge_example.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.5.3 +// BUILDER: reflection_factory/2.6.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.5.3'); + static final Version _version = Version.parse('2.6.0'); Version get reflectionFactoryVersion => _version; diff --git a/example/reflection_factory_example.reflection.g.dart b/example/reflection_factory_example.reflection.g.dart index c16679a..8f8c682 100644 --- a/example/reflection_factory_example.reflection.g.dart +++ b/example/reflection_factory_example.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.5.3 +// BUILDER: reflection_factory/2.6.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.5.3'); + static final Version _version = Version.parse('2.6.0'); Version get reflectionFactoryVersion => _version; diff --git a/test/src/reflection/user_with_reflection.g.dart b/test/src/reflection/user_with_reflection.g.dart index b0c575e..9a7fd6a 100644 --- a/test/src/reflection/user_with_reflection.g.dart +++ b/test/src/reflection/user_with_reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.5.3 +// BUILDER: reflection_factory/2.6.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.5.3'); + static final Version _version = Version.parse('2.6.0'); Version get reflectionFactoryVersion => _version; diff --git a/test/src/user_reflection_bridge.reflection.g.dart b/test/src/user_reflection_bridge.reflection.g.dart index 6549b94..4372d8c 100644 --- a/test/src/user_reflection_bridge.reflection.g.dart +++ b/test/src/user_reflection_bridge.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.5.3 +// BUILDER: reflection_factory/2.6.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.5.3'); + static final Version _version = Version.parse('2.6.0'); Version get reflectionFactoryVersion => _version; From d6a52fa34a28b2ea86fec75c84ecb10da554f64c Mon Sep 17 00:00:00 2001 From: gmpassos Date: Fri, 15 Aug 2025 19:56:47 -0300 Subject: [PATCH 6/6] reflection_factory_build_test.dart --- test/reflection_factory_build_test.dart | 1495 ++++++++++------------- 1 file changed, 641 insertions(+), 854 deletions(-) diff --git a/test/reflection_factory_build_test.dart b/test/reflection_factory_build_test.dart index 809de8b..ed2d6ce 100644 --- a/test/reflection_factory_build_test.dart +++ b/test/reflection_factory_build_test.dart @@ -6,8 +6,7 @@ import 'dart:io' as io; import 'package:build/build.dart'; import 'package:build_test/build_test.dart'; -import 'package:logging/logging.dart' - show LogRecord, Level, hierarchicalLoggingEnabled; +import 'package:logging/logging.dart' show LogRecord, Level; import 'package:reflection_factory/builder.dart'; import 'package:reflection_factory/src/reflection_factory_builder.dart'; import 'package:test/test.dart'; @@ -23,17 +22,13 @@ void _printToConsole(Object? o) { } void main() { - hierarchicalLoggingEnabled = true; - tearDown(() { // Increment this after each test so the next test has it's own package _pkgCacheCount++; }); group('ReflectionBuilder', () { - setUp(() { - ReflectionBuilder.logger.level = Level.ALL; - }); + setUp(() {}); test('NO Reflection: TestEmpty', () async { var builder = ReflectionBuilder(verbose: true); @@ -46,7 +41,7 @@ void main() { class TestEmpty {} - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -78,7 +73,7 @@ void main() { @EnableReflection() class TestEmpty {} - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -90,27 +85,22 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')", - ), - ), - allOf( - contains('TestEmpty\$reflection'), - contains('TestEmpty\$reflectionExtension'), - isNot( - contains("Map getJsonFieldsVisibleValues("), - ), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), ), - ), + allOf( + contains('TestEmpty\$reflection'), + contains('TestEmpty\$reflectionExtension'), + isNot( + contains("Map getJsonFieldsVisibleValues(")), + ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -133,7 +123,7 @@ void main() { @EnableReflection() class \$TestSpecial {} - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -145,24 +135,20 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')", - ), - ), - allOf( - contains('\$TestSpecial\$reflection'), - contains('\$TestSpecial\$reflectionExtension'), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), + ), + allOf( + contains('\$TestSpecial\$reflection'), + contains('\$TestSpecial\$reflectionExtension'), ), - ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -252,7 +238,7 @@ void main() { } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -264,58 +250,41 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')", - ), - ), - allOf( - contains('User\$reflection'), - contains('User\$reflectionExtension'), - ), - matches( - RegExp( - r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)", - ), - ), - allOf( - contains( - "TestAnnotation(['static method', 'version checker'])", - ), - contains("TestAnnotation(['method', 'password checker'])"), - contains("TestAnnotation(['static field', 'version'])"), - contains("TestAnnotation(['field', 'email'])"), - contains("TestAnnotation(['parameter', 'pass'])"), - isNot( - matches( - RegExp( - r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', - ), - ), - ), - matches( - RegExp( - r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)', - ), - ), - ), - allOf( - contains("JsonField.hidden()"), - contains("JsonField.visible()"), - contains("Map getJsonFieldsVisibleValues("), - contains("case 'tojson':"), - contains("case 'getfield':"), - contains("case 'setfield':"), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), ), - ), + allOf( + contains('User\$reflection'), + contains('User\$reflectionExtension'), + ), + matches(RegExp( + r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)")), + allOf( + contains("TestAnnotation(['static method', 'version checker'])"), + contains("TestAnnotation(['method', 'password checker'])"), + contains("TestAnnotation(['static field', 'version'])"), + contains("TestAnnotation(['field', 'email'])"), + contains("TestAnnotation(['parameter', 'pass'])"), + isNot(matches(RegExp( + r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\('))), + matches(RegExp( + r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)')), + ), + allOf( + contains("JsonField.hidden()"), + contains("JsonField.visible()"), + contains("Map getJsonFieldsVisibleValues("), + contains("case 'tojson':"), + contains("case 'getfield':"), + contains("case 'setfield':"), + ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -363,7 +332,7 @@ void main() { } } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -375,69 +344,44 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/reflection/foo.g.dart': decodedMatches( + '$_pkgName|lib/reflection/foo.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of '../foo.dart'"), - ), - allOf( - contains('Domain\$reflection'), - contains('Domain\$reflectionExtension'), - ), - allOf( - contains('bool get hasDefaultConstructor => true;'), - contains( - 'Domain? createInstanceWithDefaultConstructor() => Domain();', - ), - contains('bool get hasEmptyConstructor => true;'), - contains( - 'Domain? createInstanceWithEmptyConstructor() => Domain.empty();', - ), - contains('bool get hasNoRequiredArgsConstructor => true;'), - contains( - 'Domain? createInstanceWithNoRequiredArgsConstructor() => Domain.empty();', - ), - ), - matches( - RegExp( - r"'suffix':\s*__PR\(\s*__TR.tString\s*,\s*'suffix'\s*,\s*false\s*,\s*false\s*,\s*'net'\s*\)", - ), - ), - allOf( - matches( - RegExp( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of '../foo.dart'"), + ), + allOf( + contains('Domain\$reflection'), + contains('Domain\$reflectionExtension'), + ), + allOf( + contains('bool get hasDefaultConstructor => true;'), + contains( + 'Domain? createInstanceWithDefaultConstructor() => Domain();'), + contains('bool get hasEmptyConstructor => true;'), + contains( + 'Domain? createInstanceWithEmptyConstructor() => Domain.empty();'), + contains('bool get hasNoRequiredArgsConstructor => true;'), + contains( + 'Domain? createInstanceWithNoRequiredArgsConstructor() => Domain.empty();'), + ), + matches(RegExp( + r"'suffix':\s*__PR\(\s*__TR.tString\s*,\s*'suffix'\s*,\s*false\s*,\s*false\s*,\s*'net'\s*\)")), + allOf( + matches(RegExp( r"case 'callfx':.*?const <__PR>\[\s*__PR\(\s*__TR\(Fx\), 'f', true, false\)\s*\]", - dotAll: true, - ), - ), - matches( - RegExp( + dotAll: true)), + matches(RegExp( r"case 'callallfx':.*?__PR\(\s*__TR>\(\s*List, <__TI>\[__TI.tFunction\]\),\s*'fxs',\s*false,\s*true,\s*\)", - dotAll: true, - ), - ), - matches( - RegExp( - r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', - ), - ), - matches( - RegExp( - r'Object\?\s+toJson\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJson\(null, null, duplicatedEntitiesAsID\)', - ), - ), - matches( - RegExp( - r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)', - ), - ), - ), - ), - ), + dotAll: true)), + matches(RegExp( + r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(')), + matches(RegExp( + r'Object\?\s+toJson\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJson\(null, null, duplicatedEntitiesAsID\)')), + matches(RegExp( + r'Map\?\s+toJsonMap\(\{bool duplicatedEntitiesAsID = false\}\)\s+=>\s+reflection.toJsonMap\(duplicatedEntitiesAsID: duplicatedEntitiesAsID\)'))), + )), }, onLog: (msg) { _printToConsole(msg); @@ -463,7 +407,7 @@ void main() { bool equalsName(String name) => this.name == name; } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -471,16 +415,12 @@ void main() { var logs = []; - var res = await testBuilder( - builder, - sourceAssets, - readerWriter: readerWriter, - generateFor: {'$_pkgName|lib/foo.dart'}, - onLog: (msg) { - _printToConsole(msg); - logs.add(msg); - }, - ); + var res = await testBuilder(builder, sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, onLog: (msg) { + _printToConsole(msg); + logs.add(msg); + }); expect(res.buildResult.status.name, equals('failure')); @@ -524,7 +464,7 @@ void main() { Set> opAMethod() => >{[]}; } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -536,56 +476,38 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf([ - contains('Op\$reflection'), - contains('Op\$reflectionExtension'), - contains('OpA\$reflection'), - contains('OpA\$reflectionExtension'), - ]), - allOf( - matches( - RegExp( - r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', - ), - ), - matches( - RegExp( - r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(', - ), - ), - ), - allOf( - contains("case 'type':"), - contains("case 'value':"), - contains("_fieldsNames = const ['type', 'value']"), - contains("_supperTypes = const [Op, WithType];"), - matches( - RegExp( - r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)", - ), - ), - matches( - RegExp( - r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)", - ), - ), - matches( - RegExp( - r"__TR>\(\s*Set, <__TR>\[__TR.tListDynamic\]\)", - ), - ), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - ), + allOf([ + contains('Op\$reflection'), + contains('Op\$reflectionExtension'), + contains('OpA\$reflection'), + contains('OpA\$reflectionExtension'), + ]), + allOf( + matches(RegExp( + r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(')), + matches(RegExp( + r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(')), + ), + allOf( + contains("case 'type':"), + contains("case 'value':"), + contains("_fieldsNames = const ['type', 'value']"), + contains("_supperTypes = const [Op, WithType];"), + matches(RegExp( + r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)")), + matches(RegExp( + r"__TR>>\(\s*List, <__TR>\[__TR.tSetInt\]\)")), + matches(RegExp( + r"__TR>\(\s*Set, <__TR>\[__TR.tListDynamic\]\)")), + ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -619,7 +541,7 @@ void main() { } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -631,38 +553,29 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')", - ), - ), - allOf( - contains('User\$reflection'), - contains('User\$reflectionExtension'), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), + ), + allOf( + contains('User\$reflection'), + contains('User\$reflectionExtension'), + ), + matches(RegExp( + r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)")), + allOf( + matches(RegExp(r"typedef __RCD1 = \(bool, String\?\);")), + matches( + RegExp(r"MethodReflection\(")), matches( - RegExp( - r"'ignoreCase':\s*__PR\(\s*__TR.tBool\s*,\s*'ignoreCase'\s*,\s*false\s*,\s*false\s*,\s*false\s*\)", - ), - ), - allOf( - matches(RegExp(r"typedef __RCD1 = \(bool, String\?\);")), - matches( - RegExp(r"MethodReflection\("), - ), - matches( - RegExp(r"'checkPassword',\s+const __TR<__RCD1>\(__RCD1\),"), - ), - ), + RegExp(r"'checkPassword',\s+const __TR<__RCD1>\(__RCD1\),")), ), - ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -711,7 +624,7 @@ void main() { } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -723,43 +636,30 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')", - ), - ), - allOf( - contains('User\$reflection'), - contains('User\$reflectionExtension'), - ), - allOf( - matches(RegExp(r"typedef\s+__RCD1\s+=\s+\(dynamic,\s+Info\);")), - matches( - RegExp( - r"case\s+'base1':\s+return\s+MethodReflection\(", - ), - ), - matches( - RegExp( - r"case\s+'base2':\s+return\s+MethodReflection\(", - ), - ), - matches( - RegExp( - r"case\s+'info':\s+return\s+MethodReflection\(", - ), - ), - matches(RegExp(r"__TR<__RCD1>\(__RCD1\),")), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), + ), + allOf( + contains('User\$reflection'), + contains('User\$reflectionExtension'), + ), + allOf( + matches(RegExp(r"typedef\s+__RCD1\s+=\s+\(dynamic,\s+Info\);")), + matches(RegExp( + r"case\s+'base1':\s+return\s+MethodReflection\(")), + matches(RegExp( + r"case\s+'base2':\s+return\s+MethodReflection\(")), + matches(RegExp( + r"case\s+'info':\s+return\s+MethodReflection\(")), + matches(RegExp(r"__TR<__RCD1>\(__RCD1\),")), ), - ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -784,7 +684,7 @@ void main() { } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -796,25 +696,21 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains( - "Version _version = Version.parse('${ReflectionFactory.VERSION}')", - ), - ), - allOf( - contains('Validator\$reflection'), - contains('Validator\$reflectionExtension'), - contains("typedef __RCD1 = ({String? error, bool ok});"), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains( + "Version _version = Version.parse('${ReflectionFactory.VERSION}')"), ), - ), + allOf( + contains('Validator\$reflection'), + contains('Validator\$reflectionExtension'), + contains("typedef __RCD1 = ({String? error, bool ok});"), + ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -822,13 +718,12 @@ void main() { ); }); - test( - 'EnableReflection(reflectionClassName, reflectionExtensionName)', - () async { - var builder = ReflectionBuilder(verbose: true); + test('EnableReflection(reflectionClassName, reflectionExtensionName)', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/foo.dart': ''' + var sourceAssets = { + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -854,44 +749,35 @@ void main() { } } - ''', - }; + ''' + }; - final readerWriter = TestReaderWriter(rootPackage: _pkgName); - await readerWriter.testing.loadIsolateSources(); + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); - await testBuilder( - builder, - sourceAssets, - readerWriter: readerWriter, - generateFor: {'$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('RefUser'), - contains('RefUserExt'), - matches( - RegExp( - r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(', - ), - ), - matches( - RegExp( - r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(', - ), - ), - ), - ), - }, - onLog: (msg) { - _printToConsole(msg); - }, - //packageConfig: packageConfig, - ); - }, - ); + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('RefUser'), + contains('RefUserExt'), + matches( + RegExp(r'Object\?\s+toJson\(.*?\)\s+=>\s+reflection.toJson\(')), + matches(RegExp( + r'Map\?\s+toJsonMap\(.*?\)\s+=>\s+reflection.toJsonMap\(')), + )) + }, + onLog: (msg) { + _printToConsole(msg); + }, + //packageConfig: packageConfig, + ); + }); test('EnableReflection + source with part file', () async { var builder = ReflectionBuilder(verbose: true); @@ -924,7 +810,7 @@ void main() { Foo(this.a, this.b); } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -936,14 +822,12 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart', '$_pkgName|lib/foo_extra.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('Foo\$reflection'), - contains('FooExtra\$reflection'), - ), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('Foo\$reflection'), + contains('FooExtra\$reflection'), + )) }, onLog: (msg) { _printToConsole(msg); @@ -971,7 +855,7 @@ void main() { Foo(this.n, {this.status = Status.a}); } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -983,31 +867,26 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf([ - contains('Status\$reflection'), - contains('Status\$reflectionExtension'), - contains('Foo\$reflection'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains( - 'final Expando _objectReflections', - ), - contains('factory Status\$reflection([Status? object]) {'), - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - ), + allOf([ + contains('Status\$reflection'), + contains('Status\$reflectionExtension'), + contains('Foo\$reflection'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Status\$reflection([Status? object]) {'), + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1035,7 +914,7 @@ void main() { Foo(this.n, {this.status = Status.a}); } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1047,34 +926,27 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf([ - contains('Status\$reflection'), - contains('Status\$reflectionExtension'), - contains('Foo\$reflection'), - contains('Foo\$reflectionExtension'), - ]), - isNot( - anyOf([ - contains( - 'final Expando _objectReflections', - ), - contains('factory Status\$reflection([Status? object]) {'), - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - contains('// Dependency reflections:'), - ]), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - ), + allOf([ + contains('Status\$reflection'), + contains('Status\$reflectionExtension'), + contains('Foo\$reflection'), + contains('Foo\$reflectionExtension'), + ]), + isNot(anyOf([ + contains('final Expando _objectReflections'), + contains('factory Status\$reflection([Status? object]) {'), + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + contains('// Dependency reflections:'), + ])), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1110,7 +982,7 @@ void main() { Status s; Foo(this.n, {this.status = Status.a}); } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1122,55 +994,47 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches( + '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'status.dart'"), - ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains( - 'final Expando _objectReflections', - ), - contains('factory Status\$reflection([Status? object]) {'), - ]), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'status.dart'"), ), - ), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Status\$reflection([Status? object]) {'), + ]), + )), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - ), + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1212,7 +1076,7 @@ void main() { Wrapper s; Foo(this.n, {this.status = Status.a}); } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1224,55 +1088,47 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches( + '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'status.dart'"), - ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains( - 'final Expando _objectReflections', - ), - contains('factory Status\$reflection([Status? object]) {'), - ]), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'status.dart'"), ), - ), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Status\$reflection([Status? object]) {'), + ]), + )), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - ), + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1310,7 +1166,7 @@ void main() { Foo(this.n); } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1322,55 +1178,47 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches( + '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'status.dart'"), - ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains( - 'final Expando _objectReflections', - ), - contains('factory Status\$reflection([Status? object]) {'), - ]), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'status.dart'"), ), - ), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Status\$reflection([Status? object]) {'), + ]), + )), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - ), + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1378,13 +1226,12 @@ void main() { ); }); - test( - 'EnableReflection + import + type recursion [2 source files]', - () async { - var builder = ReflectionBuilder(verbose: true); + test('EnableReflection + import + type recursion [2 source files]', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/status.dart': ''' + var sourceAssets = { + '$_pkgName|lib/status.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -1410,7 +1257,7 @@ void main() { } ''', - '$_pkgName|lib/foo.dart': ''' + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -1426,74 +1273,65 @@ void main() { Foo(this.n, {this.status = Status.a, this.w}); } - ''', - }; + ''' + }; - final readerWriter = TestReaderWriter(rootPackage: _pkgName); - await readerWriter.testing.loadIsolateSources(); + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); - await testBuilder( - builder, - sourceAssets, - readerWriter: readerWriter, - generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/status.reflection.g.dart': decodedMatches( - allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'status.dart'"), - ), - allOf([ - contains('Status\$reflection extends'), - contains('Status\$reflectionExtension'), - isNot(contains('Foo\$reflection extends')), - isNot(contains('Foo\$reflectionExtension')), - ]), - allOf([ - contains( - 'final Expando _objectReflections', - ), - contains('factory Status\$reflection([Status? object]) {'), - ]), - ), + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/status.dart', '$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/status.reflection.g.dart': decodedMatches(allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'status.dart'"), ), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( - allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf([ - isNot(contains('Status\$reflection extends')), - isNot(contains('Status\$reflectionExtension')), - contains('Foo\$reflection extends'), - contains('Foo\$reflectionExtension'), - ]), - allOf([ - contains('final Expando _objectReflections'), - contains('factory Foo\$reflection([Foo? object]) {'), - ]), - allOf([ - contains('Foo\$reflection()'), - contains('// Dependency reflections:'), - contains('Status\$reflection()'), - ]), - ), + allOf([ + contains('Status\$reflection extends'), + contains('Status\$reflectionExtension'), + isNot(contains('Foo\$reflection extends')), + isNot(contains('Foo\$reflectionExtension')), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Status\$reflection([Status? object]) {'), + ]), + )), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - }, - onLog: (msg) { - _printToConsole(msg); - }, - ); - }, - ); + allOf([ + isNot(contains('Status\$reflection extends')), + isNot(contains('Status\$reflectionExtension')), + contains('Foo\$reflection extends'), + contains('Foo\$reflectionExtension'), + ]), + allOf([ + contains('final Expando _objectReflections'), + contains('factory Foo\$reflection([Foo? object]) {'), + ]), + allOf([ + contains('Foo\$reflection()'), + contains('// Dependency reflections:'), + contains('Status\$reflection()'), + ]), + )), + }, + onLog: (msg) { + _printToConsole(msg); + }, + ); + }); test('ReflectionBridge', () async { var builder = ReflectionBuilder(verbose: true); @@ -1521,7 +1359,7 @@ void main() { } } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1533,15 +1371,13 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('User\$reflection'), - contains('User\$reflectionExtension'), - contains('UserReflection\$reflectionExtension'), - ), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('User\$reflection'), + contains('User\$reflectionExtension'), + contains('UserReflection\$reflectionExtension'), + )) }, onLog: (msg) { _printToConsole(msg); @@ -1581,7 +1417,7 @@ void main() { } } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1593,15 +1429,13 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains("part of 'foo.dart'"), - contains('UserRef'), - contains('UserRefExt'), - contains('BridgeExt'), - ), - ), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains("part of 'foo.dart'"), + contains('UserRef'), + contains('UserRefExt'), + contains('BridgeExt'), + )) }, onLog: (msg) { _printToConsole(msg); @@ -1610,26 +1444,23 @@ void main() { }); void testClassProxyLibraryPath(bool sequential) async { - var builder = reflectionFactory( - BuilderOptions({ - 'verbose': true, - 'sequential': sequential, - 'timeout': '45 sec', - }), - ); + var builder = reflectionFactory(BuilderOptions({ + 'verbose': true, + 'sequential': sequential, + 'timeout': '45 sec', + })); expect(builder.verbose, isTrue); expect(builder.sequential, equals(sequential)); expect(builder.buildStepTimeout, equals(Duration(seconds: 45))); expect( - builder.toString(verbose: true), - allOf( - contains('verbose: true'), - contains('sequential: $sequential'), - contains('buildStepTimeout: 45 sec'), - ), - ); + builder.toString(verbose: true), + allOf( + contains('verbose: true'), + contains('sequential: $sequential'), + contains('buildStepTimeout: 45 sec'), + )); var sourceAssets = { '$_pkgName|lib/simple_api.dart': ''' @@ -1717,66 +1548,52 @@ void main() { '$_pkgName|lib/extra_api.dart', }, outputs: { - '$_pkgName|lib/reflection/simple_api.g.dart': decodedMatches( + '$_pkgName|lib/reflection/simple_api.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of '../simple_api.dart'"), - contains('SimpleAPI\$reflection'), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of '../simple_api.dart'"), + contains('SimpleAPI\$reflection'), ), - ), - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + )), + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains('SimpleAPIProxy\$reflectionProxy'), - ), - allOf( - contains('void nothing() {'), - isNot(contains('void ignore1() {')), - contains('int compute() {'), - contains('int computeSum(int a, int? b) {'), - contains('Future? computeMultiply(int a, int b) {'), - contains( - 'FutureOr? computeDivide(int a, int b, Future future) {', - ), - ), - allOf( - contains('int computeSum3(int a, {int? b, int? c}) {'), - contains( - 'Future computeFunctionAsync(FutureOr Function() callback) {', - ), - matches( - RegExp( - "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," - .replaceAll('\n', r'\s+') - .replaceAll('(', r'\(') - .replaceAll(')', r'\)'), - ), - ), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains('SimpleAPIProxy\$reflectionProxy'), ), - ), - '$_pkgName|lib/reflection/extra_api.g.dart': decodedMatches( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of '../extra_api.dart'"), - contains('ExtraAPI\$reflection'), - ), + contains('void nothing() {'), + isNot(contains('void ignore1() {')), + contains('int compute() {'), + contains('int computeSum(int a, int? b) {'), + contains('Future? computeMultiply(int a, int b) {'), + contains( + 'FutureOr? computeDivide(int a, int b, Future future) {'), ), - ), + allOf( + contains('int computeSum3(int a, {int? b, int? c}) {'), + contains( + 'Future computeFunctionAsync(FutureOr Function() callback) {'), + matches(RegExp( + "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," + .replaceAll('\n', r'\s+') + .replaceAll('(', r'\(') + .replaceAll(')', r'\)'))), + ), + )), + '$_pkgName|lib/reflection/extra_api.g.dart': decodedMatches(allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of '../extra_api.dart'"), + contains('ExtraAPI\$reflection'), + ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1784,15 +1601,11 @@ void main() { ); } - test( - 'ClassProxy: SimpleAPI (through libraryPath) +sequential', - () => testClassProxyLibraryPath(true), - ); + test('ClassProxy: SimpleAPI (through libraryPath) +sequential', + () => testClassProxyLibraryPath(true)); - test( - 'ClassProxy: SimpleAPI (through libraryPath) -sequential', - () => testClassProxyLibraryPath(false), - ); + test('ClassProxy: SimpleAPI (through libraryPath) -sequential', + () => testClassProxyLibraryPath(false)); test('ClassProxy: SimpleAPI', () async { var builder = ReflectionBuilder(verbose: true); @@ -1834,7 +1647,7 @@ void main() { String toString() => 'SimpleAPI{ name: \$name }'; } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1846,39 +1659,32 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - contains('SimpleAPIProxy\$reflectionProxy'), - ), - allOf( - contains('void nothing() {'), - contains('int compute() {'), - contains('int computeSum(int a, int? b) {'), - contains('Future? computeMultiply(int a, int b) {'), - contains('FutureOr? computeDivide(int a, int b) {'), - ), - allOf( - contains('int computeSum3(int a, {int? b, int? c}) {'), - contains( - 'Future computeFunctionAsync(FutureOr Function() callback) {', - ), - matches( - RegExp( - "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," - .replaceAll('\n', r'\s+') - .replaceAll('(', r'\(') - .replaceAll(')', r'\)'), - ), - ), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + contains('SimpleAPIProxy\$reflectionProxy'), ), - ), + allOf( + contains('void nothing() {'), + contains('int compute() {'), + contains('int computeSum(int a, int? b) {'), + contains('Future? computeMultiply(int a, int b) {'), + contains('FutureOr? computeDivide(int a, int b) {'), + ), + allOf( + contains('int computeSum3(int a, {int? b, int? c}) {'), + contains( + 'Future computeFunctionAsync(FutureOr Function() callback) {'), + matches(RegExp( + "onCall(\\s*this,\\s*'computeSum3',\\s*{\n'a': a,\n'b': b,\n'c': c,\n}," + .replaceAll('\n', r'\s+') + .replaceAll('(', r'\(') + .replaceAll(')', r'\)'))), + ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1919,7 +1725,7 @@ void main() { String toString() => 'SimpleAPI{ name: \$name }'; } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -1931,25 +1737,22 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf( - contains('SimpleAPIProxy\$reflectionProxy'), - contains('Future nothing() {'), - contains('Future compute() {'), - contains('Future computeSum(int a, int b) {'), - contains('Future? computeMultiply(int a, int b) {'), - contains('Future computeDivide(int a, int b) {'), - ), + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), ), - ), + allOf( + contains('SimpleAPIProxy\$reflectionProxy'), + contains('Future nothing() {'), + contains('Future compute() {'), + contains('Future computeSum(int a, int b) {'), + contains('Future? computeMultiply(int a, int b) {'), + contains('Future computeDivide(int a, int b) {'), + ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -1993,7 +1796,7 @@ void main() { Wrapper(this.value); } - ''', + ''' }; final readerWriter = TestReaderWriter(rootPackage: _pkgName); @@ -2005,24 +1808,20 @@ void main() { readerWriter: readerWriter, generateFor: {'$_pkgName|lib/foo.dart'}, outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( allOf( - allOf( contains('GENERATED CODE - DO NOT MODIFY BY HAND'), contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf( - contains('SimpleAPIProxy\$reflectionProxy'), - contains('void nothing() {'), - contains('int compute() {'), - contains('int computeSum(int a, int b) {'), - contains('Future computeMultiply(int a, int b) {'), - ), + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'")), + allOf( + contains('SimpleAPIProxy\$reflectionProxy'), + contains('void nothing() {'), + contains('int compute() {'), + contains('int computeSum(int a, int b) {'), + contains('Future computeMultiply(int a, int b) {'), ), - ), + )), }, onLog: (msg) { _printToConsole(msg); @@ -2030,13 +1829,12 @@ void main() { ); }); - test( - 'ClassProxy: SimpleAPI (alwaysReturnFuture+traverseReturnTypes)', - () async { - var builder = ReflectionBuilder(verbose: true); + test('ClassProxy: SimpleAPI (alwaysReturnFuture+traverseReturnTypes)', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/foo.dart': ''' + var sourceAssets = { + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -2068,51 +1866,46 @@ void main() { Wrapper(this.value); } - ''', - }; + ''' + }; - final readerWriter = TestReaderWriter(rootPackage: _pkgName); - await readerWriter.testing.loadIsolateSources(); + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); - await testBuilder( - builder, - sourceAssets, - readerWriter: readerWriter, - generateFor: {'$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( - allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf( - contains('SimpleAPIProxy\$reflectionProxy'), - contains('Future nothing() {'), - contains('Future compute() {'), - contains('Future computeSum(int a, int b) {'), - contains('Future computeMultiply(int a, int b) {'), - ), - ), + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'")), + allOf( + contains('SimpleAPIProxy\$reflectionProxy'), + contains('Future nothing() {'), + contains('Future compute() {'), + contains('Future computeSum(int a, int b) {'), + contains('Future computeMultiply(int a, int b) {'), ), - }, - onLog: (msg) { - _printToConsole(msg); - }, - ); - }, - ); + )), + }, + onLog: (msg) { + _printToConsole(msg); + }, + ); + }); test( - 'ClassProxy: MimeTypeResolverProxy (libraryPath: package:mime/mime.dart)', - () async { - var builder = ReflectionBuilder(verbose: true); + 'ClassProxy: MimeTypeResolverProxy (libraryPath: package:mime/mime.dart)', + () async { + var builder = ReflectionBuilder(verbose: true); - var sourceAssets = { - '$_pkgName|lib/foo.dart': ''' + var sourceAssets = { + '$_pkgName|lib/foo.dart': ''' import 'package:reflection_factory/reflection_factory.dart'; @@ -2122,45 +1915,39 @@ void main() { class MimeTypeResolverProxy implements ClassProxyListener { } - ''', - }; + ''' + }; - final readerWriter = TestReaderWriter(rootPackage: _pkgName); - await readerWriter.testing.loadIsolateSources(); + final readerWriter = TestReaderWriter(rootPackage: _pkgName); + await readerWriter.testing.loadIsolateSources(); - await testBuilder( - builder, - sourceAssets, - readerWriter: readerWriter, - generateFor: {'$_pkgName|lib/foo.dart'}, - outputs: { - '$_pkgName|lib/foo.reflection.g.dart': decodedMatches( - allOf( - allOf( - contains('GENERATED CODE - DO NOT MODIFY BY HAND'), - contains( - 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}', - ), - contains("part of 'foo.dart'"), - ), - allOf( - contains('MimeTypeResolverProxy\$reflectionProxy'), - contains( - 'String? lookup(String path, {List? headerBytes}) {', - ), - contains( - 'void addExtension(String extension, String mimeType) {', - ), - ), - ), + await testBuilder( + builder, + sourceAssets, + readerWriter: readerWriter, + generateFor: {'$_pkgName|lib/foo.dart'}, + outputs: { + '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( + allOf( + contains('GENERATED CODE - DO NOT MODIFY BY HAND'), + contains( + 'BUILDER: reflection_factory/${ReflectionFactory.VERSION}'), + contains("part of 'foo.dart'"), + ), + allOf( + contains('MimeTypeResolverProxy\$reflectionProxy'), + contains( + 'String? lookup(String path, {List? headerBytes}) {'), + contains( + 'void addExtension(String extension, String mimeType) {'), ), - }, - onLog: (msg) { - _printToConsole(msg); - }, - ); - }, - ); + )), + }, + onLog: (msg) { + _printToConsole(msg); + }, + ); + }); }); }