Rewrite of code rendering context

This commit is contained in:
Ryan Nowak 2017-07-03 15:25:34 -07:00
parent 35889cba81
commit 8a9bf9c71a
25 changed files with 563 additions and 786 deletions

View File

@ -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 Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
@ -10,91 +11,49 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
internal static readonly object NewLineString = "NewLineString";
internal static readonly object SuppressUniqueIds = "SuppressUniqueIds";
public static CodeRenderingContext Create(RazorCodeDocument codeDocument, RazorCodeGenerationOptions options)
{
if (codeDocument == null)
{
throw new ArgumentNullException(nameof(codeDocument));
}
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
IntermediateNodeWriter nodeWriter;
TagHelperWriter tagHelperWriter;
if (options.DesignTime)
{
nodeWriter = new DesignTimeNodeWriter();
tagHelperWriter = new DesignTimeTagHelperWriter();
}
else
{
nodeWriter = new RuntimeNodeWriter();
tagHelperWriter = new RuntimeTagHelperWriter();
}
var documentKind = codeDocument.GetDocumentIntermediateNode()?.DocumentKind;
var codeWriter = new CodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, documentKind, codeDocument.Source, options)
{
TagHelperWriter = tagHelperWriter
};
var newLineString = codeDocument.Items[NewLineString];
if (newLineString != null)
{
// Set new line character to a specific string regardless of platform, for testing purposes.
codeWriter.NewLine = (string)newLineString;
}
context.Items[SuppressUniqueIds] = codeDocument.Items[SuppressUniqueIds];
return context;
}
public abstract CodeWriter CodeWriter { get; }
public abstract IntermediateNodeWriter NodeWriter { get; protected set; }
public abstract RazorSourceDocument SourceDocument { get; }
public abstract RazorCodeGenerationOptions Options { get; }
public abstract RazorDiagnosticCollection Diagnostics { get; }
public abstract ItemCollection Items { get; }
public abstract string DocumentKind { get; }
public abstract IntermediateNodeWriterScope Push(IntermediateNodeWriter writer);
public abstract ItemCollection Items { get; }
public struct IntermediateNodeWriterScope : IDisposable
public abstract IntermediateNodeWriter NodeWriter { get; }
public abstract RazorCodeGenerationOptions Options { get; }
public abstract RazorSourceDocument SourceDocument { get; }
public abstract Scope CreateScope();
public abstract Scope CreateScope(IntermediateNodeWriter writer);
public abstract void EndScope();
public abstract void RenderNode(IntermediateNode node);
public abstract void RenderChildren(IntermediateNode node);
public abstract void AddLineMappingFor(IntermediateNode node);
public struct Scope : IDisposable
{
private readonly CodeRenderingContext _context;
private readonly IntermediateNodeWriter _writer;
public IntermediateNodeWriterScope(CodeRenderingContext context, IntermediateNodeWriter writer)
public Scope(CodeRenderingContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
_context = context;
_writer = writer;
}
public void Dispose()
{
_context.NodeWriter = _writer;
_context.EndScope();
}
}
@ -102,22 +61,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
// All bits below here are temporary
#region Temporary TagHelper bits
internal TagHelperWriter TagHelperWriter { get; set; }
internal TagHelperRenderingContext TagHelperRenderingContext { get; set; }
internal TagHelperWriterScope Push(TagHelperWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
var scope = new TagHelperWriterScope(this, TagHelperWriter);
TagHelperWriter = writer;
return scope;
}
internal TagHelperRenderingContextScope Push(TagHelperRenderingContext context)
{
if (context == null)
@ -130,33 +76,6 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return scope;
}
internal struct TagHelperWriterScope : IDisposable
{
private readonly CodeRenderingContext _context;
private readonly TagHelperWriter _writer;
public TagHelperWriterScope(CodeRenderingContext context, TagHelperWriter writer)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
_context = context;
_writer = writer;
}
public void Dispose()
{
_context.TagHelperWriter = _writer;
}
}
internal struct TagHelperRenderingContextScope : IDisposable
{
private readonly CodeRenderingContext _context;

View File

@ -1,126 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
public static class CodeRenderingContextExtensions
{
private static readonly object RenderNodeKey = new object();
private static readonly object RenderChildrenKey = new object();
private static readonly object LineMappingsKey = new object();
public static void SetRenderNode(this CodeRenderingContext context, Action<IntermediateNode> renderNode)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
context.Items[RenderNodeKey] = renderNode;
}
public static void RenderNode(this CodeRenderingContext context, IntermediateNode node)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (node == null)
{
throw new ArgumentNullException(nameof(node));
}
var renderNode = (Action<IntermediateNode>)context.Items[RenderNodeKey];
if (renderNode == null)
{
throw new InvalidOperationException(
Resources.FormatRenderingContextRequiresDelegate(nameof(CodeRenderingContext), nameof(RenderNode)));
}
renderNode(node);
}
public static void SetRenderChildren(this CodeRenderingContext context, Action<IntermediateNode> renderChildren)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
context.Items[RenderChildrenKey] = renderChildren;
}
public static void RenderChildren(this CodeRenderingContext context, IntermediateNode node)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (node == null)
{
throw new ArgumentNullException(nameof(node));
}
var renderChildren = (Action<IntermediateNode>)context.Items[RenderChildrenKey];
if (renderChildren == null)
{
throw new InvalidOperationException(
Resources.FormatRenderingContextRequiresDelegate(nameof(CodeRenderingContext), nameof(RenderChildren)));
}
renderChildren(node);
}
public static void AddLineMappingFor(this CodeRenderingContext context, IntermediateNode node)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (node == null)
{
throw new ArgumentNullException(nameof(node));
}
var lineMappings = (List<LineMapping>)context.Items[LineMappingsKey];
if (lineMappings == null)
{
lineMappings = new List<LineMapping>();
context.Items[LineMappingsKey] = lineMappings;
}
if (node.Source == null)
{
return;
}
if (context.SourceDocument.FilePath != null &&
!string.Equals(context.SourceDocument.FilePath, node.Source.Value.FilePath, StringComparison.OrdinalIgnoreCase))
{
// We don't want to generate line mappings for imports.
return;
}
var source = node.Source.Value;
var generatedLocation = new SourceSpan(context.CodeWriter.Location, source.Length);
var lineMapping = new LineMapping(source, generatedLocation);
lineMappings.Add(lineMapping);
}
public static IReadOnlyList<LineMapping> GetLineMappings(this CodeRenderingContext context)
{
var lineMappings = (IReadOnlyList<LineMapping>)context.Items[LineMappingsKey] ?? Array.Empty<LineMapping>();
return lineMappings;
}
}
}

