diff --git a/src/EntityFrameworkCore.Projectables.Generator/ParameterSyntaxRewriter.cs b/src/EntityFrameworkCore.Projectables.Generator/DeclarationSyntaxRewriter.cs similarity index 76% rename from src/EntityFrameworkCore.Projectables.Generator/ParameterSyntaxRewriter.cs rename to src/EntityFrameworkCore.Projectables.Generator/DeclarationSyntaxRewriter.cs index 6bc2018..d897599 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/ParameterSyntaxRewriter.cs +++ b/src/EntityFrameworkCore.Projectables.Generator/DeclarationSyntaxRewriter.cs @@ -6,11 +6,11 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; namespace EntityFrameworkCore.Projectables.Generator { - public class ParameterSyntaxRewriter : CSharpSyntaxRewriter + public class DeclarationSyntaxRewriter : CSharpSyntaxRewriter { readonly SemanticModel _semanticModel; - public ParameterSyntaxRewriter(SemanticModel semanticModel) + public DeclarationSyntaxRewriter(SemanticModel semanticModel) { _semanticModel = semanticModel; } @@ -19,11 +19,12 @@ namespace EntityFrameworkCore.Projectables.Generator { var visitedNode = base.VisitIdentifierName(node); - var symbol = _semanticModel.GetDeclaredSymbol(visitedNode); + var symbolInfo = _semanticModel.GetSymbolInfo(visitedNode); - if (symbol is not null) + if (symbolInfo.Symbol is not null) { - return SyntaxFactory.IdentifierName(symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); + return SyntaxFactory.IdentifierName(symbolInfo.Symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)) + .WithTriviaFrom(node); } return visitedNode; @@ -53,8 +54,7 @@ namespace EntityFrameworkCore.Projectables.Generator if (typeInfo.Type.TypeKind is not TypeKind.Struct) { return Visit(node.ElementType) - .WithLeadingTrivia(node.GetLeadingTrivia()) - .WithTrailingTrivia(node.GetTrailingTrivia()); + .WithTriviaFrom(node); } } diff --git a/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs b/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs index d2241fc..3d3c911 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs +++ b/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs @@ -52,8 +52,7 @@ namespace EntityFrameworkCore.Projectables.Generator .FirstOrDefault(); var expressionSyntaxRewriter = new ExpressionSyntaxRewriter(memberSymbol.ContainingType, semanticModel, nullConditionalRewriteSupport, context); - var parameterSyntaxRewriter = new ParameterSyntaxRewriter(semanticModel); - var returnTypeSyntaxRewriter = new ReturnTypeSyntaxRewriter(semanticModel); + var declarationSyntaxRewriter = new DeclarationSyntaxRewriter(semanticModel); var descriptor = new ProjectableDescriptor { ClassName = memberSymbol.ContainingType.Name, @@ -100,11 +99,11 @@ namespace EntityFrameworkCore.Projectables.Generator return null; } - var returnType = returnTypeSyntaxRewriter.Visit(methodDeclarationSyntax.ReturnType); + var returnType = declarationSyntaxRewriter.Visit(methodDeclarationSyntax.ReturnType); descriptor.ReturnTypeName = returnType.ToString(); descriptor.Body = expressionSyntaxRewriter.Visit(methodDeclarationSyntax.ExpressionBody.Expression); - foreach (var additionalParameter in ((ParameterListSyntax)parameterSyntaxRewriter.Visit(methodDeclarationSyntax.ParameterList)).Parameters) + foreach (var additionalParameter in ((ParameterListSyntax)declarationSyntaxRewriter.Visit(methodDeclarationSyntax.ParameterList)).Parameters) { descriptor.ParametersList = descriptor.ParametersList.AddParameters(additionalParameter); } @@ -118,7 +117,7 @@ namespace EntityFrameworkCore.Projectables.Generator return null; } - var returnType = returnTypeSyntaxRewriter.Visit(propertyDeclarationSyntax.Type); + var returnType = declarationSyntaxRewriter.Visit(propertyDeclarationSyntax.Type); descriptor.ReturnTypeName = returnType.ToString(); descriptor.Body = expressionSyntaxRewriter.Visit(propertyDeclarationSyntax.ExpressionBody.Expression); diff --git a/src/EntityFrameworkCore.Projectables.Generator/ReturnTypeSyntaxRewriter.cs b/src/EntityFrameworkCore.Projectables.Generator/ReturnTypeSyntaxRewriter.cs deleted file mode 100644 index a36cceb..0000000 --- a/src/EntityFrameworkCore.Projectables.Generator/ReturnTypeSyntaxRewriter.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; - -namespace EntityFrameworkCore.Projectables.Generator -{ - public class ReturnTypeSyntaxRewriter : CSharpSyntaxRewriter - { - readonly SemanticModel _semanticModel; - - public ReturnTypeSyntaxRewriter(SemanticModel semanticModel) - { - _semanticModel = semanticModel; - } - - public override SyntaxNode? VisitIdentifierName(IdentifierNameSyntax node) - { - var visitedNode = base.VisitIdentifierName(node); - - var symbolInfo = _semanticModel.GetSymbolInfo(visitedNode); - - if (symbolInfo.Symbol is not null) - { - return SyntaxFactory.IdentifierName(symbolInfo.Symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)); - } - - return visitedNode; - } - - public override SyntaxNode? VisitNullableType(NullableTypeSyntax node) - { - var typeInfo = _semanticModel.GetTypeInfo(node); - if (typeInfo.Type is not null) - { - if (typeInfo.Type.TypeKind is not TypeKind.Struct) - { - return Visit(node.ElementType) - .WithLeadingTrivia(node.GetLeadingTrivia()) - .WithTrailingTrivia(node.GetTrailingTrivia()); - } - } - - return base.VisitNullableType(node); - } - } -} diff --git a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithIgnoreSupport_IsBeingRewritten.verified.txt b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithIgnoreSupport_IsBeingRewritten.verified.txt index 614f02b..0d229f9 100644 --- a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithIgnoreSupport_IsBeingRewritten.verified.txt +++ b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithIgnoreSupport_IsBeingRewritten.verified.txt @@ -9,7 +9,7 @@ namespace EntityFrameworkCore.Projectables.Generated { public static class Foo_EntityExtensions_GetFirstRelatedIgnoreNulls { - public static System.Linq.Expressions.Expression> Expression => - (Entity entity) => entity.RelatedEntities[0]; + public static System.Linq.Expressions.Expression> Expression => + (global::Foo.EntityExtensions.Entity entity) => entity.RelatedEntities[0]; } } \ No newline at end of file diff --git a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithRewriteSupport_IsBeingRewritten.verified.txt b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithRewriteSupport_IsBeingRewritten.verified.txt index 1d1c6d0..c62b9bc 100644 --- a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithRewriteSupport_IsBeingRewritten.verified.txt +++ b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableElementAndMemberBinding_WithRewriteSupport_IsBeingRewritten.verified.txt @@ -9,7 +9,7 @@ namespace EntityFrameworkCore.Projectables.Generated { public static class Foo_EntityExtensions_GetFirstRelatedIgnoreNulls { - public static System.Linq.Expressions.Expression> Expression => - (Entity entity) => entity != null ? (entity.RelatedEntities != null ? (entity.RelatedEntities[0]) : null) : null; + public static System.Linq.Expressions.Expression> Expression => + (global::Foo.EntityExtensions.Entity entity) => entity != null ? (entity.RelatedEntities != null ? (entity.RelatedEntities[0]) : null) : null; } } \ No newline at end of file diff --git a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableParameters_WithRewriteSupport_IsBeingRewritten.verified.txt b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableParameters_WithRewriteSupport_IsBeingRewritten.verified.txt index 5ee3ea1..0f4fbf8 100644 --- a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableParameters_WithRewriteSupport_IsBeingRewritten.verified.txt +++ b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.NullableParameters_WithRewriteSupport_IsBeingRewritten.verified.txt @@ -9,7 +9,7 @@ namespace EntityFrameworkCore.Projectables.Generated { public static class Foo_EntityExtensions_GetFirstName { - public static System.Linq.Expressions.Expression> Expression => - (Entity entity) => entity.FullName != null ? (entity.FullName.Substring(entity.FullName != null ? (entity.FullName.IndexOf(' ') ) : null?? 0)) : null; + public static System.Linq.Expressions.Expression> Expression => + (global::Foo.EntityExtensions.Entity entity) => entity.FullName != null ? (entity.FullName.Substring(entity.FullName != null ? (entity.FullName.IndexOf(' ') ) : null?? 0)) : null; } } \ No newline at end of file diff --git a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.ProjectableExtensionMethod.verified.txt b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.ProjectableExtensionMethod.verified.txt index 3db1fb5..1ab7a6e 100644 --- a/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.ProjectableExtensionMethod.verified.txt +++ b/tests/EntityFrameworkCore.Projectables.Generator.Tests/ProjectionExpressionGeneratorTests.ProjectableExtensionMethod.verified.txt @@ -8,7 +8,7 @@ namespace EntityFrameworkCore.Projectables.Generated { public static class Foo_C_Foo { - public static System.Linq.Expressions.Expression> Expression => - (D d) => 1; + public static System.Linq.Expressions.Expression> Expression => + (global::Foo.D d) => 1; } } \ No newline at end of file