From 8a9bf9c71a4592d4f3e0baf4e54e45c121a78ed3 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 3 Jul 2017 15:25:34 -0700 Subject: [PATCH] Rewrite of code rendering context --- .../CodeGeneration/CodeRenderingContext.cs | 127 +++---------- .../CodeRenderingContextExtensions.cs | 126 ------------- .../CodeGeneration/CodeTarget.cs | 2 +- .../DefaultCodeRenderingContext.cs | 172 +++++++++++++++--- .../CodeGeneration/DefaultCodeTarget.cs | 4 +- .../CodeGeneration/DefaultDocumentWriter.cs | 77 ++++---- .../DesignTimeTagHelperWriter.cs | 16 -- .../CodeGeneration/DocumentWriter.cs | 18 +- .../CodeGeneration/RuntimeTagHelperWriter.cs | 16 -- .../CodeGeneration/TagHelperWriter.cs | 11 -- .../DefaultRazorCSharpLoweringPhase.cs | 26 +-- .../DefaultTagHelperTargetExtension.cs | 10 +- .../InjectTargetExtensionTest.cs | 15 +- .../CodeGeneration/DefaultCodeTargetTest.cs | 25 ++- .../DefaultDocumentWriterTest.cs | 126 +++++-------- .../DesignTimeNodeWriterTest.cs | 103 ++++------- .../LiteralRuntimeNodeWriterTest.cs | 4 +- .../CodeGeneration/RuntimeNodeWriterTest.cs | 96 ++++------ ...elperHtmlAttributeRuntimeNodeWriterTest.cs | 40 ++-- .../DefaultTagHelperTargetExtensionTest.cs | 102 ++++------- .../DesignTimeDirectiveTargetExtensionTest.cs | 35 +--- ...reallocatedAttributeTargetExtensionTest.cs | 33 +--- .../Extensions/SectionTargetExtensionTest.cs | 41 ++--- .../Extensions/TemplateTargetExtensionTest.cs | 25 ++- .../TestCodeRenderingContext.cs | 99 ++++++++++ 25 files changed, 563 insertions(+), 786 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContextExtensions.cs delete mode 100644 src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs delete mode 100644 src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs delete mode 100644 src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs create mode 100644 test/Microsoft.AspNetCore.Razor.Test.Common/Language/CodeGeneration/TestCodeRenderingContext.cs diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContext.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContext.cs index a6019e3a10..c0a8ac49ef 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContext.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContext.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNetCore.Razor.Language.Intermediate; namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { @@ -10,91 +11,49 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration internal static readonly object NewLineString = "NewLineString"; internal static readonly object SuppressUniqueIds = "SuppressUniqueIds"; - public static CodeRenderingContext Create(RazorCodeDocument codeDocument, RazorCodeGenerationOptions options) - { - if (codeDocument == null) - { - throw new ArgumentNullException(nameof(codeDocument)); - } - - if (options == null) - { - throw new ArgumentNullException(nameof(options)); - } - - IntermediateNodeWriter nodeWriter; - TagHelperWriter tagHelperWriter; - - if (options.DesignTime) - { - nodeWriter = new DesignTimeNodeWriter(); - tagHelperWriter = new DesignTimeTagHelperWriter(); - } - else - { - nodeWriter = new RuntimeNodeWriter(); - tagHelperWriter = new RuntimeTagHelperWriter(); - } - - var documentKind = codeDocument.GetDocumentIntermediateNode()?.DocumentKind; - var codeWriter = new CodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, documentKind, codeDocument.Source, options) - { - TagHelperWriter = tagHelperWriter - }; - - var newLineString = codeDocument.Items[NewLineString]; - if (newLineString != null) - { - // Set new line character to a specific string regardless of platform, for testing purposes. - codeWriter.NewLine = (string)newLineString; - } - - context.Items[SuppressUniqueIds] = codeDocument.Items[SuppressUniqueIds]; - - return context; - } - public abstract CodeWriter CodeWriter { get; } - public abstract IntermediateNodeWriter NodeWriter { get; protected set; } - - public abstract RazorSourceDocument SourceDocument { get; } - - public abstract RazorCodeGenerationOptions Options { get; } - public abstract RazorDiagnosticCollection Diagnostics { get; } - public abstract ItemCollection Items { get; } - public abstract string DocumentKind { get; } - public abstract IntermediateNodeWriterScope Push(IntermediateNodeWriter writer); + public abstract ItemCollection Items { get; } - public struct IntermediateNodeWriterScope : IDisposable + public abstract IntermediateNodeWriter NodeWriter { get; } + + public abstract RazorCodeGenerationOptions Options { get; } + + public abstract RazorSourceDocument SourceDocument { get; } + + public abstract Scope CreateScope(); + + public abstract Scope CreateScope(IntermediateNodeWriter writer); + + public abstract void EndScope(); + + public abstract void RenderNode(IntermediateNode node); + + public abstract void RenderChildren(IntermediateNode node); + + public abstract void AddLineMappingFor(IntermediateNode node); + + public struct Scope : IDisposable { private readonly CodeRenderingContext _context; - private readonly IntermediateNodeWriter _writer; - public IntermediateNodeWriterScope(CodeRenderingContext context, IntermediateNodeWriter writer) + public Scope(CodeRenderingContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } - if (writer == null) - { - throw new ArgumentNullException(nameof(writer)); - } - _context = context; - _writer = writer; } public void Dispose() { - _context.NodeWriter = _writer; + _context.EndScope(); } } @@ -102,22 +61,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration // All bits below here are temporary #region Temporary TagHelper bits - internal TagHelperWriter TagHelperWriter { get; set; } internal TagHelperRenderingContext TagHelperRenderingContext { get; set; } - internal TagHelperWriterScope Push(TagHelperWriter writer) - { - if (writer == null) - { - throw new ArgumentNullException(nameof(writer)); - } - - var scope = new TagHelperWriterScope(this, TagHelperWriter); - TagHelperWriter = writer; - return scope; - } - internal TagHelperRenderingContextScope Push(TagHelperRenderingContext context) { if (context == null) @@ -130,33 +76,6 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration return scope; } - internal struct TagHelperWriterScope : IDisposable - { - private readonly CodeRenderingContext _context; - private readonly TagHelperWriter _writer; - - public TagHelperWriterScope(CodeRenderingContext context, TagHelperWriter writer) - { - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } - - if (writer == null) - { - throw new ArgumentNullException(nameof(writer)); - } - - _context = context; - _writer = writer; - } - - public void Dispose() - { - _context.TagHelperWriter = _writer; - } - } - internal struct TagHelperRenderingContextScope : IDisposable { private readonly CodeRenderingContext _context; diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContextExtensions.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContextExtensions.cs deleted file mode 100644 index adc9aa42be..0000000000 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeRenderingContextExtensions.cs +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNetCore.Razor.Language.Intermediate; - -namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration -{ - public static class CodeRenderingContextExtensions - { - private static readonly object RenderNodeKey = new object(); - private static readonly object RenderChildrenKey = new object(); - private static readonly object LineMappingsKey = new object(); - - public static void SetRenderNode(this CodeRenderingContext context, Action 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)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 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)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)context.Items[LineMappingsKey]; - if (lineMappings == null) - { - lineMappings = new List(); - 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 GetLineMappings(this CodeRenderingContext context) - { - var lineMappings = (IReadOnlyList)context.Items[LineMappingsKey] ?? Array.Empty(); - - return lineMappings; - } - } -} diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeTarget.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeTarget.cs index 954844bd86..5e75789a5b 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeTarget.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/CodeTarget.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration } - public abstract DocumentWriter CreateWriter(CodeRenderingContext context); + public abstract IntermediateNodeWriter CreateNodeWriter(); public abstract TExtension GetExtension() where TExtension : class, ICodeTargetExtension; diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeRenderingContext.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeRenderingContext.cs index 1f916dd1df..97b4a23d96 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeRenderingContext.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeRenderingContext.cs @@ -3,61 +3,181 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Razor.Language.Intermediate; namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { internal class DefaultCodeRenderingContext : CodeRenderingContext { - // Internal for unit testing - internal DefaultCodeRenderingContext( - CodeWriter codeWriter, - IntermediateNodeWriter nodeWriter, - RazorSourceDocument sourceDocument, - RazorCodeGenerationOptions options) - : this (codeWriter, nodeWriter, null, sourceDocument, options) - { - } + private readonly RazorCodeDocument _codeDocument; + private readonly DocumentIntermediateNode _documentNode; + + private readonly List _scopes; public DefaultCodeRenderingContext( CodeWriter codeWriter, IntermediateNodeWriter nodeWriter, - string documentKind, - RazorSourceDocument sourceDocument, + RazorCodeDocument codeDocument, + DocumentIntermediateNode documentNode, RazorCodeGenerationOptions options) { + if (codeWriter == null) + { + throw new ArgumentNullException(nameof(codeWriter)); + } + + if (nodeWriter == null) + { + throw new ArgumentNullException(nameof(nodeWriter)); + } + + if (codeDocument == null) + { + throw new ArgumentNullException(nameof(codeDocument)); + } + + if (documentNode == null) + { + throw new ArgumentNullException(nameof(documentNode)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + CodeWriter = codeWriter; - NodeWriter = nodeWriter; - DocumentKind = documentKind; - SourceDocument = sourceDocument; + _codeDocument = codeDocument; + _documentNode = documentNode; Options = options; + Diagnostics = new DefaultRazorDiagnosticCollection(); Items = new DefaultItemCollection(); + LineMappings = new List(); + + TagHelperRenderingContext = new TagHelperRenderingContext(); + + var diagnostics = _documentNode.GetAllDiagnostics(); + for (var i = 0; i < diagnostics.Count; i++) + { + Diagnostics.Add(diagnostics[i]); + } + + var newLineString = codeDocument.Items[NewLineString]; + if (newLineString != null) + { + // Set new line character to a specific string regardless of platform, for testing purposes. + codeWriter.NewLine = (string)newLineString; + } + + Items[NewLineString] = codeDocument.Items[NewLineString]; + Items[SuppressUniqueIds] = codeDocument.Items[SuppressUniqueIds]; + + _scopes = new List(); + _scopes.Add(new ScopeInternal(nodeWriter)); } + // This will be initialized by the document writer when the context is 'live'. + public IntermediateNodeVisitor Visitor { get; set; } + public override CodeWriter CodeWriter { get; } - public override IntermediateNodeWriter NodeWriter { get; protected set; } - - public override RazorSourceDocument SourceDocument { get; } - - public override RazorCodeGenerationOptions Options { get; } - public override RazorDiagnosticCollection Diagnostics { get; } - public override ItemCollection Items { get; } - public override string DocumentKind { get; } - public override IntermediateNodeWriterScope Push(IntermediateNodeWriter writer) + public override ItemCollection Items { get; } + + public List LineMappings { get; } + + public override IntermediateNodeWriter NodeWriter => Current.Writer; + + public override RazorCodeGenerationOptions Options { get; } + + public override RazorSourceDocument SourceDocument => _codeDocument.Source; + + private ScopeInternal Current => _scopes[_scopes.Count - 1]; + + public override void AddLineMappingFor(IntermediateNode node) + { + if (node == null) + { + throw new ArgumentNullException(nameof(node)); + } + + if (node.Source == null) + { + return; + } + + if (SourceDocument.FilePath != null && + !string.Equals(SourceDocument.FilePath, node.Source.Value.FilePath, StringComparison.OrdinalIgnoreCase)) + { + // We don't want to generate line mappings for imports. + return; + } + + var source = node.Source.Value; + var generatedLocation = new SourceSpan(CodeWriter.Location, source.Length); + var lineMapping = new LineMapping(source, generatedLocation); + + LineMappings.Add(lineMapping); + } + + public override Scope CreateScope() + { + CreateScope(Current.Writer); + return new Scope(this); + } + + public override Scope CreateScope(IntermediateNodeWriter writer) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } - var scope = new IntermediateNodeWriterScope(this, NodeWriter); - NodeWriter = writer; - return scope; + _scopes.Add(new ScopeInternal(writer)); + return new Scope(this); + } + + public override void EndScope() + { + _scopes.RemoveAt(_scopes.Count - 1); + } + + public override void RenderChildren(IntermediateNode node) + { + if (node == null) + { + throw new ArgumentNullException(nameof(node)); + } + + for (var i = 0; i < node.Children.Count; i++) + { + Visitor.Visit(node.Children[i]); + } + } + + public override void RenderNode(IntermediateNode node) + { + if (node == null) + { + throw new ArgumentNullException(nameof(node)); + } + + Visitor.Visit(node); + } + + private struct ScopeInternal + { + public ScopeInternal(IntermediateNodeWriter writer) + { + Writer = writer; + } + + public IntermediateNodeWriter Writer { get; } } } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeTarget.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeTarget.cs index 6bfb26d29a..e9ef7d1ee7 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeTarget.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultCodeTarget.cs @@ -18,9 +18,9 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration public ICodeTargetExtension[] Extensions { get; } - public override DocumentWriter CreateWriter(CodeRenderingContext context) + public override IntermediateNodeWriter CreateNodeWriter() { - return new DefaultDocumentWriter(this, context); + return _options.DesignTime ? (IntermediateNodeWriter)new DesignTimeNodeWriter() : new RuntimeNodeWriter(); } public override TExtension GetExtension() diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs index 26daf8ad80..fc65f6533f 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq; using System.Text; using Microsoft.AspNetCore.Razor.Language.Intermediate; @@ -9,63 +10,57 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { internal class DefaultDocumentWriter : DocumentWriter { - private readonly CodeRenderingContext _context; - private readonly CodeTarget _target; + private readonly CodeTarget _codeTarget; + private readonly RazorCodeGenerationOptions _options; - public DefaultDocumentWriter(CodeTarget target, CodeRenderingContext context) + public DefaultDocumentWriter(CodeTarget codeTarget, RazorCodeGenerationOptions options) { - if (target == null) - { - throw new ArgumentNullException(nameof(target)); - } - - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } - - _target = target; - _context = context; + _codeTarget = codeTarget; + _options = options; } - public override void WriteDocument(DocumentIntermediateNode node) + public override RazorCSharpDocument WriteDocument(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode) { - if (node == null) + if (codeDocument == null) { - throw new ArgumentNullException(nameof(node)); + throw new ArgumentNullException(nameof(codeDocument)); } - var visitor = new Visitor(_target, _context); - _context.SetRenderNode(visitor.Visit); - _context.SetRenderChildren(visitor.RenderChildren); + if (documentNode == null) + { + throw new ArgumentNullException(nameof(documentNode)); + } - visitor.VisitDocument(node); + var context = new DefaultCodeRenderingContext( + new CodeWriter(), + _codeTarget.CreateNodeWriter(), + codeDocument, + documentNode, + _options); + context.Visitor = new Visitor(_codeTarget, context); - _context.SetRenderChildren(null); - _context.SetRenderNode(null); + context.Visitor.VisitDocument(documentNode); + + var cSharp = context.CodeWriter.GenerateCode(); + return new DefaultRazorCSharpDocument( + cSharp, + _options, + context.Diagnostics.ToArray(), + context.LineMappings.ToArray()); } private class Visitor : IntermediateNodeVisitor { - private readonly CodeRenderingContext _context; + private readonly DefaultCodeRenderingContext _context; private readonly CodeTarget _target; - public Visitor(CodeTarget target, CodeRenderingContext context) + public Visitor(CodeTarget target, DefaultCodeRenderingContext context) { _target = target; _context = context; } - private CodeRenderingContext Context => _context; - - public void RenderChildren(IntermediateNode node) - { - for (var i = 0; i < node.Children.Count; i++) - { - var child = node.Children[i]; - Visit(child); - } - } + private DefaultCodeRenderingContext Context => _context; public override void VisitDocument(DocumentIntermediateNode node) { @@ -102,7 +97,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration .WriteLine("// ") .WriteLine("#pragma warning disable 1591"); - RenderChildren(node); + VisitDefault(node); Context.CodeWriter.WriteLine("#pragma warning restore 1591"); } @@ -117,7 +112,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration using (Context.CodeWriter.BuildNamespace(node.Content)) { Context.CodeWriter.WriteLine("#line hidden"); - RenderChildren(node); + VisitDefault(node); } } @@ -125,7 +120,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { using (Context.CodeWriter.BuildClassDeclaration(node.Modifiers, node.Name, node.BaseType, node.Interfaces)) { - RenderChildren(node); + VisitDefault(node); } } @@ -147,7 +142,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration using (Context.CodeWriter.BuildScope()) { - RenderChildren(node); + VisitDefault(node); } Context.CodeWriter.WriteLine("#pragma warning restore 1998"); @@ -209,7 +204,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration using (Context.Push(tagHelperRenderingContext)) { - RenderChildren(node); + VisitDefault(node); } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs deleted file mode 100644 index 2668fb9eeb..0000000000 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using System.Text; -using Microsoft.AspNetCore.Razor.Language.Extensions; -using Microsoft.AspNetCore.Razor.Language.Intermediate; -using Microsoft.AspNetCore.Razor.Language.Legacy; - -namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration -{ - internal class DesignTimeTagHelperWriter : TagHelperWriter - { - } -} diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DocumentWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DocumentWriter.cs index 8651154e97..fcfa014da2 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DocumentWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DocumentWriter.cs @@ -1,12 +1,28 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Razor.Language.Intermediate; namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { public abstract class DocumentWriter { - public abstract void WriteDocument(DocumentIntermediateNode node); + public DocumentWriter Create(CodeTarget codeTarget, RazorCodeGenerationOptions options) + { + if (codeTarget == null) + { + throw new ArgumentNullException(nameof(codeTarget)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + + return new DefaultDocumentWriter(codeTarget, options); + } + + public abstract RazorCSharpDocument WriteDocument(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode); } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs deleted file mode 100644 index 1155a3c19f..0000000000 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.Linq; -using Microsoft.AspNetCore.Razor.Language.Extensions; -using Microsoft.AspNetCore.Razor.Language.Intermediate; -using Microsoft.AspNetCore.Razor.Language.Legacy; - -namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration -{ - internal class RuntimeTagHelperWriter : TagHelperWriter - { - } -} diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs deleted file mode 100644 index 8b8ba63fd1..0000000000 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Razor.Language.Intermediate; - -namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration -{ - internal abstract class TagHelperWriter - { - } -} diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs index ef10953c25..4f9ff9f151 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorCSharpLoweringPhase.cs @@ -12,34 +12,22 @@ namespace Microsoft.AspNetCore.Razor.Language { protected override void ExecuteCore(RazorCodeDocument codeDocument) { - var irDocument = codeDocument.GetDocumentIntermediateNode(); - ThrowForMissingDocumentDependency(irDocument); + var documentNode = codeDocument.GetDocumentIntermediateNode(); + ThrowForMissingDocumentDependency(documentNode); - var target = irDocument.Target; + var target = documentNode.Target; if (target == null) { var message = Resources.FormatDocumentMissingTarget( - irDocument.DocumentKind, + documentNode.DocumentKind, nameof(CodeTarget), nameof(DocumentIntermediateNode.Target)); throw new InvalidOperationException(message); } - var context = CodeRenderingContext.Create(codeDocument, irDocument.Options); - var documentWriter = target.CreateWriter(context); - documentWriter.WriteDocument(irDocument); - - var diagnostics = new List(); - diagnostics.AddRange(irDocument.GetAllDiagnostics()); - diagnostics.AddRange(context.Diagnostics); - - var lineMappings = context.GetLineMappings(); - var csharpDocument = RazorCSharpDocument.Create( - context.CodeWriter.GenerateCode(), - irDocument.Options, - diagnostics, - lineMappings); - codeDocument.SetCSharpDocument(csharpDocument); + var writer = new DefaultDocumentWriter(documentNode.Target, documentNode.Options); + var cSharpDocument = writer.WriteDocument(codeDocument, documentNode); + codeDocument.SetCSharpDocument(cSharpDocument); } } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Extensions/DefaultTagHelperTargetExtension.cs b/src/Microsoft.AspNetCore.Razor.Language/Extensions/DefaultTagHelperTargetExtension.cs index 3af803e4c1..83d33d4120 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Extensions/DefaultTagHelperTargetExtension.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Extensions/DefaultTagHelperTargetExtension.cs @@ -107,8 +107,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions .WriteParameterSeparator(); // We remove and redirect writers so TagHelper authors can retrieve content. - using (context.Push(new RuntimeNodeWriter())) - using (context.Push(new RuntimeTagHelperWriter())) + using (context.CreateScope(new RuntimeNodeWriter())) { using (context.CodeWriter.BuildAsyncLambda()) { @@ -215,7 +214,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions .Write(attributeValueStyleParameter) .WriteEndMethodInvocation(); - using (context.Push(new TagHelperHtmlAttributeRuntimeNodeWriter())) + using (context.CreateScope(new TagHelperHtmlAttributeRuntimeNodeWriter())) { context.RenderChildren(node); } @@ -237,8 +236,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions // We're building a writing scope around the provided chunks which captures everything written from the // page. Therefore, we do not want to write to any other buffer since we're using the pages buffer to // ensure we capture all content that's written, directly or indirectly. - using (context.Push(new RuntimeNodeWriter())) - using (context.Push(new RuntimeTagHelperWriter())) + using (context.CreateScope(new RuntimeNodeWriter())) { context.RenderChildren(node); } @@ -335,7 +333,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { context.CodeWriter.WriteMethodInvocation(BeginWriteTagHelperAttributeMethodName); - using (context.Push(new LiteralRuntimeNodeWriter())) + using (context.CreateScope(new LiteralRuntimeNodeWriter())) { context.RenderChildren(node); } diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InjectTargetExtensionTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InjectTargetExtensionTest.cs index b853c76466..352c958c71 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InjectTargetExtensionTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InjectTargetExtensionTest.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.CodeGeneration; +using Microsoft.AspNetCore.Razor.Language.Intermediate; using Microsoft.AspNetCore.Razor.Language.Legacy; using Xunit; @@ -15,7 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions public void InjectDirectiveTargetExtension_WritesProperty() { // Arrange - var context = GetRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var target = new InjectTargetExtension(); var node = new InjectIntermediateNode() { @@ -37,7 +38,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions public void InjectDirectiveTargetExtension_WritesPropertyWithLinePragma_WhenSourceIsSet() { // Arrange - var context = GetRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var target = new InjectTargetExtension(); var node = new InjectIntermediateNode() { @@ -63,15 +64,5 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions "#line hidden" + Environment.NewLine, context.CodeWriter.Builder.ToString()); } - - private CodeRenderingContext GetRenderingContext() - { - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options); - - return context; - } } } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultCodeTargetTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultCodeTargetTest.cs index a01dad9bbf..05756c09bb 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultCodeTargetTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultCodeTargetTest.cs @@ -28,20 +28,31 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration } [Fact] - public void CreateWriter_CreatesDefaultDocumentWriter() + public void CreateWriter_DesignTime_CreatesDesignTimeNodeWriter() { // Arrange - var codeWriter = new CodeWriter(); - var codeDocument = TestRazorCodeDocument.Create(string.Empty); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = CodeRenderingContext.Create(codeDocument, options); + var options = RazorCodeGenerationOptions.CreateDesignTimeDefault(); var target = new DefaultCodeTarget(options, Enumerable.Empty()); // Act - var writer = target.CreateWriter(context); + var writer = target.CreateNodeWriter(); // Assert - Assert.IsType(writer); + Assert.IsType(writer); + } + + [Fact] + public void CreateWriter_Runtime_CreatesRuntimeNodeWriter() + { + // Arrange + var options = RazorCodeGenerationOptions.CreateDefault(); + var target = new DefaultCodeTarget(options, Enumerable.Empty()); + + // Act + var writer = target.CreateNodeWriter(); + + // Assert + Assert.IsType(writer); } [Fact] diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultDocumentWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultDocumentWriterTest.cs index a7aa1140c8..fa9c1fb399 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultDocumentWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DefaultDocumentWriterTest.cs @@ -13,24 +13,19 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration public void WriteDocument_Empty_WritesChecksumAndMarksAutoGenerated() { // Arrange + var document = new DocumentIntermediateNode(); + var codeDocument = TestRazorCodeDocument.CreateEmpty(); var options = RazorCodeGenerationOptions.CreateDefault(); var target = CodeTarget.CreateDefault(codeDocument, options); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options); - - var writer = new DefaultDocumentWriter(target, context); - - var document = new DocumentIntermediateNode(); - var builder = IntermediateNodeBuilder.Create(document); + var writer = new DefaultDocumentWriter(target, options); // Act - writer.WriteDocument(document); + var result = writer.WriteDocument(codeDocument, document); // Assert - var csharp = context.CodeWriter.Builder.ToString(); + var csharp = result.GeneratedCode; Assert.Equal( @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709"" // @@ -45,6 +40,8 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration public void WriteDocument_Empty_SuppressChecksumTrue_DoesnotWriteChecksum() { // Arrange + var document = new DocumentIntermediateNode(); + var codeDocument = TestRazorCodeDocument.CreateEmpty(); var optionsBuilder = new DefaultRazorCodeGenerationOptionsBuilder() { @@ -53,20 +50,13 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration var options = optionsBuilder.Build(); var target = CodeTarget.CreateDefault(codeDocument, options); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options); - - var writer = new DefaultDocumentWriter(target, context); - - var document = new DocumentIntermediateNode(); - var builder = IntermediateNodeBuilder.Create(document); + var writer = new DefaultDocumentWriter(target, options); // Act - writer.WriteDocument(document); + var result = writer.WriteDocument(codeDocument, document); // Assert - var csharp = context.CodeWriter.Builder.ToString(); + var csharp = result.GeneratedCode; Assert.Equal( @"// #pragma warning disable 1591 @@ -80,16 +70,6 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration public void WriteDocument_WritesNamespace() { // Arrange - var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var options = RazorCodeGenerationOptions.CreateDefault(); - - var target = CodeTarget.CreateDefault(codeDocument, options); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options); - - var writer = new DefaultDocumentWriter(target, context); - var document = new DocumentIntermediateNode(); var builder = IntermediateNodeBuilder.Create(document); builder.Add(new NamespaceDeclarationIntermediateNode() @@ -97,11 +77,17 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration Content = "TestNamespace", }); + var codeDocument = TestRazorCodeDocument.CreateEmpty(); + var options = RazorCodeGenerationOptions.CreateDefault(); + + var target = CodeTarget.CreateDefault(codeDocument, options); + var writer = new DefaultDocumentWriter(target, options); + // Act - writer.WriteDocument(document); + var result = writer.WriteDocument(codeDocument, document); // Assert - var csharp = context.CodeWriter.Builder.ToString(); + var csharp = result.GeneratedCode; Assert.Equal( @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709"" // @@ -120,15 +106,6 @@ namespace TestNamespace public void WriteDocument_WritesClass() { // Arrange - var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var options = RazorCodeGenerationOptions.CreateDefault(); - - var target = CodeTarget.CreateDefault(codeDocument, options); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options); - var writer = new DefaultDocumentWriter(target, context); - var document = new DocumentIntermediateNode(); var builder = IntermediateNodeBuilder.Create(document); builder.Add(new ClassDeclarationIntermediateNode() @@ -142,11 +119,17 @@ namespace TestNamespace Name = "TestClass", }); + var codeDocument = TestRazorCodeDocument.CreateEmpty(); + var options = RazorCodeGenerationOptions.CreateDefault(); + + var target = CodeTarget.CreateDefault(codeDocument, options); + var writer = new DefaultDocumentWriter(target, options); + // Act - writer.WriteDocument(document); + var result = writer.WriteDocument(codeDocument, document); // Assert - var csharp = context.CodeWriter.Builder.ToString(); + var csharp = result.GeneratedCode; Assert.Equal( @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709"" // @@ -164,15 +147,6 @@ internal class TestClass : TestBase, IFoo, IBar public void WriteDocument_WritesMethod() { // Arrange - var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var options = RazorCodeGenerationOptions.CreateDefault(); - - var target = CodeTarget.CreateDefault(codeDocument, options); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options); - var writer = new DefaultDocumentWriter(target, context); - var document = new DocumentIntermediateNode(); var builder = IntermediateNodeBuilder.Create(document); builder.Add(new MethodDeclarationIntermediateNode() @@ -187,11 +161,17 @@ internal class TestClass : TestBase, IFoo, IBar ReturnType = "string", }); + var codeDocument = TestRazorCodeDocument.CreateEmpty(); + var options = RazorCodeGenerationOptions.CreateDefault(); + + var target = CodeTarget.CreateDefault(codeDocument, options); + var writer = new DefaultDocumentWriter(target, options); + // Act - writer.WriteDocument(document); + var result = writer.WriteDocument(codeDocument, document); // Assert - var csharp = context.CodeWriter.Builder.ToString(); + var csharp = result.GeneratedCode; Assert.Equal( @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709"" // @@ -211,15 +191,6 @@ internal virtual async string TestMethod() public void WriteDocument_WritesField() { // Arrange - var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var options = RazorCodeGenerationOptions.CreateDefault(); - - var target = CodeTarget.CreateDefault(codeDocument, options); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options); - var writer = new DefaultDocumentWriter(target, context); - var document = new DocumentIntermediateNode(); var builder = IntermediateNodeBuilder.Create(document); builder.Add(new FieldDeclarationIntermediateNode() @@ -233,11 +204,17 @@ internal virtual async string TestMethod() Type = "string", }); + var codeDocument = TestRazorCodeDocument.CreateEmpty(); + var options = RazorCodeGenerationOptions.CreateDefault(); + + var target = CodeTarget.CreateDefault(codeDocument, options); + var writer = new DefaultDocumentWriter(target, options); + // Act - writer.WriteDocument(document); + var result = writer.WriteDocument(codeDocument, document); // Assert - var csharp = context.CodeWriter.Builder.ToString(); + var csharp = result.GeneratedCode; Assert.Equal( @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709"" // @@ -253,15 +230,6 @@ internal readonly string _foo; public void WriteDocument_WritesProperty() { // Arrange - var codeDocument = TestRazorCodeDocument.CreateEmpty(); - var options = RazorCodeGenerationOptions.CreateDefault(); - - var target = CodeTarget.CreateDefault(codeDocument, options); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument.Source, options); - var writer = new DefaultDocumentWriter(target, context); - var document = new DocumentIntermediateNode(); var builder = IntermediateNodeBuilder.Create(document); builder.Add(new PropertyDeclarationIntermediateNode() @@ -275,11 +243,17 @@ internal readonly string _foo; Type = "string", }); + var codeDocument = TestRazorCodeDocument.CreateEmpty(); + var options = RazorCodeGenerationOptions.CreateDefault(); + + var target = CodeTarget.CreateDefault(codeDocument, options); + var writer = new DefaultDocumentWriter(target, options); + // Act - writer.WriteDocument(document); + var result = writer.WriteDocument(codeDocument, document); // Assert - var csharp = context.CodeWriter.Builder.ToString(); + var csharp = result.GeneratedCode; Assert.Equal( @"#pragma checksum ""test.cshtml"" ""{ff1816ec-aa5e-4d10-87f7-6f4963833460}"" ""da39a3ee5e6b4b0d3255bfef95601890afd80709"" // diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeNodeWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeNodeWriterTest.cs index a40e2741da..1038e4d84e 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeNodeWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeNodeWriterTest.cs @@ -15,9 +15,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new UsingDirectiveIntermediateNode() { @@ -42,9 +40,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration // Arrange var writer = new DesignTimeNodeWriter(); var sourceDocument = TestRazorSourceDocument.Create("@using System;"); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options); + var context = TestCodeRenderingContext.CreateDesignTime(); var originalSpan = new SourceSpan("test.cshtml", 0, 0, 0, 6); var generatedSpan = new SourceSpan(null, 21 + Environment.NewLine.Length, 1, 0, 6); @@ -59,7 +55,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration writer.WriteUsingDirective(context, node); // Assert - var mapping = Assert.Single(context.GetLineMappings()); + var mapping = Assert.Single(((DefaultCodeRenderingContext)context).LineMappings); Assert.Equal(expectedLineMapping, mapping); var csharp = context.CodeWriter.Builder.ToString(); Assert.Equal( @@ -78,9 +74,7 @@ using System; { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpExpressionIntermediateNode(); var builder = IntermediateNodeBuilder.Create(node); @@ -107,9 +101,7 @@ using System; { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpExpressionIntermediateNode() { @@ -143,9 +135,7 @@ __o = i++; { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpExpressionIntermediateNode(); var builder = IntermediateNodeBuilder.Create(node); @@ -161,15 +151,14 @@ __o = i++; Kind = IntermediateToken.TokenKind.CSharp, }); - context.SetRenderNode((n) => Assert.IsType(n)); - // Act writer.WriteCSharpExpression(context, node); // Assert var csharp = context.CodeWriter.Builder.ToString(); Assert.Equal( -@"__o = i++; +@"__o = iRender Children +++; ", csharp, ignoreLineEndingDifferences: true); @@ -180,10 +169,7 @@ __o = i++; { // Arrange var writer = new DesignTimeNodeWriter(); - var sourceDocument = TestRazorSourceDocument.Create(" @i++"); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpExpressionIntermediateNode() { @@ -202,8 +188,6 @@ __o = i++; Kind = IntermediateToken.TokenKind.CSharp, }); - context.SetRenderNode((n) => Assert.IsType(n)); - // Act writer.WriteCSharpExpression(context, node); @@ -211,7 +195,8 @@ __o = i++; var csharp = context.CodeWriter.Builder.ToString(); Assert.Equal( @"#line 1 ""test.cshtml"" - __o = i++; + __o = iRender Children +++; #line default #line hidden @@ -225,9 +210,7 @@ __o = i++; { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpCodeIntermediateNode(); IntermediateNodeBuilder.Create(node) @@ -250,9 +233,7 @@ __o = i++; { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpCodeIntermediateNode() { @@ -282,9 +263,7 @@ __o = i++; { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpCodeIntermediateNode(); IntermediateNodeBuilder.Create(node) @@ -311,9 +290,7 @@ __o = i++; { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpCodeIntermediateNode() { @@ -347,9 +324,7 @@ if (true) { } { // Arrange var writer = new DesignTimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new CSharpCodeIntermediateNode() { @@ -386,9 +361,10 @@ if (true) { } var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateDesignTime(source: sourceDocument); // Act writer.WriteCSharpExpressionAttributeValue(context, node); @@ -413,9 +389,10 @@ if (true) { } var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateDesignTime(source: sourceDocument); // Act writer.WriteCSharpCodeAttributeValue(context, node); @@ -440,9 +417,10 @@ if (true) { } var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateDesignTime(source: sourceDocument); // Act writer.WriteCSharpCodeAttributeValue(context, node); @@ -455,7 +433,7 @@ if (true) { } #line default #line hidden -Render Node - CSharpExpressionIntermediateNode +Render Children #line 1 ""test.cshtml"" } @@ -466,19 +444,6 @@ Render Node - CSharpExpressionIntermediateNode ignoreLineEndingDifferences: true); } - private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument) - { - var options = RazorCodeGenerationOptions.CreateDefault(); - var codeWriter = new CodeWriter(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options); - context.SetRenderNode(n => - { - codeWriter.WriteLine($"Render Node - {n.GetType().Name}"); - }); - - return context; - } - private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) { var engine = RazorEngine.Create(); @@ -499,10 +464,10 @@ Render Node - CSharpExpressionIntermediateNode } } - var irDocument = codeDocument.GetDocumentIntermediateNode(); - Assert.NotNull(irDocument); + var documentNode = codeDocument.GetDocumentIntermediateNode(); + Assert.NotNull(documentNode); - return irDocument; + return documentNode; } private class MyExtensionIntermediateNode : ExtensionIntermediateNode @@ -511,12 +476,12 @@ Render Node - CSharpExpressionIntermediateNode public override void Accept(IntermediateNodeVisitor visitor) { - throw new NotImplementedException(); + visitor.VisitDefault(this); } public override void WriteNode(CodeTarget target, CodeRenderingContext context) { - throw new NotImplementedException(); + context.CodeWriter.WriteLine("MyExtensionNode"); } } } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/LiteralRuntimeNodeWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/LiteralRuntimeNodeWriterTest.cs index 6042da482e..c2192d4486 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/LiteralRuntimeNodeWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/LiteralRuntimeNodeWriterTest.cs @@ -13,9 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { // Arrange var writer = new LiteralRuntimeNodeWriter(); - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpExpressionIntermediateNode() { diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeNodeWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeNodeWriterTest.cs index 3cd7915d4e..85b2244501 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeNodeWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeNodeWriterTest.cs @@ -16,8 +16,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new UsingDirectiveIntermediateNode() { @@ -42,8 +41,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new UsingDirectiveIntermediateNode() { @@ -76,8 +74,7 @@ using System; { WriteCSharpExpressionMethod = "Test", }; - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpExpressionIntermediateNode(); var builder = IntermediateNodeBuilder.Create(node); @@ -108,8 +105,7 @@ using System; { WriteCSharpExpressionMethod = "Test", }; - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpExpressionIntermediateNode() { @@ -147,8 +143,7 @@ Test(i++); { WriteCSharpExpressionMethod = "Test", }; - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpExpressionIntermediateNode(); var builder = IntermediateNodeBuilder.Create(node); @@ -164,15 +159,14 @@ Test(i++); Kind = IntermediateToken.TokenKind.CSharp, }); - context.SetRenderNode((n) => Assert.IsType(n)); - // Act writer.WriteCSharpExpression(context, node); // Assert var csharp = context.CodeWriter.Builder.ToString(); Assert.Equal( -@"Test(i++); +@"Test(iRender Children +++); ", csharp, ignoreLineEndingDifferences: true); @@ -187,9 +181,7 @@ Test(i++); { WriteCSharpExpressionMethod = "Test", }; - var options = RazorCodeGenerationOptions.CreateDefault(); - var sourceDocument = TestRazorSourceDocument.Create(" @i++"); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpExpressionIntermediateNode() { @@ -208,8 +200,6 @@ Test(i++); Kind = IntermediateToken.TokenKind.CSharp, }); - context.SetRenderNode((n) => Assert.IsType(n)); - // Act writer.WriteCSharpExpression(context, node); @@ -217,7 +207,8 @@ Test(i++); var csharp = context.CodeWriter.Builder.ToString(); Assert.Equal( @"#line 1 ""test.cshtml"" - Test(i++); + Test(iRender Children +++); #line default #line hidden @@ -232,8 +223,7 @@ Test(i++); // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpCodeIntermediateNode(); IntermediateNodeBuilder.Create(node) @@ -257,8 +247,7 @@ Test(i++); // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpCodeIntermediateNode(); IntermediateNodeBuilder.Create(node) @@ -286,8 +275,7 @@ Test(i++); // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpCodeIntermediateNode() { @@ -322,8 +310,7 @@ if (true) { } // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new CSharpCodeIntermediateNode() { @@ -358,8 +345,7 @@ if (true) { } // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new HtmlContentIntermediateNode(); node.Children.Add(new IntermediateToken() @@ -386,9 +372,7 @@ if (true) { } // Arrange var codeWriter = new CodeWriter(); var writer = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument: null, options: options); - + var context = TestCodeRenderingContext.CreateRuntime(); var node = new HtmlContentIntermediateNode(); node.Children.Add(new IntermediateToken() @@ -418,9 +402,10 @@ WriteLiteral(@""{1}""); var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single(); + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single(); + + var context = TestCodeRenderingContext.CreateRuntime(); // Act writer.WriteHtmlAttribute(context, node); @@ -430,6 +415,7 @@ WriteLiteral(@""{1}""); Assert.Equal( @"BeginWriteAttribute(""checked"", "" checked=\"""", 6, ""\"""", 34, 2); Render Children +Render Children EndWriteAttribute(); ", csharp, @@ -444,9 +430,10 @@ EndWriteAttribute(); var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[0] as HtmlAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[0] as HtmlAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateRuntime(); // Act writer.WriteHtmlAttributeValue(context, node); @@ -468,9 +455,10 @@ EndWriteAttribute(); var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateRuntime(); // Act writer.WriteCSharpExpressionAttributeValue(context, node); @@ -497,9 +485,10 @@ WriteAttributeValue("" "", 27, false, 28, 6, false); var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateRuntime(source: sourceDocument); // Act writer.WriteCSharpCodeAttributeValue(context, node); @@ -530,7 +519,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false); { PushWriterMethod = "TestPushWriter" }; - var context = GetCodeRenderingContext(writer, null); + var context = TestCodeRenderingContext.CreateRuntime(); // Act writer.BeginWriterScope(context, "MyWriter"); @@ -552,7 +541,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false); { PopWriterMethod = "TestPopWriter" }; - var context = GetCodeRenderingContext(writer, null); + var context = TestCodeRenderingContext.CreateRuntime(); // Act writer.EndWriterScope(context); @@ -566,19 +555,6 @@ WriteAttributeValue("" "", 27, false, 28, 6, false); ignoreLineEndingDifferences: true); } - private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument) - { - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options); - context.SetRenderChildren(n => - { - codeWriter.WriteLine("Render Children"); - }); - - return context; - } - private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) { var engine = RazorEngine.Create(); @@ -611,7 +587,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false); public override void Accept(IntermediateNodeVisitor visitor) { - throw new NotImplementedException(); + visitor.VisitDefault(this); } public override void WriteNode(CodeTarget target, CodeRenderingContext context) diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/TagHelperHtmlAttributeRuntimeNodeWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/TagHelperHtmlAttributeRuntimeNodeWriterTest.cs index f249d9e251..0316784842 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/TagHelperHtmlAttributeRuntimeNodeWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/TagHelperHtmlAttributeRuntimeNodeWriterTest.cs @@ -17,9 +17,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[0] as HtmlAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[0] as HtmlAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateRuntime(); // Act writer.WriteHtmlAttributeValue(context, node); @@ -40,9 +41,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[1] as CSharpExpressionAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateRuntime(); // Act writer.WriteCSharpExpressionAttributeValue(context, node); @@ -68,9 +70,10 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false); var content = ""; var sourceDocument = TestRazorSourceDocument.Create(content); var codeDocument = RazorCodeDocument.Create(sourceDocument); - var context = GetCodeRenderingContext(writer, sourceDocument); - var irDocument = Lower(codeDocument); - var node = irDocument.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + var documentNode = Lower(codeDocument); + var node = documentNode.Children.OfType().Single().Children[1] as CSharpCodeAttributeValueIntermediateNode; + + var context = TestCodeRenderingContext.CreateRuntime(source: sourceDocument); // Act writer.WriteCSharpCodeAttributeValue(context, node); @@ -93,19 +96,6 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false); ignoreLineEndingDifferences: true); } - private static CodeRenderingContext GetCodeRenderingContext(IntermediateNodeWriter writer, RazorSourceDocument sourceDocument) - { - var codeWriter = new CodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, writer, sourceDocument, options); - context.SetRenderChildren(_ => - { - codeWriter.WriteLine("Render Children"); - }); - - return context; - } - private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) { var engine = RazorEngine.Create(); @@ -126,10 +116,10 @@ AddHtmlAttributeValue("" "", 27, false, 28, 6, false); } } - var irDocument = codeDocument.GetDocumentIntermediateNode(); - Assert.NotNull(irDocument); + var documentNode = codeDocument.GetDocumentIntermediateNode(); + Assert.NotNull(documentNode); - return irDocument; + return documentNode; } } } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DefaultTagHelperTargetExtensionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DefaultTagHelperTargetExtensionTest.cs index 7a3647feb2..99e0bea81f 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DefaultTagHelperTargetExtensionTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DefaultTagHelperTargetExtensionTest.cs @@ -69,9 +69,15 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); - var node = new DefaultTagHelperBodyIntermediateNode(); + var node = new DefaultTagHelperBodyIntermediateNode() + { + Children = + { + new CSharpExpressionIntermediateNode(), + } + }; // Act extension.WriteTagHelperBody(context, node); @@ -90,10 +96,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperBodyIntermediateNode() { + Children = + { + new CSharpExpressionIntermediateNode(), + }, TagMode = TagMode.SelfClosing, TagName = "p", }; @@ -118,7 +128,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperCreateIntermediateNode() { @@ -143,7 +153,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperCreateIntermediateNode() { @@ -169,7 +179,7 @@ __tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper); { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperExecuteIntermediateNode(); @@ -189,7 +199,7 @@ __tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper); { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperExecuteIntermediateNode(); @@ -216,7 +226,7 @@ __tagHelperExecutionContext = __tagHelperScopeManager.End(); { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperHtmlAttributeIntermediateNode() { @@ -242,6 +252,7 @@ __tagHelperExecutionContext = __tagHelperScopeManager.End(); var csharp = context.CodeWriter.Builder.ToString(); Assert.Equal( @"Render Children +Render Children ", csharp, ignoreLineEndingDifferences: true); @@ -252,7 +263,7 @@ __tagHelperExecutionContext = __tagHelperScopeManager.End(); { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperHtmlAttributeIntermediateNode() { @@ -287,7 +298,7 @@ __tagHelperExecutionContext.AddHtmlAttribute(""name"", Html.Raw(__tagHelperStrin { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperHtmlAttributeIntermediateNode() { @@ -314,6 +325,7 @@ __tagHelperExecutionContext.AddHtmlAttribute(""name"", Html.Raw(__tagHelperStrin Assert.Equal( @"BeginAddHtmlAttributeValues(__tagHelperExecutionContext, ""name"", 2, global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes); Render Children +Render Children EndAddHtmlAttributeValues(__tagHelperExecutionContext); ", csharp, @@ -325,7 +337,7 @@ EndAddHtmlAttributeValues(__tagHelperExecutionContext); { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -363,7 +375,7 @@ __InputTagHelper.StringProp = ""value""; { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -401,7 +413,7 @@ __InputTagHelper.StringProp = string.Empty; { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -443,7 +455,7 @@ __InputTagHelper.IntProp = 32; { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -480,7 +492,7 @@ __InputTagHelper.IntProp = 32; { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -522,7 +534,7 @@ __InputTagHelper.IntIndexer[""bound""] = 32; { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -559,7 +571,7 @@ __InputTagHelper.IntIndexer[""bound""] = 32; { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -602,7 +614,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.St { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -645,7 +657,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.In { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -683,7 +695,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""bound"", __InputTagHelper.In { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -730,7 +742,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""foo-bound"", __InputTagHelpe { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperPropertyIntermediateNode() { @@ -772,7 +784,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""foo-bound"", __InputTagHelpe { // Arrange var extension = new DefaultTagHelperTargetExtension() { DesignTime = true }; - var context = GetDesignTimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DefaultTagHelperRuntimeIntermediateNode(); @@ -792,7 +804,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(""foo-bound"", __InputTagHelpe { // Arrange var extension = new DefaultTagHelperTargetExtension(); - var context = GetRuntimeCodeRenderingContext(); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new DefaultTagHelperRuntimeIntermediateNode(); @@ -825,50 +837,6 @@ private global::Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperScopeMana ignoreLineEndingDifferences: true); } - private static CodeRenderingContext GetRuntimeCodeRenderingContext() - { - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, null, options) - { - Items = - { - { CodeRenderingContext.SuppressUniqueIds, "test" }, - }, - TagHelperWriter = new RuntimeTagHelperWriter(), - TagHelperRenderingContext = new TagHelperRenderingContext() - }; - context.SetRenderChildren(n => - { - codeWriter.WriteLine("Render Children"); - }); - - return context; - } - - private static CodeRenderingContext GetDesignTimeCodeRenderingContext() - { - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDesignTimeDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, null, options) - { - Items = - { - { CodeRenderingContext.SuppressUniqueIds, "test" }, - }, - TagHelperWriter = new DesignTimeTagHelperWriter(), - TagHelperRenderingContext = new TagHelperRenderingContext() - }; - context.SetRenderChildren(n => - { - codeWriter.WriteLine("Render Children"); - }); - - return context; - } - private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument) { var engine = RazorEngine.Create(); diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DesignTimeDirectiveTargetExtensionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DesignTimeDirectiveTargetExtensionTest.cs index 103f0357d4..9d64baaa03 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DesignTimeDirectiveTargetExtensionTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/DesignTimeDirectiveTargetExtensionTest.cs @@ -14,10 +14,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new DesignTimeDirectiveTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new DesignTimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DesignTimeDirectiveIntermediateNode(); @@ -41,11 +38,7 @@ private void __RazorDirectiveTokenHelpers__() { { // Arrange var extension = new DesignTimeDirectiveTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new DesignTimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml"); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DesignTimeDirectiveIntermediateNode(); var token = new DirectiveTokenIntermediateNode() @@ -80,11 +73,7 @@ System.String __typeHelper = default(System.String); { // Arrange var extension = new DesignTimeDirectiveTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new DesignTimeNodeWriter(); - var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml"); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DesignTimeDirectiveIntermediateNode(); var token = new DirectiveTokenIntermediateNode() @@ -119,11 +108,7 @@ global::System.Object __typeHelper = nameof(System.Collections.Generic); { // Arrange var extension = new DesignTimeDirectiveTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new DesignTimeNodeWriter(); - var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml"); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DesignTimeDirectiveIntermediateNode(); var token = new DirectiveTokenIntermediateNode() @@ -158,11 +143,7 @@ global::System.Object Foo = null; { // Arrange var extension = new DesignTimeDirectiveTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new DesignTimeNodeWriter(); - var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml"); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DesignTimeDirectiveIntermediateNode(); var token = new DirectiveTokenIntermediateNode() @@ -208,11 +189,7 @@ global::System.Object __typeHelper = ""Value""; { // Arrange var extension = new DesignTimeDirectiveTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new DesignTimeNodeWriter(); - var sourceDocument = RazorSourceDocument.Create("test content", "test.cshtml"); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument, options); + var context = TestCodeRenderingContext.CreateDesignTime(); var node = new DesignTimeDirectiveIntermediateNode(); var token = new DirectiveTokenIntermediateNode() diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/PreallocatedAttributeTargetExtensionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/PreallocatedAttributeTargetExtensionTest.cs index 1c43e1976b..b0d79ed67e 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/PreallocatedAttributeTargetExtensionTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/PreallocatedAttributeTargetExtensionTest.cs @@ -13,10 +13,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new PreallocatedAttributeTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode() { @@ -43,10 +40,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new PreallocatedAttributeTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new PreallocatedTagHelperHtmlAttributeValueIntermediateNode() { @@ -73,10 +67,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new PreallocatedAttributeTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new PreallocatedTagHelperHtmlAttributeIntermediateNode() { @@ -100,10 +91,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new PreallocatedAttributeTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var node = new PreallocatedTagHelperPropertyValueIntermediateNode() { @@ -130,10 +118,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { // Arrange var extension = new PreallocatedAttributeTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options); + var context = TestCodeRenderingContext.CreateRuntime(); var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test"); tagHelperBuilder.TypeName("FooTagHelper"); @@ -173,13 +158,7 @@ __tagHelperExecutionContext.AddTagHelperAttribute(_tagHelper1); { // Arrange var extension = new PreallocatedAttributeTargetExtension(); - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options) - { - TagHelperRenderingContext = new TagHelperRenderingContext() - }; + var context = TestCodeRenderingContext.CreateRuntime(); var tagHelperBuilder = new DefaultTagHelperDescriptorBuilder(TagHelperConventions.DefaultKind, "FooTagHelper", "Test"); tagHelperBuilder.TypeName("FooTagHelper"); diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/SectionTargetExtensionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/SectionTargetExtensionTest.cs index 4ae7083b2a..85790be75a 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/SectionTargetExtensionTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/SectionTargetExtensionTest.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Razor.Language.CodeGeneration; +using Microsoft.AspNetCore.Razor.Language.Intermediate; using Microsoft.AspNetCore.Razor.Language.Legacy; using Xunit; using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert; @@ -16,6 +17,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions // Arrange var node = new SectionIntermediateNode() { + Children = + { + new CSharpExpressionIntermediateNode(), + }, Name = "MySection" }; @@ -24,26 +29,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions SectionMethodName = "CreateSection" }; - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options) - { - TagHelperWriter = new RuntimeTagHelperWriter(), - }; - - context.SetRenderChildren((n) => - { - Assert.Same(node, n); - context.CodeWriter.WriteLine(" var s = \"Inside\""); - }); + var context = TestCodeRenderingContext.CreateRuntime(); // Act extension.WriteSection(context, node); // Assert var expected = @"CreateSection(""MySection"", async() => { - var s = ""Inside"" + Render Children } ); "; @@ -58,6 +51,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions // Arrange var node = new SectionIntermediateNode() { + Children = + { + new CSharpExpressionIntermediateNode(), + }, Name = "MySection" }; @@ -66,26 +63,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions SectionMethodName = "CreateSection" }; - var codeWriter = new CodeWriter(); - var nodeWriter = new RuntimeNodeWriter(); - var options = RazorCodeGenerationOptions.Create(false, 4, true, false); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options) - { - TagHelperWriter = new RuntimeTagHelperWriter(), - }; - - context.SetRenderChildren((n) => - { - Assert.Same(node, n); - context.CodeWriter.WriteLine(" var s = \"Inside\""); - }); + var context = TestCodeRenderingContext.CreateDesignTime(); // Act extension.WriteSection(context, node); // Assert var expected = @"CreateSection(""MySection"", async(__razor_section_writer) => { - var s = ""Inside"" + Render Children } ); "; diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/TemplateTargetExtensionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/TemplateTargetExtensionTest.cs index 06c424342e..242373f75d 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/TemplateTargetExtensionTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Extensions/TemplateTargetExtensionTest.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Razor.Language.CodeGeneration; +using Microsoft.AspNetCore.Razor.Language.Intermediate; using Xunit; namespace Microsoft.AspNetCore.Razor.Language.Extensions @@ -12,29 +13,25 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions public void WriteTemplate_WritesTemplateCode() { // Arrange - var node = new TemplateIntermediateNode(); + var node = new TemplateIntermediateNode() + { + Children = + { + new CSharpExpressionIntermediateNode() + } + }; var extension = new TemplateTargetExtension() { TemplateTypeName = "global::TestTemplate" }; - - var codeWriter = new CodeWriter(); + var nodeWriter = new RuntimeNodeWriter() { PushWriterMethod = "TestPushWriter", PopWriterMethod = "TestPopWriter" }; - var options = RazorCodeGenerationOptions.CreateDefault(); - var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, sourceDocument: null, options: options) - { - TagHelperWriter = new RuntimeTagHelperWriter(), - }; - context.SetRenderChildren((n) => - { - Assert.Same(node, n); - context.CodeWriter.WriteLine(" var s = \"Inside\""); - }); + var context = TestCodeRenderingContext.CreateRuntime(nodeWriter: nodeWriter); // Act extension.WriteTemplate(context, node); @@ -42,7 +39,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions // Assert var expected = @"item => new global::TestTemplate(async(__razor_template_writer) => { TestPushWriter(__razor_template_writer); - var s = ""Inside"" + Render Children TestPopWriter(); } )"; diff --git a/test/Microsoft.AspNetCore.Razor.Test.Common/Language/CodeGeneration/TestCodeRenderingContext.cs b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/CodeGeneration/TestCodeRenderingContext.cs new file mode 100644 index 0000000000..2791dbcf62 --- /dev/null +++ b/test/Microsoft.AspNetCore.Razor.Test.Common/Language/CodeGeneration/TestCodeRenderingContext.cs @@ -0,0 +1,99 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Razor.Language.Intermediate; + +namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration +{ + public static class TestCodeRenderingContext + { + public static CodeRenderingContext CreateDesignTime( + string newLineString = null, + string suppressUniqueIds = "test", + RazorSourceDocument source = null, + IntermediateNodeWriter nodeWriter = null) + { + var codeWriter = new CodeWriter(); + var documentNode = new DocumentIntermediateNode(); + var options = RazorCodeGenerationOptions.CreateDesignTimeDefault(); + + if (source == null) + { + source = TestRazorSourceDocument.Create(); + } + + var codeDocument = RazorCodeDocument.Create(source); + if (newLineString != null) + { + codeDocument.Items[CodeRenderingContext.NewLineString] = newLineString; + } + + if (suppressUniqueIds != null) + { + codeDocument.Items[CodeRenderingContext.SuppressUniqueIds] = suppressUniqueIds; + } + + if (nodeWriter == null) + { + nodeWriter = new DesignTimeNodeWriter(); + } + + var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument, documentNode, options); + context.Visitor = new RenderChildrenVisitor(context); + + return context; + } + + public static CodeRenderingContext CreateRuntime( + string newLineString = null, + string suppressUniqueIds = "test", + RazorSourceDocument source = null, + IntermediateNodeWriter nodeWriter = null) + { + var codeWriter = new CodeWriter(); + var documentNode = new DocumentIntermediateNode(); + var options = RazorCodeGenerationOptions.CreateDefault(); + + if (source == null) + { + source = TestRazorSourceDocument.Create(); + } + + var codeDocument = RazorCodeDocument.Create(source); + if (newLineString != null) + { + codeDocument.Items[CodeRenderingContext.NewLineString] = newLineString; + } + + if (suppressUniqueIds != null) + { + codeDocument.Items[CodeRenderingContext.SuppressUniqueIds] = suppressUniqueIds; + } + + if (nodeWriter == null) + { + nodeWriter = new RuntimeNodeWriter(); + } + + var context = new DefaultCodeRenderingContext(codeWriter, nodeWriter, codeDocument, documentNode, options); + context.Visitor = new RenderChildrenVisitor(context); + + return context; + } + + private class RenderChildrenVisitor : IntermediateNodeVisitor + { + private readonly CodeRenderingContext _context; + public RenderChildrenVisitor(CodeRenderingContext context) + { + _context = context; + } + + public override void VisitDefault(IntermediateNode node) + { + _context.CodeWriter.WriteLine("Render Children"); + } + } + + } +}