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:
parent
c3b51cbbdf
commit
2b6b437952
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue