Skip to content

Commit

Permalink
Simplify scoped resolver compiler extensions. (#5286)
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelstaib committed Aug 9, 2022
1 parent 99917fa commit a43bb57
Show file tree
Hide file tree
Showing 13 changed files with 223 additions and 55 deletions.
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
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
@@ -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;
}
}
}
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
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
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

0 comments on commit a43bb57

Please sign in to comment.