Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify scoped resolver compiler extensions. #5286

Merged
merged 2 commits into from
Aug 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace HotChocolate.Resolvers;
/// </summary>
internal sealed class DefaultResolverCompiler : IResolverCompiler
{
private static readonly IParameterExpressionBuilder[] _empty =
private static readonly IReadOnlyList<IParameterExpressionBuilder> _empty =
Array.Empty<IParameterExpressionBuilder>();
private static readonly ParameterExpression _context =
Parameter(typeof(IResolverContext), "context");
Expand Down Expand Up @@ -137,7 +137,7 @@ internal sealed class DefaultResolverCompiler : IResolverCompiler
public FieldResolverDelegates CompileResolve<TResolver>(
Expression<Func<TResolver, object?>> propertyOrMethod,
Type? sourceType = null,
IParameterExpressionBuilder[]? parameterExpressionBuilders = null)
IReadOnlyList<IParameterExpressionBuilder>? parameterExpressionBuilders = null)
{
if (propertyOrMethod is null)
{
Expand Down Expand Up @@ -182,7 +182,7 @@ internal sealed class DefaultResolverCompiler : IResolverCompiler
MemberInfo member,
Type? sourceType = null,
Type? resolverType = null,
IParameterExpressionBuilder[]? parameterExpressionBuilders = null)
IReadOnlyList<IParameterExpressionBuilder>? parameterExpressionBuilders = null)
{
if (member is null)
{
Expand Down Expand Up @@ -249,7 +249,7 @@ internal sealed class DefaultResolverCompiler : IResolverCompiler
/// <inheritdoc />
public IEnumerable<ParameterInfo> GetArgumentParameters(
ParameterInfo[] parameters,
IParameterExpressionBuilder[]? parameterExpressionBuilders = null)
IReadOnlyList<IParameterExpressionBuilder>? parameterExpressionBuilders = null)
{
if (parameters is null)
{
Expand Down Expand Up @@ -295,7 +295,7 @@ internal sealed class DefaultResolverCompiler : IResolverCompiler

private FieldResolverDelegate CompileStaticResolver(
MethodInfo method,
IParameterExpressionBuilder[] fieldParameterExpressionBuilders)
IReadOnlyList<IParameterExpressionBuilder> fieldParameterExpressionBuilders)
{
var parameters = CreateParameters(
_context,
Expand All @@ -310,7 +310,7 @@ internal sealed class DefaultResolverCompiler : IResolverCompiler
MemberInfo member,
Type source,
Type resolverType,
IParameterExpressionBuilder[] fieldParameterExpressionBuilders)
IReadOnlyList<IParameterExpressionBuilder> fieldParameterExpressionBuilders)
{
if (member is PropertyInfo property)
{
Expand Down Expand Up @@ -341,7 +341,7 @@ internal sealed class DefaultResolverCompiler : IResolverCompiler
MemberInfo member,
Type source,
Type resolver,
IParameterExpressionBuilder[] fieldParameterExpressionBuilders)
IReadOnlyList<IParameterExpressionBuilder> fieldParameterExpressionBuilders)
{
if (member is PropertyInfo property && IsPureResolverResult(property.PropertyType))
{
Expand Down Expand Up @@ -384,7 +384,7 @@ internal sealed class DefaultResolverCompiler : IResolverCompiler
private bool IsPureResolver(
MethodInfo method,
ParameterInfo[] parameters,
IParameterExpressionBuilder[] fieldParameterExpressionBuilders)
IReadOnlyList<IParameterExpressionBuilder> fieldParameterExpressionBuilders)
{
if (!IsPureResolverResult(method.ReturnType))
{
Expand Down Expand Up @@ -447,7 +447,7 @@ private static bool IsPureResolverResult(Type resultType)
private Expression[] CreateParameters(
ParameterExpression context,
ParameterInfo[] parameters,
IParameterExpressionBuilder[] fieldParameterExpressionBuilders)
IReadOnlyList<IParameterExpressionBuilder> fieldParameterExpressionBuilders)
{
var parameterResolvers = new Expression[parameters.Length];

Expand All @@ -466,15 +466,15 @@ private static bool IsPureResolverResult(Type resultType)

private IParameterExpressionBuilder GetParameterExpressionBuilder(
ParameterInfo parameter,
IParameterExpressionBuilder[] fieldParameterExpressionBuilders)
IReadOnlyList<IParameterExpressionBuilder> fieldParameterExpressionBuilders)
{
if (fieldParameterExpressionBuilders.Length == 0 &&
if (fieldParameterExpressionBuilders.Count == 0 &&
_cache.TryGetValue(parameter, out var cached))
{
return cached;
}

if (fieldParameterExpressionBuilders.Length > 0)
if (fieldParameterExpressionBuilders.Count > 0)
{
foreach (var builder in fieldParameterExpressionBuilders)
{
Expand Down Expand Up @@ -503,7 +503,7 @@ private static bool IsPureResolverResult(Type resultType)
}
}

if (fieldParameterExpressionBuilders.Length > 0)
if (fieldParameterExpressionBuilders.Count > 0)
{
foreach (var builder in fieldParameterExpressionBuilders)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public interface IResolverCompiler : IDisposable
FieldResolverDelegates CompileResolve<TResolver>(
Expression<Func<TResolver, object?>> propertyOrMethod,
Type? sourceType = null,
IParameterExpressionBuilder[]? parameterExpressionBuilders = null);
IReadOnlyList<IParameterExpressionBuilder>? parameterExpressionBuilders = null);

/// <summary>
/// Compiles a resolver from a member selector.
Expand Down Expand Up @@ -79,7 +79,7 @@ public interface IResolverCompiler : IDisposable
MemberInfo member,
Type? sourceType = null,
Type? resolverType = null,
IParameterExpressionBuilder[]? parameterExpressionBuilders = null);
IReadOnlyList<IParameterExpressionBuilder>? parameterExpressionBuilders = null);

/// <summary>
/// Compiles a subscribe resolver from a member.
Expand Down Expand Up @@ -116,7 +116,7 @@ public interface IResolverCompiler : IDisposable
/// </returns>
IEnumerable<ParameterInfo> GetArgumentParameters(
ParameterInfo[] parameters,
IParameterExpressionBuilder[]? parameterExpressionBuilders = null);
IReadOnlyList<IParameterExpressionBuilder>? parameterExpressionBuilders = null);

/// <summary>
/// Applies filed configuration dependencies for the specified parameters.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using HotChocolate.Internal;
using HotChocolate.Utilities;

#nullable enable
Expand All @@ -11,6 +14,8 @@ namespace HotChocolate.Types.Descriptors.Definitions;
/// </summary>
public class InterfaceFieldDefinition : OutputFieldDefinitionBase
{
private List<IParameterExpressionBuilder>? _expressionBuilders;

/// <summary>
/// Initializes a new instance of <see cref="ObjectTypeDefinition"/>.
/// </summary>
Expand All @@ -33,4 +38,58 @@ public class InterfaceFieldDefinition : OutputFieldDefinitionBase
/// Gets the interface member to which this field is bound to.
/// </summary>
public MemberInfo? Member { get; set; }

/// <summary>
/// A list of parameter expression builders that shall be applied when compiling
/// the resolver or when arguments are inferred from a method.
/// </summary>
public IList<IParameterExpressionBuilder> ParameterExpressionBuilders
{
get
{
return _expressionBuilders ??= new List<IParameterExpressionBuilder>();
}
}

/// <summary>
/// A list of parameter expression builders that shall be applied when compiling
/// the resolver or when arguments are inferred from a method.
/// </summary>
internal IReadOnlyList<IParameterExpressionBuilder> GetParameterExpressionBuilders()
{
if (_expressionBuilders is null)
{
return Array.Empty<IParameterExpressionBuilder>();
}

return _expressionBuilders;
}

internal void CopyTo(InterfaceFieldDefinition target)
{
base.CopyTo(target);

if (_expressionBuilders is { Count: > 0 })
{
target._expressionBuilders = new(_expressionBuilders);
}

target.Member = Member;
}

internal void MergeInto(InterfaceFieldDefinition target)
{
base.MergeInto(target);

if (_expressionBuilders is { Count: > 0 })
{
target._expressionBuilders ??= new List<IParameterExpressionBuilder>();
target._expressionBuilders.AddRange(_expressionBuilders);
}

if (Member is not null)
{
target.Member = Member;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using HotChocolate.Internal;
using HotChocolate.Resolvers;
using HotChocolate.Utilities;

Expand All @@ -18,6 +19,7 @@ public class ObjectFieldDefinition : OutputFieldDefinitionBase
{
private List<FieldMiddlewareDefinition>? _middlewareDefinitions;
private List<ResultConverterDefinition>? _resultConverters;
private List<IParameterExpressionBuilder>? _expressionBuilders;
private List<object>? _customSettings;
private bool _middlewareDefinitionsCleaned;
private bool _resultConvertersCleaned;
Expand Down Expand Up @@ -137,7 +139,19 @@ public IList<ResultConverterDefinition> ResultConverters
}

/// <summary>
/// A list of custom settings objects that can be user in the type interceptors.
/// A list of parameter expression builders that shall be applied when compiling
/// the resolver or when arguments are inferred from a method.
/// </summary>
public IList<IParameterExpressionBuilder> ParameterExpressionBuilders
{
get
{
return _expressionBuilders ??= new List<IParameterExpressionBuilder>();
}
}

/// <summary>
/// A list of custom settings objects that can be used in the type interceptors.
/// Custom settings are not copied to the actual type system object.
/// </summary>
public IList<object> CustomSettings
Expand Down Expand Up @@ -231,6 +245,20 @@ internal IReadOnlyList<ResultConverterDefinition> GetResultConverters()
return _resultConverters;
}

/// <summary>
/// A list of parameter expression builders that shall be applied when compiling
/// the resolver or when arguments are inferred from a method.
/// </summary>
internal IReadOnlyList<IParameterExpressionBuilder> GetParameterExpressionBuilders()
{
if (_expressionBuilders is null)
{
return Array.Empty<IParameterExpressionBuilder>();
}

return _expressionBuilders;
}

/// <summary>
/// A list of custom settings objects that can be user in the type interceptors.
/// Custom settings are not copied to the actual type system object.
Expand Down Expand Up @@ -264,6 +292,11 @@ internal void CopyTo(ObjectFieldDefinition target)
_resultConvertersCleaned = false;
}

if (_expressionBuilders is { Count: > 0 })
{
target._expressionBuilders = new(_expressionBuilders);
}

if (_customSettings is { Count: > 0 })
{
target._customSettings = new(_customSettings);
Expand Down Expand Up @@ -302,6 +335,12 @@ internal void MergeInto(ObjectFieldDefinition target)
_resultConvertersCleaned = false;
}

if (_expressionBuilders is { Count: > 0 })
{
target._expressionBuilders ??= new List<IParameterExpressionBuilder>();
target._expressionBuilders.AddRange(_expressionBuilders);
}

if (_customSettings is { Count: > 0 })
{
target._customSettings ??= new List<object>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,31 +36,20 @@ public T CreateDefinition()
if (Definition.HasConfigurations)
{
var i = 0;
var buffered = 0;
var length = Definition.Configurations.Count;
var rented = ArrayPool<CreateConfiguration>.Shared.Rent(length);
var configurations = Definition.Configurations;

do
{
if (configurations[i] is { On: ApplyConfigurationOn.Create } config)
{
configurations.RemoveAt(i);
rented[buffered++] = (CreateConfiguration)config;
((CreateConfiguration)config).Configure(Context);
}
else
{
i++;
}
} while (i < configurations.Count);

for (i = 0; i < buffered; i++)
{
rented[i].Configure(Context);
}

rented.AsSpan().Slice(0, length).Clear();
ArrayPool<CreateConfiguration>.Shared.Return(rented, true);
}

return Definition;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ private void CompleteArguments(InterfaceFieldDefinition definition)
FieldDescriptorUtilities.DiscoverArguments(
Context,
definition.Arguments,
definition.Member);
definition.Member,
definition.GetParameterExpressionBuilders());
_argumentsInitialized = true;
}
}
Expand Down