Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ public ExpressionSyntaxRewriter(INamedTypeSymbol targetTypeSymbol, NullCondition
{
var diagnostic = Diagnostic.Create(Diagnostics.NullConditionalRewriteUnsupported, node.GetLocation(), node);
_context.ReportDiagnostic(diagnostic);

// Return the original node, do not attempt further rewrites
return node;
}

else if (_nullConditionalRewriteSupport is NullConditionalRewriteSupport.Ignore)
Expand Down Expand Up @@ -112,34 +115,34 @@ public ExpressionSyntaxRewriter(INamedTypeSymbol targetTypeSymbol, NullCondition

public override SyntaxNode? VisitMemberBindingExpression(MemberBindingExpressionSyntax node)
{
if (_conditionalAccessExpressionsStack.Count == 0)
if (_conditionalAccessExpressionsStack.Count > 0)
{
throw new InvalidOperationException("Expected at least one conditional expression on the stack");
}
var targetExpression = _conditionalAccessExpressionsStack.Pop();

var targetExpression = _conditionalAccessExpressionsStack.Pop();
return _nullConditionalRewriteSupport switch {
NullConditionalRewriteSupport.Ignore => SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, targetExpression, node.Name),
NullConditionalRewriteSupport.Rewrite => SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, targetExpression, node.Name),
_ => node
};
}

return _nullConditionalRewriteSupport switch {
NullConditionalRewriteSupport.Ignore => SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, targetExpression, node.Name),
NullConditionalRewriteSupport.Rewrite => SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, targetExpression, node.Name),
_ => node
};
return base.VisitMemberBindingExpression(node);
}

public override SyntaxNode? VisitElementBindingExpression(ElementBindingExpressionSyntax node)
{
if (_conditionalAccessExpressionsStack.Count == 0)
if (_conditionalAccessExpressionsStack.Count > 0)
{
throw new InvalidOperationException("Expected at least one conditional expression on the stack");
}
var targetExpression = _conditionalAccessExpressionsStack.Pop();

var targetExpression = _conditionalAccessExpressionsStack.Pop();
return _nullConditionalRewriteSupport switch {
NullConditionalRewriteSupport.Ignore => SyntaxFactory.ElementAccessExpression(targetExpression, node.ArgumentList),
NullConditionalRewriteSupport.Rewrite => SyntaxFactory.ElementAccessExpression(targetExpression, node.ArgumentList),
_ => Visit(node)
};
}

return _nullConditionalRewriteSupport switch {
NullConditionalRewriteSupport.Ignore => SyntaxFactory.ElementAccessExpression(targetExpression, node.ArgumentList),
NullConditionalRewriteSupport.Rewrite => SyntaxFactory.ElementAccessExpression(targetExpression, node.ArgumentList),
_ => Visit(node)
};
return base.VisitElementBindingExpression(node);
}

public override SyntaxNode? VisitThisExpression(ThisExpressionSyntax node)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,69 @@ static class C {
Assert.Equal("EFP0002", diagnostic.Id);
}

[Fact]
public void NullableMemberBinding_UndefinedSupport_IsBeingReported()
{
var compilation = CreateCompilation(@"
using System;
using System.Linq;
using EntityFrameworkCore.Projectables;

namespace Foo {
static class C {
[Projectable]
public static int? GetLength(this string input) => input?.Length;
}
}
");
var result = RunGenerator(compilation);

var diagnostic = Assert.Single(result.Diagnostics);
Assert.Equal("EFP0002", diagnostic.Id);
}


[Fact]
public void MultiLevelNullableMemberBinding_UndefinedSupport_IsBeingReported()
{
var compilation = CreateCompilation(@"
using System;
using System.Linq;
using EntityFrameworkCore.Projectables;

namespace Foo {
public record Address
{
public int Id { get; set; }
public string? Country { get; set; }
}

public record Party
{
public int Id { get; set; }

public Address? Address { get; set; }
}

public record Entity
{
public int Id { get; set; }

public Party? Left { get; set; }
public Party? Right { get; set; }

[Projectable]
public bool IsSameCountry => Left?.Address?.Country == Right?.Address?.Country;
}
}
");
var result = RunGenerator(compilation);

Assert.All(result.Diagnostics, diagnostic => {
Assert.Equal("EFP0002", diagnostic.Id);
});
}

[Fact]
public Task NullableMemberBinding_WithIgnoreSupport_IsBeingRewritten()
{
Expand Down