Add extensibility point for TH attribute code gen.

- Enabled the CSharpCodeBuilder to create the CSharpCodeVisitor which exposes a CSharpTagHelperCodeRenderer which is indirectly used to render attribute values.
- Fixed up some existing classes that just new'd up the CSharpCodeVisitor class to instead take in the decorated version.

#119
This commit is contained in:
NTaylorMullen 2014-09-28 23:03:39 -07:00 committed by N. Taylor Mullen
parent c3b51cbbdf
commit 2b6b437952
6 changed files with 34 additions and 24 deletions

View File

@ -52,8 +52,10 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
writer.WriteLine("private static object @__o;"); writer.WriteLine("private static object @__o;");
} }
new CSharpHelperVisitor(writer, Context).Accept(Tree.Chunks); var csharpCodeVisitor = CreateCSharpCodeVisitor(writer, Context);
new CSharpTypeMemberVisitor(writer, Context).Accept(Tree.Chunks);
new CSharpHelperVisitor(csharpCodeVisitor, writer, Context).Accept(Tree.Chunks);
new CSharpTypeMemberVisitor(csharpCodeVisitor, writer, Context).Accept(Tree.Chunks);
new CSharpDesignTimeHelpersVisitor(writer, Context).AcceptTree(Tree); new CSharpDesignTimeHelpersVisitor(writer, Context).AcceptTree(Tree);
new CSharpTagHelperFieldDeclarationVisitor(writer, Context).Accept(Tree.Chunks); 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)) 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); 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) protected virtual CSharpCodeWritingScope BuildClassDeclaration(CSharpCodeWriter writer)
{ {
var baseTypeVisitor = new CSharpBaseTypeVisitor(writer, Context); var baseTypeVisitor = new CSharpBaseTypeVisitor(writer, Context);

View File

@ -22,9 +22,6 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
private static readonly TagHelperAttributeDescriptorComparer AttributeDescriptorComparer = private static readonly TagHelperAttributeDescriptorComparer AttributeDescriptorComparer =
new TagHelperAttributeDescriptorComparer(); 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 CSharpCodeWriter _writer;
private readonly CodeBuilderContext _context; private readonly CodeBuilderContext _context;
private readonly IChunkVisitor _bodyVisitor; private readonly IChunkVisitor _bodyVisitor;
@ -41,12 +38,15 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
[NotNull] CSharpCodeWriter writer, [NotNull] CSharpCodeWriter writer,
[NotNull] CodeBuilderContext context) [NotNull] CodeBuilderContext context)
{ {
_bodyVisitor = bodyVisitor;
_writer = writer; _writer = writer;
_context = context; _context = context;
_bodyVisitor = bodyVisitor;
_tagHelperContext = context.Host.GeneratedClassContext.GeneratedTagHelperContext; _tagHelperContext = context.Host.GeneratedClassContext.GeneratedTagHelperContext;
AttributeValueCodeRenderer = new TagHelperAttributeValueCodeRenderer();
} }
public TagHelperAttributeValueCodeRenderer AttributeValueCodeRenderer { get; set; }
/// <summary> /// <summary>
/// Renders the code for the given <paramref name="chunk"/>. /// Renders the code for the given <paramref name="chunk"/>.
/// </summary> /// </summary>
@ -431,7 +431,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
private void RenderAttributeValue(TagHelperAttributeDescriptor attributeDescriptor, private void RenderAttributeValue(TagHelperAttributeDescriptor attributeDescriptor,
Action<CSharpCodeWriter> valueRenderer) Action<CSharpCodeWriter> valueRenderer)
{ {
_attributeValueCodeRenderer.RenderAttributeValue(attributeDescriptor, _writer, _context, valueRenderer); AttributeValueCodeRenderer.RenderAttributeValue(attributeDescriptor, _writer, _context, valueRenderer);
} }
private static void RenderBufferedAttributeValueAccessor(CSharpCodeWriter writer) private static void RenderBufferedAttributeValueAccessor(CSharpCodeWriter writer)

