Fully qualify extension method calls

This commit is contained in:
Koen
2022-11-05 18:11:28 +00:00
parent 0272bb2f8f
commit 636d0e5c6c
7 changed files with 78 additions and 8 deletions
@@ -16,16 +16,14 @@ namespace EntityFrameworkCore.Projectables.Generator
readonly INamedTypeSymbol _targetTypeSymbol;
readonly SemanticModel _semanticModel;
readonly NullConditionalRewriteSupport _nullConditionalRewriteSupport;
readonly Compilation _compilation;
readonly SourceProductionContext _context;
readonly Stack<ExpressionSyntax> _conditionalAccessExpressionsStack = new();
public ExpressionSyntaxRewriter(INamedTypeSymbol targetTypeSymbol, NullConditionalRewriteSupport nullConditionalRewriteSupport, Compilation compilation, SemanticModel semanticModel, SourceProductionContext context)
public ExpressionSyntaxRewriter(INamedTypeSymbol targetTypeSymbol, NullConditionalRewriteSupport nullConditionalRewriteSupport, SemanticModel semanticModel, SourceProductionContext context)
{
_targetTypeSymbol = targetTypeSymbol;
_nullConditionalRewriteSupport = nullConditionalRewriteSupport;
_semanticModel = semanticModel;
_compilation = compilation;
_context = context;
}
@@ -37,6 +35,33 @@ namespace EntityFrameworkCore.Projectables.Generator
.WithTrailingTrivia(node.GetTrailingTrivia());
}
public override SyntaxNode? VisitInvocationExpression(InvocationExpressionSyntax node)
{
// Fully qualify extension method calls
if (node.Expression is MemberAccessExpressionSyntax memberAccessExpressionSyntax)
{
var symbol = _semanticModel.GetSymbolInfo(node).Symbol;
if (symbol is IMethodSymbol { IsExtensionMethod: true } methodSymbol)
{
return SyntaxFactory.InvocationExpression(
SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
SyntaxFactory.ParseName(methodSymbol.ContainingType.ToDisplayString(NullableFlowState.None, SymbolDisplayFormat.FullyQualifiedFormat)),
memberAccessExpressionSyntax.Name
),
node.ArgumentList.WithArguments(
((ArgumentListSyntax)VisitArgumentList(node.ArgumentList)!).Arguments.Insert(0, SyntaxFactory.Argument(
(ExpressionSyntax)Visit(memberAccessExpressionSyntax.Expression)
)
)
)
);
}
}
return base.VisitInvocationExpression(node);
}
public override SyntaxNode? VisitConditionalAccessExpression(ConditionalAccessExpressionSyntax node)
{
var targetExpression = (ExpressionSyntax)Visit(node.Expression);
@@ -115,7 +115,7 @@ namespace EntityFrameworkCore.Projectables.Generator
if (memberBody is null) return null;
}
var expressionSyntaxRewriter = new ExpressionSyntaxRewriter(memberSymbol.ContainingType, nullConditionalRewriteSupport, compilation, semanticModel, context);
var expressionSyntaxRewriter = new ExpressionSyntaxRewriter(memberSymbol.ContainingType, nullConditionalRewriteSupport, semanticModel, context);
var declarationSyntaxRewriter = new DeclarationSyntaxRewriter(semanticModel);
var descriptor = new ProjectableDescriptor {