mirror of
https://github.com/zoriya/EntityFrameworkCore.Projectables.git
synced 2026-08-15 18:44:57 +00:00
Fully qualify extension method calls
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user