diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 975a222..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: @@ -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 }} @@ -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 @@ -40,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 }} @@ -59,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: @@ -74,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: | diff --git a/CHANGELOG.md b/CHANGELOG.md index c1b753a..6a9e981 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +## 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`). + +- Dart CI: `DART_VERSION: "3.8.3"` + ## 2.5.3 - `ReflectionBuilder`: improve use of `const` for generated code. 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/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_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/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 8da3bc6..e7889ed 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,31 +1,32 @@ 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: 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: ^4.1.3 + #dependency_validator: ^5.0.2 test: ^1.26.3 coverage: ^1.15.0 benchmark: ^0.3.0 diff --git a/test/reflection_factory_build_test.dart b/test/reflection_factory_build_test.dart index babd36b..ed2d6ce 100644 --- a/test/reflection_factory_build_test.dart +++ b/test/reflection_factory_build_test.dart @@ -2,12 +2,25 @@ @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; 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() { tearDown(() { // Increment this after each test so the next test has it's own package @@ -31,14 +44,17 @@ 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: {}, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -60,10 +76,13 @@ void main() { ''' }; - 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( @@ -84,9 +103,11 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); + + expect(res.buildResult.status.name, equals('success')); }); test('EnableReflection: TestEmpty', () async { @@ -105,10 +126,13 @@ void main() { ''' }; - 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( @@ -127,9 +151,11 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); + + expect(res.buildResult.status.name, equals('success')); }); test('EnableReflection: User', () async { @@ -215,10 +241,13 @@ 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( @@ -258,7 +287,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -306,10 +335,13 @@ 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( @@ -352,7 +384,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -378,20 +410,24 @@ void main() { ''' }; - 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 { @@ -431,10 +467,13 @@ 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( @@ -471,7 +510,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -505,10 +544,13 @@ 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( @@ -536,7 +578,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -585,10 +627,13 @@ 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( @@ -617,7 +662,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -642,10 +687,13 @@ 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( @@ -665,7 +713,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -704,10 +752,13 @@ 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( @@ -722,7 +773,7 @@ void main() { )) }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, //packageConfig: packageConfig, ); @@ -762,10 +813,13 @@ 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', '$_pkgName|lib/foo_extra.dart'}, outputs: { '$_pkgName|lib/foo.reflection.g.dart': decodedMatches(allOf( @@ -776,7 +830,7 @@ void main() { )) }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -804,10 +858,13 @@ 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( @@ -832,7 +889,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -860,10 +917,13 @@ 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( @@ -889,7 +949,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -925,10 +985,13 @@ void main() { ''' }; + 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( @@ -974,7 +1037,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1016,10 +1079,13 @@ void main() { ''' }; + 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( @@ -1065,7 +1131,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1103,10 +1169,13 @@ void main() { ''' }; + 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( @@ -1152,7 +1221,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1207,10 +1276,13 @@ void main() { ''' }; + 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( @@ -1256,7 +1328,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1290,10 +1362,13 @@ 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( @@ -1305,7 +1380,7 @@ void main() { )) }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, //packageConfig: packageConfig, ); @@ -1345,10 +1420,13 @@ 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( @@ -1360,12 +1438,12 @@ void main() { )) }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); - void testClassProxyLlibraryPath(bool sequential) async { + void testClassProxyLibraryPath(bool sequential) async { var builder = reflectionFactory(BuilderOptions({ 'verbose': true, 'sequential': sequential, @@ -1377,7 +1455,7 @@ void main() { expect(builder.buildStepTimeout, equals(Duration(seconds: 45))); expect( - builder.toString(), + builder.toString(verbose: true), allOf( contains('verbose: true'), contains('sequential: $sequential'), @@ -1457,10 +1535,13 @@ 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', @@ -1515,16 +1596,16 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); } test('ClassProxy: SimpleAPI (through libraryPath) +sequential', - () => testClassProxyLlibraryPath(true)); + () => testClassProxyLibraryPath(true)); test('ClassProxy: SimpleAPI (through libraryPath) -sequential', - () => testClassProxyLlibraryPath(false)); + () => testClassProxyLibraryPath(false)); test('ClassProxy: SimpleAPI', () async { var builder = ReflectionBuilder(verbose: true); @@ -1569,10 +1650,13 @@ 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( @@ -1603,7 +1687,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1644,10 +1728,13 @@ 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( @@ -1668,7 +1755,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1712,19 +1799,21 @@ 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('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() {'), @@ -1735,7 +1824,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1780,19 +1869,21 @@ 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('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() {'), @@ -1803,7 +1894,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); @@ -1827,10 +1918,13 @@ 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( @@ -1850,7 +1944,7 @@ void main() { )), }, onLog: (msg) { - print(msg); + _printToConsole(msg); }, ); }); 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;