From c0c020ecf99c212b86c866459ca640b5a863ffd8 Mon Sep 17 00:00:00 2001 From: Dong Wook Kim Date: Mon, 14 Aug 2023 20:30:34 +0900 Subject: [PATCH 1/7] (fix/reuse-fragments) Fix inline fragments serialization bug for reuse-fragments. - Fix reuse-fragments for inline fragments serialization runtime error. - Fix reuse-fragments for inline fragments: - Below query will consider CommunityContent interface while deciding reuse-fragment of CommunityFeed which implements CommunityContent. ```graphql node: { ... on CommunityContent { liked viewed } ... on CommunityFeed { ...CommunityFeedFragment } ... on CommunityReply { ...CommunityReplyFragment } } ``` - Additionally fix WhenExtension to not to create redundant mappers for interfaces which doesn't make sense because interfaces don't have __typename. (cherry picked from commit 7206742503dcf3717e2e379f9e6d7dcc5228cb9a) --- codegen/gql_code_builder/lib/data.dart | 77 +++++++++++++++---- .../lib/src/inline_fragment_classes.dart | 5 ++ .../lib/src/operation/data.dart | 25 ++++-- .../lib/src/when_extension.dart | 11 ++- 4 files changed, 96 insertions(+), 22 deletions(-) diff --git a/codegen/gql_code_builder/lib/data.dart b/codegen/gql_code_builder/lib/data.dart index e14186a7..224f3179 100644 --- a/codegen/gql_code_builder/lib/data.dart +++ b/codegen/gql_code_builder/lib/data.dart @@ -4,6 +4,7 @@ import "package:gql/ast.dart"; import "package:gql_code_builder/src/common.dart"; import "package:gql_code_builder/src/config/data_class_config.dart"; import "package:gql_code_builder/src/config/when_extension_config.dart"; +import "package:gql_code_builder/src/utils/possible_types.dart"; import "./source.dart"; import "./src/operation/data.dart"; @@ -26,8 +27,9 @@ Library buildDataLibrary( ), ]) { final fragmentMap = _fragmentMap(docSource); + final possibleTypesMap = _possibleTypesMap(schemaSource); final dataClassAliasMap = dataClassConfig.reuseFragments - ? _dataClassAliasMap(docSource, fragmentMap) + ? _dataClassAliasMap(docSource, fragmentMap, possibleTypesMap) : {}; final operationDataClasses = docSource.document.definitions @@ -40,6 +42,7 @@ Library buildDataLibrary( typeOverrides, whenExtensionConfig, fragmentMap, + possibleTypesMap, dataClassAliasMap, ), ) @@ -55,6 +58,7 @@ Library buildDataLibrary( typeOverrides, whenExtensionConfig, fragmentMap, + possibleTypesMap, dataClassAliasMap, ), ) @@ -80,16 +84,40 @@ Map _fragmentMap(SourceNode source) => { for (var import in source.imports) ..._fragmentMap(import) }; +Map> _possibleTypesMap(SourceNode source, + [Set? visitedSource, Map>? possibleTypesMap]) { + visitedSource ??= {}; + possibleTypesMap ??= {}; + + source.imports.forEach((s) { + if (!visitedSource!.contains(source.url)) { + visitedSource.add(source.url); + _possibleTypesMap(s, visitedSource, possibleTypesMap); + } + }); + + source.document.possibleTypesMap().forEach((key, value) { + possibleTypesMap![key] ??= {}; + possibleTypesMap[key]!.addAll(value); + }); + + return possibleTypesMap; +} + Map _dataClassAliasMap( - SourceNode source, Map fragmentMap, - [Map? aliasMap, Set? visitedSource]) { + SourceNode source, + Map fragmentMap, + Map> possibleTypesMap, + [Map? aliasMap, + Set? visitedSource]) { aliasMap ??= {}; visitedSource ??= {}; source.imports.forEach((s) { if (!visitedSource!.contains(source.url)) { visitedSource.add(source.url); - _dataClassAliasMap(s, fragmentMap, aliasMap); + _dataClassAliasMap( + s, fragmentMap, possibleTypesMap, aliasMap, visitedSource); } }); @@ -101,6 +129,7 @@ Map _dataClassAliasMap( selections: def.selectionSet.selections, fragmentMap: fragmentMap, aliasMap: aliasMap, + possibleTypesMap: possibleTypesMap, ); } @@ -112,6 +141,7 @@ Map _dataClassAliasMap( selections: def.selectionSet.selections, fragmentMap: fragmentMap, aliasMap: aliasMap, + possibleTypesMap: possibleTypesMap, ); _dataClassAliasMapDFS( typeRefPrefix: builtClassName("${def.name.value}Data"), @@ -119,6 +149,7 @@ Map _dataClassAliasMap( selections: def.selectionSet.selections, fragmentMap: fragmentMap, aliasMap: aliasMap, + possibleTypesMap: possibleTypesMap, ); } @@ -131,17 +162,20 @@ void _dataClassAliasMapDFS({ required List selections, required Map fragmentMap, required Map aliasMap, + required Map> possibleTypesMap, + bool shouldAlwaysGenerate = false, }) { if (selections.isEmpty) return; - // flatten selections to extract untouched fragments while visiting children. + // shrink selections to extract untouched fragments while visiting children. final shrunkenSelections = shrinkSelections(mergeSelections(selections, fragmentMap), fragmentMap); // alias single fragment and finish final selectionsWithoutTypename = shrunkenSelections .where((s) => !(s is FieldNode && s.name.value == "__typename")); - if (selectionsWithoutTypename.length == 1 && + if (!shouldAlwaysGenerate && + selectionsWithoutTypename.length == 1 && selectionsWithoutTypename.first is FragmentSpreadNode) { final node = selectionsWithoutTypename.first as FragmentSpreadNode; final fragment = fragmentMap[node.name.value]; @@ -179,20 +213,36 @@ void _dataClassAliasMapDFS({ selections: exclusiveFragmentSelections, fragmentMap: fragmentMap, aliasMap: aliasMap, + possibleTypesMap: possibleTypesMap, ); } else if (node is InlineFragmentNode) { + /// TODO: Handle inline fragments without a type condition if (node.typeCondition != null) { - /// TODO: Handle inline fragments without a type condition + final currentType = node.typeCondition!.on.name.value; + final interfaces = possibleTypesMap.entries + .where((e) => e.value.contains(currentType)) + .map((e) => e.key) + .toSet(); + + final selectionsIncludingInterfaces = [ + ...selections.where((s) => !(s is InlineFragmentNode)), + // spread all interfaces which current type is belongs to + ...selections + .whereType() + .where((s) => + s == node || + interfaces.contains(s.typeCondition?.on.name.value)) + .expand((s) => s.selectionSet.selections), + ]; + _dataClassAliasMapDFS( - typeRefPrefix: - "${typeRefPrefix}__as${node.typeCondition!.on.name.value}", + typeRefPrefix: "${typeRefPrefix}__as${currentType}", getAliasTypeName: getAliasTypeName, - selections: [ - ...selections.where((s) => s != node), - ...node.selectionSet.selections, - ], + selections: selectionsIncludingInterfaces, fragmentMap: fragmentMap, aliasMap: aliasMap, + possibleTypesMap: possibleTypesMap, + shouldAlwaysGenerate: true, ); } } else if (node is FieldNode && node.selectionSet != null) { @@ -202,6 +252,7 @@ void _dataClassAliasMapDFS({ selections: node.selectionSet!.selections, fragmentMap: fragmentMap, aliasMap: aliasMap, + possibleTypesMap: possibleTypesMap, ); } } diff --git a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart index 7ccddb9c..6b1ca2ef 100644 --- a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart +++ b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart @@ -22,6 +22,7 @@ List buildInlineFragmentClasses({ required String type, required Map typeOverrides, required Map fragmentMap, + required Map> possibleTypesMap, required Map dataClassAliasMap, required Map superclassSelections, required List inlineFragments, @@ -32,6 +33,7 @@ List buildInlineFragmentClasses({ baseTypeName: name, inlineFragments: inlineFragments, config: whenExtensionConfig, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, ); return [ @@ -71,6 +73,7 @@ List buildInlineFragmentClasses({ fragmentMap, ), fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, schemaSource: schemaSource, type: type, @@ -94,6 +97,7 @@ List buildInlineFragmentClasses({ // print("alias $typeName => ${dataClassAliasMap[typeName]!.symbol}"); return false; } + // is it okay to inlcude interfaces? return true; }).expand( (inlineFragment) => buildSelectionSetDataClasses( @@ -107,6 +111,7 @@ List buildInlineFragmentClasses({ fragmentMap, ), fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, schemaSource: schemaSource, type: inlineFragment.typeCondition!.on.name.value, diff --git a/codegen/gql_code_builder/lib/src/operation/data.dart b/codegen/gql_code_builder/lib/src/operation/data.dart index e8fea5ab..7489ddcb 100644 --- a/codegen/gql_code_builder/lib/src/operation/data.dart +++ b/codegen/gql_code_builder/lib/src/operation/data.dart @@ -15,6 +15,7 @@ List buildOperationDataClasses( Map typeOverrides, InlineFragmentSpreadWhenExtensionConfig whenExtensionConfig, Map fragmentMap, + Map> possibleTypesMap, Map dataClassAliasMap, ) { if (op.name == null) { @@ -34,6 +35,7 @@ List buildOperationDataClasses( ), typeOverrides: typeOverrides, fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, superclassSelections: {}, whenExtensionConfig: whenExtensionConfig, @@ -47,6 +49,7 @@ List buildFragmentDataClasses( Map typeOverrides, InlineFragmentSpreadWhenExtensionConfig whenExtensionConfig, Map fragmentMap, + Map> possibleTypesMap, Map dataClassAliasMap, ) { final selections = mergeSelections( @@ -62,6 +65,7 @@ List buildFragmentDataClasses( type: frag.typeCondition.on.name.value, typeOverrides: typeOverrides, fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, superclassSelections: {}, built: false, @@ -75,6 +79,7 @@ List buildFragmentDataClasses( type: frag.typeCondition.on.name.value, typeOverrides: typeOverrides, fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, superclassSelections: { frag.name.value: SourceSelections( @@ -120,6 +125,7 @@ List buildSelectionSetDataClasses({ required String type, required Map typeOverrides, required Map fragmentMap, + required Map> possibleTypesMap, required Map dataClassAliasMap, required Map superclassSelections, bool built = true, @@ -180,6 +186,7 @@ List buildSelectionSetDataClasses({ type: type, typeOverrides: typeOverrides, fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, superclassSelections: superclassSelections, inlineFragments: inlineFragments, @@ -236,6 +243,7 @@ List buildSelectionSetDataClasses({ name: "${name}_${field.alias?.value ?? field.name.value}", selections: field.selectionSet!.selections, fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, dataClassAliasMap: dataClassAliasMap, schemaSource: schemaSource, type: unwrapTypeNode( @@ -292,20 +300,25 @@ List shrinkSelections( } } + final duplicateIndices = {}; for (final node in unmerged.whereType().toList()) { final fragment = fragmentMap[node.name.value]!; - final spreadIndex = unmerged.indexOf(node); - final duplicateIndexList = []; + final fragmentSpreadIndex = unmerged.indexOf(node); unmerged.forEachIndexed((selectionIndex, selection) { - if (selectionIndex > spreadIndex && + if (selectionIndex != fragmentSpreadIndex && + !(selection is FieldNode && selection.name.value == "__typename") && fragment.selections.any((s) => s.hashCode == selection.hashCode)) { - duplicateIndexList.add(selectionIndex); + duplicateIndices.add(selectionIndex); } }); - duplicateIndexList.reversed.forEach(unmerged.removeAt); } - return unmerged; + return unmerged + .asMap() + .entries + .where((e) => !duplicateIndices.contains(e.key)) + .map((e) => e.value) + .toList(); } /// Deeply merges field nodes diff --git a/codegen/gql_code_builder/lib/src/when_extension.dart b/codegen/gql_code_builder/lib/src/when_extension.dart index 197bcab4..55894ece 100644 --- a/codegen/gql_code_builder/lib/src/when_extension.dart +++ b/codegen/gql_code_builder/lib/src/when_extension.dart @@ -40,9 +40,15 @@ Extension? inlineFragmentWhenExtension( {required String baseTypeName, required List inlineFragments, required InlineFragmentSpreadWhenExtensionConfig config, + required Map> possibleTypesMap, required Map dataClassAliasMap}) { final inlineFragmentsWithTypConditions = inlineFragments - .where((inlineFragment) => inlineFragment.typeCondition != null) + .where((inlineFragment) => + inlineFragment.typeCondition != null + // except interfaces on when extension + && + !possibleTypesMap + .containsKey(inlineFragment.typeCondition!.on.name.value)) .toList(); final nothingToDo = inlineFragmentsWithTypConditions.isEmpty || @@ -187,8 +193,7 @@ Extension? inlineFragmentWhenExtension( [ _switchTypeName, _curlyBracketOpen, - ...inlineFragments - .where((element) => element.typeCondition != null) + ...inlineFragmentsWithTypConditions .map((inlineFragment) => Block.of([ _caseStatement(inlineFragment), maybeWhenCaseBody(inlineFragment), From c3b1a5d41794259cf8419db0f476a660016bf5f6 Mon Sep 17 00:00:00 2001 From: Dong Wook Kim Date: Wed, 23 Aug 2023 22:51:49 +0900 Subject: [PATCH 2/7] make whenExtension modification backward-compatible, show error when not-existing fragment used --- codegen/gql_code_builder/lib/data.dart | 6 +++--- codegen/gql_code_builder/lib/src/operation/data.dart | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/codegen/gql_code_builder/lib/data.dart b/codegen/gql_code_builder/lib/data.dart index 224f3179..bea8c009 100644 --- a/codegen/gql_code_builder/lib/data.dart +++ b/codegen/gql_code_builder/lib/data.dart @@ -27,7 +27,7 @@ Library buildDataLibrary( ), ]) { final fragmentMap = _fragmentMap(docSource); - final possibleTypesMap = _possibleTypesMap(schemaSource); + final possibleTypesMap = dataClassConfig.reuseFragments ? _possibleTypesMap(schemaSource) : >{}; final dataClassAliasMap = dataClassConfig.reuseFragments ? _dataClassAliasMap(docSource, fragmentMap, possibleTypesMap) : {}; @@ -75,13 +75,13 @@ Library buildDataLibrary( } Map _fragmentMap(SourceNode source) => { - for (var def + for (final def in source.document.definitions.whereType()) def.name.value: SourceSelections( url: source.url, selections: def.selectionSet.selections, ), - for (var import in source.imports) ..._fragmentMap(import) + for (final import in source.imports) ..._fragmentMap(import) }; Map> _possibleTypesMap(SourceNode source, diff --git a/codegen/gql_code_builder/lib/src/operation/data.dart b/codegen/gql_code_builder/lib/src/operation/data.dart index 7489ddcb..20714c02 100644 --- a/codegen/gql_code_builder/lib/src/operation/data.dart +++ b/codegen/gql_code_builder/lib/src/operation/data.dart @@ -302,6 +302,9 @@ List shrinkSelections( final duplicateIndices = {}; for (final node in unmerged.whereType().toList()) { + if (!fragmentMap.containsKey(node.name.value)) { + throw "Cannot find a fragment ${node.name.value} from current file."; + } final fragment = fragmentMap[node.name.value]!; final fragmentSpreadIndex = unmerged.indexOf(node); unmerged.forEachIndexed((selectionIndex, selection) { From c047ece85ab0a98c391fb49178ae16a7cce1939f Mon Sep 17 00:00:00 2001 From: Dong Wook Kim Date: Sat, 26 Aug 2023 01:18:15 +0900 Subject: [PATCH 3/7] fix superclassSelections of inlineFragment data classes --- codegen/gql_code_builder/lib/data.dart | 4 +- .../lib/src/inline_fragment_classes.dart | 44 ++++++++++--------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/codegen/gql_code_builder/lib/data.dart b/codegen/gql_code_builder/lib/data.dart index bea8c009..d3b393ea 100644 --- a/codegen/gql_code_builder/lib/data.dart +++ b/codegen/gql_code_builder/lib/data.dart @@ -27,7 +27,9 @@ Library buildDataLibrary( ), ]) { final fragmentMap = _fragmentMap(docSource); - final possibleTypesMap = dataClassConfig.reuseFragments ? _possibleTypesMap(schemaSource) : >{}; + final possibleTypesMap = dataClassConfig.reuseFragments + ? _possibleTypesMap(schemaSource) + : >{}; final dataClassAliasMap = dataClassConfig.reuseFragments ? _dataClassAliasMap(docSource, fragmentMap, possibleTypesMap) : {}; diff --git a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart index 6b1ca2ef..beb942a0 100644 --- a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart +++ b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart @@ -101,26 +101,30 @@ List buildInlineFragmentClasses({ return true; }).expand( (inlineFragment) => buildSelectionSetDataClasses( - name: "${name}__as${inlineFragment.typeCondition!.on.name.value}", - selections: mergeSelections( - [ - ...selections.whereType(), - ...selections.whereType(), - ...inlineFragment.selectionSet.selections, - ], - fragmentMap, - ), - fragmentMap: fragmentMap, - possibleTypesMap: possibleTypesMap, - dataClassAliasMap: dataClassAliasMap, - schemaSource: schemaSource, - type: inlineFragment.typeCondition!.on.name.value, - typeOverrides: typeOverrides, - superclassSelections: { - name: SourceSelections(url: null, selections: selections) - }, - built: built, - whenExtensionConfig: whenExtensionConfig), + name: "${name}__as${inlineFragment.typeCondition!.on.name.value}", + selections: mergeSelections( + [ + ...selections.whereType(), + ...selections.whereType(), + ...inlineFragment.selectionSet.selections, + ], + fragmentMap, + ), + fragmentMap: fragmentMap, + possibleTypesMap: possibleTypesMap, + dataClassAliasMap: dataClassAliasMap, + schemaSource: schemaSource, + type: inlineFragment.typeCondition!.on.name.value, + typeOverrides: typeOverrides, + superclassSelections: { + name: SourceSelections(url: null, selections: selections), + ...Map.fromEntries(superclassSelections.entries.map((e) => MapEntry( + "${e.key}__as${inlineFragment.typeCondition!.on.name.value}", + e.value))), + }, + built: built, + whenExtensionConfig: whenExtensionConfig, + ), ), ]; } From 17e906b4bb4d54d745315265e255350fafe12520 Mon Sep 17 00:00:00 2001 From: Dong Wook Kim Date: Fri, 1 Sep 2023 22:31:42 +0900 Subject: [PATCH 4/7] lint: prefer_final_in_for_each --- codegen/gql_code_builder/lib/src/inline_fragment_classes.dart | 2 +- codegen/gql_code_builder/lib/var.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart index beb942a0..9592251f 100644 --- a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart +++ b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart @@ -148,7 +148,7 @@ List _inlineFragmentRootSerializationMethods({ /// TODO: Handle inline fragments without a type condition /// https://spec.graphql.org/June2018/#sec-Inline-Fragments { - for (var v in inlineFragments + for (final v in inlineFragments .where((frag) => frag.typeCondition != null)) "${v.typeCondition!.on.name.value}": dataClassAliasMap[ "${name}__as${v.typeCondition!.on.name.value}"] ?? diff --git a/codegen/gql_code_builder/lib/var.dart b/codegen/gql_code_builder/lib/var.dart index 80f553c7..f6db1243 100644 --- a/codegen/gql_code_builder/lib/var.dart +++ b/codegen/gql_code_builder/lib/var.dart @@ -30,10 +30,10 @@ Library buildVarLibrary( .toList(); Map _fragmentMap(SourceNode source) => { - for (var def + for (final def in source.document.definitions.whereType()) def.name.value: def, - for (var import in source.imports) ..._fragmentMap(import) + for (final import in source.imports) ..._fragmentMap(import) }; final fragmentVarClasses = docSource.document.definitions From 122da1231523482cb47d520b3421fc994e107277 Mon Sep 17 00:00:00 2001 From: Dong Wook Kim Date: Thu, 28 Sep 2023 10:22:29 +0900 Subject: [PATCH 5/7] fix already aliased fragment to not stop creating deeper nested alias --- codegen/gql_code_builder/lib/data.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/codegen/gql_code_builder/lib/data.dart b/codegen/gql_code_builder/lib/data.dart index d3b393ea..6639c125 100644 --- a/codegen/gql_code_builder/lib/data.dart +++ b/codegen/gql_code_builder/lib/data.dart @@ -185,7 +185,6 @@ void _dataClassAliasMapDFS({ aliasMap[typeRefPrefix] = refer(fragmentTypeName, "${fragment!.url ?? ""}#data"); // print("alias $typeRefPrefix => $fragmentTypeName"); - return; } for (final node in selectionsWithoutTypename) { From d3497bf0fdd186141f2b5fa9f36860e7b394739e Mon Sep 17 00:00:00 2001 From: Dong Wook Kim Date: Fri, 29 Sep 2023 16:46:03 +0900 Subject: [PATCH 6/7] enhance aliasing by resuing deeply nested fragments inside fragments too --- codegen/gql_code_builder/lib/src/operation/data.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/codegen/gql_code_builder/lib/src/operation/data.dart b/codegen/gql_code_builder/lib/src/operation/data.dart index 20714c02..4f56ea76 100644 --- a/codegen/gql_code_builder/lib/src/operation/data.dart +++ b/codegen/gql_code_builder/lib/src/operation/data.dart @@ -306,11 +306,15 @@ List shrinkSelections( throw "Cannot find a fragment ${node.name.value} from current file."; } final fragment = fragmentMap[node.name.value]!; + final fragmentExpanded = { + ...fragment.selections, + ..._expandFragmentSpreads(fragment.selections, fragmentMap) + }; final fragmentSpreadIndex = unmerged.indexOf(node); unmerged.forEachIndexed((selectionIndex, selection) { if (selectionIndex != fragmentSpreadIndex && !(selection is FieldNode && selection.name.value == "__typename") && - fragment.selections.any((s) => s.hashCode == selection.hashCode)) { + fragmentExpanded.any((s) => s.hashCode == selection.hashCode)) { duplicateIndices.add(selectionIndex); } }); From 253d933f81d1e3ab37519ed86a1c95f8042b6ae7 Mon Sep 17 00:00:00 2001 From: Dong Wook Kim Date: Mon, 13 Nov 2023 23:42:48 +0900 Subject: [PATCH 7/7] fix(reuse-fragment): turn off super class expanding when the flag is not on --- .../gql_code_builder/lib/src/inline_fragment_classes.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart index 9592251f..4a409b18 100644 --- a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart +++ b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart @@ -118,9 +118,10 @@ List buildInlineFragmentClasses({ typeOverrides: typeOverrides, superclassSelections: { name: SourceSelections(url: null, selections: selections), - ...Map.fromEntries(superclassSelections.entries.map((e) => MapEntry( - "${e.key}__as${inlineFragment.typeCondition!.on.name.value}", - e.value))), + if (dataClassAliasMap.isNotEmpty) + ...Map.fromEntries(superclassSelections.entries.map((e) => MapEntry( + "${e.key}__as${inlineFragment.typeCondition!.on.name.value}", + e.value))), }, built: built, whenExtensionConfig: whenExtensionConfig,