Productionize the csharp rendering context APIs.

- Rename `CSharpRenderingContext` => `CodeRenderingContext`.
- Rename `CSharpCodeWriter` => `CodeWriter`
- Rename `BasicWriter` => `IntermediateNodeWriter`
- Rename `...BasicWriter` => `...NodeWriter`
- Made `CodeRenderingContext` a public abstract API. Left temporary TagHelper pieces in the class since these will be removed soon.
- Moved several `CodeRenderingContext` methods into extension methods. These make use of the Items collection.
- Moved the reporting of missing code target extensions into the `ExtensionIntermediateNode`. This is the integration point of `CodeTarget`s and `CodeRenderingContext`s; therefore, it made more sense existing there.
- Left SetRenderChildren/SetRenderNode as extension methods due to how they're wired up. Aka, to create a `CodeTarget` you need a `CodeRenderingContext`... To Create a `DocumentWriter` you need a `CodeTarget`... To set the render methods on the context you need a `DocumentWriter`.
- Updated tests to utilize the new code renering constructs.
- Moved code generation testability features from `CSharpLoweringPhase` to the `CodeRenderingContext.Items`.

#1043
This commit is contained in:
N. Taylor Mullen 2017-06-29 12:22:09 -07:00
parent f5c55727a4
commit 2a6f0e4dc9
56 changed files with 1155 additions and 1057 deletions

View File

@ -7,6 +7,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
{ {
public interface IInjectTargetExtension : ICodeTargetExtension public interface IInjectTargetExtension : ICodeTargetExtension
{ {
void WriteInjectProperty(CSharpRenderingContext context, InjectIntermediateNode node); void WriteInjectProperty(CodeRenderingContext context, InjectIntermediateNode node);
} }
} }

View File

@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
AcceptExtensionNode<InjectIntermediateNode>(this, visitor); AcceptExtensionNode<InjectIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -41,7 +41,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
var extension = target.GetExtension<IInjectTargetExtension>(); var extension = target.GetExtension<IInjectTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<IInjectTargetExtension>(); ReportMissingCodeTargetExtension<IInjectTargetExtension>(context);
return; return;
} }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
{ {
private const string RazorInjectAttribute = "[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]"; private const string RazorInjectAttribute = "[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]";
public void WriteInjectProperty(CSharpRenderingContext context, InjectIntermediateNode node) public void WriteInjectProperty(CodeRenderingContext context, InjectIntermediateNode node)
{ {
if (context == null) if (context == null)
{ {
@ -26,16 +26,16 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
if (node.Source.HasValue) if (node.Source.HasValue)
{ {
using (context.Writer.BuildLinePragma(node.Source.Value)) using (context.CodeWriter.BuildLinePragma(node.Source.Value))
{ {
context.Writer context.CodeWriter
.WriteLine(RazorInjectAttribute) .WriteLine(RazorInjectAttribute)
.WriteLine(property); .WriteLine(property);
} }
} }
else else
{ {
context.Writer context.CodeWriter
.WriteLine(RazorInjectAttribute) .WriteLine(RazorInjectAttribute)
.WriteLine(property); .WriteLine(property);
} }

View File

@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
private void GenerateVCTHClass(ClassDeclarationIntermediateNode @class, TagHelperDescriptor tagHelper) private void GenerateVCTHClass(ClassDeclarationIntermediateNode @class, TagHelperDescriptor tagHelper)
{ {
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
WriteClass(writer, tagHelper); WriteClass(writer, tagHelper);
var statement = new CSharpCodeIntermediateNode(); var statement = new CSharpCodeIntermediateNode();
@ -93,7 +93,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
return $"__Generated__{vcName}ViewComponentTagHelper"; return $"__Generated__{vcName}ViewComponentTagHelper";
} }
private void WriteClass(CSharpCodeWriter writer, TagHelperDescriptor descriptor) private void WriteClass(CodeWriter writer, TagHelperDescriptor descriptor)
{ {
// Add target element. // Add target element.
BuildTargetElementString(writer, descriptor); BuildTargetElementString(writer, descriptor);
@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
} }
} }
private void BuildConstructorString(CSharpCodeWriter writer, string className) private void BuildConstructorString(CodeWriter writer, string className)
{ {
writer.Write("public ") writer.Write("public ")
.Write(className) .Write(className)
@ -136,7 +136,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
} }
} }
private void BuildAttributeDeclarations(CSharpCodeWriter writer, TagHelperDescriptor descriptor) private void BuildAttributeDeclarations(CodeWriter writer, TagHelperDescriptor descriptor)
{ {
writer.Write("[") writer.Write("[")
.Write("Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute") .Write("Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute")
@ -165,7 +165,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
} }
} }
private void BuildProcessMethodString(CSharpCodeWriter writer, TagHelperDescriptor descriptor) private void BuildProcessMethodString(CodeWriter writer, TagHelperDescriptor descriptor)
{ {
var contextVariable = "context"; var contextVariable = "context";
var outputVariable = "output"; var outputVariable = "output";
@ -210,7 +210,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
return methodParameters; return methodParameters;
} }
private void BuildTargetElementString(CSharpCodeWriter writer, TagHelperDescriptor descriptor) private void BuildTargetElementString(CodeWriter writer, TagHelperDescriptor descriptor)
{ {
Debug.Assert(descriptor.TagMatchingRules.Count() == 1); Debug.Assert(descriptor.TagMatchingRules.Count() == 1);

View File

@ -1,30 +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
{
public abstract class BasicWriter
{
public abstract void WriteUsingDirective(CSharpRenderingContext context, UsingDirectiveIntermediateNode node);
public abstract void WriteCSharpExpression(CSharpRenderingContext context, CSharpExpressionIntermediateNode node);
public abstract void WriteCSharpCode(CSharpRenderingContext context, CSharpCodeIntermediateNode node);
public abstract void WriteHtmlContent(CSharpRenderingContext context, HtmlContentIntermediateNode node);
public abstract void WriteHtmlAttribute(CSharpRenderingContext context, HtmlAttributeIntermediateNode node);
public abstract void WriteHtmlAttributeValue(CSharpRenderingContext context, HtmlAttributeValueIntermediateNode node);
public abstract void WriteCSharpExpressionAttributeValue(CSharpRenderingContext context, CSharpExpressionAttributeValueIntermediateNode node);
public abstract void WriteCSharpCodeAttributeValue(CSharpRenderingContext context, CSharpCodeAttributeValueIntermediateNode node);
public abstract void BeginWriterScope(CSharpRenderingContext context, string writer);
public abstract void EndWriterScope(CSharpRenderingContext context);
}
}

View File

@ -1,178 +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 class CSharpRenderingContext
{
internal ICollection<DirectiveDescriptor> Directives { get; set; }
internal Func<string> IdGenerator { get; set; } = () => Guid.NewGuid().ToString("N");
internal List<LineMapping> LineMappings { get; } = new List<LineMapping>();
public CSharpCodeWriter Writer { get; set; }
internal IList<RazorDiagnostic> Diagnostics { get; } = new List<RazorDiagnostic>();
internal RazorCodeDocument CodeDocument { get; set; }
internal RazorSourceDocument SourceDocument => CodeDocument?.Source;
internal RazorCodeGenerationOptions Options { get; set; }
internal TagHelperRenderingContext TagHelperRenderingContext { get; set; }
internal Action<IntermediateNode> RenderChildren { get; set; }
internal Action<IntermediateNode> RenderNode { get; set; }
public BasicWriter BasicWriter { get; set; }
public TagHelperWriter TagHelperWriter { get; set; }
public void AddLineMappingFor(IntermediateNode 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(Writer.Location, source.Length);
var lineMapping = new LineMapping(source, generatedLocation);
LineMappings.Add(lineMapping);
}
public BasicWriterScope Push(BasicWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
var scope = new BasicWriterScope(this, BasicWriter);
BasicWriter = writer;
return scope;
}
public TagHelperWriterScope Push(TagHelperWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
var scope = new TagHelperWriterScope(this, TagHelperWriter);
TagHelperWriter = writer;
return scope;
}
public void ReportMissingExtension<TExtension>() where TExtension : ICodeTargetExtension
{
var documentKind = CodeDocument.GetDocumentIntermediateNode()?.DocumentKind ?? string.Empty;
Diagnostics.Add(RazorDiagnosticFactory.CreateCodeTarget_UnsupportedExtension(documentKind, typeof(TExtension)));
}
internal TagHelperRenderingContextScope Push(TagHelperRenderingContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var scope = new TagHelperRenderingContextScope(this, TagHelperRenderingContext);
TagHelperRenderingContext = context;
return scope;
}
public struct BasicWriterScope : IDisposable
{
private readonly CSharpRenderingContext _context;
private readonly BasicWriter _writer;
public BasicWriterScope(CSharpRenderingContext context, BasicWriter 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.BasicWriter = _writer;
}
}
public struct TagHelperWriterScope : IDisposable
{
private readonly CSharpRenderingContext _context;
private readonly TagHelperWriter _writer;
public TagHelperWriterScope(CSharpRenderingContext context, TagHelperWriter writer)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
_context = context;
_writer = writer;
}
public void Dispose()
{
_context.TagHelperWriter = _writer;
}
}
internal struct TagHelperRenderingContextScope : IDisposable
{
private readonly CSharpRenderingContext _context;
private readonly TagHelperRenderingContext _renderingContext;
public TagHelperRenderingContextScope(CSharpRenderingContext context, TagHelperRenderingContext renderingContext)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
_context = context;
_renderingContext = renderingContext;
}
public void Dispose()
{
_context.TagHelperRenderingContext = _renderingContext;
}
}
}
}

View File

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

View File

@ -0,0 +1,126 @@
// 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(CSharpRenderingContext context); public abstract DocumentWriter CreateWriter(CodeRenderingContext context);
public abstract TExtension GetExtension<TExtension>() where TExtension : class, ICodeTargetExtension; public abstract TExtension GetExtension<TExtension>() where TExtension : class, ICodeTargetExtension;

View File