View File

@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
}
public abstract DocumentWriter CreateWriter(CodeRenderingContext context);
public abstract IntermediateNodeWriter CreateNodeWriter();
public abstract TExtension GetExtension<TExtension>() where TExtension : class, ICodeTargetExtension;

View File

@ -3,61 +3,181 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
internal class DefaultCodeRenderingContext : CodeRenderingContext
{
// Internal for unit testing
internal DefaultCodeRenderingContext(
CodeWriter codeWriter,
IntermediateNodeWriter nodeWriter,
RazorSourceDocument sourceDocument,
RazorCodeGenerationOptions options)
: this (codeWriter, nodeWriter, null, sourceDocument, options)
{
}
private readonly RazorCodeDocument _codeDocument;
private readonly DocumentIntermediateNode _documentNode;
private readonly List<ScopeInternal> _scopes;
public DefaultCodeRenderingContext(
CodeWriter codeWriter,
IntermediateNodeWriter nodeWriter,
string documentKind,
RazorSourceDocument sourceDocument,
RazorCodeDocument codeDocument,
DocumentIntermediateNode documentNode,
RazorCodeGenerationOptions options)
{
if (codeWriter == null)
{
throw new ArgumentNullException(nameof(codeWriter));
}
if (nodeWriter == null)
{
throw new ArgumentNullException(nameof(nodeWriter));
}
if (codeDocument == null)
{
throw new ArgumentNullException(nameof(codeDocument));
}
if (documentNode == null)
{
throw new ArgumentNullException(nameof(documentNode));
}
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
CodeWriter = codeWriter;
NodeWriter = nodeWriter;
DocumentKind = documentKind;
SourceDocument = sourceDocument;
_codeDocument = codeDocument;
_documentNode = documentNode;
Options = options;
Diagnostics = new DefaultRazorDiagnosticCollection();
Items = new DefaultItemCollection();
LineMappings = new List<LineMapping>();
TagHelperRenderingContext = new TagHelperRenderingContext();
var diagnostics = _documentNode.GetAllDiagnostics();
for (var i = 0; i < diagnostics.Count; i++)
{
Diagnostics.Add(diagnostics[i]);
}
var newLineString = codeDocument.Items[NewLineString];
if (newLineString != null)
{
// Set new line character to a specific string regardless of platform, for testing purposes.
codeWriter.NewLine = (string)newLineString;
}
Items[NewLineString] = codeDocument.Items[NewLineString];
Items[SuppressUniqueIds] = codeDocument.Items[SuppressUniqueIds];
_scopes = new List<ScopeInternal>();
_scopes.Add(new ScopeInternal(nodeWriter));
}
// This will be initialized by the document writer when the context is 'live'.
public IntermediateNodeVisitor Visitor { get; set; }
public override CodeWriter CodeWriter { get; }
public override IntermediateNodeWriter NodeWriter { get; protected set; }
public override RazorSourceDocument SourceDocument { get; }
public override RazorCodeGenerationOptions Options { get; }
public override RazorDiagnosticCollection Diagnostics { get; }
public override ItemCollection Items { get; }
public override string DocumentKind { get; }
public override IntermediateNodeWriterScope Push(IntermediateNodeWriter writer)
public override ItemCollection Items { get; }
public List<LineMapping> LineMappings { get; }
public override IntermediateNodeWriter NodeWriter => Current.Writer;
public override RazorCodeGenerationOptions Options { get; }
public override RazorSourceDocument SourceDocument => _codeDocument.Source;
private ScopeInternal Current => _scopes[_scopes.Count - 1];
public override void AddLineMappingFor(IntermediateNode node)
{
if (node == null)
{
throw new ArgumentNullException(nameof(node));
}
if (node.Source == null)
{
return;
}
if (SourceDocument.FilePath != null &&
!string.Equals(SourceDocument.FilePath, node.Source.Value.FilePath, StringComparison.OrdinalIgnoreCase))
{
// We don't want to generate line mappings for imports.
return;
}
var source = node.Source.Value;
var generatedLocation = new SourceSpan(CodeWriter.Location, source.Length);
var lineMapping = new LineMapping(source, generatedLocation);
LineMappings.Add(lineMapping);
}
public override Scope CreateScope()
{
CreateScope(Current.Writer);
return new Scope(this);
}
public override Scope CreateScope(IntermediateNodeWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
var scope = new IntermediateNodeWriterScope(this, NodeWriter);
NodeWriter = writer;
return scope;
_scopes.Add(new ScopeInternal(writer));
return new Scope(this);
}
public override void EndScope()
{
_scopes.RemoveAt(_scopes.Count - 1);
}
public override void RenderChildren(IntermediateNode node)
{
if (node == null)
{
throw new ArgumentNullException(nameof(node));
}
for (var i = 0; i < node.Children.Count; i++)
{
Visitor.Visit(node.Children[i]);
}
}
public override void RenderNode(IntermediateNode node)
{
if (node == null)
{
throw new ArgumentNullException(nameof(node));
}
Visitor.Visit(node);
}
private struct ScopeInternal
{
public ScopeInternal(IntermediateNodeWriter writer)
{
Writer = writer;
}
public IntermediateNodeWriter Writer { get; }
}
}
}

View File

