Skip to content
This repository has been archived by the owner on Dec 19, 2018. It is now read-only.

Commit

Permalink
Moved from Renderer to Writer
Browse files Browse the repository at this point in the history
  • Loading branch information
ajaybhargavb committed Mar 31, 2017
1 parent bc347d7 commit da1e413
Show file tree
Hide file tree
Showing 7 changed files with 431 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,11 @@ public override void VisitCSharpExpression(CSharpExpressionIRNode node)
Context.BasicWriter.WriteCSharpExpression(Context, node);
}

public override void VisitCSharpStatement(CSharpStatementIRNode node)
{
Context.BasicWriter.WriteCSharpStatement(Context, node);
}

public override void VisitDefault(RazorIRNode node)
{
// This is a temporary bridge to the renderer, which allows us to move functionality piecemeal
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Linq;
using Microsoft.AspNetCore.Razor.Evolution.Intermediate;

namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration
Expand Down Expand Up @@ -71,7 +72,55 @@ public override void WriteCSharpExpression(CSharpRenderingContext context, CShar

public override void WriteCSharpStatement(CSharpRenderingContext context, CSharpStatementIRNode node)
{
throw new NotImplementedException();
var isWhitespaceStatement = true;
for (var i = 0; i < node.Children.Count; i++)
{
var token = node.Children[i] as RazorIRToken;
if (token == null || !string.IsNullOrWhiteSpace(token.Content))
{
isWhitespaceStatement = false;
break;
}
}

IDisposable linePragmaScope = null;
if (node.Source != null)
{
if (!isWhitespaceStatement)
{
linePragmaScope = context.Writer.BuildLinePragma(node.Source.Value);
}

context.Writer.WritePadding(0, node.Source.Value, context);
}
else if (isWhitespaceStatement)
{
// Don't write whitespace if there is no line mapping for it.
return;
}

for (var i = 0; i < node.Children.Count; i++)
{
if (node.Children[i] is RazorIRToken token && token.IsCSharp)
{
context.AddLineMappingFor(token);
context.Writer.Write(token.Content);
}
else
{
// There may be something else inside the statement like an extension node.
context.RenderNode(node.Children[i]);
}
}

if (linePragmaScope != null)
{
linePragmaScope.Dispose();
}
else
{
context.Writer.WriteLine();
}
}

public override void WriteHtmlAttribute(CSharpRenderingContext context, HtmlAttributeIRNode node)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,21 +78,30 @@ public override void VisitUsingStatement(UsingStatementIRNode node)

public override void VisitCSharpStatement(CSharpStatementIRNode node)
{
var isWhitespaceToken = node.Children.All(child =>
child is RazorIRToken token && string.IsNullOrWhiteSpace(token.Content));
// We can't remove this yet, because it's still used recursively in a few places.
var isWhitespaceStatement = true;
for (var i = 0; i < node.Children.Count; i++)
{
var token = node.Children[i] as RazorIRToken;
if (token == null || !string.IsNullOrWhiteSpace(token.Content))
{
isWhitespaceStatement = false;
break;
}
}

IDisposable linePragmaScope = null;
if (node.Source != null)
{
if (!isWhitespaceToken)
if (!isWhitespaceStatement)
{
linePragmaScope = Context.Writer.BuildLinePragma(node.Source.Value);
}

var padding = BuildOffsetPadding(0, node.Source.Value, Context);
Context.Writer.Write(padding);
}
else if (isWhitespaceToken)
else if (isWhitespaceStatement)
{
// Don't write whitespace if there is no line mapping for it.
return;
Expand All @@ -102,7 +111,7 @@ public override void VisitCSharpStatement(CSharpStatementIRNode node)
{
if (node.Children[i] is RazorIRToken token && token.IsCSharp)
{
Context.AddLineMappingFor(node);
Context.AddLineMappingFor(token);
Context.Writer.Write(token.Content);
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Linq;
using Microsoft.AspNetCore.Razor.Evolution.Intermediate;

namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration
Expand Down Expand Up @@ -51,7 +52,48 @@ public override void WriteCSharpExpression(CSharpRenderingContext context, CShar

public override void WriteCSharpStatement(CSharpRenderingContext context, CSharpStatementIRNode node)
{
throw new NotImplementedException();
var isWhitespaceStatement = true;
for (var i = 0; i < node.Children.Count; i++)
{
var token = node.Children[i] as RazorIRToken;
if (token == null || !string.IsNullOrWhiteSpace(token.Content))
{
isWhitespaceStatement = false;
break;
}
}

if (isWhitespaceStatement)
{
return;
}

IDisposable linePragmaScope = null;
if (node.Source != null)
{
linePragmaScope = context.Writer.BuildLinePragma(node.Source.Value);
context.Writer.WritePadding(0, node.Source.Value, context);
}

for (var i = 0; i < node.Children.Count; i++)
{
if (node.Children[i] is RazorIRToken token && token.IsCSharp)
{
context.Writer.Write(token.Content);
}
else
{
// There may be something else inside the statement like an extension node.
context.RenderNode(node.Children[i]);
}
}

if (linePragmaScope == null)
{
context.Writer.WriteLine();
}

linePragmaScope?.Dispose();
}

public override void WriteHtmlAttribute(CSharpRenderingContext context, HtmlAttributeIRNode node)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,10 +210,19 @@ public override void VisitCSharpAttributeValue(CSharpAttributeValueIRNode node)

public override void VisitCSharpStatement(CSharpStatementIRNode node)
{
var isWhitespaceToken = node.Children.All(child =>
child is RazorIRToken token && string.IsNullOrWhiteSpace(token.Content));
// We can't remove this yet, because it's still used recursively in a few places.
var isWhitespaceStatement = true;
for (var i = 0; i < node.Children.Count; i++)
{
var token = node.Children[i] as RazorIRToken;
if (token == null || !string.IsNullOrWhiteSpace(token.Content))
{
isWhitespaceStatement = false;
break;
}
}

if (isWhitespaceToken)
if (isWhitespaceStatement)
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,177 @@ public void WriteCSharpExpression_WithSource_WritesPadding()
@"#line 1 ""test.cshtml""
__o = i++;
#line default
#line hidden
",
csharp,
ignoreLineEndingDifferences: true);
}

[Fact]
public void WriteCSharpStatement_WhitespaceContent_DoesNothing()
{
// Arrange
var writer = new DesignTimeBasicWriter();

var context = new CSharpRenderingContext()
{
Writer = new Legacy.CSharpCodeWriter(),
};

var node = new CSharpStatementIRNode();
RazorIRBuilder.Create(node)
.Add(new RazorIRToken()
{
Kind = RazorIRToken.TokenKind.CSharp,
Content = " \t"
});

// Act
writer.WriteCSharpStatement(context, node);

// Assert
var csharp = context.Writer.Builder.ToString();
Assert.Empty(csharp);
}

[Fact]
public void WriteCSharpStatement_WhitespaceContentWithSource_WritesContent()
{
// Arrange
var writer = new DesignTimeBasicWriter();

var context = new CSharpRenderingContext()
{
Writer = new Legacy.CSharpCodeWriter(),
Options = RazorParserOptions.CreateDefaultOptions(),
};

var node = new CSharpStatementIRNode()
{
Source = new SourceSpan("test.cshtml", 0, 0, 0, 3),
};
RazorIRBuilder.Create(node)
.Add(new RazorIRToken()
{
Kind = RazorIRToken.TokenKind.CSharp,
Content = " "
});

// Act
writer.WriteCSharpStatement(context, node);

// Assert
var csharp = context.Writer.Builder.ToString();
Assert.Equal(
@"
",
csharp,
ignoreLineEndingDifferences: true);
}

[Fact]
public void WriteCSharpStatement_SkipsLinePragma_WithoutSource()
{
// Arrange
var writer = new DesignTimeBasicWriter();

var context = new CSharpRenderingContext()
{
Writer = new Legacy.CSharpCodeWriter(),
};

var node = new CSharpStatementIRNode();
RazorIRBuilder.Create(node)
.Add(new RazorIRToken()
{
Kind = RazorIRToken.TokenKind.CSharp,
Content = "if (true) { }"
});

// Act
writer.WriteCSharpStatement(context, node);

// Assert
var csharp = context.Writer.Builder.ToString();
Assert.Equal(
@"if (true) { }
",
csharp,
ignoreLineEndingDifferences: true);
}

[Fact]
public void WriteCSharpStatement_WritesLinePragma_WithSource()
{
// Arrange
var writer = new DesignTimeBasicWriter();

var context = new CSharpRenderingContext()
{
Writer = new Legacy.CSharpCodeWriter(),
Options = RazorParserOptions.CreateDefaultOptions(),
};

var node = new CSharpStatementIRNode()
{
Source = new SourceSpan("test.cshtml", 0, 0, 0, 13),
};
RazorIRBuilder.Create(node)
.Add(new RazorIRToken()
{
Kind = RazorIRToken.TokenKind.CSharp,
Content = "if (true) { }",
});

// Act
writer.WriteCSharpStatement(context, node);

// Assert
var csharp = context.Writer.Builder.ToString();
Assert.Equal(
@"#line 1 ""test.cshtml""
if (true) { }
#line default
#line hidden
",
csharp,
ignoreLineEndingDifferences: true);
}

[Fact]
public void WriteCSharpStatement_WritesPadding_WithSource()
{
// Arrange
var writer = new DesignTimeBasicWriter();

var context = new CSharpRenderingContext()
{
Writer = new Legacy.CSharpCodeWriter(),
Options = RazorParserOptions.CreateDefaultOptions(),
};

var node = new CSharpStatementIRNode()
{
Source = new SourceSpan("test.cshtml", 0, 0, 0, 17),
};
RazorIRBuilder.Create(node)
.Add(new RazorIRToken()
{
Kind = RazorIRToken.TokenKind.CSharp,
Content = " if (true) { }",
});

// Act
writer.WriteCSharpStatement(context, node);

// Assert
var csharp = context.Writer.Builder.ToString();
Assert.Equal(
@"#line 1 ""test.cshtml""
if (true) { }
#line default
#line hidden
",
Expand Down
Loading

0 comments on commit da1e413

Please sign in to comment.