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;");
}
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);

View File

@ -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; }
/// <summary>
/// Renders the code for the given <paramref name="chunk"/>.
/// </summary>
@ -431,7 +431,7 @@ namespace Microsoft.AspNet.Razor.Generator.Compiler.CSharp
private void RenderAttributeValue(TagHelperAttributeDescriptor attributeDescriptor,
Action<CSharpCodeWriter> valueRenderer)
{
_attributeValueCodeRenderer.RenderAttributeValue(attributeDescriptor, _writer, _context, valueRenderer);
AttributeValueCodeRenderer.RenderAttributeValue(attributeDescriptor, _writer, _context, valueRenderer);
}
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 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)

View File

@ -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;

View File

@ -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)

View File

@ -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
/// <param name="context">A <see cref="CodeGeneratorContext"/> instance that contains information about
/// the current code generation process.</param>
/// <param name="renderAttributeValue"><see cref="Action"/> that renders the raw value of the HTML attribute.</param>
public void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor,
[NotNull] CSharpCodeWriter writer,
[NotNull] CodeBuilderContext context,
[NotNull] Action<CSharpCodeWriter> renderAttributeValue)
public virtual void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor,
[NotNull] CSharpCodeWriter writer,
[NotNull] CodeBuilderContext context,
[NotNull] Action<CSharpCodeWriter> renderAttributeValue)
{
renderAttributeValue(writer);
}