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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration 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 NewLineString = "NewLineString";
internal static readonly object SuppressUniqueIds = "SuppressUniqueIds"; 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 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 RazorDiagnosticCollection Diagnostics { get; }
public abstract ItemCollection Items { get; }
public abstract string DocumentKind { 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 CodeRenderingContext _context;
private readonly IntermediateNodeWriter _writer;
public IntermediateNodeWriterScope(CodeRenderingContext context, IntermediateNodeWriter writer) public Scope(CodeRenderingContext context)
{ {
if (context == null) if (context == null)
{ {
throw new ArgumentNullException(nameof(context)); throw new ArgumentNullException(nameof(context));
} }
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
_context = context; _context = context;
_writer = writer;
} }
public void Dispose() public void Dispose()
{ {
_context.NodeWriter = _writer; _context.EndScope();
} }
} }
@ -102,22 +61,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
// All bits below here are temporary // All bits below here are temporary
#region Temporary TagHelper bits #region Temporary TagHelper bits
internal TagHelperWriter TagHelperWriter { get; set; }
internal TagHelperRenderingContext TagHelperRenderingContext { 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) internal TagHelperRenderingContextScope Push(TagHelperRenderingContext context)
{ {
if (context == null) if (context == null)
@ -130,33 +76,6 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return scope; 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 internal struct TagHelperRenderingContextScope : IDisposable
{ {
private readonly CodeRenderingContext _context; 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; 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
internal class DefaultCodeRenderingContext : CodeRenderingContext internal class DefaultCodeRenderingContext : CodeRenderingContext
{ {
// Internal for unit testing private readonly RazorCodeDocument _codeDocument;
internal DefaultCodeRenderingContext( private readonly DocumentIntermediateNode _documentNode;
CodeWriter codeWriter,
IntermediateNodeWriter nodeWriter, private readonly List<ScopeInternal> _scopes;
RazorSourceDocument sourceDocument,
RazorCodeGenerationOptions options)
: this (codeWriter, nodeWriter, null, sourceDocument, options)
{
}
public DefaultCodeRenderingContext( public DefaultCodeRenderingContext(
CodeWriter codeWriter, CodeWriter codeWriter,
IntermediateNodeWriter nodeWriter, IntermediateNodeWriter nodeWriter,
string documentKind, RazorCodeDocument codeDocument,
RazorSourceDocument sourceDocument, DocumentIntermediateNode documentNode,
RazorCodeGenerationOptions options) 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; CodeWriter = codeWriter;
NodeWriter = nodeWriter; _codeDocument = codeDocument;
DocumentKind = documentKind; _documentNode = documentNode;
SourceDocument = sourceDocument;
Options = options; Options = options;
Diagnostics = new DefaultRazorDiagnosticCollection(); Diagnostics = new DefaultRazorDiagnosticCollection();
Items = new DefaultItemCollection(); 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 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 RazorDiagnosticCollection Diagnostics { get; }
public override ItemCollection Items { get; }
public override string DocumentKind { 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) if (writer == null)
{ {
throw new ArgumentNullException(nameof(writer)); throw new ArgumentNullException(nameof(writer));
} }
var scope = new IntermediateNodeWriterScope(this, NodeWriter); _scopes.Add(new ScopeInternal(writer));
NodeWriter = writer; return new Scope(this);
return scope; }
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 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>() 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Linq;
using System.Text; using System.Text;
using Microsoft.AspNetCore.Razor.Language.Intermediate; using Microsoft.AspNetCore.Razor.Language.Intermediate;
@ -9,63 +10,57 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
internal class DefaultDocumentWriter : DocumentWriter internal class DefaultDocumentWriter : DocumentWriter
{ {
private readonly CodeRenderingContext _context; private readonly CodeTarget _codeTarget;
private readonly CodeTarget _target; private readonly RazorCodeGenerationOptions _options;
public DefaultDocumentWriter(CodeTarget target, CodeRenderingContext context) public DefaultDocumentWriter(CodeTarget codeTarget, RazorCodeGenerationOptions options)
{ {
if (target == null) _codeTarget = codeTarget;
{ _options = options;
throw new ArgumentNullException(nameof(target));
}
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
_target = target;
_context = context;
} }
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); if (documentNode == null)
_context.SetRenderNode(visitor.Visit); {
_context.SetRenderChildren(visitor.RenderChildren); 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.Visitor.VisitDocument(documentNode);
_context.SetRenderNode(null);
var cSharp = context.CodeWriter.GenerateCode();
return new DefaultRazorCSharpDocument(
cSharp,
_options,
context.Diagnostics.ToArray(),
context.LineMappings.ToArray());
} }
private class Visitor : IntermediateNodeVisitor private class Visitor : IntermediateNodeVisitor
{ {
private readonly CodeRenderingContext _context; private readonly DefaultCodeRenderingContext _context;
private readonly CodeTarget _target; private readonly CodeTarget _target;
public Visitor(CodeTarget target, CodeRenderingContext context) public Visitor(CodeTarget target, DefaultCodeRenderingContext context)
{ {
_target = target; _target = target;
_context = context; _context = context;
} }
private CodeRenderingContext Context => _context; private DefaultCodeRenderingContext Context => _context;
public void RenderChildren(IntermediateNode node)
{
for (var i = 0; i < node.Children.Count; i++)
{
var child = node.Children[i];
Visit(child);
}
}
public override void VisitDocument(DocumentIntermediateNode node) public override void VisitDocument(DocumentIntermediateNode node)
{ {
@ -102,7 +97,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
.WriteLine("// <auto-generated/>") .WriteLine("// <auto-generated/>")
.WriteLine("#pragma warning disable 1591"); .WriteLine("#pragma warning disable 1591");
RenderChildren(node); VisitDefault(node);
Context.CodeWriter.WriteLine("#pragma warning restore 1591"); Context.CodeWriter.WriteLine("#pragma warning restore 1591");
} }
@ -117,7 +112,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
using (Context.CodeWriter.BuildNamespace(node.Content)) using (Context.CodeWriter.BuildNamespace(node.Content))
{ {
Context.CodeWriter.WriteLine("#line hidden"); 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)) 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()) using (Context.CodeWriter.BuildScope())
{ {
RenderChildren(node); VisitDefault(node);
} }
Context.CodeWriter.WriteLine("#pragma warning restore 1998"); Context.CodeWriter.WriteLine("#pragma warning restore 1998");
@ -209,7 +204,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
using (Context.Push(tagHelperRenderingContext)) 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. // 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. // 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; using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public abstract class DocumentWriter 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) protected override void ExecuteCore(RazorCodeDocument codeDocument)
{ {
var irDocument = codeDocument.GetDocumentIntermediateNode(); var documentNode = codeDocument.GetDocumentIntermediateNode();
ThrowForMissingDocumentDependency(irDocument); ThrowForMissingDocumentDependency(documentNode);
var target = irDocument.Target; var target = documentNode.Target;
if (target == null) if (target == null)
{ {
var message = Resources.FormatDocumentMissingTarget( var message = Resources.FormatDocumentMissingTarget(
irDocument.DocumentKind, documentNode.DocumentKind,
nameof(CodeTarget), nameof(CodeTarget),
nameof(DocumentIntermediateNode.Target)); nameof(DocumentIntermediateNode.Target));
throw new InvalidOperationException(message); throw new InvalidOperationException(message);
} }
var context = CodeRenderingContext.Create(codeDocument, irDocument.Options); var writer = new DefaultDocumentWriter(documentNode.Target, documentNode.Options);
var documentWriter = target.CreateWriter(context); var cSharpDocument = writer.WriteDocument(codeDocument, documentNode);
documentWriter.WriteDocument(irDocument); codeDocument.SetCSharpDocument(cSharpDocument);
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);
} }
} }
} }

View File

@ -107,8 +107,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
.WriteParameterSeparator(); .WriteParameterSeparator();
// We remove and redirect writers so TagHelper authors can retrieve content. // We remove and redirect writers so TagHelper authors can retrieve content.
using (context.Push(new RuntimeNodeWriter())) using (context.CreateScope(new RuntimeNodeWriter()))
using (context.Push(new RuntimeTagHelperWriter()))
{ {
using (context.CodeWriter.BuildAsyncLambda()) using (context.CodeWriter.BuildAsyncLambda())
{ {
@ -215,7 +214,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
.Write(attributeValueStyleParameter) .Write(attributeValueStyleParameter)
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
using (context.Push(new TagHelperHtmlAttributeRuntimeNodeWriter())) using (context.CreateScope(new TagHelperHtmlAttributeRuntimeNodeWriter()))
{ {
context.RenderChildren(node); 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 // 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 // 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. // ensure we capture all content that's written, directly or indirectly.
using (context.Push(new RuntimeNodeWriter())) using (context.CreateScope(new RuntimeNodeWriter()))
using (context.Push(new RuntimeTagHelperWriter()))
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
@ -335,7 +333,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
context.CodeWriter.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName); context.CodeWriter.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName);
using (context.Push(new LiteralRuntimeNodeWriter())) using (context.CreateScope(new LiteralRuntimeNodeWriter()))
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }

View File

@ -4,6 +4,7 @@
using System; using System;
using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Language.CodeGeneration; using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.AspNetCore.Razor.Language.Legacy; using Microsoft.AspNetCore.Razor.Language.Legacy;
using Xunit; using Xunit;
@ -15,7 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
public void InjectDirectiveTargetExtension_WritesProperty() public void InjectDirectiveTargetExtension_WritesProperty()
{ {
// Arrange // Arrange
var context = GetRenderingContext(); var context = TestCodeRenderingContext.CreateRuntime();
var target = new InjectTargetExtension(); var target = new InjectTargetExtension();
var node = new InjectIntermediateNode() var node = new InjectIntermediateNode()
{ {
@ -37,7 +38,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
public void InjectDirectiveTargetExtension_WritesPropertyWithLinePragma_WhenSourceIsSet() public void InjectDirectiveTargetExtension_WritesPropertyWithLinePragma_WhenSourceIsSet()
{ {
// Arrange // Arrange
var context = GetRenderingContext(); var context = TestCodeRenderingContext.CreateRuntime();
var target = new InjectTargetExtension(); var target = new InjectTargetExtension();
var node = new InjectIntermediateNode() var node = new InjectIntermediateNode()
{ {
@ -63,15 +64,5 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
"#line hidden" + Environment.NewLine, "#line hidden" + Environment.NewLine,
context.CodeWriter.Builder.ToString()); 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] [Fact]
public void CreateWriter_CreatesDefaultDocumentWriter() public void CreateWriter_DesignTime_CreatesDesignTimeNodeWriter()
{ {
// Arrange // Arrange
var codeWriter = new CodeWriter(); var options = RazorCodeGenerationOptions.CreateDesignTimeDefault();
var codeDocument = TestRazorCodeDocument.Create(string.Empty);
var options = RazorCodeGenerationOptions.CreateDefault();
var context = CodeRenderingContext.Create(codeDocument, options);
var target = new DefaultCodeTarget(options, Enumerable.Empty<ICodeTargetExtension>()); var target = new DefaultCodeTarget(options, Enumerable.Empty<ICodeTargetExtension>());
// Act // Act
var writer = target.CreateWriter(context); var writer = target.CreateNodeWriter();
// Assert // 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] [Fact]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -13,10 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateRuntime();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode() var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode()
{ {
@ -43,10 +40,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateRuntime();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode() var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode()
{ {
@ -73,10 +67,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateRuntime();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new PreallocatedTagHelperHtmlAttributeIntermediateNode() var node = new PreallocatedTagHelperHtmlAttributeIntermediateNode()
{ {
@ -100,10 +91,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateRuntime();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new PreallocatedTagHelperPropertyValueIntermediateNode() var node = new PreallocatedTagHelperPropertyValueIntermediateNode()
{ {
@ -130,10 +118,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateRuntime();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test"); var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test");
tagHelperBuilder.TypeName("FooTagHelper"); tagHelperBuilder.TypeName("FooTagHelper");
@ -173,13 +158,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(_tagHelper1);
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateRuntime();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{
TagHelperRenderingContext = new TagHelperRenderingContext()
};
var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test"); var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test");
tagHelperBuilder.TypeName("FooTagHelper"); 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. // 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.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.AspNetCore.Razor.Language.Legacy; using Microsoft.AspNetCore.Razor.Language.Legacy;
using Xunit; using Xunit;
using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert; using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert;
@ -16,6 +17,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// Arrange // Arrange
var node = new SectionIntermediateNode() var node = new SectionIntermediateNode()
{ {
Children =
{
new CSharpExpressionIntermediateNode(),
},
Name = "MySection" Name = "MySection"
}; };
@ -24,26 +29,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
SectionMethodName = "CreateSection" SectionMethodName = "CreateSection"
}; };
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateRuntime();
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\"");
});
// Act // Act
extension.WriteSection(context, node); extension.WriteSection(context, node);
// Assert // Assert
var expected = @"CreateSection(""MySection"", async() => { var expected = @"CreateSection(""MySection"", async() => {
var s = ""Inside"" Render Children
} }
); );
"; ";
@ -58,6 +51,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// Arrange // Arrange
var node = new SectionIntermediateNode() var node = new SectionIntermediateNode()
{ {
Children =
{
new CSharpExpressionIntermediateNode(),
},
Name = "MySection" Name = "MySection"
}; };
@ -66,26 +63,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
SectionMethodName = "CreateSection" SectionMethodName = "CreateSection"
}; };
var codeWriter = new CodeWriter(); var context = TestCodeRenderingContext.CreateDesignTime();
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\"");
});
// Act // Act
extension.WriteSection(context, node); extension.WriteSection(context, node);
// Assert // Assert
var expected = @"CreateSection(""MySection"", async(__razor_section_writer) => { 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. // 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.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.Extensions namespace Microsoft.AspNetCore.Razor.Language.Extensions
@ -12,29 +13,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
public void WriteTemplate_WritesTemplateCode() public void WriteTemplate_WritesTemplateCode()
{ {
// Arrange // Arrange
var node = new TemplateIntermediateNode(); var node = new TemplateIntermediateNode()
{
Children =
{
new CSharpExpressionIntermediateNode()
}
};
var extension = new TemplateTargetExtension() var extension = new TemplateTargetExtension()
{ {
TemplateTypeName = "global::TestTemplate" TemplateTypeName = "global::TestTemplate"
}; };
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter() var nodeWriter = new RuntimeNodeWriter()
{ {
PushWriterMethod = "TestPushWriter", PushWriterMethod = "TestPushWriter",
PopWriterMethod = "TestPopWriter" PopWriterMethod = "TestPopWriter"
}; };
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{
TagHelperWriter = new RuntimeTagHelperWriter(),
};
context.SetRenderChildren((n) => var context = TestCodeRenderingContext.CreateRuntime(nodeWriter: nodeWriter);
{
Assert.Same(node, n);
context.CodeWriter.WriteLine(" var s = \"Inside\"");
});
// Act // Act
extension.WriteTemplate(context, node); extension.WriteTemplate(context, node);
@ -42,7 +39,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// Assert // Assert
var expected = @"item => new global::TestTemplate(async(__razor_template_writer) => { var expected = @"item => new global::TestTemplate(async(__razor_template_writer) => {
TestPushWriter(__razor_template_writer); TestPushWriter(__razor_template_writer);
var s = ""Inside"" Render Children
TestPopWriter(); 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");
}
}
}
}