Skip to content

Commit

Permalink
Address feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
layomia committed Aug 16, 2023
1 parent 28ec242 commit 81bf579
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Operations;

namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
{
Expand Down Expand Up @@ -44,13 +43,9 @@ public Parser(SourceProductionContext context, KnownTypeSymbols typeSymbols, Imm

foreach (BinderInvocation invocation in _invocations)
{
if (invocation.CandidateOperation is not IInvocationOperation operation)
{
continue;
}

Debug.Assert(operation.TargetMethod.IsExtensionMethod);
INamedTypeSymbol? candidateBinderType = operation.TargetMethod.ContainingType;
IMethodSymbol targetMethod = invocation.Operation.TargetMethod;
INamedTypeSymbol? candidateBinderType = targetMethod.ContainingType;
Debug.Assert(targetMethod.IsExtensionMethod);

if (SymbolEqualityComparer.Default.Equals(candidateBinderType, _typeSymbols.ConfigurationBinder))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
? new CompilationData((CSharpCompilation)compilation)
: null);

IncrementalValuesProvider<BinderInvocation> inputCalls = context.SyntaxProvider
IncrementalValuesProvider<BinderInvocation?> inputCalls = context.SyntaxProvider
.CreateSyntaxProvider(
(node, _) => BinderInvocation.IsCandidateSyntaxNode(node),
BinderInvocation.Create);
BinderInvocation.Create)
.Where(invocation => invocation is not null);

IncrementalValueProvider<(CompilationData?, ImmutableArray<BinderInvocation>)> inputData = compilationData.Combine(inputCalls.Collect());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,17 @@

namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
{
internal readonly record struct BinderInvocation
internal sealed record BinderInvocation(IInvocationOperation Operation, Location Location)
{
public IInvocationOperation? CandidateOperation { get; private init; }
public Location? Location { get; private init; }

public static BinderInvocation Create(GeneratorSyntaxContext context, CancellationToken cancellationToken)
public static BinderInvocation? Create(GeneratorSyntaxContext context, CancellationToken cancellationToken)
{
Debug.Assert(IsCandidateSyntaxNode(context.Node));
InvocationExpressionSyntax? invocationSyntax = (InvocationExpressionSyntax)context.Node;

if (context.SemanticModel.GetOperation(invocationSyntax, cancellationToken) is IInvocationOperation operation &&
IsCandidateInvocationOperation(operation))
{
return new BinderInvocation()
{
CandidateOperation = operation,
Location = invocationSyntax.GetLocation()
};
}
InvocationExpressionSyntax invocationSyntax = (InvocationExpressionSyntax)context.Node;

return default;
return context.SemanticModel.GetOperation(invocationSyntax, cancellationToken) is IInvocationOperation operation &&
IsCandidateInvocationOperation(operation)
? new BinderInvocation(operation, invocationSyntax.GetLocation())
: null;
}

public static bool IsCandidateSyntaxNode(SyntaxNode node)
Expand All @@ -54,19 +44,28 @@ private static bool IsCandidateInvocationOperation(IInvocationOperation operatio
{
IsExtensionMethod: true,
Name: string methodName,
ContainingType.Name: string containingTypeName,
ContainingType: INamedTypeSymbol
{
Name: string containingTypeName,
ContainingNamespace: INamespaceSymbol containingNamespace,
}
})
{
return false;
}

string containingNamespaceName = containingNamespace.ToDisplayString();

return (containingTypeName) switch
{
"ConfigurationBinder" =>
containingNamespaceName is "Microsoft.Extensions.Configuration" &&
IsCandidateMethodName_ConfigurationBinder(methodName),
"OptionsBuilderConfigurationExtensions" =>
containingNamespaceName is "Microsoft.Extensions.DependencyInjection" &&
IsCandidateMethodName_OptionsBuilderConfigurationExtensions(methodName),
"OptionsConfigurationServiceCollectionExtensions" =>
containingNamespaceName is "Microsoft.Extensions.DependencyInjection" &&
IsValidMethodName_OptionsConfigurationServiceCollectionExtensions(methodName),
_ => false,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ private sealed partial class Parser
{
private void RegisterMethodInvocation_ConfigurationBinder(BinderInvocation invocation)
{
switch (invocation.CandidateOperation.TargetMethod.Name)
switch (invocation.Operation.TargetMethod.Name)
{
case nameof(MethodsToGen_ConfigurationBinder.Bind):
{
Expand All @@ -40,7 +40,7 @@ private void RegisterMethodInvocation_ConfigurationBinder(BinderInvocation invoc

private void RegisterBindInvocation(BinderInvocation invocation)
{
IInvocationOperation operation = invocation.CandidateOperation!;
IInvocationOperation operation = invocation.Operation!;
ImmutableArray<IParameterSymbol> @params = operation.TargetMethod.Parameters;
int paramCount = @params.Length;

Expand Down Expand Up @@ -132,7 +132,7 @@ private void RegisterBindInvocation(BinderInvocation invocation)

private void RegisterGetInvocation(BinderInvocation invocation)
{
IInvocationOperation operation = invocation.CandidateOperation!;
IInvocationOperation operation = invocation.Operation!;
IMethodSymbol targetMethod = operation.TargetMethod;
ImmutableArray<IParameterSymbol> @params = targetMethod.Parameters;
int paramCount = @params.Length;
Expand Down Expand Up @@ -192,7 +192,7 @@ private void RegisterGetInvocation(BinderInvocation invocation)

private void RegisterGetValueInvocation(BinderInvocation invocation)
{
IInvocationOperation operation = invocation.CandidateOperation!;
IInvocationOperation operation = invocation.Operation!;
IMethodSymbol targetMethod = operation.TargetMethod;
ImmutableArray<IParameterSymbol> @params = targetMethod.Parameters;
int paramCount = @params.Length;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ private sealed partial class Parser
{
private void RegisterMethodInvocation_OptionsBuilderExt(BinderInvocation invocation)
{
IMethodSymbol targetMethod = invocation.CandidateOperation.TargetMethod;
IMethodSymbol targetMethod = invocation.Operation.TargetMethod;
ImmutableArray<IParameterSymbol> @params = targetMethod.Parameters;

if (!targetMethod.IsGenericMethod ||
Expand Down Expand Up @@ -49,7 +49,7 @@ private void RegisterMethodInvocation_OptionsBuilderExt(BinderInvocation invocat

private void RegisterBindInvocation(BinderInvocation invocation, TypeSpec typeSpec)
{
IInvocationOperation operation = invocation.CandidateOperation!;
IInvocationOperation operation = invocation.Operation!;
IMethodSymbol targetMethod = operation.TargetMethod;
ImmutableArray<IParameterSymbol> @params = targetMethod.Parameters;
int paramCount = @params.Length;
Expand Down Expand Up @@ -79,7 +79,7 @@ private void RegisterBindInvocation(BinderInvocation invocation, TypeSpec typeSp

private void ParseBindConfigurationInvocation(BinderInvocation invocation, TypeSpec typeSpec)
{
IMethodSymbol targetMethod = invocation.CandidateOperation.TargetMethod;
IMethodSymbol targetMethod = invocation.Operation.TargetMethod;
ImmutableArray<IParameterSymbol> @params = targetMethod.Parameters;

int paramCount = @params.Length;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ private sealed partial class Parser
{
private void RegisterMethodInvocation_ServiceCollectionExt(BinderInvocation invocation)
{
IInvocationOperation operation = invocation.CandidateOperation!;
IInvocationOperation operation = invocation.Operation!;
IMethodSymbol targetMethod = operation.TargetMethod;
ImmutableArray<IParameterSymbol> @params = targetMethod.Parameters;
int paramCount = @params.Length;
Expand Down

0 comments on commit 81bf579

Please sign in to comment.