GQL004: Don't use obsolete Field
methods
Value | |
---|---|
Rule ID | GQL004 |
Category | Usage |
Default severity | Warning |
Enabled by default | Yes |
Code fix provided | Yes |
Introduced in | v7.7 |
Cause
- One of the deprecated
FieldXXX
methods that returnFieldType
were used. - Expression based
Field
builder withnullable
andtype
parameters was used.
Rule description
A bunch of FieldXXX
APIs were deprecated and will be removed in future
version. For more information see
v7 Migration Guide.
How to fix violations
You will need to change a way of setting fields on your graph types. Instead of
many FieldXXX
overloads, start configuring your field with one of the Field
methods defined on ComplexGraphType
. All such methods define a new field and
return an instance of FieldBuilder<T,U>
. Then continue to configure the field
with rich APIs provided by the returned builder.
For the expression based field builder, you need to use an overload with only
nullable
or type
parameters.
Example of a violation
Field<NonNullGraphType<StringGraphType>>(
"name",
"Field description",
resolve: context => context.Source!.Name);
FieldAsync<CharacterInterface>(
"hero",
resolve: async context => await data.GetDroidByIdAsync("3"));
FieldAsync<HumanType>(
"human",
arguments: new QueryArguments(new QueryArgument<NonNullGraphType<StringGraphType>>
{
Name = "id",
Description = "id of the human"
}),
resolve: async context => await data.GetHumanByIdAsync(context.GetArgument<string>("id"))
);
Field(x => Name, true, typeof(StringGraphType));
Example of how to fix
Field<NonNullGraphType<StringGraphType>>("name")
.Description("Field description")
.Resolve(context => context.Source!.Name);
Field<CharacterInterface>("hero")
.ResolveAsync(async context => await data.GetDroidByIdAsync("3"));
Field<HumanType>("human")
.Argument<NonNullGraphType<StringGraphType>>("id", "id of the human")
.ResolveAsync(async context => await data.GetHumanByIdAsync(context.GetArgument<string>("id")));
// remove the 'nullable' argument because if was ignored by the obsolete overload
Field(x => Name, typeof(StringGraphType));
Configure code fix
The given diagnostic rule offers an automatic code fix. By default, it attempts
to retain the original user code formatting as much as possible but it will
remove unnecessary null
values. For instance, consider the subsequent code
snippet:
Field<StringGraphType>("name", "description", null,
context => "text");
This will be transformed into:
Field<StringGraphType>("name").Description("description")
.Resolve(context => "text");
Configure formatting
The reformat
configuration option will guide the code fix to apply code
reformatting. The default value is false
.
[*.cs]
dotnet_diagnostic.GQL004.reformat = true
The earlier code snippet will undergo the following reformatting:
Field<StringGraphType>("name")
.Description("description")
.Resolve(context => "text");
Configure null
values handling
The skip_nulls
option can be set to false
to preserve null
values
assignments. The default value is true
.
[*.cs]
dotnet_diagnostic.GQL004.skip_nulls = false
The earlier code snippet will undergo the following reformatting:
Field<StringGraphType>("name").Description("description").Arguments(null)
.Resolve(context => "text");
Suppress a warning
If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.
#pragma warning disable GQL004
// The code that's violating the rule is on this line.
#pragma warning restore GQL004
To disable the rule for a file, folder, or project, set its severity to none
in the
configuration file.
[*.cs]
dotnet_diagnostic.GQL004.severity = none
For more information, see How to suppress code analysis warnings.