@ -10,7 +10,7 @@ using System.Text;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public sealed class CSharpCodeWriter public sealed class CodeWriter
{ {
private const string InstanceMethodFormat = "{0}.{1}"; private const string InstanceMethodFormat = "{0}.{1}";
@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public SourceLocation Location => new SourceLocation(_absoluteIndex, _currentLineIndex, _currentLineCharacterIndex); public SourceLocation Location => new SourceLocation(_absoluteIndex, _currentLineIndex, _currentLineCharacterIndex);
// Internal for testing. // Internal for testing.
internal CSharpCodeWriter Indent(int size) internal CodeWriter Indent(int size)
{ {
if (IsAfterNewLine) if (IsAfterNewLine)
{ {
@ -62,7 +62,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return this; return this;
} }
public CSharpCodeWriter Write(string data) public CodeWriter Write(string data)
{ {
if (data == null) if (data == null)
{ {
@ -72,7 +72,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return Write(data, 0, data.Length); return Write(data, 0, data.Length);
} }
public CSharpCodeWriter Write(string data, int index, int count) public CodeWriter Write(string data, int index, int count)
{ {
if (data == null || count == 0) if (data == null || count == 0)
{ {
@ -147,7 +147,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return this; return this;
} }
public CSharpCodeWriter WriteLine() public CodeWriter WriteLine()
{ {
Builder.Append(NewLine); Builder.Append(NewLine);
@ -161,7 +161,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return this; return this;
} }
public CSharpCodeWriter WriteLine(string data) public CodeWriter WriteLine(string data)
{ {
return Write(data).WriteLine(); return Write(data).WriteLine();
} }
@ -177,7 +177,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return _cache; return _cache;
} }
public CSharpCodeWriter WritePadding(int offset, SourceSpan? span, CSharpRenderingContext context) public CodeWriter WritePadding(int offset, SourceSpan? span, CodeRenderingContext context)
{ {
if (span == null) if (span == null)
{ {
@ -237,7 +237,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
public CSharpCodeWriter WriteVariableDeclaration(string type, string name, string value) public CodeWriter WriteVariableDeclaration(string type, string name, string value)
{ {
Write(type).Write(" ").Write(name); Write(type).Write(" ").Write(name);
if (!string.IsNullOrEmpty(value)) if (!string.IsNullOrEmpty(value))
@ -254,27 +254,27 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return this; return this;
} }
public CSharpCodeWriter WriteBooleanLiteral(bool value) public CodeWriter WriteBooleanLiteral(bool value)
{ {
return Write(value.ToString().ToLowerInvariant()); return Write(value.ToString().ToLowerInvariant());
} }
public CSharpCodeWriter WriteStartAssignment(string name) public CodeWriter WriteStartAssignment(string name)
{ {
return Write(name).Write(" = "); return Write(name).Write(" = ");
} }
public CSharpCodeWriter WriteParameterSeparator() public CodeWriter WriteParameterSeparator()
{ {
return Write(", "); return Write(", ");
} }
public CSharpCodeWriter WriteStartNewObject(string typeName) public CodeWriter WriteStartNewObject(string typeName)
{ {
return Write("new ").Write(typeName).Write("("); return Write("new ").Write(typeName).Write("(");
} }
public CSharpCodeWriter WriteStringLiteral(string literal) public CodeWriter WriteStringLiteral(string literal)
{ {
if (literal.Length >= 256 && literal.Length <= 1500 && literal.IndexOf('\0') == -1) if (literal.Length >= 256 && literal.Length <= 1500 && literal.IndexOf('\0') == -1)
{ {
@ -288,12 +288,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return this; return this;
} }
public CSharpCodeWriter WriteUsing(string name) public CodeWriter WriteUsing(string name)
{ {
return WriteUsing(name, endLine: true); return WriteUsing(name, endLine: true);
} }
public CSharpCodeWriter WriteUsing(string name, bool endLine) public CodeWriter WriteUsing(string name, bool endLine)
{ {
Write("using "); Write("using ");
Write(name); Write(name);
@ -311,8 +311,8 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
/// </summary> /// </summary>
/// <param name="location">The location to generate the line pragma for.</param> /// <param name="location">The location to generate the line pragma for.</param>
/// <param name="file">The file to generate the line pragma for.</param> /// <param name="file">The file to generate the line pragma for.</param>
/// <returns>The current instance of <see cref="CSharpCodeWriter"/>.</returns> /// <returns>The current instance of <see cref="CodeWriter"/>.</returns>
public CSharpCodeWriter WriteLineNumberDirective(SourceSpan location, string file) public CodeWriter WriteLineNumberDirective(SourceSpan location, string file)
{ {
if (location.FilePath != null) if (location.FilePath != null)
{ {
@ -328,19 +328,19 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return Write("#line ").Write(lineNumberAsString).Write(" \"").Write(file).WriteLine("\""); return Write("#line ").Write(lineNumberAsString).Write(" \"").Write(file).WriteLine("\"");
} }
public CSharpCodeWriter WriteStartMethodInvocation(string methodName) public CodeWriter WriteStartMethodInvocation(string methodName)
{ {
Write(methodName); Write(methodName);
return Write("("); return Write("(");
} }
public CSharpCodeWriter WriteEndMethodInvocation() public CodeWriter WriteEndMethodInvocation()
{ {
return WriteEndMethodInvocation(endLine: true); return WriteEndMethodInvocation(endLine: true);
} }
public CSharpCodeWriter WriteEndMethodInvocation(bool endLine) public CodeWriter WriteEndMethodInvocation(bool endLine)
{ {
Write(")"); Write(")");
if (endLine) if (endLine)
@ -352,7 +352,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
// Writes a method invocation for the given instance name. // Writes a method invocation for the given instance name.
public CSharpCodeWriter WriteInstanceMethodInvocation( public CodeWriter WriteInstanceMethodInvocation(
string instanceName, string instanceName,
string methodName, string methodName,
params string[] parameters) params string[] parameters)
@ -371,7 +371,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
// Writes a method invocation for the given instance name. // Writes a method invocation for the given instance name.
public CSharpCodeWriter WriteInstanceMethodInvocation( public CodeWriter WriteInstanceMethodInvocation(
string instanceName, string instanceName,
string methodName, string methodName,
bool endLine, bool endLine,
@ -393,7 +393,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
parameters); parameters);
} }
public CSharpCodeWriter WriteStartInstanceMethodInvocation(string instanceName, string methodName) public CodeWriter WriteStartInstanceMethodInvocation(string instanceName, string methodName)
{ {
if (instanceName == null) if (instanceName == null)
{ {
@ -409,7 +409,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
string.Format(CultureInfo.InvariantCulture, InstanceMethodFormat, instanceName, methodName)); string.Format(CultureInfo.InvariantCulture, InstanceMethodFormat, instanceName, methodName));
} }
public CSharpCodeWriter WriteField(IList<string> modifiers, string typeName, string fieldName) public CodeWriter WriteField(IList<string> modifiers, string typeName, string fieldName)
{ {
if (modifiers == null) if (modifiers == null)
{ {
@ -441,19 +441,19 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
return this; return this;
} }
public CSharpCodeWriter WriteMethodInvocation(string methodName, params string[] parameters) public CodeWriter WriteMethodInvocation(string methodName, params string[] parameters)
{ {
return WriteMethodInvocation(methodName, endLine: true, parameters: parameters); return WriteMethodInvocation(methodName, endLine: true, parameters: parameters);
} }
public CSharpCodeWriter WriteMethodInvocation(string methodName, bool endLine, params string[] parameters) public CodeWriter WriteMethodInvocation(string methodName, bool endLine, params string[] parameters)
{ {
return WriteStartMethodInvocation(methodName) return WriteStartMethodInvocation(methodName)
.Write(string.Join(", ", parameters)) .Write(string.Join(", ", parameters))
.WriteEndMethodInvocation(endLine); .WriteEndMethodInvocation(endLine);
} }
public CSharpCodeWriter WriteAutoPropertyDeclaration(IList<string> modifiers, string typeName, string propertyName) public CodeWriter WriteAutoPropertyDeclaration(IList<string> modifiers, string typeName, string propertyName)
{ {
if (modifiers == null) if (modifiers == null)
{ {
@ -675,12 +675,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public struct CSharpCodeWritingScope : IDisposable public struct CSharpCodeWritingScope : IDisposable
{ {
private CSharpCodeWriter _writer; private CodeWriter _writer;
private bool _autoSpace; private bool _autoSpace;
private int _tabSize; private int _tabSize;
private int _startIndent; private int _startIndent;
public CSharpCodeWritingScope(CSharpCodeWriter writer, int tabSize = 4, bool autoSpace = true) public CSharpCodeWritingScope(CodeWriter writer, int tabSize = 4, bool autoSpace = true)
{ {
_writer = writer; _writer = writer;
_autoSpace = true; _autoSpace = true;
@ -730,10 +730,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
private class LinePragmaWriter : IDisposable private class LinePragmaWriter : IDisposable
{ {
private readonly CSharpCodeWriter _writer; private readonly CodeWriter _writer;
private readonly int _startIndent; private readonly int _startIndent;
public LinePragmaWriter(CSharpCodeWriter writer, SourceSpan documentLocation) public LinePragmaWriter(CodeWriter writer, SourceSpan documentLocation)
{ {
if (writer == null) if (writer == null)
{ {

View File

@ -0,0 +1,63 @@

// 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;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{
internal class DefaultCodeRenderingContext : CodeRenderingContext
{
// Internal for unit testing
internal DefaultCodeRenderingContext(
CodeWriter codeWriter,
IntermediateNodeWriter nodeWriter,
RazorSourceDocument sourceDocument,
RazorCodeGenerationOptions options)
: this (codeWriter, nodeWriter, null, sourceDocument, options)
{
}
public DefaultCodeRenderingContext(
CodeWriter codeWriter,
IntermediateNodeWriter nodeWriter,
string documentKind,
RazorSourceDocument sourceDocument,
RazorCodeGenerationOptions options)
{
CodeWriter = codeWriter;
NodeWriter = nodeWriter;
DocumentKind = documentKind;
SourceDocument = sourceDocument;
Options = options;
Diagnostics = new DefaultRazorDiagnosticCollection();
Items = new DefaultItemCollection();
}
public override CodeWriter CodeWriter { get; }
public override IntermediateNodeWriter NodeWriter { get; protected set; }
public override RazorSourceDocument SourceDocument { get; }
public override RazorCodeGenerationOptions Options { get; }
public override RazorDiagnosticCollection Diagnostics { get; }
public override ItemCollection Items { get; }
public override string DocumentKind { get; }
public override IntermediateNodeWriterScope Push(IntermediateNodeWriter writer)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
var scope = new IntermediateNodeWriterScope(this, NodeWriter);
NodeWriter = writer;
return scope;
}
}
}

View File

@ -18,7 +18,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public ICodeTargetExtension[] Extensions { get; } public ICodeTargetExtension[] Extensions { get; }
public override DocumentWriter CreateWriter(CSharpRenderingContext context) public override DocumentWriter CreateWriter(CodeRenderingContext context)
{ {
return new DefaultDocumentWriter(this, context); return new DefaultDocumentWriter(this, context);
} }

View File

@ -9,10 +9,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
internal class DefaultDocumentWriter : DocumentWriter internal class DefaultDocumentWriter : DocumentWriter
{ {
private readonly CSharpRenderingContext _context; private readonly CodeRenderingContext _context;
private readonly CodeTarget _target; private readonly CodeTarget _target;
public DefaultDocumentWriter(CodeTarget target, CSharpRenderingContext context) public DefaultDocumentWriter(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -36,28 +36,27 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
var visitor = new Visitor(_target, _context); var visitor = new Visitor(_target, _context);
_context.RenderChildren = visitor.RenderChildren; _context.SetRenderNode(visitor.Visit);
_context.RenderNode = visitor.Visit; _context.SetRenderChildren(visitor.RenderChildren);
_context.BasicWriter = _context.Options.DesignTime ? (BasicWriter)new DesignTimeBasicWriter() : new RuntimeBasicWriter();
_context.TagHelperWriter = _context.Options.DesignTime ? (TagHelperWriter)new DesignTimeTagHelperWriter() : new RuntimeTagHelperWriter();
visitor.VisitDocument(node); visitor.VisitDocument(node);
_context.RenderChildren = null;
_context.SetRenderChildren(null);
_context.SetRenderNode(null);
} }
private class Visitor : IntermediateNodeVisitor private class Visitor : IntermediateNodeVisitor
{ {
private readonly CSharpRenderingContext _context; private readonly CodeRenderingContext _context;
private readonly CodeTarget _target; private readonly CodeTarget _target;
public Visitor(CodeTarget target, CSharpRenderingContext context) public Visitor(CodeTarget target, CodeRenderingContext context)
{ {
_target = target; _target = target;
_context = context; _context = context;
} }
private CSharpRenderingContext Context => _context; private CodeRenderingContext Context => _context;
public void RenderChildren(IntermediateNode node) public void RenderChildren(IntermediateNode node)
{ {
@ -88,7 +87,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (!string.IsNullOrEmpty(bytes)) if (!string.IsNullOrEmpty(bytes))
{ {
Context.Writer Context.CodeWriter
.Write("#pragma checksum \"") .Write("#pragma checksum \"")
.Write(sourceDocument.FilePath) .Write(sourceDocument.FilePath)
.Write("\" \"") .Write("\" \"")
@ -99,32 +98,32 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
Context.Writer Context.CodeWriter
.WriteLine("// <auto-generated/>") .WriteLine("// <auto-generated/>")
.WriteLine("#pragma warning disable 1591"); .WriteLine("#pragma warning disable 1591");
RenderChildren(node); RenderChildren(node);
Context.Writer.WriteLine("#pragma warning restore 1591"); Context.CodeWriter.WriteLine("#pragma warning restore 1591");
} }
public override void VisitUsingDirective(UsingDirectiveIntermediateNode node) public override void VisitUsingDirective(UsingDirectiveIntermediateNode node)
{ {
Context.BasicWriter.WriteUsingDirective(Context, node); Context.NodeWriter.WriteUsingDirective(Context, node);
} }
public override void VisitNamespaceDeclaration(NamespaceDeclarationIntermediateNode node) public override void VisitNamespaceDeclaration(NamespaceDeclarationIntermediateNode node)
{ {
using (Context.Writer.BuildNamespace(node.Content)) using (Context.CodeWriter.BuildNamespace(node.Content))
{ {
Context.Writer.WriteLine("#line hidden"); Context.CodeWriter.WriteLine("#line hidden");
RenderChildren(node); RenderChildren(node);
} }
} }
public override void VisitClassDeclaration(ClassDeclarationIntermediateNode node) public override void VisitClassDeclaration(ClassDeclarationIntermediateNode node)
{ {
using (Context.Writer.BuildClassDeclaration(node.Modifiers, node.Name, node.BaseType, node.Interfaces)) using (Context.CodeWriter.BuildClassDeclaration(node.Modifiers, node.Name, node.BaseType, node.Interfaces))
{ {
RenderChildren(node); RenderChildren(node);
} }
@ -132,36 +131,36 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public override void VisitMethodDeclaration(MethodDeclarationIntermediateNode node) public override void VisitMethodDeclaration(MethodDeclarationIntermediateNode node)
{ {
Context.Writer.WriteLine("#pragma warning disable 1998"); Context.CodeWriter.WriteLine("#pragma warning disable 1998");
for (var i = 0; i < node.Modifiers.Count; i++) for (var i = 0; i < node.Modifiers.Count; i++)
{ {
Context.Writer.Write(node.Modifiers[i]); Context.CodeWriter.Write(node.Modifiers[i]);
Context.Writer.Write(" "); Context.CodeWriter.Write(" ");
} }
Context.Writer Context.CodeWriter
.Write(node.ReturnType) .Write(node.ReturnType)
.Write(" ") .Write(" ")
.Write(node.Name) .Write(node.Name)
.WriteLine("()"); .WriteLine("()");
using (Context.Writer.BuildScope()) using (Context.CodeWriter.BuildScope())
{ {
RenderChildren(node); RenderChildren(node);
} }
Context.Writer.WriteLine("#pragma warning restore 1998"); Context.CodeWriter.WriteLine("#pragma warning restore 1998");
} }
public override void VisitFieldDeclaration(FieldDeclarationIntermediateNode node) public override void VisitFieldDeclaration(FieldDeclarationIntermediateNode node)
{ {
Context.Writer.WriteField(node.Modifiers, node.Type, node.Name); Context.CodeWriter.WriteField(node.Modifiers, node.Type, node.Name);
} }
public override void VisitPropertyDeclaration(PropertyDeclarationIntermediateNode node) public override void VisitPropertyDeclaration(PropertyDeclarationIntermediateNode node)
{ {
Context.Writer.WriteAutoPropertyDeclaration(node.Modifiers, node.Type, node.Name); Context.CodeWriter.WriteAutoPropertyDeclaration(node.Modifiers, node.Type, node.Name);
} }
public override void VisitExtension(ExtensionIntermediateNode node) public override void VisitExtension(ExtensionIntermediateNode node)
@ -171,37 +170,37 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public override void VisitCSharpExpression(CSharpExpressionIntermediateNode node) public override void VisitCSharpExpression(CSharpExpressionIntermediateNode node)
{ {
Context.BasicWriter.WriteCSharpExpression(Context, node); Context.NodeWriter.WriteCSharpExpression(Context, node);
} }
public override void VisitCSharpCode(CSharpCodeIntermediateNode node) public override void VisitCSharpCode(CSharpCodeIntermediateNode node)
{ {
Context.BasicWriter.WriteCSharpCode(Context, node); Context.NodeWriter.WriteCSharpCode(Context, node);
} }
public override void VisitHtmlAttribute(HtmlAttributeIntermediateNode node) public override void VisitHtmlAttribute(HtmlAttributeIntermediateNode node)
{ {
Context.BasicWriter.WriteHtmlAttribute(Context, node); Context.NodeWriter.WriteHtmlAttribute(Context, node);
} }
public override void VisitHtmlAttributeValue(HtmlAttributeValueIntermediateNode node) public override void VisitHtmlAttributeValue(HtmlAttributeValueIntermediateNode node)
{ {
Context.BasicWriter.WriteHtmlAttributeValue(Context, node); Context.NodeWriter.WriteHtmlAttributeValue(Context, node);
} }
public override void VisitCSharpExpressionAttributeValue(CSharpExpressionAttributeValueIntermediateNode node) public override void VisitCSharpExpressionAttributeValue(CSharpExpressionAttributeValueIntermediateNode node)
{ {
Context.BasicWriter.WriteCSharpExpressionAttributeValue(Context, node); Context.NodeWriter.WriteCSharpExpressionAttributeValue(Context, node);
} }
public override void VisitCSharpCodeAttributeValue(CSharpCodeAttributeValueIntermediateNode node) public override void VisitCSharpCodeAttributeValue(CSharpCodeAttributeValueIntermediateNode node)
{ {
Context.BasicWriter.WriteCSharpCodeAttributeValue(Context, node); Context.NodeWriter.WriteCSharpCodeAttributeValue(Context, node);
} }
public override void VisitHtml(HtmlContentIntermediateNode node) public override void VisitHtml(HtmlContentIntermediateNode node)
{ {
Context.BasicWriter.WriteHtmlContent(Context, node); Context.NodeWriter.WriteHtmlContent(Context, node);
} }
public override void VisitDeclareTagHelperFields(DeclareTagHelperFieldsIntermediateNode node) public override void VisitDeclareTagHelperFields(DeclareTagHelperFieldsIntermediateNode node)

View File

@ -7,25 +7,25 @@ using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class DesignTimeBasicWriter : BasicWriter public class DesignTimeNodeWriter : IntermediateNodeWriter
{ {
public override void WriteUsingDirective(CSharpRenderingContext context, UsingDirectiveIntermediateNode node) public override void WriteUsingDirective(CodeRenderingContext context, UsingDirectiveIntermediateNode node)
{ {
if (node.Source.HasValue) if (node.Source.HasValue)
{ {
using (context.Writer.BuildLinePragma(node.Source.Value)) using (context.CodeWriter.BuildLinePragma(node.Source.Value))
{ {
context.AddLineMappingFor(node); context.AddLineMappingFor(node);
context.Writer.WriteUsing(node.Content); context.CodeWriter.WriteUsing(node.Content);
} }
} }
else else
{ {
context.Writer.WriteUsing(node.Content); context.CodeWriter.WriteUsing(node.Content);
} }
} }
public override void WriteCSharpExpression(CSharpRenderingContext context, CSharpExpressionIntermediateNode node) public override void WriteCSharpExpression(CodeRenderingContext context, CSharpExpressionIntermediateNode node)
{ {
if (context == null) if (context == null)
{ {
@ -44,18 +44,18 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (node.Source != null) if (node.Source != null)
{ {
using (context.Writer.BuildLinePragma(node.Source.Value)) using (context.CodeWriter.BuildLinePragma(node.Source.Value))
{ {
var offset = DesignTimeDirectivePass.DesignTimeVariable.Length + " = ".Length; var offset = DesignTimeDirectivePass.DesignTimeVariable.Length + " = ".Length;
context.Writer.WritePadding(offset, node.Source, context); context.CodeWriter.WritePadding(offset, node.Source, context);
context.Writer.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable); context.CodeWriter.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable);
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
{ {
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
{ {
context.AddLineMappingFor(token); context.AddLineMappingFor(token);
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -64,17 +64,17 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
} }
} }
else else
{ {
context.Writer.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable); context.CodeWriter.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable);
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
{ {
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
{ {
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -82,11 +82,11 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
context.RenderNode(node.Children[i]); context.RenderNode(node.Children[i]);
} }
} }
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
} }
} }
public override void WriteCSharpCode(CSharpRenderingContext context, CSharpCodeIntermediateNode node) public override void WriteCSharpCode(CodeRenderingContext context, CSharpCodeIntermediateNode node)
{ {
var isWhitespaceStatement = true; var isWhitespaceStatement = true;
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
@ -104,10 +104,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
if (!isWhitespaceStatement) if (!isWhitespaceStatement)
{ {
linePragmaScope = context.Writer.BuildLinePragma(node.Source.Value); linePragmaScope = context.CodeWriter.BuildLinePragma(node.Source.Value);
} }
context.Writer.WritePadding(0, node.Source.Value, context); context.CodeWriter.WritePadding(0, node.Source.Value, context);
} }
else if (isWhitespaceStatement) else if (isWhitespaceStatement)
{ {
@ -120,7 +120,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
{ {
context.AddLineMappingFor(token); context.AddLineMappingFor(token);
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -135,21 +135,21 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
else else
{ {
context.Writer.WriteLine(); context.CodeWriter.WriteLine();
} }
} }
public override void WriteHtmlAttribute(CSharpRenderingContext context, HtmlAttributeIntermediateNode node) public override void WriteHtmlAttribute(CodeRenderingContext context, HtmlAttributeIntermediateNode node)
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
public override void WriteHtmlAttributeValue(CSharpRenderingContext context, HtmlAttributeValueIntermediateNode node) public override void WriteHtmlAttributeValue(CodeRenderingContext context, HtmlAttributeValueIntermediateNode node)
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
public override void WriteCSharpExpressionAttributeValue(CSharpRenderingContext context, CSharpExpressionAttributeValueIntermediateNode node) public override void WriteCSharpExpressionAttributeValue(CodeRenderingContext context, CSharpExpressionAttributeValueIntermediateNode node)
{ {
if (context == null) if (context == null)
{ {
@ -169,18 +169,18 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var firstChild = node.Children[0]; var firstChild = node.Children[0];
if (firstChild.Source != null) if (firstChild.Source != null)
{ {
using (context.Writer.BuildLinePragma(firstChild.Source.Value)) using (context.CodeWriter.BuildLinePragma(firstChild.Source.Value))
{ {
var offset = DesignTimeDirectivePass.DesignTimeVariable.Length + " = ".Length; var offset = DesignTimeDirectivePass.DesignTimeVariable.Length + " = ".Length;
context.Writer.WritePadding(offset, firstChild.Source, context); context.CodeWriter.WritePadding(offset, firstChild.Source, context);
context.Writer.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable); context.CodeWriter.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable);
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
{ {
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
{ {
context.AddLineMappingFor(token); context.AddLineMappingFor(token);
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -189,12 +189,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
} }
} }
else else
{ {
context.Writer.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable); context.CodeWriter.WriteStartAssignment(DesignTimeDirectivePass.DesignTimeVariable);
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
{ {
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
@ -204,7 +204,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
context.AddLineMappingFor(token); context.AddLineMappingFor(token);
} }
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -212,11 +212,11 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
context.RenderNode(node.Children[i]); context.RenderNode(node.Children[i]);
} }
} }
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
} }
} }
public override void WriteCSharpCodeAttributeValue(CSharpRenderingContext context, CSharpCodeAttributeValueIntermediateNode node) public override void WriteCSharpCodeAttributeValue(CodeRenderingContext context, CSharpCodeAttributeValueIntermediateNode node)
{ {
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
{ {
@ -229,10 +229,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
if (!isWhitespaceStatement) if (!isWhitespaceStatement)
{ {
linePragmaScope = context.Writer.BuildLinePragma(token.Source.Value); linePragmaScope = context.CodeWriter.BuildLinePragma(token.Source.Value);
} }
context.Writer.WritePadding(0, token.Source.Value, context); context.CodeWriter.WritePadding(0, token.Source.Value, context);
} }
else if (isWhitespaceStatement) else if (isWhitespaceStatement)
{ {
@ -241,7 +241,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
context.AddLineMappingFor(token); context.AddLineMappingFor(token);
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
if (linePragmaScope != null) if (linePragmaScope != null)
{ {
@ -249,7 +249,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
else else
{ {
context.Writer.WriteLine(); context.CodeWriter.WriteLine();
} }
} }
else else
@ -260,17 +260,17 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
public override void WriteHtmlContent(CSharpRenderingContext context, HtmlContentIntermediateNode node) public override void WriteHtmlContent(CodeRenderingContext context, HtmlContentIntermediateNode node)
{ {
// Do nothing // Do nothing
} }
public override void BeginWriterScope(CSharpRenderingContext context, string writer) public override void BeginWriterScope(CodeRenderingContext context, string writer)
{ {
// Do nothing // Do nothing
} }
public override void EndWriterScope(CSharpRenderingContext context) public override void EndWriterScope(CodeRenderingContext context)
{ {
// Do nothing // Do nothing
} }

View File

@ -10,16 +10,16 @@ using Microsoft.AspNetCore.Razor.Language.Legacy;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class DesignTimeTagHelperWriter : TagHelperWriter internal class DesignTimeTagHelperWriter : TagHelperWriter
{ {
public string CreateTagHelperMethodName { get; set; } = "CreateTagHelper"; public string CreateTagHelperMethodName { get; set; } = "CreateTagHelper";
public override void WriteDeclareTagHelperFields(CSharpRenderingContext context, DeclareTagHelperFieldsIntermediateNode node) public override void WriteDeclareTagHelperFields(CodeRenderingContext context, DeclareTagHelperFieldsIntermediateNode node)
{ {
foreach (var tagHelperTypeName in node.UsedTagHelperTypeNames) foreach (var tagHelperTypeName in node.UsedTagHelperTypeNames)
{ {
var tagHelperVariableName = GetTagHelperVariableName(tagHelperTypeName); var tagHelperVariableName = GetTagHelperVariableName(tagHelperTypeName);
context.Writer context.CodeWriter
.Write("private global::") .Write("private global::")
.WriteVariableDeclaration( .WriteVariableDeclaration(
tagHelperTypeName, tagHelperTypeName,
@ -28,32 +28,32 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
public override void WriteTagHelper(CSharpRenderingContext context, TagHelperIntermediateNode node) public override void WriteTagHelper(CodeRenderingContext context, TagHelperIntermediateNode node)
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
public override void WriteTagHelperBody(CSharpRenderingContext context, TagHelperBodyIntermediateNode node) public override void WriteTagHelperBody(CodeRenderingContext context, TagHelperBodyIntermediateNode node)
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
public override void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIntermediateNode node) public override void WriteCreateTagHelper(CodeRenderingContext context, CreateTagHelperIntermediateNode node)
{ {
var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName);
context.Writer context.CodeWriter
.WriteStartAssignment(tagHelperVariableName) .WriteStartAssignment(tagHelperVariableName)
.Write(CreateTagHelperMethodName) .Write(CreateTagHelperMethodName)
.WriteLine($"<global::{node.TagHelperTypeName}>();"); .WriteLine($"<global::{node.TagHelperTypeName}>();");
} }
public override void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIntermediateNode node) public override void WriteAddTagHelperHtmlAttribute(CodeRenderingContext context, AddTagHelperHtmlAttributeIntermediateNode node)
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
public override void WriteSetTagHelperProperty(CSharpRenderingContext context, SetTagHelperPropertyIntermediateNode node) public override void WriteSetTagHelperProperty(CodeRenderingContext context, SetTagHelperPropertyIntermediateNode node)
{ {
var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName);
var tagHelperRenderingContext = context.TagHelperRenderingContext; var tagHelperRenderingContext = context.TagHelperRenderingContext;
@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (tagHelperRenderingContext.RenderedBoundAttributes.TryGetValue(node.AttributeName, out string previousValueAccessor)) if (tagHelperRenderingContext.RenderedBoundAttributes.TryGetValue(node.AttributeName, out string previousValueAccessor))
{ {
context.Writer context.CodeWriter
.WriteStartAssignment(propertyValueAccessor) .WriteStartAssignment(propertyValueAccessor)
.Write(previousValueAccessor) .Write(previousValueAccessor)
.WriteLine(";"); .WriteLine(";");
@ -77,24 +77,24 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
context.RenderChildren(node); context.RenderChildren(node);
context.Writer.WriteStartAssignment(propertyValueAccessor); context.CodeWriter.WriteStartAssignment(propertyValueAccessor);
if (node.Children.Count == 1 && node.Children.First() is HtmlContentIntermediateNode htmlNode) if (node.Children.Count == 1 && node.Children.First() is HtmlContentIntermediateNode htmlNode)
{ {
var content = GetContent(htmlNode); var content = GetContent(htmlNode);
context.Writer.WriteStringLiteral(content); context.CodeWriter.WriteStringLiteral(content);
} }
else else
{ {
context.Writer.Write("string.Empty"); context.CodeWriter.Write("string.Empty");
} }
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
} }
else else
{ {
var firstMappedChild = node.Children.FirstOrDefault(child => child.Source != null) as IntermediateNode; var firstMappedChild = node.Children.FirstOrDefault(child => child.Source != null) as IntermediateNode;
var valueStart = firstMappedChild?.Source; var valueStart = firstMappedChild?.Source;
using (context.Writer.BuildLinePragma(node.Source.Value)) using (context.CodeWriter.BuildLinePragma(node.Source.Value))
{ {
var assignmentPrefixLength = propertyValueAccessor.Length + " = ".Length; var assignmentPrefixLength = propertyValueAccessor.Length + " = ".Length;
if (node.Descriptor.IsEnum && if (node.Descriptor.IsEnum &&
@ -106,10 +106,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (valueStart != null) if (valueStart != null)
{ {
context.Writer.WritePadding(assignmentPrefixLength, node.Source.Value, context); context.CodeWriter.WritePadding(assignmentPrefixLength, node.Source.Value, context);
} }
context.Writer context.CodeWriter
.WriteStartAssignment(propertyValueAccessor) .WriteStartAssignment(propertyValueAccessor)
.Write("global::") .Write("global::")
.Write(node.Descriptor.TypeName) .Write(node.Descriptor.TypeName)
@ -119,21 +119,21 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
if (valueStart != null) if (valueStart != null)
{ {
context.Writer.WritePadding(assignmentPrefixLength, node.Source.Value, context); context.CodeWriter.WritePadding(assignmentPrefixLength, node.Source.Value, context);
} }
context.Writer.WriteStartAssignment(propertyValueAccessor); context.CodeWriter.WriteStartAssignment(propertyValueAccessor);
} }
RenderTagHelperAttributeInline(context, node, node.Source.Value); RenderTagHelperAttributeInline(context, node, node.Source.Value);
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
} }
} }
} }
private void RenderTagHelperAttributeInline( private void RenderTagHelperAttributeInline(
CSharpRenderingContext context, CodeRenderingContext context,
SetTagHelperPropertyIntermediateNode property, SetTagHelperPropertyIntermediateNode property,
SourceSpan documentLocation) SourceSpan documentLocation)
{ {
@ -144,7 +144,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
private void RenderTagHelperAttributeInline( private void RenderTagHelperAttributeInline(
CSharpRenderingContext context, CodeRenderingContext context,
SetTagHelperPropertyIntermediateNode property, SetTagHelperPropertyIntermediateNode property,
IntermediateNode node, IntermediateNode node,
SourceSpan documentLocation) SourceSpan documentLocation)
@ -163,7 +163,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
context.AddLineMappingFor(node); context.AddLineMappingFor(node);
} }
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else if (node is CSharpCodeIntermediateNode) else if (node is CSharpCodeIntermediateNode)
{ {

View File

@ -0,0 +1,30 @@
// 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 abstract class IntermediateNodeWriter
{
public abstract void WriteUsingDirective(CodeRenderingContext context, UsingDirectiveIntermediateNode node);
public abstract void WriteCSharpExpression(CodeRenderingContext context, CSharpExpressionIntermediateNode node);
public abstract void WriteCSharpCode(CodeRenderingContext context, CSharpCodeIntermediateNode node);
public abstract void WriteHtmlContent(CodeRenderingContext context, HtmlContentIntermediateNode node);
public abstract void WriteHtmlAttribute(CodeRenderingContext context, HtmlAttributeIntermediateNode node);
public abstract void WriteHtmlAttributeValue(CodeRenderingContext context, HtmlAttributeValueIntermediateNode node);
public abstract void WriteCSharpExpressionAttributeValue(CodeRenderingContext context, CSharpExpressionAttributeValueIntermediateNode node);
public abstract void WriteCSharpCodeAttributeValue(CodeRenderingContext context, CSharpCodeAttributeValueIntermediateNode node);
public abstract void BeginWriterScope(CodeRenderingContext context, string writer);
public abstract void EndWriterScope(CodeRenderingContext context);
}
}

View File

@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
internal class LiteralRuntimeBasicWriter : RuntimeBasicWriter internal class LiteralRuntimeNodeWriter : RuntimeNodeWriter
{ {
public override string WriteCSharpExpressionMethod { get; set; } = "WriteLiteral"; public override string WriteCSharpExpressionMethod { get; set; } = "WriteLiteral";
} }

View File

@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class RuntimeBasicWriter : BasicWriter public class RuntimeNodeWriter : IntermediateNodeWriter
{ {
public virtual string WriteCSharpExpressionMethod { get; set; } = "Write"; public virtual string WriteCSharpExpressionMethod { get; set; } = "Write";
@ -28,22 +28,22 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public string TemplateTypeName { get; set; } = "Microsoft.AspNetCore.Mvc.Razor.HelperResult"; public string TemplateTypeName { get; set; } = "Microsoft.AspNetCore.Mvc.Razor.HelperResult";
public override void WriteUsingDirective(CSharpRenderingContext context, UsingDirectiveIntermediateNode node) public override void WriteUsingDirective(CodeRenderingContext context, UsingDirectiveIntermediateNode node)
{ {
if (node.Source.HasValue) if (node.Source.HasValue)
{ {
using (context.Writer.BuildLinePragma(node.Source.Value)) using (context.CodeWriter.BuildLinePragma(node.Source.Value))
{ {
context.Writer.WriteUsing(node.Content); context.CodeWriter.WriteUsing(node.Content);
} }
} }
else else
{ {
context.Writer.WriteUsing(node.Content); context.CodeWriter.WriteUsing(node.Content);
} }
} }
public override void WriteCSharpExpression(CSharpRenderingContext context, CSharpExpressionIntermediateNode node) public override void WriteCSharpExpression(CodeRenderingContext context, CSharpExpressionIntermediateNode node)
{ {
if (context == null) if (context == null)
{ {
@ -58,17 +58,17 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
IDisposable linePragmaScope = null; IDisposable linePragmaScope = null;
if (node.Source != null) if (node.Source != null)
{ {
linePragmaScope = context.Writer.BuildLinePragma(node.Source.Value); linePragmaScope = context.CodeWriter.BuildLinePragma(node.Source.Value);
context.Writer.WritePadding(WriteCSharpExpressionMethod.Length + 1, node.Source, context); context.CodeWriter.WritePadding(WriteCSharpExpressionMethod.Length + 1, node.Source, context);
} }
context.Writer.WriteStartMethodInvocation(WriteCSharpExpressionMethod); context.CodeWriter.WriteStartMethodInvocation(WriteCSharpExpressionMethod);
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
{ {
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
{ {
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -77,12 +77,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
context.Writer.WriteEndMethodInvocation(); context.CodeWriter.WriteEndMethodInvocation();
linePragmaScope?.Dispose(); linePragmaScope?.Dispose();
} }
public override void WriteCSharpCode(CSharpRenderingContext context, CSharpCodeIntermediateNode node) public override void WriteCSharpCode(CodeRenderingContext context, CSharpCodeIntermediateNode node)
{ {
var isWhitespaceStatement = true; var isWhitespaceStatement = true;
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
@ -103,15 +103,15 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
IDisposable linePragmaScope = null; IDisposable linePragmaScope = null;
if (node.Source != null) if (node.Source != null)
{ {
linePragmaScope = context.Writer.BuildLinePragma(node.Source.Value); linePragmaScope = context.CodeWriter.BuildLinePragma(node.Source.Value);
context.Writer.WritePadding(0, node.Source.Value, context); context.CodeWriter.WritePadding(0, node.Source.Value, context);
} }
for (var i = 0; i < node.Children.Count; i++) for (var i = 0; i < node.Children.Count; i++)
{ {
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
{ {
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -122,13 +122,13 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (linePragmaScope == null) if (linePragmaScope == null)
{ {
context.Writer.WriteLine(); context.CodeWriter.WriteLine();
} }
linePragmaScope?.Dispose(); linePragmaScope?.Dispose();
} }
public override void WriteHtmlAttribute(CSharpRenderingContext context, HtmlAttributeIntermediateNode node) public override void WriteHtmlAttribute(CodeRenderingContext context, HtmlAttributeIntermediateNode node)
{ {
var valuePieceCount = node var valuePieceCount = node
.Children .Children
@ -140,7 +140,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var prefixLocation = node.Source.Value.AbsoluteIndex; var prefixLocation = node.Source.Value.AbsoluteIndex;
var suffixLocation = node.Source.Value.AbsoluteIndex + node.Source.Value.Length - node.Suffix.Length; var suffixLocation = node.Source.Value.AbsoluteIndex + node.Source.Value.Length - node.Suffix.Length;
context.Writer context.CodeWriter
.WriteStartMethodInvocation(BeginWriteAttributeMethod) .WriteStartMethodInvocation(BeginWriteAttributeMethod)
.WriteStringLiteral(node.Name) .WriteStringLiteral(node.Name)
.WriteParameterSeparator() .WriteParameterSeparator()
@ -157,17 +157,17 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
context.RenderChildren(node); context.RenderChildren(node);
context.Writer context.CodeWriter
.WriteStartMethodInvocation(EndWriteAttributeMethod) .WriteStartMethodInvocation(EndWriteAttributeMethod)
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
} }
public override void WriteHtmlAttributeValue(CSharpRenderingContext context, HtmlAttributeValueIntermediateNode node) public override void WriteHtmlAttributeValue(CodeRenderingContext context, HtmlAttributeValueIntermediateNode node)
{ {
var prefixLocation = node.Source.Value.AbsoluteIndex; var prefixLocation = node.Source.Value.AbsoluteIndex;
var valueLocation = node.Source.Value.AbsoluteIndex + node.Prefix.Length; var valueLocation = node.Source.Value.AbsoluteIndex + node.Prefix.Length;
var valueLength = node.Source.Value.Length; var valueLength = node.Source.Value.Length;
context.Writer context.CodeWriter
.WriteStartMethodInvocation(WriteAttributeValueMethod) .WriteStartMethodInvocation(WriteAttributeValueMethod)
.WriteStringLiteral(node.Prefix) .WriteStringLiteral(node.Prefix)
.WriteParameterSeparator() .WriteParameterSeparator()
@ -179,7 +179,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
if (node.Children[i] is IntermediateToken token && token.IsHtml) if (node.Children[i] is IntermediateToken token && token.IsHtml)
{ {
context.Writer.WriteStringLiteral(token.Content); context.CodeWriter.WriteStringLiteral(token.Content);
} }
else else
{ {
@ -188,7 +188,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
context.Writer context.CodeWriter
.WriteParameterSeparator() .WriteParameterSeparator()
.Write(valueLocation.ToString(CultureInfo.InvariantCulture)) .Write(valueLocation.ToString(CultureInfo.InvariantCulture))
.WriteParameterSeparator() .WriteParameterSeparator()
@ -198,12 +198,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
} }
public override void WriteCSharpExpressionAttributeValue(CSharpRenderingContext context, CSharpExpressionAttributeValueIntermediateNode node) public override void WriteCSharpExpressionAttributeValue(CodeRenderingContext context, CSharpExpressionAttributeValueIntermediateNode node)
{ {
using (context.Writer.BuildLinePragma(node.Source.Value)) using (context.CodeWriter.BuildLinePragma(node.Source.Value))
{ {
var prefixLocation = node.Source.Value.AbsoluteIndex; var prefixLocation = node.Source.Value.AbsoluteIndex;
context.Writer context.CodeWriter
.WriteStartMethodInvocation(WriteAttributeValueMethod) .WriteStartMethodInvocation(WriteAttributeValueMethod)
.WriteStringLiteral(node.Prefix) .WriteStringLiteral(node.Prefix)
.WriteParameterSeparator() .WriteParameterSeparator()
@ -214,7 +214,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
if (node.Children[i] is IntermediateToken token && token.IsCSharp) if (node.Children[i] is IntermediateToken token && token.IsCSharp)
{ {
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else else
{ {
@ -225,7 +225,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var valueLocation = node.Source.Value.AbsoluteIndex + node.Prefix.Length; var valueLocation = node.Source.Value.AbsoluteIndex + node.Prefix.Length;
var valueLength = node.Source.Value.Length - node.Prefix.Length; var valueLength = node.Source.Value.Length - node.Prefix.Length;
context.Writer context.CodeWriter
.WriteParameterSeparator() .WriteParameterSeparator()
.Write(valueLocation.ToString(CultureInfo.InvariantCulture)) .Write(valueLocation.ToString(CultureInfo.InvariantCulture))
.WriteParameterSeparator() .WriteParameterSeparator()
@ -236,23 +236,23 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
public override void WriteCSharpCodeAttributeValue(CSharpRenderingContext context, CSharpCodeAttributeValueIntermediateNode node) public override void WriteCSharpCodeAttributeValue(CodeRenderingContext context, CSharpCodeAttributeValueIntermediateNode node)
{ {
const string ValueWriterName = "__razor_attribute_value_writer"; const string ValueWriterName = "__razor_attribute_value_writer";
var prefixLocation = node.Source.Value.AbsoluteIndex; var prefixLocation = node.Source.Value.AbsoluteIndex;
var valueLocation = node.Source.Value.AbsoluteIndex + node.Prefix.Length; var valueLocation = node.Source.Value.AbsoluteIndex + node.Prefix.Length;
var valueLength = node.Source.Value.Length - node.Prefix.Length; var valueLength = node.Source.Value.Length - node.Prefix.Length;
context.Writer context.CodeWriter
.WriteStartMethodInvocation(WriteAttributeValueMethod) .WriteStartMethodInvocation(WriteAttributeValueMethod)
.WriteStringLiteral(node.Prefix) .WriteStringLiteral(node.Prefix)
.WriteParameterSeparator() .WriteParameterSeparator()
.Write(prefixLocation.ToString(CultureInfo.InvariantCulture)) .Write(prefixLocation.ToString(CultureInfo.InvariantCulture))
.WriteParameterSeparator(); .WriteParameterSeparator();
context.Writer.WriteStartNewObject(TemplateTypeName); context.CodeWriter.WriteStartNewObject(TemplateTypeName);
using (context.Writer.BuildAsyncLambda(ValueWriterName)) using (context.CodeWriter.BuildAsyncLambda(ValueWriterName))
{ {
BeginWriterScope(context, ValueWriterName); BeginWriterScope(context, ValueWriterName);
@ -266,10 +266,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
if (!isWhitespaceStatement) if (!isWhitespaceStatement)
{ {
linePragmaScope = context.Writer.BuildLinePragma(token.Source.Value); linePragmaScope = context.CodeWriter.BuildLinePragma(token.Source.Value);
} }
context.Writer.WritePadding(0, token.Source.Value, context); context.CodeWriter.WritePadding(0, token.Source.Value, context);
} }
else if (isWhitespaceStatement) else if (isWhitespaceStatement)
{ {
@ -277,7 +277,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
continue; continue;
} }
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
if (linePragmaScope != null) if (linePragmaScope != null)
{ {
@ -285,7 +285,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
else else
{ {
context.Writer.WriteLine(); context.CodeWriter.WriteLine();
} }
} }
else else
@ -298,9 +298,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
EndWriterScope(context); EndWriterScope(context);
} }
context.Writer.WriteEndMethodInvocation(false); context.CodeWriter.WriteEndMethodInvocation(false);
context.Writer context.CodeWriter
.WriteParameterSeparator() .WriteParameterSeparator()
.Write(valueLocation.ToString(CultureInfo.InvariantCulture)) .Write(valueLocation.ToString(CultureInfo.InvariantCulture))
.WriteParameterSeparator() .WriteParameterSeparator()
@ -310,7 +310,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
} }
public override void WriteHtmlContent(CSharpRenderingContext context, HtmlContentIntermediateNode node) public override void WriteHtmlContent(CodeRenderingContext context, HtmlContentIntermediateNode node)
{ {
const int MaxStringLiteralLength = 1024; const int MaxStringLiteralLength = 1024;
@ -341,7 +341,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
textToRender = content.Substring(charactersConsumed, charactersToSubstring); textToRender = content.Substring(charactersConsumed, charactersToSubstring);
} }
context.Writer context.CodeWriter
.WriteStartMethodInvocation(WriteHtmlContentMethod) .WriteStartMethodInvocation(WriteHtmlContentMethod)
.WriteStringLiteral(textToRender) .WriteStringLiteral(textToRender)
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
@ -350,14 +350,14 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
public override void BeginWriterScope(CSharpRenderingContext context, string writer) public override void BeginWriterScope(CodeRenderingContext context, string writer)
{ {
context.Writer.WriteMethodInvocation(PushWriterMethod, writer); context.CodeWriter.WriteMethodInvocation(PushWriterMethod, writer);
} }
public override void EndWriterScope(CSharpRenderingContext context) public override void EndWriterScope(CodeRenderingContext context)
{ {
context.Writer.WriteMethodInvocation(PopWriterMethod); context.CodeWriter.WriteMethodInvocation(PopWriterMethod);
} }
} }
} }

View File

@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Razor.Language.Legacy;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class RuntimeTagHelperWriter : TagHelperWriter internal class RuntimeTagHelperWriter : TagHelperWriter
{ {
public virtual string WriteTagHelperOutputMethod { get; set; } = "Write"; public virtual string WriteTagHelperOutputMethod { get; set; } = "Write";
@ -68,26 +68,26 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public string FormatInvalidIndexerAssignmentMethodName { get; set; } = "InvalidTagHelperIndexerAssignment"; public string FormatInvalidIndexerAssignmentMethodName { get; set; } = "InvalidTagHelperIndexerAssignment";
public override void WriteDeclareTagHelperFields(CSharpRenderingContext context, DeclareTagHelperFieldsIntermediateNode node) public override void WriteDeclareTagHelperFields(CodeRenderingContext context, DeclareTagHelperFieldsIntermediateNode node)
{ {
context.Writer.WriteLine("#line hidden"); context.CodeWriter.WriteLine("#line hidden");
// Need to disable the warning "X is assigned to but never used." for the value buffer since // Need to disable the warning "X is assigned to but never used." for the value buffer since
// whether it's used depends on how a TagHelper is used. // whether it's used depends on how a TagHelper is used.
context.Writer context.CodeWriter
.WriteLine("#pragma warning disable 0414") .WriteLine("#pragma warning disable 0414")
.Write("private ") .Write("private ")
.WriteVariableDeclaration("string", StringValueBufferVariableName, value: null) .WriteVariableDeclaration("string", StringValueBufferVariableName, value: null)
.WriteLine("#pragma warning restore 0414"); .WriteLine("#pragma warning restore 0414");
context.Writer context.CodeWriter
.Write("private ") .Write("private ")
.WriteVariableDeclaration( .WriteVariableDeclaration(
ExecutionContextTypeName, ExecutionContextTypeName,
ExecutionContextVariableName, ExecutionContextVariableName,
value: null); value: null);
context.Writer context.CodeWriter
.Write("private ") .Write("private ")
.Write(RunnerTypeName) .Write(RunnerTypeName)
.Write(" ") .Write(" ")
@ -97,32 +97,32 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
.WriteLine("();"); .WriteLine("();");
var backedScopeManageVariableName = "__backed" + ScopeManagerVariableName; var backedScopeManageVariableName = "__backed" + ScopeManagerVariableName;
context.Writer context.CodeWriter
.Write("private ") .Write("private ")
.WriteVariableDeclaration( .WriteVariableDeclaration(
ScopeManagerTypeName, ScopeManagerTypeName,
backedScopeManageVariableName, backedScopeManageVariableName,
value: null); value: null);
context.Writer context.CodeWriter
.Write("private ") .Write("private ")
.Write(ScopeManagerTypeName) .Write(ScopeManagerTypeName)
.Write(" ") .Write(" ")
.WriteLine(ScopeManagerVariableName); .WriteLine(ScopeManagerVariableName);
using (context.Writer.BuildScope()) using (context.CodeWriter.BuildScope())
{ {
context.Writer.WriteLine("get"); context.CodeWriter.WriteLine("get");
using (context.Writer.BuildScope()) using (context.CodeWriter.BuildScope())
{ {
context.Writer context.CodeWriter
.Write("if (") .Write("if (")
.Write(backedScopeManageVariableName) .Write(backedScopeManageVariableName)
.WriteLine(" == null)"); .WriteLine(" == null)");
using (context.Writer.BuildScope()) using (context.CodeWriter.BuildScope())
{ {
context.Writer context.CodeWriter
.WriteStartAssignment(backedScopeManageVariableName) .WriteStartAssignment(backedScopeManageVariableName)
.WriteStartNewObject(ScopeManagerTypeName) .WriteStartNewObject(ScopeManagerTypeName)
.Write(StartTagHelperWritingScopeMethodName) .Write(StartTagHelperWritingScopeMethodName)
@ -131,7 +131,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
} }
context.Writer context.CodeWriter
.Write("return ") .Write("return ")
.Write(backedScopeManageVariableName) .Write(backedScopeManageVariableName)
.WriteLine(";"); .WriteLine(";");
@ -141,7 +141,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
foreach (var tagHelperTypeName in node.UsedTagHelperTypeNames) foreach (var tagHelperTypeName in node.UsedTagHelperTypeNames)
{ {
var tagHelperVariableName = GetTagHelperVariableName(tagHelperTypeName); var tagHelperVariableName = GetTagHelperVariableName(tagHelperTypeName);
context.Writer context.CodeWriter
.Write("private global::") .Write("private global::")
.WriteVariableDeclaration( .WriteVariableDeclaration(
tagHelperTypeName, tagHelperTypeName,
@ -150,12 +150,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
public override void WriteTagHelper(CSharpRenderingContext context, TagHelperIntermediateNode node) public override void WriteTagHelper(CodeRenderingContext context, TagHelperIntermediateNode node)
{ {
context.RenderChildren(node); context.RenderChildren(node);
// Execute tag helpers // Execute tag helpers
context.Writer context.CodeWriter
.Write("await ") .Write("await ")
.WriteStartInstanceMethodInvocation( .WriteStartInstanceMethodInvocation(
RunnerVariableName, RunnerVariableName,
@ -165,23 +165,23 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var tagHelperOutputAccessor = $"{ExecutionContextVariableName}.{ExecutionContextOutputPropertyName}"; var tagHelperOutputAccessor = $"{ExecutionContextVariableName}.{ExecutionContextOutputPropertyName}";
context.Writer context.CodeWriter
.Write("if (!") .Write("if (!")
.Write(tagHelperOutputAccessor) .Write(tagHelperOutputAccessor)
.Write(".") .Write(".")
.Write(TagHelperOutputIsContentModifiedPropertyName) .Write(TagHelperOutputIsContentModifiedPropertyName)
.WriteLine(")"); .WriteLine(")");
using (context.Writer.BuildScope()) using (context.CodeWriter.BuildScope())
{ {
context.Writer context.CodeWriter
.Write("await ") .Write("await ")
.WriteInstanceMethodInvocation( .WriteInstanceMethodInvocation(
ExecutionContextVariableName, ExecutionContextVariableName,
ExecutionContextSetOutputContentAsyncMethodName); ExecutionContextSetOutputContentAsyncMethodName);
} }
context.Writer context.CodeWriter
.WriteStartMethodInvocation(WriteTagHelperOutputMethod) .WriteStartMethodInvocation(WriteTagHelperOutputMethod)
.Write(tagHelperOutputAccessor) .Write(tagHelperOutputAccessor)
.WriteEndMethodInvocation() .WriteEndMethodInvocation()
@ -191,56 +191,62 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
ScopeManagerEndMethodName); ScopeManagerEndMethodName);
} }
public override void WriteTagHelperBody(CSharpRenderingContext context, TagHelperBodyIntermediateNode node) public override void WriteTagHelperBody(CodeRenderingContext context, TagHelperBodyIntermediateNode node)
{ {
// Call into the tag helper scope manager to start a new tag helper scope. // Call into the tag helper scope manager to start a new tag helper scope.
// Also capture the value as the current execution context. // Also capture the value as the current execution context.
context.Writer context.CodeWriter
.WriteStartAssignment(ExecutionContextVariableName) .WriteStartAssignment(ExecutionContextVariableName)
.WriteStartInstanceMethodInvocation( .WriteStartInstanceMethodInvocation(
ScopeManagerVariableName, ScopeManagerVariableName,
ScopeManagerBeginMethodName); ScopeManagerBeginMethodName);
var uniqueId = context.Items[CodeRenderingContext.SuppressUniqueIds]?.ToString();
if (uniqueId == null)
{
uniqueId = Guid.NewGuid().ToString("N");
}
// Assign a unique ID for this instance of the source HTML tag. This must be unique // Assign a unique ID for this instance of the source HTML tag. This must be unique
// per call site, e.g. if the tag is on the view twice, there should be two IDs. // per call site, e.g. if the tag is on the view twice, there should be two IDs.
context.Writer.WriteStringLiteral(context.TagHelperRenderingContext.TagName) context.CodeWriter.WriteStringLiteral(context.TagHelperRenderingContext.TagName)
.WriteParameterSeparator() .WriteParameterSeparator()
.Write(TagModeTypeName) .Write(TagModeTypeName)
.Write(".") .Write(".")
.Write(context.TagHelperRenderingContext.TagMode.ToString()) .Write(context.TagHelperRenderingContext.TagMode.ToString())
.WriteParameterSeparator() .WriteParameterSeparator()
.WriteStringLiteral(context.IdGenerator()) .WriteStringLiteral(uniqueId)
.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 RuntimeBasicWriter())) using (context.Push(new RuntimeNodeWriter()))
using (context.Push(new RuntimeTagHelperWriter())) using (context.Push(new RuntimeTagHelperWriter()))
{ {
using (context.Writer.BuildAsyncLambda()) using (context.CodeWriter.BuildAsyncLambda())
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
} }
context.Writer.WriteEndMethodInvocation(); context.CodeWriter.WriteEndMethodInvocation();
} }
public override void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIntermediateNode node) public override void WriteCreateTagHelper(CodeRenderingContext context, CreateTagHelperIntermediateNode node)
{ {
var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName);
context.Writer context.CodeWriter
.WriteStartAssignment(tagHelperVariableName) .WriteStartAssignment(tagHelperVariableName)
.Write(CreateTagHelperMethodName) .Write(CreateTagHelperMethodName)
.WriteLine($"<global::{node.TagHelperTypeName}>();"); .WriteLine($"<global::{node.TagHelperTypeName}>();");
context.Writer.WriteInstanceMethodInvocation( context.CodeWriter.WriteInstanceMethodInvocation(
ExecutionContextVariableName, ExecutionContextVariableName,
ExecutionContextAddMethodName, ExecutionContextAddMethodName,
tagHelperVariableName); tagHelperVariableName);
} }
public override void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIntermediateNode node) public override void WriteAddTagHelperHtmlAttribute(CodeRenderingContext context, AddTagHelperHtmlAttributeIntermediateNode node)
{ {
var attributeValueStyleParameter = $"{HtmlAttributeValueStyleTypeName}.{node.AttributeStructure}"; var attributeValueStyleParameter = $"{HtmlAttributeValueStyleTypeName}.{node.AttributeStructure}";
var isConditionalAttributeValue = node.Children.Any( var isConditionalAttributeValue = node.Children.Any(
@ -261,7 +267,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
child is CSharpCodeAttributeValueIntermediateNode || child is CSharpCodeAttributeValueIntermediateNode ||
child is ExtensionIntermediateNode); child is ExtensionIntermediateNode);
context.Writer context.CodeWriter
.WriteStartMethodInvocation(BeginAddHtmlAttributeValuesMethodName) .WriteStartMethodInvocation(BeginAddHtmlAttributeValuesMethodName)
.Write(ExecutionContextVariableName) .Write(ExecutionContextVariableName)
.WriteParameterSeparator() .WriteParameterSeparator()
@ -272,12 +278,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
.Write(attributeValueStyleParameter) .Write(attributeValueStyleParameter)
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
using (context.Push(new TagHelperHtmlAttributeRuntimeBasicWriter())) using (context.Push(new TagHelperHtmlAttributeRuntimeNodeWriter()))
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
context.Writer context.CodeWriter
.WriteMethodInvocation( .WriteMethodInvocation(
EndAddHtmlAttributeValuesMethodName, EndAddHtmlAttributeValuesMethodName,
ExecutionContextVariableName); ExecutionContextVariableName);
@ -289,18 +295,18 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
// determine its final value. // determine its final value.
// Attribute value is not plain text, must be buffered to determine its final value. // Attribute value is not plain text, must be buffered to determine its final value.
context.Writer.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName); context.CodeWriter.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName);
// 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 RuntimeBasicWriter())) using (context.Push(new RuntimeNodeWriter()))
using (context.Push(new RuntimeTagHelperWriter())) using (context.Push(new RuntimeTagHelperWriter()))
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
context.Writer context.CodeWriter
.WriteStartAssignment(StringValueBufferVariableName) .WriteStartAssignment(StringValueBufferVariableName)
.WriteMethodInvocation(EndWriteTagHelperAttributeMethodName) .WriteMethodInvocation(EndWriteTagHelperAttributeMethodName)
.WriteStartInstanceMethodInvocation( .WriteStartInstanceMethodInvocation(
@ -317,7 +323,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
} }
public override void WriteSetTagHelperProperty(CSharpRenderingContext context, SetTagHelperPropertyIntermediateNode node) public override void WriteSetTagHelperProperty(CodeRenderingContext context, SetTagHelperPropertyIntermediateNode node)
{ {
var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName);
var tagHelperRenderingContext = context.TagHelperRenderingContext; var tagHelperRenderingContext = context.TagHelperRenderingContext;
@ -328,17 +334,17 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
tagHelperRenderingContext.VerifiedPropertyDictionaries.Add($"{node.TagHelperTypeName}.{propertyName}")) tagHelperRenderingContext.VerifiedPropertyDictionaries.Add($"{node.TagHelperTypeName}.{propertyName}"))
{ {
// Throw a reasonable Exception at runtime if the dictionary property is null. // Throw a reasonable Exception at runtime if the dictionary property is null.
context.Writer context.CodeWriter
.Write("if (") .Write("if (")
.Write(tagHelperVariableName) .Write(tagHelperVariableName)
.Write(".") .Write(".")
.Write(propertyName) .Write(propertyName)
.WriteLine(" == null)"); .WriteLine(" == null)");
using (context.Writer.BuildScope()) using (context.CodeWriter.BuildScope())
{ {
// System is in Host.NamespaceImports for all MVC scenarios. No need to generate FullName // System is in Host.NamespaceImports for all MVC scenarios. No need to generate FullName
// of InvalidOperationException type. // of InvalidOperationException type.
context.Writer context.CodeWriter
.Write("throw ") .Write("throw ")
.WriteStartNewObject(nameof(InvalidOperationException)) .WriteStartNewObject(nameof(InvalidOperationException))
.WriteStartMethodInvocation(FormatInvalidIndexerAssignmentMethodName) .WriteStartMethodInvocation(FormatInvalidIndexerAssignmentMethodName)
@ -356,7 +362,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (tagHelperRenderingContext.RenderedBoundAttributes.TryGetValue(node.AttributeName, out var previousValueAccessor)) if (tagHelperRenderingContext.RenderedBoundAttributes.TryGetValue(node.AttributeName, out var previousValueAccessor))
{ {
context.Writer context.CodeWriter
.WriteStartAssignment(propertyValueAccessor) .WriteStartAssignment(propertyValueAccessor)
.Write(previousValueAccessor) .Write(previousValueAccessor)
.WriteLine(";"); .WriteLine(";");
@ -370,14 +376,14 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
if (node.Descriptor.IsStringProperty || (node.IsIndexerNameMatch && node.Descriptor.IsIndexerStringProperty)) if (node.Descriptor.IsStringProperty || (node.IsIndexerNameMatch && node.Descriptor.IsIndexerStringProperty))
{ {
context.Writer.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName); context.CodeWriter.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName);
using (context.Push(new LiteralRuntimeBasicWriter())) using (context.Push(new LiteralRuntimeNodeWriter()))
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
context.Writer context.CodeWriter
.WriteStartAssignment(StringValueBufferVariableName) .WriteStartAssignment(StringValueBufferVariableName)
.WriteMethodInvocation(EndWriteTagHelperAttributeMethodName) .WriteMethodInvocation(EndWriteTagHelperAttributeMethodName)
.WriteStartAssignment(propertyValueAccessor) .WriteStartAssignment(propertyValueAccessor)
@ -386,16 +392,16 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
else else
{ {
using (context.Writer.BuildLinePragma(node.Source.Value)) using (context.CodeWriter.BuildLinePragma(node.Source.Value))
{ {
context.Writer.WriteStartAssignment(propertyValueAccessor); context.CodeWriter.WriteStartAssignment(propertyValueAccessor);
if (node.Descriptor.IsEnum && if (node.Descriptor.IsEnum &&
node.Children.Count == 1 && node.Children.Count == 1 &&
node.Children.First() is IntermediateToken token && node.Children.First() is IntermediateToken token &&
token.IsCSharp) token.IsCSharp)
{ {
context.Writer context.CodeWriter
.Write("global::") .Write("global::")
.Write(node.Descriptor.TypeName) .Write(node.Descriptor.TypeName)
.Write("."); .Write(".");
@ -403,12 +409,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
RenderTagHelperAttributeInline(context, node, node.Source.Value); RenderTagHelperAttributeInline(context, node, node.Source.Value);
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
} }
} }
// We need to inform the context of the attribute value. // We need to inform the context of the attribute value.
context.Writer context.CodeWriter
.WriteStartInstanceMethodInvocation( .WriteStartInstanceMethodInvocation(
ExecutionContextVariableName, ExecutionContextVariableName,
ExecutionContextAddTagHelperAttributeMethodName) ExecutionContextAddTagHelperAttributeMethodName)
@ -421,7 +427,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
private void RenderTagHelperAttributeInline( private void RenderTagHelperAttributeInline(
CSharpRenderingContext context, CodeRenderingContext context,
SetTagHelperPropertyIntermediateNode property, SetTagHelperPropertyIntermediateNode property,
SourceSpan documentLocation) SourceSpan documentLocation)
{ {
@ -432,7 +438,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
private void RenderTagHelperAttributeInline( private void RenderTagHelperAttributeInline(
CSharpRenderingContext context, CodeRenderingContext context,
SetTagHelperPropertyIntermediateNode property, SetTagHelperPropertyIntermediateNode property,
IntermediateNode node, IntermediateNode node,
SourceSpan documentLocation) SourceSpan documentLocation)
@ -446,7 +452,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
} }
else if (node is IntermediateToken token) else if (node is IntermediateToken token)
{ {
context.Writer.Write(token.Content); context.CodeWriter.Write(token.Content);
} }
else if (node is CSharpCodeIntermediateNode) else if (node is CSharpCodeIntermediateNode)
{ {

View File

@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
internal class TagHelperHtmlAttributeRuntimeBasicWriter : RuntimeBasicWriter internal class TagHelperHtmlAttributeRuntimeNodeWriter : RuntimeNodeWriter
{ {
public override string WriteAttributeValueMethod { get; set; } = "AddHtmlAttributeValue"; public override string WriteAttributeValueMethod { get; set; } = "AddHtmlAttributeValue";
} }

View File

@ -5,18 +5,18 @@ using Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public abstract class TagHelperWriter internal abstract class TagHelperWriter
{ {
public abstract void WriteDeclareTagHelperFields(CSharpRenderingContext context, DeclareTagHelperFieldsIntermediateNode node); public abstract void WriteDeclareTagHelperFields(CodeRenderingContext context, DeclareTagHelperFieldsIntermediateNode node);
public abstract void WriteTagHelper(CSharpRenderingContext context, TagHelperIntermediateNode node); public abstract void WriteTagHelper(CodeRenderingContext context, TagHelperIntermediateNode node);
public abstract void WriteTagHelperBody(CSharpRenderingContext context, TagHelperBodyIntermediateNode node); public abstract void WriteTagHelperBody(CodeRenderingContext context, TagHelperBodyIntermediateNode node);
public abstract void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIntermediateNode node); public abstract void WriteCreateTagHelper(CodeRenderingContext context, CreateTagHelperIntermediateNode node);
public abstract void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIntermediateNode node); public abstract void WriteAddTagHelperHtmlAttribute(CodeRenderingContext context, AddTagHelperHtmlAttributeIntermediateNode node);
public abstract void WriteSetTagHelperProperty(CSharpRenderingContext context, SetTagHelperPropertyIntermediateNode node); public abstract void WriteSetTagHelperProperty(CodeRenderingContext context, SetTagHelperPropertyIntermediateNode node);
} }
} }

View File

@ -10,10 +10,6 @@ namespace Microsoft.AspNetCore.Razor.Language
{ {
internal class DefaultRazorCSharpLoweringPhase : RazorEnginePhaseBase, IRazorCSharpLoweringPhase internal class DefaultRazorCSharpLoweringPhase : RazorEnginePhaseBase, IRazorCSharpLoweringPhase
{ {
internal static readonly object NewLineString = "NewLineString";
internal static readonly object SuppressUniqueIds = "SuppressUniqueIds";
protected override void ExecuteCore(RazorCodeDocument codeDocument) protected override void ExecuteCore(RazorCodeDocument codeDocument)
{ {
var irDocument = codeDocument.GetDocumentIntermediateNode(); var irDocument = codeDocument.GetDocumentIntermediateNode();
@ -29,40 +25,20 @@ namespace Microsoft.AspNetCore.Razor.Language
throw new InvalidOperationException(message); throw new InvalidOperationException(message);
} }
var codeWriter = new CSharpCodeWriter(); var context = CodeRenderingContext.Create(codeDocument, irDocument.Options);
var newLineString = codeDocument.Items[NewLineString]; var documentWriter = target.CreateWriter(context);
if (newLineString != null)
{
// Set new line character to a specific string regardless of platform, for testing purposes.
codeWriter.NewLine = (string)newLineString;
}
var renderingContext = new CSharpRenderingContext()
{
Writer = codeWriter,
CodeDocument = codeDocument,
Options = irDocument.Options,
};
var idValue = codeDocument.Items[SuppressUniqueIds];
if (idValue != null)
{
// Generate a static value for unique ids instead of a guid, for testing purposes.
renderingContext.IdGenerator = () => idValue.ToString();
}
var documentWriter = target.CreateWriter(renderingContext);
documentWriter.WriteDocument(irDocument); documentWriter.WriteDocument(irDocument);
var diagnostics = new List<RazorDiagnostic>(); var diagnostics = new List<RazorDiagnostic>();
diagnostics.AddRange(irDocument.GetAllDiagnostics()); diagnostics.AddRange(irDocument.GetAllDiagnostics());
diagnostics.AddRange(renderingContext.Diagnostics); diagnostics.AddRange(context.Diagnostics);
var lineMappings = context.GetLineMappings();
var csharpDocument = RazorCSharpDocument.Create( var csharpDocument = RazorCSharpDocument.Create(
renderingContext.Writer.GenerateCode(), context.CodeWriter.GenerateCode(),
irDocument.Options, irDocument.Options,
diagnostics, diagnostics,
renderingContext.LineMappings); lineMappings);
codeDocument.SetCSharpDocument(csharpDocument); codeDocument.SetCSharpDocument(csharpDocument);
} }
} }

View File

@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
AcceptExtensionNode<AddPreallocatedTagHelperHtmlAttributeIntermediateNode>(this, visitor); AcceptExtensionNode<AddPreallocatedTagHelperHtmlAttributeIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>(); var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<IPreallocatedAttributeTargetExtension>(); ReportMissingCodeTargetExtension<IPreallocatedAttributeTargetExtension>(context);
return; return;
} }

View File

@ -33,7 +33,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
AcceptExtensionNode<DeclarePreallocatedTagHelperAttributeIntermediateNode>(this, visitor); AcceptExtensionNode<DeclarePreallocatedTagHelperAttributeIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -48,7 +48,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>(); var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<IPreallocatedAttributeTargetExtension>(); ReportMissingCodeTargetExtension<IPreallocatedAttributeTargetExtension>(context);
return; return;
} }

View File

@ -33,7 +33,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
AcceptExtensionNode<DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode>(this, visitor); AcceptExtensionNode<DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -48,7 +48,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>(); var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<IPreallocatedAttributeTargetExtension>(); ReportMissingCodeTargetExtension<IPreallocatedAttributeTargetExtension>(context);
return; return;
} }

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
AcceptExtensionNode<DesignTimeDirectiveIntermediateNode>(this, visitor); AcceptExtensionNode<DesignTimeDirectiveIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var extension = target.GetExtension<IDesignTimeDirectiveTargetExtension>(); var extension = target.GetExtension<IDesignTimeDirectiveTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<IDesignTimeDirectiveTargetExtension>(); ReportMissingCodeTargetExtension<IDesignTimeDirectiveTargetExtension>(context);
return; return;
} }

View File

@ -12,9 +12,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
private const string DirectiveTokenHelperMethodName = "__RazorDirectiveTokenHelpers__"; private const string DirectiveTokenHelperMethodName = "__RazorDirectiveTokenHelpers__";
private const string TypeHelper = "__typeHelper"; private const string TypeHelper = "__typeHelper";
public void WriteDesignTimeDirective(CSharpRenderingContext context, DesignTimeDirectiveIntermediateNode node) public void WriteDesignTimeDirective(CodeRenderingContext context, DesignTimeDirectiveIntermediateNode node)
{ {
context.Writer context.CodeWriter
.WriteLine("#pragma warning disable 219") .WriteLine("#pragma warning disable 219")
.WriteLine($"private void {DirectiveTokenHelperMethodName}() {{"); .WriteLine($"private void {DirectiveTokenHelperMethodName}() {{");
@ -26,12 +26,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
} }
} }
context.Writer context.CodeWriter
.WriteLine("}") .WriteLine("}")
.WriteLine("#pragma warning restore 219"); .WriteLine("#pragma warning restore 219");
} }
private void WriteDesignTimeDirectiveToken(CSharpRenderingContext context, DirectiveTokenIntermediateNode node) private void WriteDesignTimeDirectiveToken(CodeRenderingContext context, DirectiveTokenIntermediateNode node)
{ {
var tokenKind = node.Descriptor.Kind; var tokenKind = node.Descriptor.Kind;
if (!node.Source.HasValue || if (!node.Source.HasValue ||
@ -45,14 +45,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
} }
// Wrap the directive token in a lambda to isolate variable names. // Wrap the directive token in a lambda to isolate variable names.
context.Writer context.CodeWriter
.Write("((") .Write("((")
.Write(typeof(Action).FullName) .Write(typeof(Action).FullName)
.Write(")("); .Write(")(");
using (context.Writer.BuildLambda()) using (context.CodeWriter.BuildLambda())
{ {
var originalIndent = context.Writer.CurrentIndent; var originalIndent = context.CodeWriter.CurrentIndent;
context.Writer.CurrentIndent = 0; context.CodeWriter.CurrentIndent = 0;
switch (tokenKind) switch (tokenKind)
{ {
case DirectiveTokenKind.Type: case DirectiveTokenKind.Type:
@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// {node.Content} __typeHelper = default({node.Content}); // {node.Content} __typeHelper = default({node.Content});
context.AddLineMappingFor(node); context.AddLineMappingFor(node);
context.Writer context.CodeWriter
.Write(node.Content) .Write(node.Content)
.Write(" ") .Write(" ")
.WriteStartAssignment(TypeHelper) .WriteStartAssignment(TypeHelper)
@ -73,13 +73,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// global::System.Object {node.content} = null; // global::System.Object {node.content} = null;
context.Writer context.CodeWriter
.Write("global::") .Write("global::")
.Write(typeof(object).FullName) .Write(typeof(object).FullName)
.Write(" "); .Write(" ");
context.AddLineMappingFor(node); context.AddLineMappingFor(node);
context.Writer context.CodeWriter
.Write(node.Content) .Write(node.Content)
.WriteLine(" = null;"); .WriteLine(" = null;");
break; break;
@ -88,16 +88,16 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// global::System.Object __typeHelper = nameof({node.Content}); // global::System.Object __typeHelper = nameof({node.Content});
context.Writer context.CodeWriter
.Write("global::") .Write("global::")
.Write(typeof(object).FullName) .Write(typeof(object).FullName)
.Write(" ") .Write(" ")
.WriteStartAssignment(TypeHelper); .WriteStartAssignment(TypeHelper);
context.Writer.Write("nameof("); context.CodeWriter.Write("nameof(");
context.AddLineMappingFor(node); context.AddLineMappingFor(node);
context.Writer context.CodeWriter
.Write(node.Content) .Write(node.Content)
.WriteLine(");"); .WriteLine(");");
break; break;
@ -106,7 +106,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// global::System.Object __typeHelper = "{node.Content}"; // global::System.Object __typeHelper = "{node.Content}";
context.Writer context.CodeWriter
.Write("global::") .Write("global::")
.Write(typeof(object).FullName) .Write(typeof(object).FullName)
.Write(" ") .Write(" ")
@ -115,23 +115,23 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
if (node.Content.StartsWith("\"", StringComparison.Ordinal)) if (node.Content.StartsWith("\"", StringComparison.Ordinal))
{ {
context.AddLineMappingFor(node); context.AddLineMappingFor(node);
context.Writer.Write(node.Content); context.CodeWriter.Write(node.Content);
} }
else else
{ {
context.Writer.Write("\""); context.CodeWriter.Write("\"");
context.AddLineMappingFor(node); context.AddLineMappingFor(node);
context.Writer context.CodeWriter
.Write(node.Content) .Write(node.Content)
.Write("\""); .Write("\"");
} }
context.Writer.WriteLine(";"); context.CodeWriter.WriteLine(";");
break; break;
} }
context.Writer.CurrentIndent = originalIndent; context.CodeWriter.CurrentIndent = originalIndent;
} }
context.Writer.WriteLine("))();"); context.CodeWriter.WriteLine("))();");
} }
} }
} }

View File

@ -8,6 +8,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
internal interface IDesignTimeDirectiveTargetExtension : ICodeTargetExtension internal interface IDesignTimeDirectiveTargetExtension : ICodeTargetExtension
{ {
void WriteDesignTimeDirective(CSharpRenderingContext context, DesignTimeDirectiveIntermediateNode node); void WriteDesignTimeDirective(CodeRenderingContext context, DesignTimeDirectiveIntermediateNode node);
} }
} }

View File

@ -8,12 +8,12 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
internal interface IPreallocatedAttributeTargetExtension : ICodeTargetExtension internal interface IPreallocatedAttributeTargetExtension : ICodeTargetExtension
{ {
void WriteDeclarePreallocatedTagHelperHtmlAttribute(CSharpRenderingContext context, DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode node); void WriteDeclarePreallocatedTagHelperHtmlAttribute(CodeRenderingContext context, DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode node);
void WriteAddPreallocatedTagHelperHtmlAttribute(CSharpRenderingContext context, AddPreallocatedTagHelperHtmlAttributeIntermediateNode node); void WriteAddPreallocatedTagHelperHtmlAttribute(CodeRenderingContext context, AddPreallocatedTagHelperHtmlAttributeIntermediateNode node);
void WriteDeclarePreallocatedTagHelperAttribute(CSharpRenderingContext context, DeclarePreallocatedTagHelperAttributeIntermediateNode node); void WriteDeclarePreallocatedTagHelperAttribute(CodeRenderingContext context, DeclarePreallocatedTagHelperAttributeIntermediateNode node);
void WriteSetPreallocatedTagHelperProperty(CSharpRenderingContext context, SetPreallocatedTagHelperPropertyIntermediateNode node); void WriteSetPreallocatedTagHelperProperty(CodeRenderingContext context, SetPreallocatedTagHelperPropertyIntermediateNode node);
} }
} }

View File

@ -7,6 +7,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
public interface ISectionTargetExtension : ICodeTargetExtension public interface ISectionTargetExtension : ICodeTargetExtension
{ {
void WriteSection(CSharpRenderingContext context, SectionIntermediateNode node); void WriteSection(CodeRenderingContext context, SectionIntermediateNode node);
} }
} }

View File

@ -7,6 +7,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
public interface ITemplateTargetExtension : ICodeTargetExtension public interface ITemplateTargetExtension : ICodeTargetExtension
{ {
void WriteTemplate(CSharpRenderingContext context, TemplateIntermediateNode node); void WriteTemplate(CodeRenderingContext context, TemplateIntermediateNode node);
} }
} }

View File

@ -20,9 +20,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
public string FormatInvalidIndexerAssignmentMethodName { get; set; } = "InvalidTagHelperIndexerAssignment"; public string FormatInvalidIndexerAssignmentMethodName { get; set; } = "InvalidTagHelperIndexerAssignment";
public void WriteDeclarePreallocatedTagHelperHtmlAttribute(CSharpRenderingContext context, DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode node) public void WriteDeclarePreallocatedTagHelperHtmlAttribute(CodeRenderingContext context, DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode node)
{ {
context.Writer context.CodeWriter
.Write("private static readonly global::") .Write("private static readonly global::")
.Write(TagHelperAttributeTypeName) .Write(TagHelperAttributeTypeName)
.Write(" ") .Write(" ")
@ -33,11 +33,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
if (node.AttributeStructure == AttributeStructure.Minimized) if (node.AttributeStructure == AttributeStructure.Minimized)
{ {
context.Writer.WriteEndMethodInvocation(); context.CodeWriter.WriteEndMethodInvocation();
} }
else else
{ {
context.Writer context.CodeWriter
.WriteParameterSeparator() .WriteParameterSeparator()
.WriteStartNewObject("global::" + EncodedHtmlStringTypeName) .WriteStartNewObject("global::" + EncodedHtmlStringTypeName)
.WriteStringLiteral(node.Value) .WriteStringLiteral(node.Value)
@ -48,17 +48,17 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
} }
} }
public void WriteAddPreallocatedTagHelperHtmlAttribute(CSharpRenderingContext context, AddPreallocatedTagHelperHtmlAttributeIntermediateNode node) public void WriteAddPreallocatedTagHelperHtmlAttribute(CodeRenderingContext context, AddPreallocatedTagHelperHtmlAttributeIntermediateNode node)
{ {
context.Writer context.CodeWriter
.WriteStartInstanceMethodInvocation(ExecutionContextVariableName, ExecutionContextAddHtmlAttributeMethodName) .WriteStartInstanceMethodInvocation(ExecutionContextVariableName, ExecutionContextAddHtmlAttributeMethodName)
.Write(node.VariableName) .Write(node.VariableName)
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
} }
public void WriteDeclarePreallocatedTagHelperAttribute(CSharpRenderingContext context, DeclarePreallocatedTagHelperAttributeIntermediateNode node) public void WriteDeclarePreallocatedTagHelperAttribute(CodeRenderingContext context, DeclarePreallocatedTagHelperAttributeIntermediateNode node)
{ {
context.Writer context.CodeWriter
.Write("private static readonly global::") .Write("private static readonly global::")
.Write(TagHelperAttributeTypeName) .Write(TagHelperAttributeTypeName)
.Write(" ") .Write(" ")
@ -73,7 +73,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
.WriteEndMethodInvocation(); .WriteEndMethodInvocation();
} }
public void WriteSetPreallocatedTagHelperProperty(CSharpRenderingContext context, SetPreallocatedTagHelperPropertyIntermediateNode node) public void WriteSetPreallocatedTagHelperProperty(CodeRenderingContext context, SetPreallocatedTagHelperPropertyIntermediateNode node)
{ {
var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName);
var propertyName = node.Descriptor.GetPropertyName(); var propertyName = node.Descriptor.GetPropertyName();
@ -85,17 +85,17 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
context.TagHelperRenderingContext.VerifiedPropertyDictionaries.Add($"{node.TagHelperTypeName}.{propertyName}")) context.TagHelperRenderingContext.VerifiedPropertyDictionaries.Add($"{node.TagHelperTypeName}.{propertyName}"))
{ {
// Throw a reasonable Exception at runtime if the dictionary property is null. // Throw a reasonable Exception at runtime if the dictionary property is null.
context.Writer context.CodeWriter
.Write("if (") .Write("if (")
.Write(tagHelperVariableName) .Write(tagHelperVariableName)
.Write(".") .Write(".")
.Write(propertyName) .Write(propertyName)
.WriteLine(" == null)"); .WriteLine(" == null)");
using (context.Writer.BuildScope()) using (context.CodeWriter.BuildScope())
{ {
// System is in Host.NamespaceImports for all MVC scenarios. No need to generate FullName // System is in Host.NamespaceImports for all MVC scenarios. No need to generate FullName
// of InvalidOperationException type. // of InvalidOperationException type.
context.Writer context.CodeWriter
.Write("throw ") .Write("throw ")
.WriteStartNewObject(nameof(InvalidOperationException)) .WriteStartNewObject(nameof(InvalidOperationException))
.WriteStartMethodInvocation(FormatInvalidIndexerAssignmentMethodName) .WriteStartMethodInvocation(FormatInvalidIndexerAssignmentMethodName)
@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
} }
} }
context.Writer context.CodeWriter
.WriteStartAssignment(propertyValueAccessor) .WriteStartAssignment(propertyValueAccessor)
.Write("(string)") .Write("(string)")
.Write(attributeValueAccessor) .Write(attributeValueAccessor)

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
AcceptExtensionNode<SectionIntermediateNode>(this, visitor); AcceptExtensionNode<SectionIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var extension = target.GetExtension<ISectionTargetExtension>(); var extension = target.GetExtension<ISectionTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<ISectionTargetExtension>(); ReportMissingCodeTargetExtension<ISectionTargetExtension>(context);
return; return;
} }

View File

@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
public string SectionMethodName { get; set; } = DefaultSectionMethodName; public string SectionMethodName { get; set; } = DefaultSectionMethodName;
public void WriteSection(CSharpRenderingContext context, SectionIntermediateNode node) public void WriteSection(CodeRenderingContext context, SectionIntermediateNode node)
{ {
// Quirk Alert! // Quirk Alert!
// //
@ -26,18 +26,18 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
// design time, at least until we have multi-targeting. // design time, at least until we have multi-targeting.
var writerName = context.Options.DesignTime ? DefaultWriterName : string.Empty; var writerName = context.Options.DesignTime ? DefaultWriterName : string.Empty;
context.Writer context.CodeWriter
.WriteStartMethodInvocation(SectionMethodName) .WriteStartMethodInvocation(SectionMethodName)
.Write("\"") .Write("\"")
.Write(node.Name) .Write(node.Name)
.Write("\", "); .Write("\", ");
using (context.Writer.BuildAsyncLambda(writerName)) using (context.CodeWriter.BuildAsyncLambda(writerName))
{ {
context.RenderChildren(node); context.RenderChildren(node);
} }
context.Writer.WriteEndMethodInvocation(endLine: true); context.CodeWriter.WriteEndMethodInvocation(endLine: true);
} }
} }
} }

View File

@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
AcceptExtensionNode<SetPreallocatedTagHelperPropertyIntermediateNode>(this, visitor); AcceptExtensionNode<SetPreallocatedTagHelperPropertyIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -54,7 +54,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>(); var extension = target.GetExtension<IPreallocatedAttributeTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<IPreallocatedAttributeTargetExtension>(); ReportMissingCodeTargetExtension<IPreallocatedAttributeTargetExtension>(context);
return; return;
} }

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
AcceptExtensionNode<TemplateIntermediateNode>(this, visitor); AcceptExtensionNode<TemplateIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
if (target == null) if (target == null)
{ {
@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
var extension = target.GetExtension<ITemplateTargetExtension>(); var extension = target.GetExtension<ITemplateTargetExtension>();
if (extension == null) if (extension == null)
{ {
context.ReportMissingExtension<ITemplateTargetExtension>(); ReportMissingCodeTargetExtension<ITemplateTargetExtension>(context);
return; return;
} }

View File

@ -11,25 +11,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
public string TemplateTypeName { get; set; } = DefaultTemplateTypeName; public string TemplateTypeName { get; set; } = DefaultTemplateTypeName;
public void WriteTemplate(CSharpRenderingContext context, TemplateIntermediateNode node) public void WriteTemplate(CodeRenderingContext context, TemplateIntermediateNode node)
{ {
const string ItemParameterName = "item"; const string ItemParameterName = "item";
const string TemplateWriterName = "__razor_template_writer"; const string TemplateWriterName = "__razor_template_writer";
context.Writer context.CodeWriter
.Write(ItemParameterName).Write(" => ") .Write(ItemParameterName).Write(" => ")
.WriteStartNewObject(TemplateTypeName); .WriteStartNewObject(TemplateTypeName);
using (context.Writer.BuildAsyncLambda(TemplateWriterName)) using (context.CodeWriter.BuildAsyncLambda(TemplateWriterName))
{ {
context.BasicWriter.BeginWriterScope(context, TemplateWriterName); context.NodeWriter.BeginWriterScope(context, TemplateWriterName);
context.RenderChildren(node); context.RenderChildren(node);
context.BasicWriter.EndWriterScope(context); context.NodeWriter.EndWriterScope(context);
} }
context.Writer.WriteEndMethodInvocation(endLine: false); context.CodeWriter.WriteEndMethodInvocation(endLine: false);
} }
} }
} }

View File

@ -1,6 +1,7 @@
// 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.CodeGeneration; using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
namespace Microsoft.AspNetCore.Razor.Language.Intermediate namespace Microsoft.AspNetCore.Razor.Language.Intermediate
@ -40,7 +41,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
public override bool HasDiagnostics => _diagnostics != null && _diagnostics.Count > 0; public override bool HasDiagnostics => _diagnostics != null && _diagnostics.Count > 0;
public abstract void WriteNode(CodeTarget target, CSharpRenderingContext context); public abstract void WriteNode(CodeTarget target, CodeRenderingContext context);
protected static void AcceptExtensionNode<TNode>(TNode node, IntermediateNodeVisitor visitor) protected static void AcceptExtensionNode<TNode>(TNode node, IntermediateNodeVisitor visitor)
where TNode : ExtensionIntermediateNode where TNode : ExtensionIntermediateNode
@ -55,5 +56,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
typedVisitor.VisitExtension(node); typedVisitor.VisitExtension(node);
} }
} }
protected void ReportMissingCodeTargetExtension<TDependency>(CodeRenderingContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var documentKind = context.DocumentKind ?? string.Empty;
context.Diagnostics.Add(
RazorDiagnosticFactory.CreateCodeTarget_UnsupportedExtension(
documentKind,
typeof(TDependency)));
}
} }
} }

View File

@ -570,6 +570,20 @@ namespace Microsoft.AspNetCore.Razor.Language
internal static string FormatUnexpectedDirectiveKind(object p0) internal static string FormatUnexpectedDirectiveKind(object p0)
=> string.Format(CultureInfo.CurrentCulture, GetString("UnexpectedDirectiveKind"), p0); => string.Format(CultureInfo.CurrentCulture, GetString("UnexpectedDirectiveKind"), p0);
/// <summary>
/// The '{0}' requires a '{1}' delegate to be set.
/// </summary>
internal static string RenderingContextRequiresDelegate
{
get => GetString("RenderingContextRequiresDelegate");
}
/// <summary>
/// The '{0}' requires a '{1}' delegate to be set.
/// </summary>
internal static string FormatRenderingContextRequiresDelegate(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("RenderingContextRequiresDelegate"), p0, p1);
private static string GetString(string name, params string[] formatterNames) private static string GetString(string name, params string[] formatterNames)
{ {
var value = _resourceManager.GetString(name); var value = _resourceManager.GetString(name);

View File

@ -237,4 +237,7 @@
<data name="UnexpectedDirectiveKind" xml:space="preserve"> <data name="UnexpectedDirectiveKind" xml:space="preserve">
<value>Unreachable code. This can happen when a new {0} is introduced.</value> <value>Unreachable code. This can happen when a new {0} is introduced.</value>
</data> </data>
<data name="RenderingContextRequiresDelegate" xml:space="preserve">
<value>The '{0}' requires a '{1}' delegate to be set.</value>
</data>
</root> </root>

View File

@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
Assert.Equal( Assert.Equal(
"[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]" + Environment.NewLine + "[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]" + Environment.NewLine +
"public PropertyType PropertyName { get; private set; }" + Environment.NewLine, "public PropertyType PropertyName { get; private set; }" + Environment.NewLine,
context.Writer.Builder.ToString()); context.CodeWriter.Builder.ToString());
} }
[Fact] [Fact]
@ -61,15 +61,17 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions
"public PropertyType<ModelType> PropertyName { get; private set; }" + Environment.NewLine + Environment.NewLine + "public PropertyType<ModelType> PropertyName { get; private set; }" + Environment.NewLine + Environment.NewLine +
"#line default" + Environment.NewLine + "#line default" + Environment.NewLine +
"#line hidden" + Environment.NewLine, "#line hidden" + Environment.NewLine,
context.Writer.Builder.ToString()); context.CodeWriter.Builder.ToString());
} }
private CSharpRenderingContext GetRenderingContext() private CodeRenderingContext GetRenderingContext()
{ {
return new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Writer = new CSharpCodeWriter() var options = RazorCodeGenerationOptions.CreateDefault();
}; var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
return context;
} }
} }
} }

View File

@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithWrite() public void CSharpCodeWriter_TracksPosition_WithWrite()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234"); writer.Write("1234");
@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithIndent() public void CSharpCodeWriter_TracksPosition_WithIndent()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.WriteLine(); writer.WriteLine();
@ -62,7 +62,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithWriteLine() public void CSharpCodeWriter_TracksPosition_WithWriteLine()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.WriteLine("1234"); writer.WriteLine("1234");
@ -80,7 +80,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithWriteLine_WithNewLineInContent(string newLine) public void CSharpCodeWriter_TracksPosition_WithWriteLine_WithNewLineInContent(string newLine)
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.WriteLine("1234" + newLine + "12"); writer.WriteLine("1234" + newLine + "12");
@ -101,7 +101,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithWrite_WithNewlineInContent(string newLine) public void CSharpCodeWriter_TracksPosition_WithWrite_WithNewlineInContent(string newLine)
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234" + newLine + "123" + newLine + "12"); writer.Write("1234" + newLine + "123" + newLine + "12");
@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithWrite_WithNewlineInContent_RepeatedN() public void CSharpCodeWriter_TracksPosition_WithWrite_WithNewlineInContent_RepeatedN()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234\n\n123"); writer.Write("1234\n\n123");
@ -141,7 +141,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithWrite_WithMixedNewlineInContent() public void CSharpCodeWriter_TracksPosition_WithWrite_WithMixedNewlineInContent()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234\r123\r\n12\n1"); writer.Write("1234\r123\r\n12\n1");
@ -161,7 +161,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithNewline_SplitAcrossWrites() public void CSharpCodeWriter_TracksPosition_WithNewline_SplitAcrossWrites()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234\r"); writer.Write("1234\r");
@ -182,7 +182,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithTwoNewline_SplitAcrossWrites_R() public void CSharpCodeWriter_TracksPosition_WithTwoNewline_SplitAcrossWrites_R()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234\r"); writer.Write("1234\r");
@ -203,7 +203,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithTwoNewline_SplitAcrossWrites_N() public void CSharpCodeWriter_TracksPosition_WithTwoNewline_SplitAcrossWrites_N()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234\n"); writer.Write("1234\n");
@ -224,7 +224,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithTwoNewline_SplitAcrossWrites_Reversed() public void CSharpCodeWriter_TracksPosition_WithTwoNewline_SplitAcrossWrites_Reversed()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("1234\n"); writer.Write("1234\n");
@ -245,7 +245,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CSharpCodeWriter_TracksPosition_WithNewline_SplitAcrossWrites_AtBeginning() public void CSharpCodeWriter_TracksPosition_WithNewline_SplitAcrossWrites_AtBeginning()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.Write("\r"); writer.Write("\r");
@ -267,7 +267,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
// Arrange // Arrange
var filePath = "some-path"; var filePath = "some-path";
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
var expected = $"#line 5 \"{filePath}\"" + writer.NewLine; var expected = $"#line 5 \"{filePath}\"" + writer.NewLine;
var sourceLocation = new SourceLocation(10, 4, 3); var sourceLocation = new SourceLocation(10, 4, 3);
var mappingLocation = new SourceSpan(sourceLocation, 9); var mappingLocation = new SourceSpan(sourceLocation, 9);
@ -288,7 +288,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
// Arrange // Arrange
var filePath = "some-path"; var filePath = "some-path";
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
var expected = $"#line 5 \"{sourceLocationFilePath}\"" + writer.NewLine; var expected = $"#line 5 \"{sourceLocationFilePath}\"" + writer.NewLine;
var sourceLocation = new SourceLocation(sourceLocationFilePath, 10, 4, 3); var sourceLocation = new SourceLocation(sourceLocationFilePath, 10, 4, 3);
var mappingLocation = new SourceSpan(sourceLocation, 9); var mappingLocation = new SourceSpan(sourceLocation, 9);
@ -305,7 +305,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteField_WritesFieldDeclaration() public void WriteField_WritesFieldDeclaration()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.WriteField(new[] { "private" }, "global::System.String", "_myString"); writer.WriteField(new[] { "private" }, "global::System.String", "_myString");
@ -319,7 +319,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteField_WithModifiers_WritesFieldDeclaration() public void WriteField_WithModifiers_WritesFieldDeclaration()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.WriteField(new[] { "private", "readonly", "static" }, "global::System.String", "_myString"); writer.WriteField(new[] { "private", "readonly", "static" }, "global::System.String", "_myString");
@ -333,7 +333,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteAutoPropertyDeclaration_WritesPropertyDeclaration() public void WriteAutoPropertyDeclaration_WritesPropertyDeclaration()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.WriteAutoPropertyDeclaration(new[] { "public" }, "global::System.String", "MyString"); writer.WriteAutoPropertyDeclaration(new[] { "public" }, "global::System.String", "MyString");
@ -347,7 +347,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteAutoPropertyDeclaration_WithModifiers_WritesPropertyDeclaration() public void WriteAutoPropertyDeclaration_WithModifiers_WritesPropertyDeclaration()
{ {
// Arrange // Arrange
var writer = new CSharpCodeWriter(); var writer = new CodeWriter();
// Act // Act
writer.WriteAutoPropertyDeclaration(new[] { "public", "static" }, "global::System.String", "MyString"); writer.WriteAutoPropertyDeclaration(new[] { "public", "static" }, "global::System.String", "MyString");

View File

@ -31,12 +31,14 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void CreateWriter_CreatesDefaultDocumentWriter() public void CreateWriter_CreatesDefaultDocumentWriter()
{ {
// Arrange // Arrange
var codeWriter = new CodeWriter();
var codeDocument = TestRazorCodeDocument.Create(string.Empty);
var options = RazorCodeGenerationOptions.CreateDefault(); 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(new CSharpRenderingContext()); var writer = target.CreateWriter(context);
// Assert // Assert
Assert.IsType<DefaultDocumentWriter>(writer); Assert.IsType<DefaultDocumentWriter>(writer);

View File

@ -17,12 +17,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options); var target = CodeTarget.CreateDefault(codeDocument, options);
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Options = options, var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
Writer = new CSharpCodeWriter(),
CodeDocument = codeDocument
};
var writer = new DefaultDocumentWriter(target, context); var writer = new DefaultDocumentWriter(target, context);
@ -33,7 +30,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteDocument(document); writer.WriteDocument(document);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
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/>
@ -56,12 +53,9 @@ 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 context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Options = options, var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
Writer = new CSharpCodeWriter(),
CodeDocument = codeDocument
};
var writer = new DefaultDocumentWriter(target, context); var writer = new DefaultDocumentWriter(target, context);
@ -72,7 +66,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteDocument(document); writer.WriteDocument(document);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"// <auto-generated/> @"// <auto-generated/>
#pragma warning disable 1591 #pragma warning disable 1591
@ -90,12 +84,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options); var target = CodeTarget.CreateDefault(codeDocument, options);
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Options = options, var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
Writer = new CSharpCodeWriter(),
CodeDocument = codeDocument
};
var writer = new DefaultDocumentWriter(target, context); var writer = new DefaultDocumentWriter(target, context);
@ -110,7 +101,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteDocument(document); writer.WriteDocument(document);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
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/>
@ -133,12 +124,9 @@ namespace TestNamespace
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options); var target = CodeTarget.CreateDefault(codeDocument, options);
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Options = options, var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
Writer = new CSharpCodeWriter(),
CodeDocument = codeDocument
};
var writer = new DefaultDocumentWriter(target, context); var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode(); var document = new DocumentIntermediateNode();
@ -158,7 +146,7 @@ namespace TestNamespace
writer.WriteDocument(document); writer.WriteDocument(document);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
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/>
@ -180,12 +168,9 @@ internal class TestClass : TestBase, IFoo, IBar
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options); var target = CodeTarget.CreateDefault(codeDocument, options);
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Options = options, var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
Writer = new CSharpCodeWriter(),
CodeDocument = codeDocument
};
var writer = new DefaultDocumentWriter(target, context); var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode(); var document = new DocumentIntermediateNode();
@ -206,7 +191,7 @@ internal class TestClass : TestBase, IFoo, IBar
writer.WriteDocument(document); writer.WriteDocument(document);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
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/>
@ -230,12 +215,9 @@ internal virtual async string TestMethod()
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options); var target = CodeTarget.CreateDefault(codeDocument, options);
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Options = options, var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
Writer = new CSharpCodeWriter(),
CodeDocument = codeDocument
};
var writer = new DefaultDocumentWriter(target, context); var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode(); var document = new DocumentIntermediateNode();
@ -255,7 +237,7 @@ internal virtual async string TestMethod()
writer.WriteDocument(document); writer.WriteDocument(document);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
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/>
@ -275,12 +257,9 @@ internal readonly string _foo;
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var target = CodeTarget.CreateDefault(codeDocument, options); var target = CodeTarget.CreateDefault(codeDocument, options);
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Options = options, var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options);
Writer = new CSharpCodeWriter(),
CodeDocument = codeDocument
};
var writer = new DefaultDocumentWriter(target, context); var writer = new DefaultDocumentWriter(target, context);
var document = new DocumentIntermediateNode(); var document = new DocumentIntermediateNode();
@ -300,7 +279,7 @@ internal readonly string _foo;
writer.WriteDocument(document); writer.WriteDocument(document);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
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

@ -2,24 +2,22 @@
// 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 System.Linq; using System.Linq;
using Microsoft.AspNetCore.Razor.Language.Intermediate; using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class DesignTimeBasicWriterTest public class DesignTimeNodeWriterTest
{ {
[Fact] [Fact]
public void WriteUsingDirective_NoSource_WritesContent() public void WriteUsingDirective_NoSource_WritesContent()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var options = RazorCodeGenerationOptions.CreateDefault();
Writer = new CSharpCodeWriter() var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
};
var node = new UsingDirectiveIntermediateNode() var node = new UsingDirectiveIntermediateNode()
{ {
@ -30,7 +28,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteUsingDirective(context, node); writer.WriteUsingDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"using System; @"using System;
", ",
@ -42,13 +40,11 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteUsingDirective_WithSource_WritesContentWithLinePragmaAndMapping() public void WriteUsingDirective_WithSource_WritesContentWithLinePragmaAndMapping()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var sourceDocument = TestRazorSourceDocument.Create("@using System;"); var sourceDocument = TestRazorSourceDocument.Create("@using System;");
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var options = RazorCodeGenerationOptions.CreateDefault();
Writer = new CSharpCodeWriter(), var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
CodeDocument = RazorCodeDocument.Create(sourceDocument)
};
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);
@ -63,9 +59,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteUsingDirective(context, node); writer.WriteUsingDirective(context, node);
// Assert // Assert
var mapping = Assert.Single(context.LineMappings); var mapping = Assert.Single(context.GetLineMappings());
Assert.Equal(expectedLineMapping, mapping); Assert.Equal(expectedLineMapping, mapping);
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
using System; using System;
@ -81,12 +77,10 @@ using System;
public void WriteCSharpExpression_SkipsLinePragma_WithoutSource() public void WriteCSharpExpression_SkipsLinePragma_WithoutSource()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode(); var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node); var builder = IntermediateNodeBuilder.Create(node);
@ -100,7 +94,7 @@ using System;
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"__o = i++; @"__o = i++;
", ",
@ -112,13 +106,10 @@ using System;
public void WriteCSharpExpression_WritesLinePragma_WithSource() public void WriteCSharpExpression_WritesLinePragma_WithSource()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Options = RazorCodeGenerationOptions.CreateDefault(),
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode() var node = new CSharpExpressionIntermediateNode()
{ {
@ -135,7 +126,7 @@ using System;
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
__o = i++; __o = i++;
@ -151,12 +142,10 @@ __o = i++;
public void WriteCSharpExpression_WithExtensionNode_WritesPadding() public void WriteCSharpExpression_WithExtensionNode_WritesPadding()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode(); var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node); var builder = IntermediateNodeBuilder.Create(node);
@ -172,13 +161,13 @@ __o = i++;
Kind = IntermediateToken.TokenKind.CSharp, Kind = IntermediateToken.TokenKind.CSharp,
}); });
context.RenderNode = (n) => Assert.IsType<MyExtensionIntermediateNode>(n); context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act // Act
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"__o = i++; @"__o = i++;
", ",
@ -190,15 +179,11 @@ __o = i++;
public void WriteCSharpExpression_WithSource_WritesPadding() public void WriteCSharpExpression_WithSource_WritesPadding()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var sourceDocument = TestRazorSourceDocument.Create(" @i++"); var sourceDocument = TestRazorSourceDocument.Create(" @i++");
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
Options = RazorCodeGenerationOptions.CreateDefault(),
CodeDocument = RazorCodeDocument.Create(sourceDocument),
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode() var node = new CSharpExpressionIntermediateNode()
{ {
@ -217,13 +202,13 @@ __o = i++;
Kind = IntermediateToken.TokenKind.CSharp, Kind = IntermediateToken.TokenKind.CSharp,
}); });
context.RenderNode = (n) => Assert.IsType<MyExtensionIntermediateNode>(n); context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act // Act
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
__o = i++; __o = i++;
@ -239,12 +224,10 @@ __o = i++;
public void WriteCSharpCode_WhitespaceContent_DoesNothing() public void WriteCSharpCode_WhitespaceContent_DoesNothing()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
};
var node = new CSharpCodeIntermediateNode(); var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node) IntermediateNodeBuilder.Create(node)
@ -258,7 +241,7 @@ __o = i++;
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Empty(csharp); Assert.Empty(csharp);
} }
@ -266,13 +249,10 @@ __o = i++;
public void WriteCSharpCode_WhitespaceContentWithSource_WritesContent() public void WriteCSharpCode_WhitespaceContentWithSource_WritesContent()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.CreateDefault(),
};
var node = new CSharpCodeIntermediateNode() var node = new CSharpCodeIntermediateNode()
{ {
@ -289,7 +269,7 @@ __o = i++;
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@" @"
", ",
@ -301,12 +281,10 @@ __o = i++;
public void WriteCSharpCode_SkipsLinePragma_WithoutSource() public void WriteCSharpCode_SkipsLinePragma_WithoutSource()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
};
var node = new CSharpCodeIntermediateNode(); var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node) IntermediateNodeBuilder.Create(node)
@ -320,7 +298,7 @@ __o = i++;
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"if (true) { } @"if (true) { }
", ",
@ -332,13 +310,10 @@ __o = i++;
public void WriteCSharpCode_WritesLinePragma_WithSource() public void WriteCSharpCode_WritesLinePragma_WithSource()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.CreateDefault(),
};
var node = new CSharpCodeIntermediateNode() var node = new CSharpCodeIntermediateNode()
{ {
@ -355,7 +330,7 @@ __o = i++;
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
if (true) { } if (true) { }
@ -371,13 +346,10 @@ if (true) { }
public void WriteCSharpCode_WritesPadding_WithSource() public void WriteCSharpCode_WritesPadding_WithSource()
{ {
// Arrange // Arrange
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.CreateDefault(),
};
var node = new CSharpCodeIntermediateNode() var node = new CSharpCodeIntermediateNode()
{ {
@ -394,7 +366,7 @@ if (true) { }
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
if (true) { } if (true) { }
@ -409,13 +381,12 @@ if (true) { }
[Fact] [Fact]
public void WriteCSharpExpressionAttributeValue_RendersCorrectly() public void WriteCSharpExpressionAttributeValue_RendersCorrectly()
{ {
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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);
context.CodeDocument = codeDocument; var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
@ -423,7 +394,7 @@ if (true) { }
writer.WriteCSharpExpressionAttributeValue(context, node); writer.WriteCSharpExpressionAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
__o = false; __o = false;
@ -438,13 +409,11 @@ if (true) { }
[Fact] [Fact]
public void WriteCSharpCodeAttributeValue_RendersCorrectly() public void WriteCSharpCodeAttributeValue_RendersCorrectly()
{ {
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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);
context.CodeDocument = codeDocument; var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
@ -452,7 +421,7 @@ if (true) { }
writer.WriteCSharpCodeAttributeValue(context, node); writer.WriteCSharpCodeAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
if(@true){ } if(@true){ }
@ -467,13 +436,11 @@ if (true) { }
[Fact] [Fact]
public void WriteCSharpCodeAttributeValue_WithExpression_RendersCorrectly() public void WriteCSharpCodeAttributeValue_WithExpression_RendersCorrectly()
{ {
var writer = new DesignTimeBasicWriter(); var writer = new DesignTimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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);
context.CodeDocument = codeDocument; var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
@ -481,7 +448,7 @@ if (true) { }
writer.WriteCSharpCodeAttributeValue(context, node); writer.WriteCSharpCodeAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
if(@true){ if(@true){
@ -499,24 +466,15 @@ Render Node - CSharpExpressionIntermediateNode
ignoreLineEndingDifferences: true); ignoreLineEndingDifferences: true);
} }
private static CSharpRenderingContext GetCSharpRenderingContext(BasicWriter writer) private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument)
{ {
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var codeWriter = new CSharpCodeWriter(); var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
context.SetRenderNode(n =>
{ {
Writer = codeWriter, codeWriter.WriteLine($"Render Node - {n.GetType().Name}");
Options = options, });
BasicWriter = writer,
RenderChildren = n =>
{
codeWriter.WriteLine("Render Children");
},
RenderNode = n =>
{
codeWriter.WriteLine($"Render Node - {n.GetType().Name}");
}
};
return context; return context;
} }
@ -556,7 +514,7 @@ Render Node - CSharpExpressionIntermediateNode
throw new NotImplementedException(); throw new NotImplementedException();
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
// Arrange // Arrange
var writer = new DesignTimeTagHelperWriter(); var writer = new DesignTimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer);
var node = new DeclareTagHelperFieldsIntermediateNode(); var node = new DeclareTagHelperFieldsIntermediateNode();
node.UsedTagHelperTypeNames.Add("PTagHelper"); node.UsedTagHelperTypeNames.Add("PTagHelper");
node.UsedTagHelperTypeNames.Add("MyTagHelper"); node.UsedTagHelperTypeNames.Add("MyTagHelper");
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteDeclareTagHelperFields(context, node); writer.WriteDeclareTagHelperFields(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"private global::PTagHelper __PTagHelper = null; @"private global::PTagHelper __PTagHelper = null;
private global::MyTagHelper __MyTagHelper = null; private global::MyTagHelper __MyTagHelper = null;
@ -39,7 +39,7 @@ private global::MyTagHelper __MyTagHelper = null;
{ {
// Arrange // Arrange
var writer = new DesignTimeTagHelperWriter(); var writer = new DesignTimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer);
var node = new CreateTagHelperIntermediateNode() var node = new CreateTagHelperIntermediateNode()
{ {
TagHelperTypeName = "TestNamespace.MyTagHelper" TagHelperTypeName = "TestNamespace.MyTagHelper"
@ -49,7 +49,7 @@ private global::MyTagHelper __MyTagHelper = null;
writer.WriteCreateTagHelper(context, node); writer.WriteCreateTagHelper(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"__TestNamespace_MyTagHelper = CreateTagHelper<global::TestNamespace.MyTagHelper>(); @"__TestNamespace_MyTagHelper = CreateTagHelper<global::TestNamespace.MyTagHelper>();
", ",
@ -85,13 +85,13 @@ private global::MyTagHelper __MyTagHelper = null;
var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode; var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode;
var writer = new DesignTimeTagHelperWriter(); var writer = new DesignTimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteSetTagHelperProperty(context, node); writer.WriteSetTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"Render Children @"Render Children
__InputTagHelper.FooProp = ""value""; __InputTagHelper.FooProp = ""value"";
@ -128,13 +128,13 @@ __InputTagHelper.FooProp = ""value"";
var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode; var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode;
var writer = new DesignTimeTagHelperWriter(); var writer = new DesignTimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteSetTagHelperProperty(context, node); writer.WriteSetTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 3 ""test.cshtml"" @"#line 3 ""test.cshtml""
__InputTagHelper.FooProp = 42; __InputTagHelper.FooProp = 42;
@ -175,13 +175,13 @@ __InputTagHelper.FooProp = 42;
var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode; var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode;
var writer = new DesignTimeTagHelperWriter(); var writer = new DesignTimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteSetTagHelperProperty(context, node); writer.WriteSetTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 3 ""test.cshtml"" @"#line 3 ""test.cshtml""
__InputTagHelper.FooProp[""bound""] = 42; __InputTagHelper.FooProp[""bound""] = 42;
@ -193,23 +193,20 @@ __InputTagHelper.FooProp[""bound""] = 42;
ignoreLineEndingDifferences: true); ignoreLineEndingDifferences: true);
} }
private static CSharpRenderingContext GetCSharpRenderingContext(TagHelperWriter writer, RazorCodeDocument codeDocument = null) private static CodeRenderingContext GetCodeRenderingContext(TagHelperWriter writer, RazorCodeDocument codeDocument = null)
{ {
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var codeWriter = new CSharpCodeWriter(); var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var nodeWriter = new DesignTimeNodeWriter();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument?.Source, options)
{ {
Writer = codeWriter,
Options = options,
BasicWriter = new DesignTimeBasicWriter(),
TagHelperWriter = writer, TagHelperWriter = writer,
TagHelperRenderingContext = new TagHelperRenderingContext(), TagHelperRenderingContext = new TagHelperRenderingContext()
CodeDocument = codeDocument,
RenderChildren = n =>
{
codeWriter.WriteLine("Render Children");
}
}; };
context.SetRenderChildren(n =>
{
codeWriter.WriteLine("Render Children");
});
return context; return context;
} }

View File

@ -6,19 +6,16 @@ using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class LiteralRuntimeBasicWriterTest public class LiteralRuntimeNodeWriterTest
{ {
[Fact] [Fact]
public void WriteCSharpExpression_UsesWriteLiteral_WritesLinePragma_WithSource() public void WriteCSharpExpression_UsesWriteLiteral_WritesLinePragma_WithSource()
{ {
// Arrange // Arrange
var writer = new LiteralRuntimeBasicWriter(); var writer = new LiteralRuntimeNodeWriter();
var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Options = RazorCodeGenerationOptions.CreateDefault(),
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode() var node = new CSharpExpressionIntermediateNode()
{ {
@ -35,7 +32,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
WriteLiteral(i++); WriteLiteral(i++);

View File

@ -8,17 +8,16 @@ using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class RuntimeBasicWriterTest public class RuntimeNodeWriterTest
{ {
[Fact] [Fact]
public void WriteUsingDirective_NoSource_WritesContent() public void WriteUsingDirective_NoSource_WritesContent()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var writer = new RuntimeNodeWriter();
{ var options = RazorCodeGenerationOptions.CreateDefault();
Writer = new CSharpCodeWriter() var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
};
var node = new UsingDirectiveIntermediateNode() var node = new UsingDirectiveIntermediateNode()
{ {
@ -29,7 +28,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteUsingDirective(context, node); writer.WriteUsingDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"using System; @"using System;
", ",
@ -41,11 +40,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
public void WriteUsingDirective_WithSource_WritesContentWithLinePragma() public void WriteUsingDirective_WithSource_WritesContentWithLinePragma()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var writer = new RuntimeNodeWriter();
{ var options = RazorCodeGenerationOptions.CreateDefault();
Writer = new CSharpCodeWriter() var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
};
var node = new UsingDirectiveIntermediateNode() var node = new UsingDirectiveIntermediateNode()
{ {
@ -57,7 +55,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteUsingDirective(context, node); writer.WriteUsingDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
using System; using System;
@ -73,15 +71,13 @@ using System;
public void WriteCSharpExpression_SkipsLinePragma_WithoutSource() public void WriteCSharpExpression_SkipsLinePragma_WithoutSource()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter() var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter()
{ {
WriteCSharpExpressionMethod = "Test", WriteCSharpExpressionMethod = "Test",
}; };
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new CSharpRenderingContext() var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
{
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode(); var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node); var builder = IntermediateNodeBuilder.Create(node);
@ -95,7 +91,7 @@ using System;
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"Test(i++); @"Test(i++);
", ",
@ -107,16 +103,13 @@ using System;
public void WriteCSharpExpression_WritesLinePragma_WithSource() public void WriteCSharpExpression_WritesLinePragma_WithSource()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter() var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter()
{ {
WriteCSharpExpressionMethod = "Test", WriteCSharpExpressionMethod = "Test",
}; };
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new CSharpRenderingContext() var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
{
Options = RazorCodeGenerationOptions.CreateDefault(),
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode() var node = new CSharpExpressionIntermediateNode()
{ {
@ -133,7 +126,7 @@ using System;
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
Test(i++); Test(i++);
@ -149,15 +142,13 @@ Test(i++);
public void WriteCSharpExpression_WithExtensionNode_WritesPadding() public void WriteCSharpExpression_WithExtensionNode_WritesPadding()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter() var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter()
{ {
WriteCSharpExpressionMethod = "Test", WriteCSharpExpressionMethod = "Test",
}; };
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new CSharpRenderingContext() var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
{
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode(); var node = new CSharpExpressionIntermediateNode();
var builder = IntermediateNodeBuilder.Create(node); var builder = IntermediateNodeBuilder.Create(node);
@ -173,13 +164,13 @@ Test(i++);
Kind = IntermediateToken.TokenKind.CSharp, Kind = IntermediateToken.TokenKind.CSharp,
}); });
context.RenderNode = (n) => Assert.IsType<MyExtensionIntermediateNode>(n); context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act // Act
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"Test(i++); @"Test(i++);
", ",
@ -191,18 +182,14 @@ Test(i++);
public void WriteCSharpExpression_WithSource_WritesPadding() public void WriteCSharpExpression_WithSource_WritesPadding()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter() var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter()
{ {
WriteCSharpExpressionMethod = "Test", WriteCSharpExpressionMethod = "Test",
}; };
var options = RazorCodeGenerationOptions.CreateDefault();
var sourceDocument = TestRazorSourceDocument.Create(" @i++"); var sourceDocument = TestRazorSourceDocument.Create(" @i++");
var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
var context = new CSharpRenderingContext()
{
Options = RazorCodeGenerationOptions.CreateDefault(),
CodeDocument = RazorCodeDocument.Create(sourceDocument),
Writer = new CSharpCodeWriter(),
};
var node = new CSharpExpressionIntermediateNode() var node = new CSharpExpressionIntermediateNode()
{ {
@ -221,13 +208,13 @@ Test(i++);
Kind = IntermediateToken.TokenKind.CSharp, Kind = IntermediateToken.TokenKind.CSharp,
}); });
context.RenderNode = (n) => Assert.IsType<MyExtensionIntermediateNode>(n); context.SetRenderNode((n) => Assert.IsType<MyExtensionIntermediateNode>(n));
// Act // Act
writer.WriteCSharpExpression(context, node); writer.WriteCSharpExpression(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
Test(i++); Test(i++);
@ -243,12 +230,10 @@ Test(i++);
public void WriteCSharpCode_WhitespaceContent_DoesNothing() public void WriteCSharpCode_WhitespaceContent_DoesNothing()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
};
var node = new CSharpCodeIntermediateNode(); var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node) IntermediateNodeBuilder.Create(node)
@ -262,7 +247,7 @@ Test(i++);
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Empty(csharp); Assert.Empty(csharp);
} }
@ -270,12 +255,10 @@ Test(i++);
public void WriteCSharpCode_SkipsLinePragma_WithoutSource() public void WriteCSharpCode_SkipsLinePragma_WithoutSource()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
};
var node = new CSharpCodeIntermediateNode(); var node = new CSharpCodeIntermediateNode();
IntermediateNodeBuilder.Create(node) IntermediateNodeBuilder.Create(node)
@ -289,7 +272,7 @@ Test(i++);
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"if (true) { } @"if (true) { }
", ",
@ -301,13 +284,10 @@ Test(i++);
public void WriteCSharpCode_WritesLinePragma_WithSource() public void WriteCSharpCode_WritesLinePragma_WithSource()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.CreateDefault(),
};
var node = new CSharpCodeIntermediateNode() var node = new CSharpCodeIntermediateNode()
{ {
@ -324,7 +304,7 @@ Test(i++);
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
if (true) { } if (true) { }
@ -340,13 +320,10 @@ if (true) { }
public void WriteCSharpCode_WritesPadding_WithSource() public void WriteCSharpCode_WritesPadding_WithSource()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var writer = new RuntimeNodeWriter();
var context = new CSharpRenderingContext() var options = RazorCodeGenerationOptions.CreateDefault();
{ var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.CreateDefault(),
};
var node = new CSharpCodeIntermediateNode() var node = new CSharpCodeIntermediateNode()
{ {
@ -363,7 +340,7 @@ if (true) { }
writer.WriteCSharpCode(context, node); writer.WriteCSharpCode(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
if (true) { } if (true) { }
@ -379,12 +356,10 @@ if (true) { }
public void WriteHtmlContent_RendersContentCorrectly() public void WriteHtmlContent_RendersContentCorrectly()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var writer = new RuntimeNodeWriter();
{ var options = RazorCodeGenerationOptions.CreateDefault();
Writer = new CSharpCodeWriter(), var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Options = RazorCodeGenerationOptions.CreateDefault(),
};
var node = new HtmlContentIntermediateNode(); var node = new HtmlContentIntermediateNode();
node.Children.Add(new IntermediateToken() node.Children.Add(new IntermediateToken()
@ -397,7 +372,7 @@ if (true) { }
writer.WriteHtmlContent(context, node); writer.WriteHtmlContent(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"WriteLiteral(""SomeContent""); @"WriteLiteral(""SomeContent"");
", ",
@ -409,12 +384,10 @@ if (true) { }
public void WriteHtmlContent_LargeStringLiteral_UsesMultipleWrites() public void WriteHtmlContent_LargeStringLiteral_UsesMultipleWrites()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var codeWriter = new CodeWriter();
var context = new CSharpRenderingContext() var writer = new RuntimeNodeWriter();
{ var options = RazorCodeGenerationOptions.CreateDefault();
Writer = new CSharpCodeWriter(), var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options);
Options = RazorCodeGenerationOptions.CreateDefault(),
};
var node = new HtmlContentIntermediateNode(); var node = new HtmlContentIntermediateNode();
@ -428,7 +401,7 @@ if (true) { }
writer.WriteHtmlContent(context, node); writer.WriteHtmlContent(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal(string.Format( Assert.Equal(string.Format(
@"WriteLiteral(@""{0}""); @"WriteLiteral(@""{0}"");
WriteLiteral(@""{1}""); WriteLiteral(@""{1}"");
@ -441,12 +414,11 @@ WriteLiteral(@""{1}"");
public void WriteHtmlAttribute_RendersCorrectly() public void WriteHtmlAttribute_RendersCorrectly()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var writer = new RuntimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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 irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single(); var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single();
@ -454,7 +426,7 @@ WriteLiteral(@""{1}"");
writer.WriteHtmlAttribute(context, node); writer.WriteHtmlAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"BeginWriteAttribute(""checked"", "" checked=\"""", 6, ""\"""", 34, 2); @"BeginWriteAttribute(""checked"", "" checked=\"""", 6, ""\"""", 34, 2);
Render Children Render Children
@ -468,12 +440,11 @@ EndWriteAttribute();
public void WriteHtmlAttributeValue_RendersCorrectly() public void WriteHtmlAttributeValue_RendersCorrectly()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var writer = new RuntimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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 irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode;
@ -481,7 +452,7 @@ EndWriteAttribute();
writer.WriteHtmlAttributeValue(context, node); writer.WriteHtmlAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"WriteAttributeValue("""", 16, ""hello-world"", 16, 11, true); @"WriteAttributeValue("""", 16, ""hello-world"", 16, 11, true);
", ",
@ -493,12 +464,11 @@ EndWriteAttribute();
public void WriteCSharpExpressionAttributeValue_RendersCorrectly() public void WriteCSharpExpressionAttributeValue_RendersCorrectly()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var writer = new RuntimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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 irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
@ -506,7 +476,7 @@ EndWriteAttribute();
writer.WriteCSharpExpressionAttributeValue(context, node); writer.WriteCSharpExpressionAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
WriteAttributeValue("" "", 27, false, 28, 6, false); WriteAttributeValue("" "", 27, false, 28, 6, false);
@ -522,13 +492,12 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
public void WriteCSharpCodeAttributeValue_BuffersResult() public void WriteCSharpCodeAttributeValue_BuffersResult()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter(); var writer = new RuntimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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);
context.CodeDocument = codeDocument; var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
@ -536,7 +505,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
writer.WriteCSharpCodeAttributeValue(context, node); writer.WriteCSharpCodeAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"WriteAttributeValue("" "", 27, new Microsoft.AspNetCore.Mvc.Razor.HelperResult(async(__razor_attribute_value_writer) => { @"WriteAttributeValue("" "", 27, new Microsoft.AspNetCore.Mvc.Razor.HelperResult(async(__razor_attribute_value_writer) => {
PushWriter(__razor_attribute_value_writer); PushWriter(__razor_attribute_value_writer);
@ -557,17 +526,17 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
public void BeginWriterScope_UsesSpecifiedWriter_RendersCorrectly() public void BeginWriterScope_UsesSpecifiedWriter_RendersCorrectly()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter() var writer = new RuntimeNodeWriter()
{ {
PushWriterMethod = "TestPushWriter" PushWriterMethod = "TestPushWriter"
}; };
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer, null);
// Act // Act
writer.BeginWriterScope(context, "MyWriter"); writer.BeginWriterScope(context, "MyWriter");
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"TestPushWriter(MyWriter); @"TestPushWriter(MyWriter);
", ",
@ -579,17 +548,17 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
public void EndWriterScope_RendersCorrectly() public void EndWriterScope_RendersCorrectly()
{ {
// Arrange // Arrange
var writer = new RuntimeBasicWriter() var writer = new RuntimeNodeWriter()
{ {
PopWriterMethod = "TestPopWriter" PopWriterMethod = "TestPopWriter"
}; };
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer, null);
// Act // Act
writer.EndWriterScope(context); writer.EndWriterScope(context);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"TestPopWriter(); @"TestPopWriter();
", ",
@ -597,20 +566,15 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
ignoreLineEndingDifferences: true); ignoreLineEndingDifferences: true);
} }
private static CSharpRenderingContext GetCSharpRenderingContext(BasicWriter writer) private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument)
{ {
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var codeWriter = new CSharpCodeWriter(); var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
var context = new CSharpRenderingContext() context.SetRenderChildren(n =>
{ {
Writer = codeWriter, codeWriter.WriteLine("Render Children");
Options = options, });
BasicWriter = writer,
RenderChildren = n =>
{
codeWriter.WriteLine("Render Children");
}
};
return context; return context;
} }
@ -652,7 +616,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
throw new NotImplementedException(); throw new NotImplementedException();
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -17,13 +17,13 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
// Arrange // Arrange
var node = new DeclareTagHelperFieldsIntermediateNode(); var node = new DeclareTagHelperFieldsIntermediateNode();
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer);
// Act // Act
writer.WriteDeclareTagHelperFields(context, node); writer.WriteDeclareTagHelperFields(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line hidden @"#line hidden
#pragma warning disable 0414 #pragma warning disable 0414
@ -57,13 +57,13 @@ private global::Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperScopeMana
node.UsedTagHelperTypeNames.Add("MyTagHelper"); node.UsedTagHelperTypeNames.Add("MyTagHelper");
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer);
// Act // Act
writer.WriteDeclareTagHelperFields(context, node); writer.WriteDeclareTagHelperFields(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line hidden @"#line hidden
#pragma warning disable 0414 #pragma warning disable 0414
@ -96,8 +96,8 @@ private global::MyTagHelper __MyTagHelper = null;
// Arrange // Arrange
var node = new TagHelperBodyIntermediateNode(); var node = new TagHelperBodyIntermediateNode();
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer);
context.IdGenerator = () => "test"; context.Items[CodeRenderingContext.SuppressUniqueIds] = "test";
context.TagHelperRenderingContext = new TagHelperRenderingContext() context.TagHelperRenderingContext = new TagHelperRenderingContext()
{ {
TagName = "p", TagName = "p",
@ -108,7 +108,7 @@ private global::MyTagHelper __MyTagHelper = null;
writer.WriteTagHelperBody(context, node); writer.WriteTagHelperBody(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"__tagHelperExecutionContext = __tagHelperScopeManager.Begin(""p"", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.SelfClosing, ""test"", async() => { @"__tagHelperExecutionContext = __tagHelperScopeManager.Begin(""p"", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.SelfClosing, ""test"", async() => {
Render Children Render Children
@ -128,13 +128,13 @@ private global::MyTagHelper __MyTagHelper = null;
TagHelperTypeName = "TestNamespace.MyTagHelper" TagHelperTypeName = "TestNamespace.MyTagHelper"
}; };
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer);
// Act // Act
writer.WriteCreateTagHelper(context, node); writer.WriteCreateTagHelper(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"__TestNamespace_MyTagHelper = CreateTagHelper<global::TestNamespace.MyTagHelper>(); @"__TestNamespace_MyTagHelper = CreateTagHelper<global::TestNamespace.MyTagHelper>();
__tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper); __tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper);
@ -149,13 +149,13 @@ __tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper);
// Arrange // Arrange
var node = new TagHelperIntermediateNode(); var node = new TagHelperIntermediateNode();
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer); var context = GetCodeRenderingContext(writer);
// Act // Act
writer.WriteTagHelper(context, node); writer.WriteTagHelper(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"Render Children @"Render Children
await __tagHelperRunner.RunAsync(__tagHelperExecutionContext); await __tagHelperRunner.RunAsync(__tagHelperExecutionContext);
@ -191,13 +191,13 @@ __tagHelperExecutionContext = __tagHelperScopeManager.End();
var node = irDocument.Children.Last().Children[2] as AddTagHelperHtmlAttributeIntermediateNode; var node = irDocument.Children.Last().Children[2] as AddTagHelperHtmlAttributeIntermediateNode;
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteAddTagHelperHtmlAttribute(context, node); writer.WriteAddTagHelperHtmlAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"BeginWriteTagHelperAttribute(); @"BeginWriteTagHelperAttribute();
Render Children Render Children
@ -229,13 +229,13 @@ __tagHelperExecutionContext.AddHtmlAttribute(""name"", Html.Raw(__tagHelperStrin
var node = irDocument.Children.Last().Children[2] as AddTagHelperHtmlAttributeIntermediateNode; var node = irDocument.Children.Last().Children[2] as AddTagHelperHtmlAttributeIntermediateNode;
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteAddTagHelperHtmlAttribute(context, node); writer.WriteAddTagHelperHtmlAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"BeginWriteTagHelperAttribute(); @"BeginWriteTagHelperAttribute();
Render Children Render Children
@ -267,13 +267,13 @@ __tagHelperExecutionContext.AddHtmlAttribute(""data-test"", Html.Raw(__tagHelper
var node = irDocument.Children.Last().Children[2] as AddTagHelperHtmlAttributeIntermediateNode; var node = irDocument.Children.Last().Children[2] as AddTagHelperHtmlAttributeIntermediateNode;
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteAddTagHelperHtmlAttribute(context, node); writer.WriteAddTagHelperHtmlAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"BeginAddHtmlAttributeValues(__tagHelperExecutionContext, ""test"", 2, global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes); @"BeginAddHtmlAttributeValues(__tagHelperExecutionContext, ""test"", 2, global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
Render Children Render Children
@ -311,13 +311,13 @@ EndAddHtmlAttributeValues(__tagHelperExecutionContext);
var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode; var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode;
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteSetTagHelperProperty(context, node); writer.WriteSetTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
// The attribute value is not rendered inline because we are not using the preallocated writer. // The attribute value is not rendered inline because we are not using the preallocated writer.
Assert.Equal( Assert.Equal(
@ -359,13 +359,13 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.Fo
var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode; var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode;
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteSetTagHelperProperty(context, node); writer.WriteSetTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 3 ""test.cshtml"" @"#line 3 ""test.cshtml""
__InputTagHelper.FooProp = 42; __InputTagHelper.FooProp = 42;
@ -407,13 +407,13 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.Fo
var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode; var node = irDocument.Children.Last().Children[2] as SetTagHelperPropertyIntermediateNode;
var writer = new RuntimeTagHelperWriter(); var writer = new RuntimeTagHelperWriter();
var context = GetCSharpRenderingContext(writer, codeDocument); var context = GetCodeRenderingContext(writer, codeDocument);
// Act // Act
writer.WriteSetTagHelperProperty(context, node); writer.WriteSetTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"if (__InputTagHelper.FooProp == null) @"if (__InputTagHelper.FooProp == null)
{ {
@ -430,22 +430,20 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""foo-bound"", __InputTagHelpe
ignoreLineEndingDifferences: true); ignoreLineEndingDifferences: true);
} }
private static CSharpRenderingContext GetCSharpRenderingContext(TagHelperWriter writer, RazorCodeDocument codeDocument = null) private static CodeRenderingContext GetCodeRenderingContext(TagHelperWriter writer, RazorCodeDocument codeDocument = null)
{ {
var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var codeWriter = new CSharpCodeWriter(); var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument?.Source, options)
var context = new CSharpRenderingContext()
{ {
Writer = codeWriter,
Options = options,
BasicWriter = new RuntimeBasicWriter(),
TagHelperWriter = writer, TagHelperWriter = writer,
TagHelperRenderingContext = new TagHelperRenderingContext(), TagHelperRenderingContext = new TagHelperRenderingContext()
RenderChildren = n =>
{
codeWriter.WriteLine("Render Children");
}
}; };
context.SetRenderChildren(n =>
{
codeWriter.WriteLine("Render Children");
});
return context; return context;
} }

View File

@ -7,17 +7,17 @@ using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
{ {
public class TagHelperHtmlAttributeRuntimeBasicWriterTest public class TagHelperHtmlAttributeRuntimeNodeWriterTest
{ {
[Fact] [Fact]
public void WriteHtmlAttributeValue_RendersCorrectly() public void WriteHtmlAttributeValue_RendersCorrectly()
{ {
var writer = new TagHelperHtmlAttributeRuntimeBasicWriter(); var writer = new TagHelperHtmlAttributeRuntimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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 irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[0] as HtmlAttributeValueIntermediateNode;
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteHtmlAttributeValue(context, node); writer.WriteHtmlAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"AddHtmlAttributeValue("""", 16, ""hello-world"", 16, 11, true); @"AddHtmlAttributeValue("""", 16, ""hello-world"", 16, 11, true);
", ",
@ -36,12 +36,11 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
[Fact] [Fact]
public void WriteCSharpExpressionAttributeValue_RendersCorrectly() public void WriteCSharpExpressionAttributeValue_RendersCorrectly()
{ {
var writer = new TagHelperHtmlAttributeRuntimeBasicWriter(); var writer = new TagHelperHtmlAttributeRuntimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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 irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode;
@ -49,7 +48,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration
writer.WriteCSharpExpressionAttributeValue(context, node); writer.WriteCSharpExpressionAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#line 1 ""test.cshtml"" @"#line 1 ""test.cshtml""
AddHtmlAttributeValue("" "", 27, false, 28, 6, false); AddHtmlAttributeValue("" "", 27, false, 28, 6, false);
@ -64,13 +63,12 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false);
[Fact] [Fact]
public void WriteCSharpCodeAttributeValue_BuffersResult() public void WriteCSharpCodeAttributeValue_BuffersResult()
{ {
var writer = new TagHelperHtmlAttributeRuntimeBasicWriter(); var writer = new TagHelperHtmlAttributeRuntimeNodeWriter();
var context = GetCSharpRenderingContext(writer);
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);
context.CodeDocument = codeDocument; var context = GetCodeRenderingContext(writer, sourceDocument);
var irDocument = Lower(codeDocument); var irDocument = Lower(codeDocument);
var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; var node = irDocument.Children.OfType<HtmlAttributeIntermediateNode>().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode;
@ -78,7 +76,7 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false);
writer.WriteCSharpCodeAttributeValue(context, node); writer.WriteCSharpCodeAttributeValue(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"AddHtmlAttributeValue("" "", 27, new Microsoft.AspNetCore.Mvc.Razor.HelperResult(async(__razor_attribute_value_writer) => { @"AddHtmlAttributeValue("" "", 27, new Microsoft.AspNetCore.Mvc.Razor.HelperResult(async(__razor_attribute_value_writer) => {
PushWriter(__razor_attribute_value_writer); PushWriter(__razor_attribute_value_writer);
@ -95,20 +93,15 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false);
ignoreLineEndingDifferences: true); ignoreLineEndingDifferences: true);
} }
private static CSharpRenderingContext GetCSharpRenderingContext(BasicWriter writer) private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument)
{ {
var codeWriter = new CodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault(); var options = RazorCodeGenerationOptions.CreateDefault();
var codeWriter = new CSharpCodeWriter(); var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options);
var context = new CSharpRenderingContext() context.SetRenderChildren(_ =>
{ {
Writer = codeWriter, codeWriter.WriteLine("Render Children");
Options = options, });
BasicWriter = writer,
RenderChildren = n =>
{
codeWriter.WriteLine("Render Children");
}
};
return context; return context;
} }

View File

@ -14,10 +14,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new DesignTimeDirectiveTargetExtension(); var extension = new DesignTimeDirectiveTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new DesignTimeNodeWriter();
Writer = new CSharpCodeWriter() var options = RazorCodeGenerationOptions.CreateDefault();
}; var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new DesignTimeDirectiveIntermediateNode(); var node = new DesignTimeDirectiveIntermediateNode();
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
extension.WriteDesignTimeDirective(context, node); extension.WriteDesignTimeDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#pragma warning disable 219 @"#pragma warning disable 219
private void __RazorDirectiveTokenHelpers__() { private void __RazorDirectiveTokenHelpers__() {
@ -41,11 +41,11 @@ private void __RazorDirectiveTokenHelpers__() {
{ {
// Arrange // Arrange
var extension = new DesignTimeDirectiveTargetExtension(); var extension = new DesignTimeDirectiveTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new DesignTimeNodeWriter();
Writer = new CSharpCodeWriter(), var options = RazorCodeGenerationOptions.CreateDefault();
CodeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("test content", "test.cshtml")) 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()
@ -60,7 +60,7 @@ private void __RazorDirectiveTokenHelpers__() {
extension.WriteDesignTimeDirective(context, node); extension.WriteDesignTimeDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#pragma warning disable 219 @"#pragma warning disable 219
private void __RazorDirectiveTokenHelpers__() { private void __RazorDirectiveTokenHelpers__() {
@ -80,11 +80,11 @@ System.String __typeHelper = default(System.String);
{ {
// Arrange // Arrange
var extension = new DesignTimeDirectiveTargetExtension(); var extension = new DesignTimeDirectiveTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new DesignTimeNodeWriter();
Writer = new CSharpCodeWriter(), var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
CodeDocument = RazorCodeDocument.Create(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()
@ -99,7 +99,7 @@ System.String __typeHelper = default(System.String);
extension.WriteDesignTimeDirective(context, node); extension.WriteDesignTimeDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#pragma warning disable 219 @"#pragma warning disable 219
private void __RazorDirectiveTokenHelpers__() { private void __RazorDirectiveTokenHelpers__() {
@ -119,11 +119,11 @@ global::System.Object __typeHelper = nameof(System.Collections.Generic);
{ {
// Arrange // Arrange
var extension = new DesignTimeDirectiveTargetExtension(); var extension = new DesignTimeDirectiveTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new DesignTimeNodeWriter();
Writer = new CSharpCodeWriter(), var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
CodeDocument = RazorCodeDocument.Create(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()
@ -138,7 +138,7 @@ global::System.Object __typeHelper = nameof(System.Collections.Generic);
extension.WriteDesignTimeDirective(context, node); extension.WriteDesignTimeDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#pragma warning disable 219 @"#pragma warning disable 219
private void __RazorDirectiveTokenHelpers__() { private void __RazorDirectiveTokenHelpers__() {
@ -158,11 +158,11 @@ global::System.Object Foo = null;
{ {
// Arrange // Arrange
var extension = new DesignTimeDirectiveTargetExtension(); var extension = new DesignTimeDirectiveTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new DesignTimeNodeWriter();
Writer = new CSharpCodeWriter(), var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
CodeDocument = RazorCodeDocument.Create(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()
@ -184,7 +184,7 @@ global::System.Object Foo = null;
extension.WriteDesignTimeDirective(context, node); extension.WriteDesignTimeDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#pragma warning disable 219 @"#pragma warning disable 219
private void __RazorDirectiveTokenHelpers__() { private void __RazorDirectiveTokenHelpers__() {
@ -208,11 +208,11 @@ global::System.Object __typeHelper = ""Value"";
{ {
// Arrange // Arrange
var extension = new DesignTimeDirectiveTargetExtension(); var extension = new DesignTimeDirectiveTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new DesignTimeNodeWriter();
Writer = new CSharpCodeWriter(), var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml");
CodeDocument = RazorCodeDocument.Create(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()
@ -226,7 +226,7 @@ global::System.Object __typeHelper = ""Value"";
extension.WriteDesignTimeDirective(context, node); extension.WriteDesignTimeDirective(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"#pragma warning disable 219 @"#pragma warning disable 219
private void __RazorDirectiveTokenHelpers__() { private void __RazorDirectiveTokenHelpers__() {

View File

@ -13,10 +13,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Writer = new CSharpCodeWriter() var options = RazorCodeGenerationOptions.CreateDefault();
}; var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode() var node = new DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode()
{ {
@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
extension.WriteDeclarePreallocatedTagHelperHtmlAttribute(context, node); extension.WriteDeclarePreallocatedTagHelperHtmlAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute MyProp = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute(""Foo"", new global::Microsoft.AspNetCore.Html.HtmlString(""Bar""), global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes); @"private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute MyProp = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute(""Foo"", new global::Microsoft.AspNetCore.Html.HtmlString(""Bar""), global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
", ",
@ -43,10 +43,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Writer = new CSharpCodeWriter() var options = RazorCodeGenerationOptions.CreateDefault();
}; var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode() var node = new DeclarePreallocatedTagHelperHtmlAttributeIntermediateNode()
{ {
@ -60,7 +60,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
extension.WriteDeclarePreallocatedTagHelperHtmlAttribute(context, node); extension.WriteDeclarePreallocatedTagHelperHtmlAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute _tagHelper1 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute(""Foo""); @"private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute _tagHelper1 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute(""Foo"");
", ",
@ -73,10 +73,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Writer = new CSharpCodeWriter() var options = RazorCodeGenerationOptions.CreateDefault();
}; var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new AddPreallocatedTagHelperHtmlAttributeIntermediateNode() var node = new AddPreallocatedTagHelperHtmlAttributeIntermediateNode()
{ {
@ -87,7 +87,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
extension.WriteAddPreallocatedTagHelperHtmlAttribute(context, node); extension.WriteAddPreallocatedTagHelperHtmlAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"__tagHelperExecutionContext.AddHtmlAttribute(_tagHelper1); @"__tagHelperExecutionContext.AddHtmlAttribute(_tagHelper1);
", ",
@ -100,10 +100,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Writer = new CSharpCodeWriter() var options = RazorCodeGenerationOptions.CreateDefault();
}; var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options);
var node = new DeclarePreallocatedTagHelperAttributeIntermediateNode() var node = new DeclarePreallocatedTagHelperAttributeIntermediateNode()
{ {
@ -117,7 +117,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
extension.WriteDeclarePreallocatedTagHelperAttribute(context, node); extension.WriteDeclarePreallocatedTagHelperAttribute(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute _tagHelper1 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute(""Foo"", ""Bar"", global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes); @"private static readonly global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute _tagHelper1 = new global::Microsoft.AspNetCore.Razor.TagHelpers.TagHelperAttribute(""Foo"", ""Bar"", global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
", ",
@ -130,10 +130,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
{ var nodeWriter = new RuntimeNodeWriter();
Writer = new CSharpCodeWriter() 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");
@ -159,7 +159,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
extension.WriteSetPreallocatedTagHelperProperty(context, node); extension.WriteSetPreallocatedTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"__FooTagHelper.FooProp = (string)_tagHelper1.Value; @"__FooTagHelper.FooProp = (string)_tagHelper1.Value;
__tagHelperExecutionContext.AddTagHelperAttribute(_tagHelper1); __tagHelperExecutionContext.AddTagHelperAttribute(_tagHelper1);
@ -173,9 +173,11 @@ __tagHelperExecutionContext.AddTagHelperAttribute(_tagHelper1);
{ {
// Arrange // Arrange
var extension = new PreallocatedAttributeTargetExtension(); var extension = new PreallocatedAttributeTargetExtension();
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{ {
Writer = new CSharpCodeWriter(),
TagHelperRenderingContext = new TagHelperRenderingContext() TagHelperRenderingContext = new TagHelperRenderingContext()
}; };
@ -205,7 +207,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(_tagHelper1);
extension.WriteSetPreallocatedTagHelperProperty(context, node); extension.WriteSetPreallocatedTagHelperProperty(context, node);
// Assert // Assert
var csharp = context.Writer.Builder.ToString(); var csharp = context.CodeWriter.Builder.ToString();
Assert.Equal( Assert.Equal(
@"if (__FooTagHelper.FooProp == null) @"if (__FooTagHelper.FooProp == null)
{ {

View File

@ -24,19 +24,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
SectionMethodName = "CreateSection" SectionMethodName = "CreateSection"
}; };
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{ {
BasicWriter = new RuntimeBasicWriter(),
TagHelperWriter = new RuntimeTagHelperWriter(), TagHelperWriter = new RuntimeTagHelperWriter(),
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.CreateDefault(),
}; };
context.RenderChildren = (n) => context.SetRenderChildren((n) =>
{ {
Assert.Same(node, n); Assert.Same(node, n);
context.Writer.WriteLine(" var s = \"Inside\""); context.CodeWriter.WriteLine(" var s = \"Inside\"");
}; });
// Act // Act
extension.WriteSection(context, node); extension.WriteSection(context, node);
@ -48,7 +48,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
); );
"; ";
var output = context.Writer.Builder.ToString(); var output = context.CodeWriter.Builder.ToString();
Assert.Equal(expected, output); Assert.Equal(expected, output);
} }
@ -66,19 +66,19 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
SectionMethodName = "CreateSection" SectionMethodName = "CreateSection"
}; };
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter();
var options = RazorCodeGenerationOptions.Create(false, 4, true, false);
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{ {
BasicWriter = new RuntimeBasicWriter(),
TagHelperWriter = new RuntimeTagHelperWriter(), TagHelperWriter = new RuntimeTagHelperWriter(),
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.Create(false, 4, true, false),
}; };
context.RenderChildren = (n) => context.SetRenderChildren((n) =>
{ {
Assert.Same(node, n); Assert.Same(node, n);
context.Writer.WriteLine(" var s = \"Inside\""); context.CodeWriter.WriteLine(" var s = \"Inside\"");
}; });
// Act // Act
extension.WriteSection(context, node); extension.WriteSection(context, node);
@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
); );
"; ";
var output = context.Writer.Builder.ToString(); var output = context.CodeWriter.Builder.ToString();
Assert.Equal(expected, output); Assert.Equal(expected, output);
} }
} }

View File

@ -2,9 +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.Legacy;
using Xunit; using Xunit;
using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert;
namespace Microsoft.AspNetCore.Razor.Language.Extensions namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
@ -15,29 +13,28 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
{ {
// Arrange // Arrange
var node = new TemplateIntermediateNode(); var node = new TemplateIntermediateNode();
var extension = new TemplateTargetExtension() var extension = new TemplateTargetExtension()
{ {
TemplateTypeName = "global::TestTemplate" TemplateTypeName = "global::TestTemplate"
}; };
var context = new CSharpRenderingContext() var codeWriter = new CodeWriter();
var nodeWriter = new RuntimeNodeWriter()
{
PushWriterMethod = "TestPushWriter",
PopWriterMethod = "TestPopWriter"
};
var options = RazorCodeGenerationOptions.CreateDefault();
var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options)
{ {
BasicWriter = new RuntimeBasicWriter()
{
PushWriterMethod = "TestPushWriter",
PopWriterMethod = "TestPopWriter"
},
TagHelperWriter = new RuntimeTagHelperWriter(), TagHelperWriter = new RuntimeTagHelperWriter(),
Writer = new CSharpCodeWriter(),
Options = RazorCodeGenerationOptions.CreateDefault(),
}; };
context.RenderChildren = (n) => context.SetRenderChildren((n) =>
{ {
Assert.Same(node, n); Assert.Same(node, n);
context.Writer.WriteLine(" var s = \"Inside\""); context.CodeWriter.WriteLine(" var s = \"Inside\"");
}; });
// Act // Act
extension.WriteTemplate(context, node); extension.WriteTemplate(context, node);
@ -50,7 +47,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions
} }
)"; )";
var output = context.Writer.Builder.ToString(); var output = context.CodeWriter.Builder.ToString();
Assert.Equal(expected, output); Assert.Equal(expected, output);
} }
} }

View File

@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
AcceptExtensionNode<TestExtensionIntermediateNode>(this, visitor); AcceptExtensionNode<TestExtensionIntermediateNode>(this, visitor);
} }
public override void WriteNode(CodeTarget target, CSharpRenderingContext context) public override void WriteNode(CodeTarget target, CodeRenderingContext context)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -13,6 +13,7 @@ using System.Runtime.Remoting.Messaging;
#else #else
using System.Threading; using System.Threading;
#endif #endif
using Microsoft.AspNetCore.Razor.Language.CodeGeneration;
using Microsoft.AspNetCore.Razor.Language.Intermediate; using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Xunit; using Xunit;
using Xunit.Sdk; using Xunit.Sdk;
@ -94,10 +95,10 @@ namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests
var codeDocument = RazorCodeDocument.Create(source, imports); var codeDocument = RazorCodeDocument.Create(source, imports);
// This will ensure that we're not putting any randomly generated data in a baseline. // This will ensure that we're not putting any randomly generated data in a baseline.
codeDocument.Items[DefaultRazorCSharpLoweringPhase.SuppressUniqueIds] = "test"; codeDocument.Items[CodeRenderingContext.SuppressUniqueIds] = "test";
// This is to make tests work cross platform. // This is to make tests work cross platform.
codeDocument.Items[DefaultRazorCSharpLoweringPhase.NewLineString] = "\r\n"; codeDocument.Items[CodeRenderingContext.NewLineString] = "\r\n";
OnCreatedCodeDocument(ref codeDocument); OnCreatedCodeDocument(ref codeDocument);