@ -18,9 +18,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public ICodeTargetExtension[] Extensions { get; }
public override DocumentWriter CreateWriter(CodeRenderingContext context)
public override IntermediateNodeWriter CreateNodeWriter()
{
return new DefaultDocumentWriter(this, context);
return _options.DesignTime ? (IntermediateNodeWriter)new DesignTimeNodeWriter() : new RuntimeNodeWriter();
}
public override TExtension GetExtension<TExtension>()

View File

@ -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 System.Text;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
@ -9,63 +10,57 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
internal class DefaultDocumentWriter : DocumentWriter
{
private readonly CodeRenderingContext _context;
private readonly CodeTarget _target;
private readonly CodeTarget _codeTarget;
private readonly RazorCodeGenerationOptions _options;
public DefaultDocumentWriter(CodeTarget target, CodeRenderingContext context)
public DefaultDocumentWriter(CodeTarget codeTarget, RazorCodeGenerationOptions options)
{
if (target == null)
{
throw new ArgumentNullException(nameof(target));
}
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
_target = target;
_context = context;
_codeTarget = codeTarget;
_options = options;
}
public override void WriteDocument(DocumentIntermediateNode node)
public override RazorCSharpDocument WriteDocument(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode)
{
if (node == null)
if (codeDocument == null)
{
throw new ArgumentNullException(nameof(node));
throw new ArgumentNullException(nameof(codeDocument));
}
var visitor = new Visitor(_target, _context);
_context.SetRenderNode(visitor.Visit);
_context.SetRenderChildren(visitor.RenderChildren);
if (documentNode == null)
{
throw new ArgumentNullException(nameof(documentNode));
}
visitor.VisitDocument(node);
var context = new DefaultCodeRenderingContext(
new CodeWriter(),
_codeTarget.CreateNodeWriter(),
codeDocument,
documentNode,
_options);
context.Visitor = new Visitor(_codeTarget, context);
_context.SetRenderChildren(null);
_context.SetRenderNode(null);
context.Visitor.VisitDocument(documentNode);
var cSharp = context.CodeWriter.GenerateCode();
return new DefaultRazorCSharpDocument(
cSharp,
_options,
context.Diagnostics.ToArray(),
context.LineMappings.ToArray());
}
private class Visitor : IntermediateNodeVisitor
{
private readonly CodeRenderingContext _context;
private readonly DefaultCodeRenderingContext _context;
private readonly CodeTarget _target;
public Visitor(CodeTarget target, CodeRenderingContext context)
public Visitor(CodeTarget target, DefaultCodeRenderingContext context)
{
_target = target;
_context = context;
}
private CodeRenderingContext Context => _context;
public void RenderChildren(IntermediateNode node)
{
for (var i = 0; i < node.Children.Count; i++)
{
var child = node.Children[i];
Visit(child);
}
}
private DefaultCodeRenderingContext Context => _context;
public override void VisitDocument(DocumentIntermediateNode node)
{
@ -102,7 +97,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
.WriteLine("// <auto-generated/>")
.WriteLine("#pragma warning disable 1591");
RenderChildren(node);
VisitDefault(node);
Context.CodeWriter.WriteLine("#pragma warning restore 1591");
}
@ -117,7 +112,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
using (Context.CodeWriter.BuildNamespace(node.Content))
{
Context.CodeWriter.WriteLine("#line hidden");
RenderChildren(node);
VisitDefault(node);
}
}
@ -125,7 +120,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
using (Context.CodeWriter.BuildClassDeclaration(node.Modifiers, node.Name, node.BaseType, node.Interfaces))
{
RenderChildren(node);
VisitDefault(node);
}
}
@ -147,7 +142,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
using (Context.CodeWriter.BuildScope())
{
RenderChildren(node);
VisitDefault(node);
}
Context.CodeWriter.WriteLine("#pragma warning restore 1998");
@ -209,7 +204,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
using (Context.Push(tagHelperRenderingContext))
{
RenderChildren(node);
VisitDefault(node);
}
}

View File

@ -1,16 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Linq;
using System.Text;
using Microsoft.AspNetCore.Razor.Language.Extensions;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.AspNetCore.Razor.Language.Legacy;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
internal class DesignTimeTagHelperWriter : TagHelperWriter
{
}
}

View File

@ -1,12 +1,28 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
public abstract class DocumentWriter
{
public abstract void WriteDocument(DocumentIntermediateNode node);
public DocumentWriter Create(CodeTarget codeTarget, RazorCodeGenerationOptions options)
{
if (codeTarget == null)
{
throw new ArgumentNullException(nameof(codeTarget));
}
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
return new DefaultDocumentWriter(codeTarget, options);
}
public abstract RazorCSharpDocument WriteDocument(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode);
}
}

View File

@ -1,16 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Globalization;
using System.Linq;
using Microsoft.AspNetCore.Razor.Language.Extensions;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.AspNetCore.Razor.Language.Legacy;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
internal class RuntimeTagHelperWriter : TagHelperWriter
{
}
}

View File

@ -1,11 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
internal abstract class TagHelperWriter
{
}
}

View File

@ -12,34 +12,22 @@ namespace Microsoft.AspNetCore.Razor.Language
{
protected override void ExecuteCore(RazorCodeDocument codeDocument)
{
var irDocument = codeDocument.GetDocumentIntermediateNode();
ThrowForMissingDocumentDependency(irDocument);
var documentNode = codeDocument.GetDocumentIntermediateNode();
ThrowForMissingDocumentDependency(documentNode);
var target = irDocument.Target;
var target = documentNode.Target;
if (target == null)
{
var message = Resources.FormatDocumentMissingTarget(
irDocument.DocumentKind,
documentNode.DocumentKind,
nameof(CodeTarget),
nameof(DocumentIntermediateNode.Target));
throw new InvalidOperationException(message);
}
var context = CodeRenderingContext.Create(codeDocument, irDocument.Options);
var documentWriter = target.CreateWriter(context);
documentWriter.WriteDocument(irDocument);
var diagnostics = new List<RazorDiagnostic>();
diagnostics.AddRange(irDocument.GetAllDiagnostics());
diagnostics.AddRange(context.Diagnostics);
var lineMappings = context.GetLineMappings();
var csharpDocument = RazorCSharpDocument.Create(
context.CodeWriter.GenerateCode(),
irDocument.Options,
diagnostics,
lineMappings);
codeDocument.SetCSharpDocument(csharpDocument);
var writer = new DefaultDocumentWriter(documentNode.Target, documentNode.Options);
var cSharpDocument = writer.WriteDocument(codeDocument, documentNode);
codeDocument.SetCSharpDocument(cSharpDocument);
}
}
}

