From fa44d74f8faf3b43fbf96bb27c1c503397183db9 Mon Sep 17 00:00:00 2001 From: Florian Harr Date: Sat, 27 Jan 2024 11:18:16 -0500 Subject: [PATCH] fix(gql_code_builder): Fixing nullables and type overrides for vars create factories (#444) --- .../fragment_with_scalar_var.var.gql.dart | 2 +- .../hero_with_fragments.var.gql.dart | 4 ++-- .../multiple_fragments.var.gql.dart | 2 +- .../review_with_date.var.gql.dart | 4 ++-- .../__generated__/create_review.var.gql.dart | 2 +- .../hero_with_fragments.var.gql.dart | 2 +- codegen/gql_build/pubspec.yaml | 8 ++++---- .../lib/src/required_vars_constructor.dart | 19 ++++++++++++------- codegen/gql_code_builder/lib/var.dart | 1 + codegen/gql_code_builder/pubspec.yaml | 8 ++++---- 10 files changed, 29 insertions(+), 23 deletions(-) diff --git a/codegen/end_to_end_test/lib/fragments/__generated__/fragment_with_scalar_var.var.gql.dart b/codegen/end_to_end_test/lib/fragments/__generated__/fragment_with_scalar_var.var.gql.dart index 9ae60682..c929999d 100644 --- a/codegen/end_to_end_test/lib/fragments/__generated__/fragment_with_scalar_var.var.gql.dart +++ b/codegen/end_to_end_test/lib/fragments/__generated__/fragment_with_scalar_var.var.gql.dart @@ -20,7 +20,7 @@ abstract class GPostsWithFixedVariableVars [void Function(GPostsWithFixedVariableVarsBuilder b) updates]) = _$GPostsWithFixedVariableVars; - factory GPostsWithFixedVariableVars.create({required _i1.GJson? filter}) => + factory GPostsWithFixedVariableVars.create({_i1.GJson? filter}) => GPostsWithFixedVariableVars((b) => b..filter = filter?.toBuilder()); _i1.GJson? get filter; diff --git a/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_fragments.var.gql.dart b/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_fragments.var.gql.dart index 4d470c5e..7ba4ccb1 100644 --- a/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_fragments.var.gql.dart +++ b/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_fragments.var.gql.dart @@ -17,7 +17,7 @@ abstract class GHeroWithFragmentsVars [void Function(GHeroWithFragmentsVarsBuilder b) updates]) = _$GHeroWithFragmentsVars; - factory GHeroWithFragmentsVars.create({required int? first}) => + factory GHeroWithFragmentsVars.create({int? first}) => GHeroWithFragmentsVars((b) => b..first = first); int? get first; @@ -67,7 +67,7 @@ abstract class GcomparisonFieldsVars [void Function(GcomparisonFieldsVarsBuilder b) updates]) = _$GcomparisonFieldsVars; - factory GcomparisonFieldsVars.create({required int? first}) => + factory GcomparisonFieldsVars.create({int? first}) => GcomparisonFieldsVars((b) => b..first = first); int? get first; diff --git a/codegen/end_to_end_test/lib/fragments/__generated__/multiple_fragments.var.gql.dart b/codegen/end_to_end_test/lib/fragments/__generated__/multiple_fragments.var.gql.dart index 4ffcb5a5..d62a891a 100644 --- a/codegen/end_to_end_test/lib/fragments/__generated__/multiple_fragments.var.gql.dart +++ b/codegen/end_to_end_test/lib/fragments/__generated__/multiple_fragments.var.gql.dart @@ -17,7 +17,7 @@ abstract class GHeroWith2FragmentsVars [void Function(GHeroWith2FragmentsVarsBuilder b) updates]) = _$GHeroWith2FragmentsVars; - factory GHeroWith2FragmentsVars.create({required int? first}) => + factory GHeroWith2FragmentsVars.create({int? first}) => GHeroWith2FragmentsVars((b) => b..first = first); int? get first; diff --git a/codegen/end_to_end_test/lib/scalars/__generated__/review_with_date.var.gql.dart b/codegen/end_to_end_test/lib/scalars/__generated__/review_with_date.var.gql.dart index f76367ed..50a7a91c 100644 --- a/codegen/end_to_end_test/lib/scalars/__generated__/review_with_date.var.gql.dart +++ b/codegen/end_to_end_test/lib/scalars/__generated__/review_with_date.var.gql.dart @@ -20,9 +20,9 @@ abstract class GReviewWithDateVars _$GReviewWithDateVars; factory GReviewWithDateVars.create({ - required _i1.GEpisode? episode, + _i1.GEpisode? episode, required _i1.GReviewInput review, - required DateTime? createdAt, + DateTime? createdAt, }) => GReviewWithDateVars((b) => b ..episode = episode diff --git a/codegen/end_to_end_test/lib/variables/__generated__/create_review.var.gql.dart b/codegen/end_to_end_test/lib/variables/__generated__/create_review.var.gql.dart index 63e00968..73fddcfa 100644 --- a/codegen/end_to_end_test/lib/variables/__generated__/create_review.var.gql.dart +++ b/codegen/end_to_end_test/lib/variables/__generated__/create_review.var.gql.dart @@ -20,7 +20,7 @@ abstract class GCreateReviewVars _$GCreateReviewVars; factory GCreateReviewVars.create({ - required _i1.GEpisode? episode, + _i1.GEpisode? episode, required _i1.GReviewInput review, }) => GCreateReviewVars((b) => b diff --git a/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_fragments.var.gql.dart b/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_fragments.var.gql.dart index bdc57124..c45f840f 100644 --- a/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_fragments.var.gql.dart +++ b/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_fragments.var.gql.dart @@ -73,7 +73,7 @@ abstract class GcomparisonFieldsVars [void Function(GcomparisonFieldsVarsBuilder b) updates]) = _$GcomparisonFieldsVars; - factory GcomparisonFieldsVars.create({required int? first}) => + factory GcomparisonFieldsVars.create({int? first}) => GcomparisonFieldsVars((b) => b..first = first); int? get first; diff --git a/codegen/gql_build/pubspec.yaml b/codegen/gql_build/pubspec.yaml index 95a329d7..e0b6fd21 100644 --- a/codegen/gql_build/pubspec.yaml +++ b/codegen/gql_build/pubspec.yaml @@ -2,9 +2,9 @@ name: gql_build version: 0.11.0+1 description: Useful builders for your GraphQL SDL and documents. Based on package:gql_code_builder and package:build repository: https://github.com/gql-dart/gql -environment: +environment: sdk: '>=3.0.0 <4.0.0' -dependencies: +dependencies: analyzer: '>=4.6.0 <7.0.0' build: ^2.1.0 built_collection: ^5.0.0 @@ -18,10 +18,10 @@ dependencies: path: ^1.8.0 yaml: ^3.1.0 gql_tristate_value: ^1.0.0 -dev_dependencies: +dev_dependencies: build_test: ^2.0.0 gql_pedantic: ^1.0.2 -topics: +topics: - graphql - gql - codegen diff --git a/codegen/gql_code_builder/lib/src/required_vars_constructor.dart b/codegen/gql_code_builder/lib/src/required_vars_constructor.dart index 56e91478..7c5711f9 100644 --- a/codegen/gql_code_builder/lib/src/required_vars_constructor.dart +++ b/codegen/gql_code_builder/lib/src/required_vars_constructor.dart @@ -8,6 +8,7 @@ Constructor builtCreateConstructor({ required String name, required Iterable getters, required SourceNode schemaSource, + Map typeOverrides = const {}, }) { final className = builtClassName(name); @@ -21,15 +22,17 @@ Constructor builtCreateConstructor({ ); // Create parameters for the factory constructor - final factoryParameters = filteredGetters.map( - (g) => Parameter( + final factoryParameters = filteredGetters.map((g) { + final isNullable = (g.returns! as TypeReference).isNullable ?? false; + + return Parameter( (b) => b ..name = g.name! ..named = true - ..required = true + ..required = !isNullable ..type = g.returns, - ), - ); + ); + }); final assignments = filteredGetters.map((g) { final typeDefinitionNode = getTypeDefinitionNode( @@ -37,9 +40,11 @@ Constructor builtCreateConstructor({ final isBuiltType = typeDefinitionNode is InputObjectTypeDefinitionNode || typeDefinitionNode is ScalarTypeDefinitionNode; - // Check if the type is nullable + final isTypeOverride = typeOverrides.values.contains(g.returns!); final isNullable = (g.returns! as TypeReference).isNullable ?? false; - final assignment = isBuiltType + + // If the type is a built type and not a TypeOverride, we need to call toBuilder() on it. + final assignment = isBuiltType && !isTypeOverride ? "${g.name} = ${g.name}${isNullable ? '?' : ''}.toBuilder()" : "${g.name} = ${g.name}"; diff --git a/codegen/gql_code_builder/lib/var.dart b/codegen/gql_code_builder/lib/var.dart index 5d7db904..24648346 100644 --- a/codegen/gql_code_builder/lib/var.dart +++ b/codegen/gql_code_builder/lib/var.dart @@ -52,6 +52,7 @@ Library buildVarLibrary( ), ), schemaSource: schemaSource, + typeOverrides: typeOverrides, ), ], initializers: switch (useTriStateValueForNullableTypes) { diff --git a/codegen/gql_code_builder/pubspec.yaml b/codegen/gql_code_builder/pubspec.yaml index 2362bc2b..e1665b4a 100644 --- a/codegen/gql_code_builder/pubspec.yaml +++ b/codegen/gql_code_builder/pubspec.yaml @@ -2,9 +2,9 @@ name: gql_code_builder version: 0.10.0 description: Dart code builders taking *.graphql documents and SDL to build useful classes. repository: https://github.com/gql-dart/gql -environment: +environment: sdk: '>=3.0.0 <4.0.0' -dependencies: +dependencies: analyzer: '>=4.6.0 <7.0.0' built_collection: ^5.0.0 built_value: ^8.0.6 @@ -14,11 +14,11 @@ dependencies: gql_exec: ^1.0.0 path: ^1.8.0 gql_tristate_value: ^1.0.0 -dev_dependencies: +dev_dependencies: build_runner: ^2.1.0 gql_pedantic: ^1.0.2 test: ^1.16.8 -topics: +topics: - graphql - gql - codegen