diff --git a/packages/ferry_generator/lib/serializer_builder.dart b/packages/ferry_generator/lib/serializer_builder.dart index b844c084..253864a5 100644 --- a/packages/ferry_generator/lib/serializer_builder.dart +++ b/packages/ferry_generator/lib/serializer_builder.dart @@ -91,19 +91,6 @@ class SerializerBuilder implements Builder { final nonBuiltClasses = SplayTreeSet((a, b) => a.name.compareTo(b.name)); - final hasSerializer = (ClassElement c) => c.fields.any((field) => - field.isStatic && - field.name == 'serializer' && - field.type.element?.name == 'Serializer' && - field.type.element?.source?.uri.toString() == - 'package:built_value/serializer.dart'); - - final isBuiltValue = (ClassElement c) => c.allSupertypes.any((interface) => - (interface.element.name == 'Built' || - interface.element.name == 'EnumClass') && - interface.element.source.uri.toString() == - 'package:built_value/built_value.dart'); - final excludeFileIds = {}; for (final excludeGlob in excludeFiles) { await for (final fileAssetId in buildStep.findAssets(excludeGlob)) { @@ -114,17 +101,9 @@ class SerializerBuilder implements Builder { await for (final input in buildStep.findAssets(generatedFiles)) { if (excludeFileIds.containsKey(input.path)) continue; final lib = await buildStep.resolver.libraryFor(input); - lib.units - .expand((cu) => cu.classes) - .where((c) => hasSerializer(c) && isBuiltValue(c)) - .forEach(builtClasses.add); - - lib.units - .expand((cu) => cu.classes) - .where( - (c) => hasSerializer(c) && !isBuiltValue(c), - ) - .forEach(nonBuiltClasses.add); + final classes = extractClassesToGenerateSerializersFor(lib); + builtClasses.addAll(classes.builtClasses); + nonBuiltClasses.addAll(classes.nonBuiltClasses); } final additionalSerializers = { @@ -152,6 +131,20 @@ class SerializerBuilder implements Builder { .property('serializers') : null; + if (isExternalSchema) { + final externalSchemaId = + outputAssetId(schemaId, schemaExtension, config.outputDir); + + final externalSchemaLibrary = + await buildStep.resolver.libraryFor(externalSchemaId); + + final externalSchemaClasses = + extractClassesToGenerateSerializersFor(externalSchemaLibrary); + + builtClasses.addAll(externalSchemaClasses.builtClasses); + nonBuiltClasses.addAll(externalSchemaClasses.nonBuiltClasses); + } + final library = buildSerializerLibrary( builtClasses, outputFileName.replaceFirst('.gql.dart', '.gql.g.dart'), @@ -165,7 +158,6 @@ class SerializerBuilder implements Builder { 'package:built_collection/built_collection.dart', 'package:ferry_exec/ferry_exec.dart', ...config.typeOverrides.values.map((ref) => ref.url).whereType(), - if (isExternalSchema) _externalSchemaImport(schemaId, config), ], aliasedImports: { if (isExternalSchema) _externalSchemaSerializersImport(schemaId, config): @@ -181,12 +173,6 @@ class SerializerBuilder implements Builder { } } -String _externalSchemaImport(AssetId schemaId, BuilderConfig config) { - final outPutId = outputAssetId(schemaId, schemaExtension, config.outputDir); - - return 'package:${outPutId.package}/${outPutId.path.replaceFirst(RegExp('^lib/'), '')}'; -} - String _externalSchemaSerializersImport( AssetId schemaId, BuilderConfig config) { final outPutId = outputAssetId(schemaId, schemaExtension, config.outputDir); @@ -200,3 +186,41 @@ String _externalSchemaSerializersImport( return 'package:${outPutId.package}/$outPutPath'; } + +bool hasSerializer(ClassElement c) => c.fields.any((field) => + field.isStatic && + field.name == 'serializer' && + field.type.element?.name == 'Serializer' && + field.type.element?.source?.uri.toString() == + 'package:built_value/serializer.dart'); + +bool isBuiltValue(ClassElement c) => c.allSupertypes.any((interface) => + (interface.element.name == 'Built' || + interface.element.name == 'EnumClass') && + interface.element.source.uri.toString() == + 'package:built_value/built_value.dart'); + +typedef ClassesToGenerateSerializersFor = ({ + Set builtClasses, + Set nonBuiltClasses +}); + +ClassesToGenerateSerializersFor extractClassesToGenerateSerializersFor( + LibraryElement externalSchemaLibrary) { + final builtClasses = externalSchemaLibrary.units + .expand((cu) => cu.classes) + .where((c) => hasSerializer(c) && isBuiltValue(c)) + .toSet(); + + final nonBuiltClasses = externalSchemaLibrary.units + .expand((cu) => cu.classes) + .where( + (c) => hasSerializer(c) && !isBuiltValue(c), + ) + .toSet(); + + return ( + builtClasses: builtClasses, + nonBuiltClasses: nonBuiltClasses, + ); +} diff --git a/packages/ferry_test_external_schema/pubspec_overrides.yaml b/packages/ferry_test_external_schema/pubspec_overrides.yaml deleted file mode 100644 index e5350337..00000000 --- a/packages/ferry_test_external_schema/pubspec_overrides.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# melos_managed_dependency_overrides: ferry,ferry_cache,ferry_exec,ferry_generator,ferry_store,ferry_test_graphql2,normalize -dependency_overrides: - ferry: - path: ../ferry - ferry_cache: - path: ../ferry_cache - ferry_exec: - path: ../ferry_exec - ferry_generator: - path: ../ferry_generator - ferry_store: - path: ../ferry_store - ferry_test_graphql2: - path: ../ferry_test_graphql2 - normalize: - path: ../normalize