View File

@ -107,8 +107,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
.WriteParameterSeparator();
// We remove and redirect writers so TagHelper authors can retrieve content.
using (context.Push(new RuntimeNodeWriter()))
using (context.Push(new RuntimeTagHelperWriter()))
using (context.CreateScope(new RuntimeNodeWriter()))
{
using (context.CodeWriter.BuildAsyncLambda())
{
@ -215,7 +214,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
.Write(attributeValueStyleParameter)
.WriteEndMethodInvocation();
using (context.Push(new TagHelperHtmlAttributeRuntimeNodeWriter()))
using (context.CreateScope(new TagHelperHtmlAttributeRuntimeNodeWriter()))
{
context.RenderChildren(node);
}
@ -237,8 +236,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// We're building a writing scope around the provided chunks which captures everything written from the
// page. Therefore, we do not want to write to any other buffer since we're using the pages buffer to
// ensure we capture all content that's written, directly or indirectly.
using (context.Push(new RuntimeNodeWriter()))
using (context.Push(new RuntimeTagHelperWriter()))
using (context.CreateScope(new RuntimeNodeWriter()))
{
context.RenderChildren(node);
}
@ -335,7 +333,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
context.CodeWriter.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName);
using (context.Push(new LiteralRuntimeNodeWriter()))
using (context.CreateScope(new LiteralRuntimeNodeWriter()))
{
context.RenderChildren(node);
}

View File

@ -4,6 +4,7 @@
using System;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.AspNetCore.Razor.Language.Legacy;
using Xunit;
@ -15,7 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
public void InjectDirectiveTargetExtension_WritesProperty()
{
// Arrange
var context = GetRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var target = new InjectTargetExtension();
var node = new InjectIntermediateNode()
{
@ -37,7 +38,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
public void InjectDirectiveTargetExtension_WritesPropertyWithLinePragma_WhenSourceIsSet()
{
// Arrange
var context = GetRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var target = new InjectTargetExtension();
var node = new InjectIntermediateNode()
{
@ -63,15 +64,5 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
"#line hidden" + Environment.NewLine,
context.CodeWriter.Builder.ToString());
}
private CodeRenderingContext GetRenderingContext()
{
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
return context;
}
}
}

View File

@ -28,20 +28,31 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
}
[Fact]
public void CreateWriter_CreatesDefaultDocumentWriter()
public void CreateWriter_DesignTime_CreatesDesignTimeNodeWriter()
{
// Arrange
var codeWriter = new CodeWriter();
var codeDocument = TestRazorCodeDocument.Create(string.Empty);
var options = RazorCodeGenerationOptions.CreateDefault();
var context = CodeRenderingContext.Create(codeDocument, options);
var options = RazorCodeGenerationOptions.CreateDesignTimeDefault();
var target = new DefaultCodeTarget(options, Enumerable.Empty<ICodeTargetExtension>());
// Act
var writer = target.CreateWriter(context);
var writer = target.CreateNodeWriter();
// Assert
Assert.IsType<DefaultDocumentWriter>(writer);
Assert.IsType<DesignTimeNodeWriter>(writer);
}
[Fact]
public void CreateWriter_Runtime_CreatesRuntimeNodeWriter()
{
// Arrange
var options = RazorCodeGenerationOptions.CreateDefault();
var target = new DefaultCodeTarget(options, Enumerable.Empty<ICodeTargetExtension>());
// Act
var writer = target.CreateNodeWriter();
// Assert
Assert.IsType<RuntimeNodeWriter>(writer);
}
[Fact]

View File

