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);