Skip to content

Commit

Permalink
Remove DiagnosticBag from BoundNode (#109)
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisKXu authored Nov 29, 2024
1 parent feeae4b commit 9831fdb
Show file tree
Hide file tree
Showing 33 changed files with 464 additions and 504 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,11 @@ internal sealed partial class {{BoundNodeFactoryClassName}}
{
[GeneratedCode("{{nameof(BoundNodeFactorySourceGenerator)}}", "1.0.0.0")]
internal static {{className}} Create{{className}}(
SyntaxNode syntaxNode,
{{boundNodeMetadata.WriteParameters()}}
DiagnosticBag.Builder diagnosticBuilder = null)
{{boundNodeMetadata.WriteParameters()}})
{
diagnosticBuilder ??= new();
{{boundNodeMetadata.WriteDiagnostics()}}
return new {{className}}()
{
SyntaxNode = syntaxNode,
{{boundNodeMetadata.WriteInitializers()}}
DiagnosticBuilder = diagnosticBuilder
};
}
}
Expand Down Expand Up @@ -106,29 +98,17 @@ public BoundNodeMetadata(GeneratorAttributeSyntaxContext context)
}

public string WriteParameters()
=> string.Join("\n", Properties.Select(p => $"{p.Name} {p.Property.CamelCasedName()},"));

public string WriteDiagnostics()
{
var statements = new List<string>();
var boundNodeType = context.SemanticModel.Compilation.GetTypeByMetadataName(BoundNodeTypeName);

statements.AddRange(
Properties
.Where(p => p.Property.Type.IsDerivedFrom(boundNodeType))
.Select(p => $"diagnosticBuilder.Add({p.Property.CamelCasedName()});"));

statements.AddRange(
Properties
.Where(p => p.Property.Type is INamedTypeSymbol t
&& t.IsGenericType
&& t.TypeArguments.Any(t => t.IsDerivedFrom(boundNodeType)))
.Select(p => $"diagnosticBuilder.AddRange({p.Property.CamelCasedName()});"));

return string.Join("\n", statements);
var properties = Properties.Select(p => $"{p.Name} {p.Property.CamelCasedName()}").ToList();
properties.Insert(0, "SyntaxNode syntaxNode");
return string.Join(",\n", properties);
}

