From 2ec34002ed4771c628462f432fb1bb03c66eba17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kl=C4=81vs=20Pried=C4=ABtis?= Date: Fri, 21 Feb 2020 22:33:05 +0200 Subject: [PATCH] depend on allocator to refer to other generated files --- gql_build/lib/gql_build.dart | 6 +- gql_build/lib/src/op_builder.dart | 10 -- gql_build/lib/src/req_builder.dart | 2 - gql_build/lib/src/utils/writer.dart | 37 ++++-- gql_build/lib/src/var_builder.dart | 1 - gql_code_builder/lib/ast.dart | 7 +- gql_code_builder/lib/op.dart | 9 +- gql_code_builder/lib/req.dart | 4 - gql_code_builder/lib/src/operation/data.dart | 118 ++++++++++--------- gql_code_builder/lib/src/operation/req.dart | 13 +- gql_code_builder/lib/src/operation/var.dart | 9 +- gql_code_builder/lib/var.dart | 2 - 12 files changed, 106 insertions(+), 112 deletions(-) diff --git a/gql_build/lib/gql_build.dart b/gql_build/lib/gql_build.dart index 6912cdf9..1b47dee2 100644 --- a/gql_build/lib/gql_build.dart +++ b/gql_build/lib/gql_build.dart @@ -26,11 +26,7 @@ Builder dataBuilder( Builder opBuilder( BuilderOptions options, ) => - OpBuilder( - AssetId.parse( - options.config["schema"] as String, - ), - ); + OpBuilder(); /// Builds GraphQL type-safe request builder Builder reqBuilder( diff --git a/gql_build/lib/src/op_builder.dart b/gql_build/lib/src/op_builder.dart index be8a9903..e29441cf 100644 --- a/gql_build/lib/src/op_builder.dart +++ b/gql_build/lib/src/op_builder.dart @@ -8,12 +8,6 @@ import "package:gql_build/src/config.dart"; import "package:gql_code_builder/op.dart"; class OpBuilder implements Builder { - final AssetId schemaId; - - OpBuilder( - this.schemaId, - ); - @override Map> get buildExtensions => { sourceExtension: [opExtension], @@ -22,13 +16,9 @@ class OpBuilder implements Builder { @override FutureOr build(BuildStep buildStep) async { final doc = await readDocument(buildStep); - final schema = await readDocument(buildStep, schemaId); final library = buildOpLibrary( doc, - schema, - buildStep.inputId.changeExtension(astExtension).uri.toString(), - schemaId.changeExtension(schemaExtension).uri.toString(), ); return writeDocument( diff --git a/gql_build/lib/src/req_builder.dart b/gql_build/lib/src/req_builder.dart index eb0429fb..7e952204 100644 --- a/gql_build/lib/src/req_builder.dart +++ b/gql_build/lib/src/req_builder.dart @@ -27,8 +27,6 @@ class ReqBuilder implements Builder { final library = buildReqLibrary( doc, schema, - buildStep.inputId.changeExtension(opExtension).uri.toString(), - buildStep.inputId.changeExtension(varExtension).uri.toString(), ); return writeDocument( diff --git a/gql_build/lib/src/utils/writer.dart b/gql_build/lib/src/utils/writer.dart index 58b93b78..39e325b7 100644 --- a/gql_build/lib/src/utils/writer.dart +++ b/gql_build/lib/src/utils/writer.dart @@ -19,8 +19,8 @@ Future writeDocument( final genSrc = _dartfmt.format("${library.accept( DartEmitter( _GqlAllocator( + buildStep.inputId.uri.toString(), generatedAsset.uri.toString(), - extension, ), ), )}"); @@ -34,14 +34,15 @@ Future writeDocument( class _GqlAllocator implements Allocator { static const _doNotPrefix = ["dart:core"]; - final _imports = {}; - final String extension; + final String sourceUrl; final String currentUrl; + + final _imports = {}; var _keys = 1; _GqlAllocator( + this.sourceUrl, this.currentUrl, - this.extension, ); @override @@ -52,9 +53,31 @@ class _GqlAllocator implements Allocator { return symbol; } - if (reference.url.endsWith(sourceExtension)) { - final replacedUrl = - reference.url.replaceAll(RegExp(r".graphql$"), extension); + final uri = Uri.parse(reference.url); + + if (uri.path.endsWith(sourceExtension)) { + final replacedUrl = uri + .replace( + path: uri.path.replaceAll( + RegExp(r".graphql$"), + ".${uri.fragment}.gql.dart", + ), + ) + .removeFragment() + .toString(); + + if (replacedUrl == currentUrl) { + return symbol; + } + + return "_i${_imports.putIfAbsent(replacedUrl, _nextKey)}.$symbol"; + } + + if (uri.path.isEmpty && uri.fragment.isNotEmpty) { + final replacedUrl = sourceUrl.replaceAll( + RegExp(r".graphql$"), + ".${uri.fragment}.gql.dart", + ); if (replacedUrl == currentUrl) { return symbol; diff --git a/gql_build/lib/src/var_builder.dart b/gql_build/lib/src/var_builder.dart index 6c34b823..31bdd746 100644 --- a/gql_build/lib/src/var_builder.dart +++ b/gql_build/lib/src/var_builder.dart @@ -26,7 +26,6 @@ class VarBuilder implements Builder { final library = buildVarLibrary( doc, schema, - schemaId.changeExtension(schemaExtension).uri.toString(), ); return writeDocument( diff --git a/gql_code_builder/lib/ast.dart b/gql_code_builder/lib/ast.dart index ed5d37c8..ff1e1ccd 100644 --- a/gql_code_builder/lib/ast.dart +++ b/gql_code_builder/lib/ast.dart @@ -19,7 +19,12 @@ Library buildAstLibrary( [], { "definitions": literalList( - source.getRefs(), + source.getRefs().map( + (ref) => Reference( + ref.symbol, + ref.url + "#ast", + ), + ), ), }, ) diff --git a/gql_code_builder/lib/op.dart b/gql_code_builder/lib/op.dart index 08f81826..5c5e9cb1 100644 --- a/gql_code_builder/lib/op.dart +++ b/gql_code_builder/lib/op.dart @@ -4,12 +4,8 @@ import "package:gql_code_builder/source.dart"; Library buildOpLibrary( SourceNode docSource, - SourceNode schemaSource, - String astDocUrl, - String schemaUrl, ) { final doc = docSource.flatDocument; - final schema = schemaSource.flatDocument; final operations = doc.definitions.whereType().map( (def) => refer( @@ -19,10 +15,7 @@ Library buildOpLibrary( .call( [], { - "document": refer( - "document", - astDocUrl, - ), + "document": refer("document", "#ast"), "operationName": literalString( def.name?.value, ), diff --git a/gql_code_builder/lib/req.dart b/gql_code_builder/lib/req.dart index 8e135dcb..00f37163 100644 --- a/gql_code_builder/lib/req.dart +++ b/gql_code_builder/lib/req.dart @@ -5,8 +5,6 @@ import "package:gql_code_builder/source.dart"; Library buildReqLibrary( SourceNode docSource, SourceNode schemaSource, - String opDocUrl, - String varDocUrl, ) => Library( (b) => b.body @@ -14,8 +12,6 @@ Library buildReqLibrary( buildOperationReqClasses( docSource.flatDocument, schemaSource.flatDocument, - opDocUrl, - varDocUrl, ), ), ); diff --git a/gql_code_builder/lib/src/operation/data.dart b/gql_code_builder/lib/src/operation/data.dart index c570f439..907f0f30 100644 --- a/gql_code_builder/lib/src/operation/data.dart +++ b/gql_code_builder/lib/src/operation/data.dart @@ -137,13 +137,13 @@ List _buildSelectionSetDataClasses({ (b) => b ..name = name ..implements = ListBuilder( - superclassSelections.keys.map((superName) => refer( - superName, - superclassSelections[superName] - .url - // TODO: remove the hard-coded string - ?.replaceAll(RegExp(r".graphql$"), ".data.gql.dart"), - ))) + superclassSelections.keys.map( + (superName) => refer( + superName, + superclassSelections[superName].url + "#data", + ), + ), + ) ..constructors = _buildConstructors( name, selections.whereType().toList(), @@ -182,25 +182,25 @@ List _buildSelectionSetDataClasses({ ), ), ), - ...selections - .whereType() - .expand((inlineFragment) => _buildSelectionSetDataClasses( - name: "$name\$as${inlineFragment.typeCondition.on.name.value}", - selections: _mergeSelections( - [ - ...selections.whereType(), - ...selections.whereType(), - ...inlineFragment.selectionSet.selections, - ], - fragmentMap, - ), - fragmentMap: fragmentMap, - schemaSource: schemaSource, - type: inlineFragment.typeCondition.on.name.value, - superclassSelections: { - name: _SourceSelections(url: null, selections: selections) - }, - )) + ...selections.whereType().expand( + (inlineFragment) => _buildSelectionSetDataClasses( + name: "$name\$as${inlineFragment.typeCondition.on.name.value}", + selections: _mergeSelections( + [ + ...selections.whereType(), + ...selections.whereType(), + ...inlineFragment.selectionSet.selections, + ], + fragmentMap, + ), + fragmentMap: fragmentMap, + schemaSource: schemaSource, + type: inlineFragment.typeCondition.on.name.value, + superclassSelections: { + name: _SourceSelections(url: null, selections: selections) + }, + ), + ), ]; } @@ -273,25 +273,30 @@ Map _fragmentSelectionsForField( Map fragmentMap, FieldNode field, ) => - { - for (var entry in fragmentMap.entries) - for (var selection - in entry.value.selections.whereType().where( + Map.fromEntries( + fragmentMap.entries.expand( + (entry) => entry.value.selections.whereType().where( (selection) { + if (selection.selectionSet == null) return false; + final selectionKey = selection.alias?.value ?? selection.name.value; final fieldKey = field.alias?.value ?? field.name.value; return selectionKey == fieldKey; }, - )) - if (selection.selectionSet != null) - "${entry.key}\$${field.alias?.value ?? field.name.value}": - _SourceSelections( - url: entry.value.url, - selections: selection.selectionSet.selections - .whereType() - .toList()) - }; + ).map( + (selection) => MapEntry( + "${entry.key}\$${field.alias?.value ?? field.name.value}", + _SourceSelections( + url: entry.value.url, + selections: selection.selectionSet.selections + .whereType() + .toList(), + ), + ), + ), + ), + ); ListBuilder _buildFields() => ListBuilder( [ @@ -315,27 +320,35 @@ ListBuilder _buildConstructors( Constructor( (b) => b ..name = inlineFragments.isEmpty ? null : "fromData" - ..requiredParameters.add(Parameter( - (b) => b - ..name = "data" - ..toThis = true, - )) + ..requiredParameters.add( + Parameter( + (b) => b + ..name = "data" + ..toThis = true, + ), + ) ..constant = true, ), if (inlineFragments.isNotEmpty) Constructor( (b) => b ..factory = true - ..requiredParameters.add(Parameter((b) => b..name = "data")) - ..body = Code([ - "switch (data['__typename']) {", - ...inlineFragments.map((inlineFragment) => """ + ..requiredParameters.add( + Parameter( + (b) => b..name = "data", + ), + ) + ..body = Code( + [ + "switch (data['__typename']) {", + ...inlineFragments.map((inlineFragment) => """ case "${inlineFragment.typeCondition.on.name.value}": return ${'$name\$as${inlineFragment.typeCondition.on.name.value}'}(data); """), - "default: return $name.fromData(data); }" - ].join()), - ) + "default: return $name.fromData(data); }" + ].join(), + ), + ), ], ); @@ -389,8 +402,7 @@ Method _buildGetter( else if (fieldTypeDef != null) typeName: refer( typeName, - // TODO: remove the hard-coded string - schemaSource.url.replaceAll(RegExp(r".graphql$"), ".schema.gql.dart"), + schemaSource.url + "#schema", ) }; diff --git a/gql_code_builder/lib/src/operation/req.dart b/gql_code_builder/lib/src/operation/req.dart index f947ebbb..71cf6a62 100644 --- a/gql_code_builder/lib/src/operation/req.dart +++ b/gql_code_builder/lib/src/operation/req.dart @@ -5,8 +5,6 @@ import "package:gql/ast.dart"; List buildOperationReqClasses( DocumentNode doc, DocumentNode schema, - String opDocUrl, - String varDocUrl, ) => doc.definitions .whereType() @@ -14,8 +12,6 @@ List buildOperationReqClasses( (op) => _buildOperationReqClass( op, schema, - opDocUrl, - varDocUrl, ), ) .toList(); @@ -23,11 +19,9 @@ List buildOperationReqClasses( Class _buildOperationReqClass( OperationDefinitionNode node, DocumentNode schema, - String opDocUrl, - String varDocUrl, ) { final name = node.name.value; - final varBuilderRef = refer("${name}VarBuilder", varDocUrl); + final varBuilderRef = refer("${name}VarBuilder", "#var"); return Class( (b) => b @@ -64,10 +58,7 @@ Class _buildOperationReqClass( ).call( [], { - "operation": refer( - name, - opDocUrl, - ), + "operation": refer(name, "#op"), "variables": refer("buildVars").call( [ varBuilderRef.call([]), diff --git a/gql_code_builder/lib/src/operation/var.dart b/gql_code_builder/lib/src/operation/var.dart index c2df95d4..ec9d5293 100644 --- a/gql_code_builder/lib/src/operation/var.dart +++ b/gql_code_builder/lib/src/operation/var.dart @@ -6,7 +6,6 @@ import "package:gql_code_builder/src/common.dart"; List buildOperationVarClasses( DocumentNode doc, DocumentNode schema, - String schemaUrl, ) => doc.definitions .whereType() @@ -14,7 +13,6 @@ List buildOperationVarClasses( (op) => _buildOperationVarClass( op, schema, - schemaUrl, ), ) .toList(); @@ -22,7 +20,6 @@ List buildOperationVarClasses( Class _buildOperationVarClass( OperationDefinitionNode node, DocumentNode schema, - String schemaUrl, ) => Class( (b) => b @@ -47,21 +44,18 @@ Class _buildOperationVarClass( ..methods = _buildSetters( node.variableDefinitions, schema, - schemaUrl, ), ); ListBuilder _buildSetters( List nodes, DocumentNode schema, - String schemaUrl, ) => ListBuilder( nodes.map( (VariableDefinitionNode node) => _buildSetter( node, schema, - schemaUrl, ), ), ); @@ -69,7 +63,6 @@ ListBuilder _buildSetters( Method _buildSetter( VariableDefinitionNode node, DocumentNode schema, - String schemaUrl, ) { final unwrappedTypeNode = _unwrapTypeNode(node.type); final typeName = unwrappedTypeNode.name.value; @@ -80,7 +73,7 @@ Method _buildSetter( final typeMap = { ...defaultTypeMap, - if (argTypeDef != null) typeName: refer(typeName, schemaUrl), + if (argTypeDef != null) typeName: refer(typeName, "#schema"), }; final argType = typeRef( diff --git a/gql_code_builder/lib/var.dart b/gql_code_builder/lib/var.dart index daa7a95f..b6fda625 100644 --- a/gql_code_builder/lib/var.dart +++ b/gql_code_builder/lib/var.dart @@ -5,7 +5,6 @@ import "package:gql_code_builder/source.dart"; Library buildVarLibrary( SourceNode docSource, SourceNode schemaSource, - String schemaUrl, ) => Library( (b) => b.body @@ -13,7 +12,6 @@ Library buildVarLibrary( buildOperationVarClasses( docSource.flatDocument, schemaSource.flatDocument, - schemaUrl, ), ), );