diff --git a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpCodeBuilder.cs b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpCodeBuilder.cs index 97c4987f4f..3cb2ee5ccd 100644 --- a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpCodeBuilder.cs +++ b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpCodeBuilder.cs @@ -52,8 +52,10 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp writer.WriteLine("private static object @__o;"); } - new CSharpHelperVisitor(writer, Context).Accept(Tree.Chunks); - new CSharpTypeMemberVisitor(writer, Context).Accept(Tree.Chunks); + var csharpCodeVisitor = CreateCSharpCodeVisitor(writer, Context); + + new CSharpHelperVisitor(csharpCodeVisitor, writer, Context).Accept(Tree.Chunks); + new CSharpTypeMemberVisitor(csharpCodeVisitor, writer, Context).Accept(Tree.Chunks); new CSharpDesignTimeHelpersVisitor(writer, Context).AcceptTree(Tree); new CSharpTagHelperFieldDeclarationVisitor(writer, Context).Accept(Tree.Chunks); @@ -66,7 +68,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp { using (writer.BuildMethodDeclaration("public override async", "Task", Host.GeneratedClassContext.ExecuteMethodName)) { - new CSharpCodeVisitor(writer, Context).Accept(Tree.Chunks); + csharpCodeVisitor.Accept(Tree.Chunks); } } } @@ -75,6 +77,12 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp return new CodeBuilderResult(writer.GenerateCode(), writer.LineMappingManager.Mappings); } + protected virtual CSharpCodeVisitor CreateCSharpCodeVisitor([NotNull] CSharpCodeWriter writer, + [NotNull] CodeBuilderContext context) + { + return new CSharpCodeVisitor(writer, context); + } + protected virtual CSharpCodeWritingScope BuildClassDeclaration(CSharpCodeWriter writer) { var baseTypeVisitor = new CSharpBaseTypeVisitor(writer, Context); diff --git a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpTagHelperCodeRenderer.cs b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpTagHelperCodeRenderer.cs index a4efa1ff8b..83af0e72e7 100644 --- a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpTagHelperCodeRenderer.cs +++ b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpTagHelperCodeRenderer.cs @@ -22,9 +22,6 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp private static readonly TagHelperAttributeDescriptorComparer AttributeDescriptorComparer = new TagHelperAttributeDescriptorComparer(); - // TODO: The work to properly implement this will be done in: https://github.com/aspnet/Razor/issues/74 - private readonly TagHelperAttributeValueCodeRenderer _attributeValueCodeRenderer = - new TagHelperAttributeValueCodeRenderer(); private readonly CSharpCodeWriter _writer; private readonly CodeBuilderContext _context; private readonly IChunkVisitor _bodyVisitor; @@ -41,12 +38,15 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp [NotNull] CSharpCodeWriter writer, [NotNull] CodeBuilderContext context) { + _bodyVisitor = bodyVisitor; _writer = writer; _context = context; - _bodyVisitor = bodyVisitor; _tagHelperContext = context.Host.GeneratedClassContext.GeneratedTagHelperContext; + AttributeValueCodeRenderer = new TagHelperAttributeValueCodeRenderer(); } + public TagHelperAttributeValueCodeRenderer AttributeValueCodeRenderer { get; set; } + /// /// Renders the code for the given . /// @@ -431,7 +431,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp private void RenderAttributeValue(TagHelperAttributeDescriptor attributeDescriptor, Action valueRenderer) { - _attributeValueCodeRenderer.RenderAttributeValue(attributeDescriptor, _writer, _context, valueRenderer); + AttributeValueCodeRenderer.RenderAttributeValue(attributeDescriptor, _writer, _context, valueRenderer); } private static void RenderBufferedAttributeValueAccessor(CSharpCodeWriter writer) diff --git a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpCodeVisitor.cs b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpCodeVisitor.cs index 49e308e116..3162bc5e26 100644 --- a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpCodeVisitor.cs +++ b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpCodeVisitor.cs @@ -17,18 +17,19 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp private const string TemplateWriterName = "__razor_template_writer"; private CSharpPaddingBuilder _paddingBuilder; - private CSharpTagHelperCodeRenderer _tagHelperCodeRenderer; public CSharpCodeVisitor(CSharpCodeWriter writer, CodeBuilderContext context) : base(writer, context) { _paddingBuilder = new CSharpPaddingBuilder(context.Host); - _tagHelperCodeRenderer = new CSharpTagHelperCodeRenderer(this, writer, context); + TagHelperRenderer = new CSharpTagHelperCodeRenderer(this, writer, context); } + public CSharpTagHelperCodeRenderer TagHelperRenderer { get; set; } + protected override void Visit(TagHelperChunk chunk) { - _tagHelperCodeRenderer.RenderTagHelper(chunk); + TagHelperRenderer.RenderTagHelper(chunk); } protected override void Visit(ChunkBlock chunk) diff --git a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpHelperVisitor.cs b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpHelperVisitor.cs index 9f4785713e..2f68e86aae 100644 --- a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpHelperVisitor.cs +++ b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpHelperVisitor.cs @@ -9,12 +9,14 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp { private const string HelperWriterName = "__razor_helper_writer"; - private CSharpCodeVisitor _codeVisitor; + private CSharpCodeVisitor _csharpCodeVisitor; - public CSharpHelperVisitor(CSharpCodeWriter writer, CodeBuilderContext context) + public CSharpHelperVisitor([NotNull] CSharpCodeVisitor csharpCodeVisitor, + [NotNull] CSharpCodeWriter writer, + [NotNull] CodeBuilderContext context) : base(writer, context) { - _codeVisitor = new CSharpCodeVisitor(writer, context); + _csharpCodeVisitor = csharpCodeVisitor; } protected override void Visit(HelperChunk chunk) @@ -46,7 +48,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp Context.TargetWriterName = HelperWriterName; // Generate children code - _codeVisitor.Accept(chunk.Children); + _csharpCodeVisitor.Accept(chunk.Children); Context.TargetWriterName = currentTargetWriterName; diff --git a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpTypeMemberVisitor.cs b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpTypeMemberVisitor.cs index acff74340e..dc26beaced 100644 --- a/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpTypeMemberVisitor.cs +++ b/src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpTypeMemberVisitor.cs @@ -9,10 +9,12 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp { private CSharpCodeVisitor _csharpCodeVisitor; - public CSharpTypeMemberVisitor(CSharpCodeWriter writer, CodeBuilderContext context) + public CSharpTypeMemberVisitor([NotNull] CSharpCodeVisitor csharpCodeVisitor, + [NotNull] CSharpCodeWriter writer, + [NotNull] CodeBuilderContext context) : base(writer, context) { - _csharpCodeVisitor = new CSharpCodeVisitor(writer, context); + _csharpCodeVisitor = csharpCodeVisitor; } protected override void Visit(TypeMemberChunk chunk) diff --git a/src/Microsoft.AspNet.Razor/TagHelpers/TagHelperAttributeValueCodeRenderer.cs b/src/Microsoft.AspNet.Razor/TagHelpers/TagHelperAttributeValueCodeRenderer.cs index e5334c99c5..8088892ee2 100644 --- a/src/Microsoft.AspNet.Razor/TagHelpers/TagHelperAttributeValueCodeRenderer.cs +++ b/src/Microsoft.AspNet.Razor/TagHelpers/TagHelperAttributeValueCodeRenderer.cs @@ -2,9 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics; -using System.Linq; -using System.Reflection; using Microsoft.AspNet.Razor.Generator; using Microsoft.AspNet.Razor.Generator.Compiler.CSharp; @@ -24,10 +21,10 @@ namespace Microsoft.AspNet.Razor.TagHelpers /// A instance that contains information about /// the current code generation process. /// that renders the raw value of the HTML attribute. - public void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor, - [NotNull] CSharpCodeWriter writer, - [NotNull] CodeBuilderContext context, - [NotNull] Action renderAttributeValue) + public virtual void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor, + [NotNull] CSharpCodeWriter writer, + [NotNull] CodeBuilderContext context, + [NotNull] Action renderAttributeValue) { renderAttributeValue(writer); }