public string WriteInitializers()
=> string.Join("\n", Properties.Select(p => $"{p.Property.Name} = {p.Property.CamelCasedName()},"));
{
var properties = Properties.Select(p => $"{p.Property.Name} = {p.Property.CamelCasedName()}").ToList();
properties.Insert(0, "SyntaxNode = syntaxNode");
return string.Join(",\n", properties);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ void TestBindAssignmentExpressionBasic(
var block = TestUtils.BindStatement<BoundBlockStatement>(input);
var boundAssignmentExpression = block.Statements[1].As<BoundExpressionStatement>().Expression.As<BoundAssignmentExpression>();
boundAssignmentExpression.Should().NotBeNull();
boundAssignmentExpression.GetDiagnostics().Should().BeEmpty();

boundAssignmentExpression.Operator.BoundAssignmentOperatorKind.Should().Be(expectedBoundAssignmentOperatorKind);
boundAssignmentExpression.ResultType.SpecialType.Should().Be(expectedResultType);
Expand All @@ -47,11 +46,12 @@ void TestBindAssignmentExpressionBasic(
[InlineData("{ const n = 0; n /= 10; }")]
public void TestBindAssignmentExpressionWithReadonlyVariables(string input)
{
var block = TestUtils.BindStatement<BoundBlockStatement>(input);
var diagnosticsBuilder = new DiagnosticBag.Builder();
var block = TestUtils.BindStatement<BoundBlockStatement>(input, diagnosticsBuilder);
var boundAssignmentExpression = block.Statements[1].As<BoundExpressionStatement>().Expression.As<BoundAssignmentExpression>();
boundAssignmentExpression.Should().NotBeNull();

var diagnostics = boundAssignmentExpression.GetDiagnostics();
var diagnostics = diagnosticsBuilder.Build();
diagnostics.Should().HaveCount(1);

var readonlyVariable = diagnostics.First();
Expand All @@ -68,10 +68,11 @@ public void TestBindAssignmentExpressionWithReadonlyVariables(string input)
[InlineData("n /= 10;")]
public void TestBindAssignmentExpressionWithUndeclaredVariables(string input)
{
var boundAssignmentExpression = TestUtils.BindExpression<BoundAssignmentExpression>(input);
var diagnosticsBuilder = new DiagnosticBag.Builder();
var boundAssignmentExpression = TestUtils.BindExpression<BoundAssignmentExpression>(input, diagnosticsBuilder);
boundAssignmentExpression.Should().NotBeNull();

var diagnostics = boundAssignmentExpression.GetDiagnostics();
var diagnostics = diagnosticsBuilder.Build();
diagnostics.Should().HaveCount(1);

var undeclaredVariable = diagnostics.First();
Expand All @@ -88,11 +89,12 @@ public void TestBindAssignmentExpressionWithUndeclaredVariables(string input)
[InlineData("{ let n = 0; n /= \"abc\"; }")]
public void TestBindAssignmentExpressionWithMismatchedTypes(string input)
{
var block = TestUtils.BindStatement<BoundBlockStatement>(input);
var diagnosticsBuilder = new DiagnosticBag.Builder();
var block = TestUtils.BindStatement<BoundBlockStatement>(input, diagnosticsBuilder);
var boundAssignmentExpression = block.Statements[1].As<BoundExpressionStatement>().Expression.As<BoundAssignmentExpression>();
boundAssignmentExpression.Should().NotBeNull();

var diagnostics = boundAssignmentExpression.GetDiagnostics();
var diagnostics = diagnosticsBuilder.Build();
diagnostics.Should().HaveCount(1);

var typeMismatch = diagnostics.First();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ public void TestBindIfUnlessStatementWithoutElseClauses(string inputText, bool i
{
var boundConditionalStatement = TestUtils.BindStatement<BoundConditionalStatement>(inputText);
boundConditionalStatement.Should().NotBeNull();
boundConditionalStatement.GetDiagnostics().Should().BeEmpty();

boundConditionalStatement.Condition.As<BoundConstant>().Value.Should().Be(true);

Expand All @@ -30,7 +29,6 @@ public void TestBindIfUnlessStatementWithSimpleElseClause()
var inputText = "if true { 0.ToString(); } else { 1.ToString(); }";
var boundConditionalStatement = TestUtils.BindStatement<BoundConditionalStatement>(inputText);
boundConditionalStatement.Should().NotBeNull();
boundConditionalStatement.GetDiagnostics().Should().BeEmpty();

boundConditionalStatement.Condition.As<BoundConstant>().Value.Should().Be(true);

Expand All @@ -47,7 +45,6 @@ public void TestBindIfUnlessStatementWithMultipleElseClauses()
var inputText = "unless 0 == 1 { 0.ToString(); } else unless 1 == 2 { 1.ToString(); } else { 2.ToString(); }";
var boundConditionalStatement = TestUtils.BindStatement<BoundConditionalStatement>(inputText);
boundConditionalStatement.Should().NotBeNull();
boundConditionalStatement.GetDiagnostics().Should().BeEmpty();

void ValidateCondition(BoundConditionalStatement boundConditionalStatement, int expectedLeft, int expectedRight)
{
Expand Down Expand Up @@ -96,11 +93,11 @@ void ValidateBlockStatements(BoundBlockStatement boundBlockStatement, int expect
[InlineData("if 0 { 0.ToString(); }")]
public void BoundConditionalStatementShouldHaveBooleanConditions(string inputText)
{
var boundConditionalStatement = TestUtils.BindStatement<BoundConditionalStatement>(inputText);
var diagnosticBuilder = new DiagnosticBag.Builder();
var boundConditionalStatement = TestUtils.BindStatement<BoundConditionalStatement>(inputText, diagnosticBuilder);
boundConditionalStatement.Should().NotBeNull();

var diagnostics = boundConditionalStatement.GetDiagnostics().ToList();
diagnostics[0].ErrorCode.Should().Be(ErrorCode.TypeMismatch);
diagnosticBuilder.Build().First().ErrorCode.Should().Be(ErrorCode.TypeMismatch);
}

[Fact]
Expand Down
Loading

0 comments on commit 9831fdb

Please sign in to comment.