@ -13,24 +13,19 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteDocument_Empty_WritesChecksumAndMarksAutoGenerated()
{
// Arrange
var document = new DocumentIntermediateNode();
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode();
var builder = IntermediateNodeBuilder.Create(document);
var writer = new DefaultDocumentWriter(target, options);
// Act
writer.WriteDocument(document);
var result = writer.WriteDocument(codeDocument, document);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
var csharp = result.GeneratedCode;
Assert.Equal(
@"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
@ -45,6 +40,8 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteDocument_Empty_SuppressChecksumTrue_DoesnotWriteChecksum()
{
// Arrange
var document = new DocumentIntermediateNode();
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var optionsBuilder = new DefaultRazorCodeGenerationOptionsBuilder()
{
@ -53,20 +50,13 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var options = optionsBuilder.Build();
var target = CodeTarget.CreateDefault(codeDocument, options);
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode();
var builder = IntermediateNodeBuilder.Create(document);
var writer = new DefaultDocumentWriter(target, options);
// Act
writer.WriteDocument(document);
var result = writer.WriteDocument(codeDocument, document);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
var csharp = result.GeneratedCode;
Assert.Equal(
@"// <auto-generated/>
#pragma warning disable 1591
@ -80,16 +70,6 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteDocument_WritesNamespace()
{
// Arrange
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode();
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new NamespaceDeclarationIntermediateNode()
@ -97,11 +77,17 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
Content = "TestNamespace",
});
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var writer = new DefaultDocumentWriter(target, options);
// Act
writer.WriteDocument(document);
var result = writer.WriteDocument(codeDocument, document);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
var csharp = result.GeneratedCode;
Assert.Equal(
@"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
@ -120,15 +106,6 @@ namespace TestNamespace
public void WriteDocument_WritesClass()
{
// Arrange
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode();
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new ClassDeclarationIntermediateNode()
@ -142,11 +119,17 @@ namespace TestNamespace
Name = "TestClass",
});
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var writer = new DefaultDocumentWriter(target, options);
// Act
writer.WriteDocument(document);
var result = writer.WriteDocument(codeDocument, document);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
var csharp = result.GeneratedCode;
Assert.Equal(
@"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
@ -164,15 +147,6 @@ internal class TestClass : TestBase, IFoo, IBar
public void WriteDocument_WritesMethod()
{
// Arrange
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode();
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new MethodDeclarationIntermediateNode()
@ -187,11 +161,17 @@ internal class TestClass : TestBase, IFoo, IBar
ReturnType = "string",
});
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var writer = new DefaultDocumentWriter(target, options);
// Act
writer.WriteDocument(document);
var result = writer.WriteDocument(codeDocument, document);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
var csharp = result.GeneratedCode;
Assert.Equal(
@"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
@ -211,15 +191,6 @@ internal virtual async string TestMethod()
public void WriteDocument_WritesField()
{
// Arrange
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode();
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new FieldDeclarationIntermediateNode()
@ -233,11 +204,17 @@ internal virtual async string TestMethod()
Type = "string",
});
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var writer = new DefaultDocumentWriter(target, options);
// Act
writer.WriteDocument(document);
var result = writer.WriteDocument(codeDocument, document);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
var csharp = result.GeneratedCode;
Assert.Equal(
@"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>
@ -253,15 +230,6 @@ internal readonly string _foo;
public void WriteDocument_WritesProperty()
{
// Arrange
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode();
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new PropertyDeclarationIntermediateNode()
@ -275,11 +243,17 @@ internal readonly string _foo;
Type = "string",
});
var codeDocument = TestRazorCodeDocument.CreateEmpty();
var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options);
var writer = new DefaultDocumentWriter(target, options);
// Act
writer.WriteDocument(document);
var result = writer.WriteDocument(codeDocument, document);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
var csharp = result.GeneratedCode;
Assert.Equal(
@"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709""
// <auto-generated/>

View File

@ -15,9 +15,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new UsingDirectiveIntermediateNode()
{
@ -42,9 +40,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
// Arrange
var writer = new DesignTimeNodeWriter();
var sourceDocument = TestRazorSourceDocument.Create("@using System;");
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
var context = TestCodeRenderingContext.CreateDesignTime();
var originalSpan = new SourceSpan("test.cshtml", 0, 0, 0, 6);
var generatedSpan = new SourceSpan(null, 21 + Environment.NewLine.Length, 1, 0, 6);
@ -59,7 +55,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteUsingDirective(context, node);
// Assert
var mapping = Assert.Single(context.GetLineMappings());
var mapping = Assert.Single(((DefaultCodeRenderingContext)context).LineMappings);
Assert.Equal(expectedLineMapping, mapping);
var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal(
@ -78,9 +74,7 @@ using System;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node);
@ -107,9 +101,7 @@ using System;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpExpressionIntermediateNode()
{
@ -143,9 +135,7 @@ __o = i++;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node);
@ -161,15 +151,14 @@ __o = i++;
Kind = IntermediateToken.TokenKind.CSharp,
});
context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act
writer.WriteCSharpExpression(context, node);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal(
@"__o = i++;
@"__o = iRender Children
++;
",
csharp,
ignoreLineEndingDifferences: true);
@ -180,10 +169,7 @@ __o = i++;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var sourceDocument = TestRazorSourceDocument.Create(" @i++");
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpExpressionIntermediateNode()
{
@ -202,8 +188,6 @@ __o = i++;
Kind = IntermediateToken.TokenKind.CSharp,
});
context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act
writer.WriteCSharpExpression(context, node);
@ -211,7 +195,8 @@ __o = i++;
var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal(
@"#line 1 ""test.cshtml""
__o = i++;
__o = iRender Children
++;
#line default
#line hidden
@ -225,9 +210,7 @@ __o = i++;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node)
@ -250,9 +233,7 @@ __o = i++;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpCodeIntermediateNode()
{
@ -282,9 +263,7 @@ __o = i++;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node)
@ -311,9 +290,7 @@ __o = i++;
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpCodeIntermediateNode()
{
@ -347,9 +324,7 @@ if (true) { }
{
// Arrange
var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new CSharpCodeIntermediateNode()
{
@ -386,9 +361,10 @@ if (true) { }
var content = "<input checked=\"hello-world @false\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateDesignTime(source: sourceDocument);
// Act
writer.WriteCSharpExpressionAttributeValue(context, node);
@ -413,9 +389,10 @@ if (true) { }
var content = "<input checked=\"hello-world @if(@true){ }\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateDesignTime(source: sourceDocument);
// Act
writer.WriteCSharpCodeAttributeValue(context, node);
@ -440,9 +417,10 @@ if (true) { }
var content = "<input checked=\"hello-world @if(@true){ @false }\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateDesignTime(source: sourceDocument);
// Act
writer.WriteCSharpCodeAttributeValue(context, node);
@ -455,7 +433,7 @@ if (true) { }
#line default
#line hidden
Render Node - CSharpExpressionIntermediateNode
Render Children
#line 1 ""test.cshtml""
}
@ -466,19 +444,6 @@ Render Node - CSharpExpressionIntermediateNode
ignoreLineEndingDifferences: true);
}
private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument)
{
var options = RazorCodeGenerationOptions.CreateDefault();
var codeWriter = new CodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
context.SetRenderNode(n =>
{
codeWriter.WriteLine($"Render Node - {n.GetType().Name}");
});
return context;
}
private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument)
{
var engine = RazorEngine.Create();
@ -499,10 +464,10 @@ Render Node - CSharpExpressionIntermediateNode
}
}
var irDocument = codeDocument.GetDocumentIntermediateNode();
Assert.NotNull(irDocument);
var documentNode = codeDocument.GetDocumentIntermediateNode();
Assert.NotNull(documentNode);
return irDocument;
return documentNode;
}
private class MyExtensionIntermediateNode : ExtensionIntermediateNode
@ -511,12 +476,12 @@ Render Node - CSharpExpressionIntermediateNode
public override void Accept(IntermediateNodeVisitor visitor)
{
throw new NotImplementedException();
visitor.VisitDefault(this);
}
public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{
throw new NotImplementedException();
context.CodeWriter.WriteLine("MyExtensionNode");
}
}
}