View File

@ -17,18 +17,19 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
private const string TemplateWriterName = "__razor_template_writer"; private const string TemplateWriterName = "__razor_template_writer";
private CSharpPaddingBuilder _paddingBuilder; private CSharpPaddingBuilder _paddingBuilder;
private CSharpTagHelperCodeRenderer _tagHelperCodeRenderer;
public CSharpCodeVisitor(CSharpCodeWriter writer, CodeBuilderContext context) public CSharpCodeVisitor(CSharpCodeWriter writer, CodeBuilderContext context)
: base(writer, context) : base(writer, context)
{ {
_paddingBuilder = new CSharpPaddingBuilder(context.Host); _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) protected override void Visit(TagHelperChunk chunk)
{ {
_tagHelperCodeRenderer.RenderTagHelper(chunk); TagHelperRenderer.RenderTagHelper(chunk);
} }
protected override void Visit(ChunkBlock chunk) protected override void Visit(ChunkBlock chunk)

View File

@ -9,12 +9,14 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
{ {
private const string HelperWriterName = "__razor_helper_writer"; 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) : base(writer, context)
{ {
_codeVisitor = new CSharpCodeVisitor(writer, context); _csharpCodeVisitor = csharpCodeVisitor;
} }
protected override void Visit(HelperChunk chunk) protected override void Visit(HelperChunk chunk)
@ -46,7 +48,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
Context.TargetWriterName = HelperWriterName; Context.TargetWriterName = HelperWriterName;
// Generate children code // Generate children code
_codeVisitor.Accept(chunk.Children); _csharpCodeVisitor.Accept(chunk.Children);
Context.TargetWriterName = currentTargetWriterName; Context.TargetWriterName = currentTargetWriterName;

View File

@ -9,10 +9,12 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
{ {
private CSharpCodeVisitor _csharpCodeVisitor; private CSharpCodeVisitor _csharpCodeVisitor;
public CSharpTypeMemberVisitor(CSharpCodeWriter writer, CodeBuilderContext context) public CSharpTypeMemberVisitor([NotNull] CSharpCodeVisitor csharpCodeVisitor,
[NotNull] CSharpCodeWriter writer,
[NotNull] CodeBuilderContext context)
: base(writer, context) : base(writer, context)
{ {
_csharpCodeVisitor = new CSharpCodeVisitor(writer, context); _csharpCodeVisitor = csharpCodeVisitor;
} }
protected override void Visit(TypeMemberChunk chunk) protected override void Visit(TypeMemberChunk chunk)

View File

@ -2,9 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using Microsoft.AspNet.Razor.Generator; using Microsoft.AspNet.Razor.Generator;
using Microsoft.AspNet.Razor.Generator.Compiler.CSharp; using Microsoft.AspNet.Razor.Generator.Compiler.CSharp;
@ -24,10 +21,10 @@ namespace Microsoft.AspNet.Razor.TagHelpers
/// <param name="context">A <see cref="CodeGeneratorContext"/> instance that contains information about /// <param name="context">A <see cref="CodeGeneratorContext"/> instance that contains information about
/// the current code generation process.</param> /// the current code generation process.</param>
/// <param name="renderAttributeValue"><see cref="Action"/> that renders the raw value of the HTML attribute.</param> /// <param name="renderAttributeValue"><see cref="Action"/> that renders the raw value of the HTML attribute.</param>
public void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor, public virtual void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor,
[NotNull] CSharpCodeWriter writer, [NotNull] CSharpCodeWriter writer,
[NotNull] CodeBuilderContext context, [NotNull] CodeBuilderContext context,
[NotNull] Action<CSharpCodeWriter> renderAttributeValue) [NotNull] Action<CSharpCodeWriter> renderAttributeValue)
{ {
renderAttributeValue(writer); renderAttributeValue(writer);
} }