From 5be719e4f114f3a863be5b6cdf23b53f548cc6ae Mon Sep 17 00:00:00 2001 From: Koen Bekkenutte <2912652+kbekkenutte@users.noreply.github.com> Date: Tue, 9 Nov 2021 20:37:20 +0800 Subject: [PATCH] Fixed nullability issues --- ...rameworkCore.Projectables.Generator.csproj | 6 ++++- .../ExpressionSyntaxRewriter.cs | 2 +- .../ProjectableDescriptor.cs | 24 +++++++++---------- .../ProjectableInterpreter.cs | 2 +- .../ProjectionExpressionGenerator.cs | 20 ++++++++++++---- .../ProjectionExpressionClassNameGenerator.cs | 15 +++++++----- 6 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/EntityFrameworkCore.Projectables.Generator/EntityFrameworkCore.Projectables.Generator.csproj b/src/EntityFrameworkCore.Projectables.Generator/EntityFrameworkCore.Projectables.Generator.csproj index 5f68ad4..3349b07 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/EntityFrameworkCore.Projectables.Generator.csproj +++ b/src/EntityFrameworkCore.Projectables.Generator/EntityFrameworkCore.Projectables.Generator.csproj @@ -2,7 +2,7 @@ netstandard2.0 - $(NoWarn);nullable;NU5128 + $(NoWarn);NU5128 false @@ -15,4 +15,8 @@ + + + + diff --git a/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs b/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs index 23da059..74b0660 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs +++ b/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs @@ -135,7 +135,7 @@ namespace EntityFrameworkCore.Projectables.Generator node ); } - else if (symbolInfo.Symbol.Kind is SymbolKind.NamedType && node.Parent.Kind() is not SyntaxKind.QualifiedName) + else if (symbolInfo.Symbol.Kind is SymbolKind.NamedType && node.Parent?.Kind() is not SyntaxKind.QualifiedName) { var typeInfo = _semanticModel.GetTypeInfo(node); diff --git a/src/EntityFrameworkCore.Projectables.Generator/ProjectableDescriptor.cs b/src/EntityFrameworkCore.Projectables.Generator/ProjectableDescriptor.cs index b4805bb..4142a2f 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/ProjectableDescriptor.cs +++ b/src/EntityFrameworkCore.Projectables.Generator/ProjectableDescriptor.cs @@ -11,28 +11,28 @@ namespace EntityFrameworkCore.Projectables.Generator { public class ProjectableDescriptor { - public IEnumerable UsingDirectives { get; set; } + public IEnumerable? UsingDirectives { get; set; } - public string ClassNamespace { get; set; } + public string? ClassNamespace { get; set; } - public IEnumerable NestedInClassNames { get; set; } + public IEnumerable? NestedInClassNames { get; set; } - public string TargetClassNamespace { get; set; } + public string? TargetClassNamespace { get; set; } - public IEnumerable TargetNestedInClassNames { get; set; } + public IEnumerable? TargetNestedInClassNames { get; set; } - public string ClassName { get; set; } + public string? ClassName { get; set; } - public string MemberName { get; set; } + public string? MemberName { get; set; } - public string ReturnTypeName { get; set; } + public string? ReturnTypeName { get; set; } - public ParameterListSyntax ParametersList { get; set; } + public ParameterListSyntax? ParametersList { get; set; } - public TypeParameterListSyntax TypeParameterList { get; set; } + public TypeParameterListSyntax? TypeParameterList { get; set; } - public IEnumerable ConstraintClauses { get; set; } + public IEnumerable? ConstraintClauses { get; set; } - public SyntaxNode Body { get; set; } + public SyntaxNode? Body { get; set; } } } diff --git a/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs b/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs index 29d65a2..919c8d3 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs +++ b/src/EntityFrameworkCore.Projectables.Generator/ProjectableInterpreter.cs @@ -35,7 +35,7 @@ namespace EntityFrameworkCore.Projectables.Generator var projectableAttributeTypeSymbol = context.Compilation.GetTypeByMetadataName("EntityFrameworkCore.Projectables.ProjectableAttribute"); var projectableAttributeClass = memberSymbol.GetAttributes() - .Where(x => x.AttributeClass.Name == "ProjectableAttribute") + .Where(x => x.AttributeClass?.Name == "ProjectableAttribute") .FirstOrDefault(); if (projectableAttributeClass is null || !SymbolEqualityComparer.Default.Equals(projectableAttributeClass.AttributeClass, projectableAttributeTypeSymbol)) diff --git a/src/EntityFrameworkCore.Projectables.Generator/ProjectionExpressionGenerator.cs b/src/EntityFrameworkCore.Projectables.Generator/ProjectionExpressionGenerator.cs index b70fe11..5986343 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/ProjectionExpressionGenerator.cs +++ b/src/EntityFrameworkCore.Projectables.Generator/ProjectionExpressionGenerator.cs @@ -26,17 +26,26 @@ namespace EntityFrameworkCore.Projectables.Generator { var projectables = receiver.Candidates .Select(x => ProjectableInterpreter.GetDescriptor(x, context)) - .Where(x => x is not null); + .Where(x => x is not null) + .Select(x => x!); var resultBuilder = new StringBuilder(); foreach (var projectable in projectables) { + if (projectable.MemberName is null) + { + throw new InvalidOperationException("Expected a memberName here"); + } + resultBuilder.Clear(); - foreach (var usingDirective in projectable.UsingDirectives.Distinct()) + if (projectable.UsingDirectives is not null) { - resultBuilder.AppendLine(usingDirective); + foreach (var usingDirective in projectable.UsingDirectives.Distinct()) + { + resultBuilder.AppendLine(usingDirective); + } } if (projectable.TargetClassNamespace is not null) @@ -60,9 +69,10 @@ namespace EntityFrameworkCore.Projectables.Generator } var generatedClassName = ProjectionExpressionClassNameGenerator.GenerateName(projectable.ClassNamespace, projectable.NestedInClassNames, projectable.MemberName); + var lambdaTypeArguments = SyntaxFactory.TypeArgumentList( SyntaxFactory.SeparatedList( - projectable.ParametersList.Parameters.Select(p => p.Type) + projectable.ParametersList?.Parameters.Where(p => p.Type is not null).Select(p => p.Type!) ) ); @@ -72,7 +82,7 @@ namespace EntityFrameworkCore.Projectables.Generated {{ public static class {generatedClassName} {{ - public static System.Linq.Expressions.Expression> Expression{(projectable.TypeParameterList.Parameters.Any() ? projectable.TypeParameterList.ToString() : string.Empty)}()"); + public static System.Linq.Expressions.Expression> Expression{(projectable.TypeParameterList?.Parameters.Any() == true ? projectable.TypeParameterList.ToString() : string.Empty)}()"); if (projectable.ConstraintClauses is not null) { diff --git a/src/EntityFrameworkCore.Projectables/Services/ProjectionExpressionClassNameGenerator.cs b/src/EntityFrameworkCore.Projectables/Services/ProjectionExpressionClassNameGenerator.cs index 18adea2..b09d091 100644 --- a/src/EntityFrameworkCore.Projectables/Services/ProjectionExpressionClassNameGenerator.cs +++ b/src/EntityFrameworkCore.Projectables/Services/ProjectionExpressionClassNameGenerator.cs @@ -10,14 +10,14 @@ namespace EntityFrameworkCore.Projectables.Services { public const string Namespace = "EntityFrameworkCore.Projectables.Generated"; - public static string GenerateName(string? namespaceName, IEnumerable nestedInClassNames, string memberName) + public static string GenerateName(string? namespaceName, IEnumerable? nestedInClassNames, string memberName) { var stringBuilder = new StringBuilder(); return GenerateNameImpl(stringBuilder, namespaceName, nestedInClassNames, memberName); } - public static string GenerateFullName(string? namespaceName, IEnumerable nestedInClassNames, string memberName) + public static string GenerateFullName(string? namespaceName, IEnumerable? nestedInClassNames, string memberName) { var stringBuilder = new StringBuilder(Namespace); stringBuilder.Append('.'); @@ -25,14 +25,17 @@ namespace EntityFrameworkCore.Projectables.Services return GenerateNameImpl(stringBuilder, namespaceName, nestedInClassNames, memberName); } - static string GenerateNameImpl(StringBuilder stringBuilder, string? namespaceName, IEnumerable nestedInClassNames, string memberName) + static string GenerateNameImpl(StringBuilder stringBuilder, string? namespaceName, IEnumerable? nestedInClassNames, string memberName) { stringBuilder.Append(namespaceName?.Replace('.', '_')); stringBuilder.Append('_'); - foreach (var className in nestedInClassNames) + if (nestedInClassNames is not null) { - stringBuilder.Append(className); - stringBuilder.Append('_'); + foreach (var className in nestedInClassNames) + { + stringBuilder.Append(className); + stringBuilder.Append('_'); + } } stringBuilder.Append(memberName);