View File

@ -13,9 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
// Arrange
var writer = new LiteralRuntimeNodeWriter();
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpExpressionIntermediateNode()
{

View File

@ -16,8 +16,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new UsingDirectiveIntermediateNode()
{
@ -42,8 +41,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new UsingDirectiveIntermediateNode()
{
@ -76,8 +74,7 @@ using System;
{
WriteCSharpExpressionMethod = "Test",
};
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node);
@ -108,8 +105,7 @@ using System;
{
WriteCSharpExpressionMethod = "Test",
};
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpExpressionIntermediateNode()
{
@ -147,8 +143,7 @@ Test(i++);
{
WriteCSharpExpressionMethod = "Test",
};
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node);
@ -164,15 +159,14 @@ Test(i++);
Kind = IntermediateToken.TokenKind.CSharp,
});
context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act
writer.WriteCSharpExpression(context, node);
// Assert
var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal(
@"Test(i++);
@"Test(iRender Children
++);
",
csharp,
ignoreLineEndingDifferences: true);
@ -187,9 +181,7 @@ Test(i++);
{
WriteCSharpExpressionMethod = "Test",
};
var options = RazorCodeGenerationOptions.CreateDefault();
var sourceDocument = TestRazorSourceDocument.Create(" @i++");
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpExpressionIntermediateNode()
{
@ -208,8 +200,6 @@ Test(i++);
Kind = IntermediateToken.TokenKind.CSharp,
});
context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act
writer.WriteCSharpExpression(context, node);
@ -217,7 +207,8 @@ Test(i++);
var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal(
@"#line 1 ""test.cshtml""
Test(i++);
Test(iRender Children
++);
#line default
#line hidden
@ -232,8 +223,7 @@ Test(i++);
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node)
@ -257,8 +247,7 @@ Test(i++);
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node)
@ -286,8 +275,7 @@ Test(i++);
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpCodeIntermediateNode()
{
@ -322,8 +310,7 @@ if (true) { }
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new CSharpCodeIntermediateNode()
{
@ -358,8 +345,7 @@ if (true) { }
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new HtmlContentIntermediateNode();
node.Children.Add(new IntermediateToken()
@ -386,9 +372,7 @@ if (true) { }
// Arrange
var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new HtmlContentIntermediateNode();
node.Children.Add(new IntermediateToken()
@ -418,9 +402,10 @@ WriteLiteral(@""{1}"");
var content = "<input checked=\"hello-world @false\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single();
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single();
var context = TestCodeRenderingContext.CreateRuntime();
// Act
writer.WriteHtmlAttribute(context, node);
@ -430,6 +415,7 @@ WriteLiteral(@""{1}"");
Assert.Equal(
@"BeginWriteAttribute(""checked"", "" checked=\"""", 6, ""\"""", 34, 2);
Render Children
Render Children
EndWriteAttribute();
",
csharp,
@ -444,9 +430,10 @@ EndWriteAttribute();
var content = "<input checked=\"hello-world @false\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateRuntime();
// Act
writer.WriteHtmlAttributeValue(context, node);
@ -468,9 +455,10 @@ EndWriteAttribute();
var content = "<input checked=\"hello-world @false\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateRuntime();
// Act
writer.WriteCSharpExpressionAttributeValue(context, node);
@ -497,9 +485,10 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
var content = "<input checked=\"hello-world @if(@true){ }\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateRuntime(source: sourceDocument);
// Act
writer.WriteCSharpCodeAttributeValue(context, node);
@ -530,7 +519,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
{
PushWriterMethod = "TestPushWriter"
};
var context = GetCodeRenderingContext(writer, null);
var context = TestCodeRenderingContext.CreateRuntime();
// Act
writer.BeginWriterScope(context, "MyWriter");
@ -552,7 +541,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
{
PopWriterMethod = "TestPopWriter"
};
var context = GetCodeRenderingContext(writer, null);
var context = TestCodeRenderingContext.CreateRuntime();
// Act
writer.EndWriterScope(context);
@ -566,19 +555,6 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
ignoreLineEndingDifferences: true);
}
private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument)
{
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
context.SetRenderChildren(n =>
{
codeWriter.WriteLine("Render Children");
});
return context;
}
private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument)
{
var engine = RazorEngine.Create();
@ -611,7 +587,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
public override void Accept(IntermediateNodeVisitor visitor)
{
throw new NotImplementedException();
visitor.VisitDefault(this);
}
public override void WriteNode(CodeTarget target, CodeRenderingContext context)

View File

@ -17,9 +17,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var content = "<input checked=\"hello-world @false\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateRuntime();
// Act
writer.WriteHtmlAttributeValue(context, node);
@ -40,9 +41,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var content = "<input checked=\"hello-world @false\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateRuntime();
// Act
writer.WriteCSharpExpressionAttributeValue(context, node);
@ -68,9 +70,10 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false);
var content = "<input checked=\"hello-world @if(@true){ }\" />";
var sourceDocument = TestRazorSourceDocument.Create(content);
var codeDocument = RazorCodeDocument.Create(sourceDocument);
var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var documentNode = Lower(codeDocument);
var node = documentNode.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
var context = TestCodeRenderingContext.CreateRuntime(source: sourceDocument);
// Act
writer.WriteCSharpCodeAttributeValue(context, node);
@ -93,19 +96,6 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false);
ignoreLineEndingDifferences: true);
}
private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument)
{
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
context.SetRenderChildren(_ =>
{
codeWriter.WriteLine("Render Children");
});
return context;
}
private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument)
{
var engine = RazorEngine.Create();
@ -126,10 +116,10 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false);
}
}
var irDocument = codeDocument.GetDocumentIntermediateNode();
Assert.NotNull(irDocument);
var documentNode = codeDocument.GetDocumentIntermediateNode();
Assert.NotNull(documentNode);
return irDocument;
return documentNode;
}
}
}

View File

@ -69,9 +69,15 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperBodyIntermediateNode();
var node = new DefaultTagHelperBodyIntermediateNode()
{
Children =
{
new CSharpExpressionIntermediateNode(),
}
};
// Act
extension.WriteTagHelperBody(context, node);
@ -90,10 +96,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperBodyIntermediateNode()
{
Children =
{
new CSharpExpressionIntermediateNode(),
},
TagMode = TagMode.SelfClosing,
TagName = "p",
};
@ -118,7 +128,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperCreateIntermediateNode()
{
@ -143,7 +153,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperCreateIntermediateNode()
{
@ -169,7 +179,7 @@ __tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper);
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperExecuteIntermediateNode();
@ -189,7 +199,7 @@ __tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper);
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperExecuteIntermediateNode();
@ -216,7 +226,7 @@ __tagHelperExecutionContext = __tagHelperScopeManager.End();
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperHtmlAttributeIntermediateNode()
{
@ -242,6 +252,7 @@ __tagHelperExecutionContext = __tagHelperScopeManager.End();
var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal(
@"Render Children
Render Children
",
csharp,
ignoreLineEndingDifferences: true);
@ -252,7 +263,7 @@ __tagHelperExecutionContext = __tagHelperScopeManager.End();
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperHtmlAttributeIntermediateNode()
{
@ -287,7 +298,7 @@ __tagHelperExecutionContext.AddHtmlAttribute(""name"", Html.Raw(__tagHelperStrin
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperHtmlAttributeIntermediateNode()
{
@ -314,6 +325,7 @@ __tagHelperExecutionContext.AddHtmlAttribute(""name"", Html.Raw(__tagHelperStrin
Assert.Equal(
@"BeginAddHtmlAttributeValues(__tagHelperExecutionContext, ""name"", 2, global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
Render Children
Render Children
EndAddHtmlAttributeValues(__tagHelperExecutionContext);
",
csharp,
@ -325,7 +337,7 @@ EndAddHtmlAttributeValues(__tagHelperExecutionContext);
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -363,7 +375,7 @@ __InputTagHelper.StringProp = ""value"";
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -401,7 +413,7 @@ __InputTagHelper.StringProp = string.Empty;
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -443,7 +455,7 @@ __InputTagHelper.IntProp = 32;
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -480,7 +492,7 @@ __InputTagHelper.IntProp = 32;
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -522,7 +534,7 @@ __InputTagHelper.IntIndexer[""bound""] = 32;
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -559,7 +571,7 @@ __InputTagHelper.IntIndexer[""bound""] = 32;
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -602,7 +614,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.St
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -645,7 +657,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.In
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -683,7 +695,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.In
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -730,7 +742,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""foo-bound"", __InputTagHelpe
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperPropertyIntermediateNode()
{
@ -772,7 +784,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""foo-bound"", __InputTagHelpe
{
// Arrange
var extension = new DefaultTagHelperTargetExtension() { DesignTime = true };
var context = GetDesignTimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DefaultTagHelperRuntimeIntermediateNode();
@ -792,7 +804,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""foo-bound"", __InputTagHelpe
{
// Arrange
var extension = new DefaultTagHelperTargetExtension();
var context = GetRuntimeCodeRenderingContext();
var context = TestCodeRenderingContext.CreateRuntime();
var node = new DefaultTagHelperRuntimeIntermediateNode();
@ -825,50 +837,6 @@ private global::Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperScopeMana
ignoreLineEndingDifferences: true);
}
private static CodeRenderingContext GetRuntimeCodeRenderingContext()
{
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, null, options)
{
Items =
{
{ CodeRenderingContext.SuppressUniqueIds, "test" },
},
TagHelperWriter = new RuntimeTagHelperWriter(),
TagHelperRenderingContext = new TagHelperRenderingContext()
};
context.SetRenderChildren(n =>
{
codeWriter.WriteLine("Render Children");
});
return context;
}
private static CodeRenderingContext GetDesignTimeCodeRenderingContext()
{
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDesignTimeDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, null, options)
{
Items =
{
{ CodeRenderingContext.SuppressUniqueIds, "test" },
},
TagHelperWriter = new DesignTimeTagHelperWriter(),
TagHelperRenderingContext = new TagHelperRenderingContext()
};
context.SetRenderChildren(n =>
{
codeWriter.WriteLine("Render Children");
});
return context;
}
private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument)
{
var engine = RazorEngine.Create();

View File

@ -14,10 +14,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new DesignTimeDirectiveTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new DesignTimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DesignTimeDirectiveIntermediateNode();
@ -41,11 +38,7 @@ private void __RazorDirectiveTokenHelpers__() {
{
// Arrange
var extension = new DesignTimeDirectiveTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new DesignTimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DesignTimeDirectiveIntermediateNode();
var token = new DirectiveTokenIntermediateNode()
@ -80,11 +73,7 @@ System.String __typeHelper = default(System.String);
{
// Arrange
var extension = new DesignTimeDirectiveTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new DesignTimeNodeWriter();
var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DesignTimeDirectiveIntermediateNode();
var token = new DirectiveTokenIntermediateNode()
@ -119,11 +108,7 @@ global::System.Object __typeHelper = nameof(System.Collections.Generic);
{
// Arrange
var extension = new DesignTimeDirectiveTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new DesignTimeNodeWriter();
var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DesignTimeDirectiveIntermediateNode();
var token = new DirectiveTokenIntermediateNode()
@ -158,11 +143,7 @@ global::System.Object Foo = null;
{
// Arrange
var extension = new DesignTimeDirectiveTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new DesignTimeNodeWriter();
var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DesignTimeDirectiveIntermediateNode();
var token = new DirectiveTokenIntermediateNode()
@ -208,11 +189,7 @@ global::System.Object __typeHelper = ""Value"";
{
// Arrange
var extension = new DesignTimeDirectiveTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new DesignTimeNodeWriter();
var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options);
var context = TestCodeRenderingContext.CreateDesignTime();
var node = new DesignTimeDirectiveIntermediateNode();
var token = new DirectiveTokenIntermediateNode()

View File

@ -13,10 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode()
{
@ -43,10 +40,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode()
{
@ -73,10 +67,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new PreallocatedTagHelperHtmlAttributeIntermediateNode()
{
@ -100,10 +91,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var node = new PreallocatedTagHelperPropertyValueIntermediateNode()
{
@ -130,10 +118,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{
// Arrange
var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var context = TestCodeRenderingContext.CreateRuntime();
var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test");
tagHelperBuilder.TypeName("FooTagHelper");
@ -173,13 +158,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(_tagHelper1);
{
// Arrange
var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{
TagHelperRenderingContext = new TagHelperRenderingContext()
};
var context = TestCodeRenderingContext.CreateRuntime();
var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test");
tagHelperBuilder.TypeName("FooTagHelper");

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.AspNetCore.Razor.Language.Legacy;
using Xunit;
using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert;
@ -16,6 +17,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// Arrange
var node = new SectionIntermediateNode()
{
Children =
{
new CSharpExpressionIntermediateNode(),
},
Name = "MySection"
};
@ -24,26 +29,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
SectionMethodName = "CreateSection"
};
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{
TagHelperWriter = new RuntimeTagHelperWriter(),
};
context.SetRenderChildren((n) =>
{
Assert.Same(node, n);
context.CodeWriter.WriteLine(" var s = \"Inside\"");
});
var context = TestCodeRenderingContext.CreateRuntime();
// Act
extension.WriteSection(context, node);
// Assert
var expected = @"CreateSection(""MySection"", async() => {
var s = ""Inside""
Render Children
}
);
";
@ -58,6 +51,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// Arrange
var node = new SectionIntermediateNode()
{
Children =
{
new CSharpExpressionIntermediateNode(),
},
Name = "MySection"
};
@ -66,26 +63,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
SectionMethodName = "CreateSection"
};
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.Create(false, 4, true, false);
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{
TagHelperWriter = new RuntimeTagHelperWriter(),
};
context.SetRenderChildren((n) =>
{
Assert.Same(node, n);
context.CodeWriter.WriteLine(" var s = \"Inside\"");
});
var context = TestCodeRenderingContext.CreateDesignTime();
// Act
extension.WriteSection(context, node);
// Assert
var expected = @"CreateSection(""MySection"", async(__razor_section_writer) => {
var s = ""Inside""
Render Children
}
);
";

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.Extensions
@ -12,29 +13,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
public void WriteTemplate_WritesTemplateCode()
{
// Arrange
var node = new TemplateIntermediateNode();
var node = new TemplateIntermediateNode()
{
Children =
{
new CSharpExpressionIntermediateNode()
}
};
var extension = new TemplateTargetExtension()
{
TemplateTypeName = "global::TestTemplate"
};
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter()
{
PushWriterMethod = "TestPushWriter",
PopWriterMethod = "TestPopWriter"
};
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{
TagHelperWriter = new RuntimeTagHelperWriter(),
};
context.SetRenderChildren((n) =>
{
Assert.Same(node, n);
context.CodeWriter.WriteLine(" var s = \"Inside\"");
});
var context = TestCodeRenderingContext.CreateRuntime(nodeWriter: nodeWriter);
// Act
extension.WriteTemplate(context, node);
@ -42,7 +39,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// Assert
var expected = @"item => new global::TestTemplate(async(__razor_template_writer) => {
TestPushWriter(__razor_template_writer);
var s = ""Inside""
Render Children
TestPopWriter();
}
)";

View File

@ -0,0 +1,99 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
public static class TestCodeRenderingContext
{
public static CodeRenderingContext CreateDesignTime(
string newLineString = null,
string suppressUniqueIds = "test",
RazorSourceDocument source = null,
IntermediateNodeWriter nodeWriter = null)
{
var codeWriter = new CodeWriter();
var documentNode = new DocumentIntermediateNode();
var options = RazorCodeGenerationOptions.CreateDesignTimeDefault();
if (source == null)
{
source = TestRazorSourceDocument.Create();
}
var codeDocument = RazorCodeDocument.Create(source);
if (newLineString != null)
{
codeDocument.Items[CodeRenderingContext.NewLineString] = newLineString;
}
if (suppressUniqueIds != null)
{
codeDocument.Items[CodeRenderingContext.SuppressUniqueIds] = suppressUniqueIds;
}
if (nodeWriter == null)
{
nodeWriter = new DesignTimeNodeWriter();
}
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument, documentNode, options);
context.Visitor = new RenderChildrenVisitor(context);
return context;
}
public static CodeRenderingContext CreateRuntime(
string newLineString = null,
string suppressUniqueIds = "test",
RazorSourceDocument source = null,
IntermediateNodeWriter nodeWriter = null)
{
var codeWriter = new CodeWriter();
var documentNode = new DocumentIntermediateNode();
var options = RazorCodeGenerationOptions.CreateDefault();
if (source == null)
{
source = TestRazorSourceDocument.Create();
}
var codeDocument = RazorCodeDocument.Create(source);
if (newLineString != null)
{
codeDocument.Items[CodeRenderingContext.NewLineString] = newLineString;
}
if (suppressUniqueIds != null)
{
codeDocument.Items[CodeRenderingContext.SuppressUniqueIds] = suppressUniqueIds;
}
if (nodeWriter == null)
{
nodeWriter = new RuntimeNodeWriter();
}
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument, documentNode, options);
context.Visitor = new RenderChildrenVisitor(context);
return context;
}
private class RenderChildrenVisitor : IntermediateNodeVisitor
{
private readonly CodeRenderingContext _context;
public RenderChildrenVisitor(CodeRenderingContext context)
{
_context = context;
}
public override void VisitDefault(IntermediateNode node)
{
_context.CodeWriter.WriteLine("Render Children");
}
}
}
}