Skip to content
This repository was archived by the owner on Dec 19, 2018. It is now read-only.

Commit 84e32d5

Browse files
author
N. Taylor Mullen
committed
Add extensibility point for TH attribute code gen.
- Followed the "decorate" pattern that we use throughout Razor. - Enabled the CSharpCodeBuilder to decorate 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
1 parent cfffc06 commit 84e32d5

File tree

6 files changed

+47
-28
lines changed

6 files changed

+47
-28
lines changed

src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpCodeBuilder.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,12 @@ public override CodeBuilderResult Build()
3939
writer.WriteLine("private static object @__o;");
4040
}
4141

42-
new CSharpHelperVisitor(writer, Context).Accept(Tree.Chunks);
43-
new CSharpTypeMemberVisitor(writer, Context).Accept(Tree.Chunks);
42+
var csharpCodeVisitor = DecorateCSharpCodeVisitor(writer,
43+
Context,
44+
new CSharpCodeVisitor(writer, Context));
45+
46+
new CSharpHelperVisitor(csharpCodeVisitor, writer, Context).Accept(Tree.Chunks);
47+
new CSharpTypeMemberVisitor(csharpCodeVisitor, writer, Context).Accept(Tree.Chunks);
4448
new CSharpDesignTimeHelpersVisitor(writer, Context).AcceptTree(Tree);
4549
new CSharpPropertyVisitor(writer, Context).Accept(Tree.Chunks);
4650

@@ -55,7 +59,7 @@ public override CodeBuilderResult Build()
5559
{
5660
new CSharpTagHelperDeclarationVisitor(writer, Context).Accept(Tree.Chunks);
5761

58-
new CSharpCodeVisitor(writer, Context).Accept(Tree.Chunks);
62+
csharpCodeVisitor.Accept(Tree.Chunks);
5963
}
6064
}
6165
}
@@ -64,6 +68,13 @@ public override CodeBuilderResult Build()
6468
return new CodeBuilderResult(writer.GenerateCode(), writer.LineMappingManager.Mappings);
6569
}
6670

71+
protected virtual CSharpCodeVisitor DecorateCSharpCodeVisitor([NotNull] CSharpCodeWriter writer,
72+
[NotNull] CodeBuilderContext context,
73+
[NotNull] CSharpCodeVisitor incomingVisitor)
74+
{
75+
return incomingVisitor;
76+
}
77+
6778
protected virtual CSharpCodeWritingScope BuildClassDeclaration(CSharpCodeWriter writer)
6879
{
6980
var baseTypeVisitor = new CSharpBaseTypeVisitor(writer, Context);

src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/CSharpTagHelperCodeRenderer.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ public class CSharpTagHelperCodeRenderer
2525
private static readonly TagHelperAttributeDescriptorComparer AttributeDescriptorComparer =
2626
new TagHelperAttributeDescriptorComparer();
2727

28-
// TODO: The work to properly implement this will be done in: https://github.com/aspnet/Razor/issues/74
29-
private readonly TagHelperAttributeValueCodeRenderer _attributeValueCodeRenderer =
30-
new TagHelperAttributeValueCodeRenderer();
28+
private readonly TagHelperAttributeValueCodeRenderer _attributeValueCodeRenderer;
3129
private readonly CSharpCodeWriter _writer;
3230
private readonly CodeBuilderContext _context;
3331
private readonly IChunkVisitor _bodyVisitor;
@@ -41,12 +39,14 @@ public class CSharpTagHelperCodeRenderer
4139
/// <param name="context">A <see cref="CodeBuilderContext"/> instance that contains information about
4240
/// the current code generation process.</param>
4341
public CSharpTagHelperCodeRenderer([NotNull] IChunkVisitor bodyVisitor,
42+
[NotNull] TagHelperAttributeValueCodeRenderer attributeValueCodeRenderer,
4443
[NotNull] CSharpCodeWriter writer,
4544
[NotNull] CodeBuilderContext context)
4645
{
46+
_bodyVisitor = bodyVisitor;
47+
_attributeValueCodeRenderer = attributeValueCodeRenderer;
4748
_writer = writer;
4849
_context = context;
49-
_bodyVisitor = bodyVisitor;
5050
_tagHelperContext = context.Host.GeneratedClassContext.GeneratedTagHelperContext;
5151
}
5252

@@ -363,7 +363,7 @@ private void RenderBufferedAttributeValueAccessor()
363363

364364
private void RenderBufferedAttributeValue(TagHelperAttributeDescriptor attributeDescriptor)
365365
{
366-
RenderAttribute(
366+
RenderAttributeValue(
367367
attributeDescriptor,
368368
valueRenderer: (writer) =>
369369
{
@@ -373,7 +373,7 @@ private void RenderBufferedAttributeValue(TagHelperAttributeDescriptor attribute
373373

374374
private void RenderRawAttributeValue(string value, TagHelperAttributeDescriptor attributeDescriptor)
375375
{
376-
RenderAttribute(
376+
RenderAttributeValue(
377377
attributeDescriptor,
378378
valueRenderer: (writer) =>
379379
{
@@ -383,7 +383,7 @@ private void RenderRawAttributeValue(string value, TagHelperAttributeDescriptor
383383

384384
private void RenderQuotedAttributeValue(string value, TagHelperAttributeDescriptor attributeDescriptor)
385385
{
386-
RenderAttribute(
386+
RenderAttributeValue(
387387
attributeDescriptor,
388388
valueRenderer: (writer) =>
389389
{
@@ -417,8 +417,8 @@ private void BuildBufferedWritingScope(Action renderCode)
417417
}
418418
}
419419

420-
private void RenderAttribute(TagHelperAttributeDescriptor attributeDescriptor,
421-
Action<CSharpCodeWriter> valueRenderer)
420+
private void RenderAttributeValue(TagHelperAttributeDescriptor attributeDescriptor,
421+
Action<CSharpCodeWriter> valueRenderer)
422422
{
423423
_attributeValueCodeRenderer.RenderAttributeValue(attributeDescriptor, _writer, _context, valueRenderer);
424424
}

src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpCodeVisitor.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,25 @@ public class CSharpCodeVisitor : CodeVisitor<CSharpCodeWriter>
1717
private const string TemplateWriterName = "__razor_template_writer";
1818

1919
private CSharpPaddingBuilder _paddingBuilder;
20-
private CSharpTagHelperCodeRenderer _tagHelperCodeRenderer;
2120

2221
public CSharpCodeVisitor(CSharpCodeWriter writer, CodeBuilderContext context)
2322
: base(writer, context)
2423
{
2524
_paddingBuilder = new CSharpPaddingBuilder(context.Host);
26-
_tagHelperCodeRenderer = new CSharpTagHelperCodeRenderer(this, writer, context);
25+
TagHelperRenderer = new CSharpTagHelperCodeRenderer(this,
26+
new TagHelperAttributeValueCodeRenderer(),
27+
writer,
28+
context);
2729
}
2830

31+
public CSharpTagHelperCodeRenderer TagHelperRenderer { get; set; }
32+
2933
protected override void Visit(TagHelperChunk chunk)
3034
{
31-
_tagHelperCodeRenderer.RenderTagHelper(chunk);
35+
if (TagHelperRenderer != null)
36+
{
37+
TagHelperRenderer.RenderTagHelper(chunk);
38+
}
3239
}
3340

3441
protected override void Visit(ChunkBlock chunk)

src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpHelperVisitor.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ public class CSharpHelperVisitor : CodeVisitor<CSharpCodeWriter>
99
{
1010
private const string HelperWriterName = "__razor_helper_writer";
1111

12-
private CSharpCodeVisitor _codeVisitor;
12+
private CSharpCodeVisitor _csharpCodeVisitor;
1313

14-
public CSharpHelperVisitor(CSharpCodeWriter writer, CodeBuilderContext context)
14+
public CSharpHelperVisitor([NotNull] CSharpCodeVisitor csharpCodeVisitor,
15+
[NotNull] CSharpCodeWriter writer,
16+
[NotNull] CodeBuilderContext context)
1517
: base(writer, context)
1618
{
17-
_codeVisitor = new CSharpCodeVisitor(writer, context);
19+
_csharpCodeVisitor = csharpCodeVisitor;
1820
}
1921

2022
protected override void Visit(HelperChunk chunk)
@@ -46,7 +48,7 @@ protected override void Visit(HelperChunk chunk)
4648
Context.TargetWriterName = HelperWriterName;
4749

4850
// Generate children code
49-
_codeVisitor.Accept(chunk.Children);
51+
_csharpCodeVisitor.Accept(chunk.Children);
5052

5153
Context.TargetWriterName = currentTargetWriterName;
5254

src/Microsoft.AspNet.Razor/Generator/Compiler/CodeBuilder/CSharp/Visitors/CSharpTypeMemberVisitor.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ public class CSharpTypeMemberVisitor : CodeVisitor<CSharpCodeWriter>
99
{
1010
private CSharpCodeVisitor _csharpCodeVisitor;
1111

12-
public CSharpTypeMemberVisitor(CSharpCodeWriter writer, CodeBuilderContext context)
12+
public CSharpTypeMemberVisitor([NotNull] CSharpCodeVisitor csharpCodeVisitor,
13+
[NotNull] CSharpCodeWriter writer,
14+
[NotNull] CodeBuilderContext context)
1315
: base(writer, context)
1416
{
15-
_csharpCodeVisitor = new CSharpCodeVisitor(writer, context);
17+
_csharpCodeVisitor = csharpCodeVisitor;
1618
}
1719

1820
protected override void Visit(TypeMemberChunk chunk)

src/Microsoft.AspNet.Razor/TagHelpers/TagHelperAttributeValueCodeRenderer.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5-
using System.Diagnostics;
6-
using System.Linq;
7-
using System.Reflection;
85
using Microsoft.AspNet.Razor.Generator;
96
using Microsoft.AspNet.Razor.Generator.Compiler.CSharp;
107

@@ -31,10 +28,10 @@ public class TagHelperAttributeValueCodeRenderer
3128
/// Writes the string: "new MyPropertyType(...)" to the output where the "..." is rendered by calling the
3229
/// <paramref name="renderAttributeValue"/> <see cref="Action"/>.
3330
/// </remarks>
34-
public void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor,
35-
[NotNull] CSharpCodeWriter writer,
36-
[NotNull] CodeBuilderContext context,
37-
[NotNull] Action<CSharpCodeWriter> renderAttributeValue)
31+
public virtual void RenderAttributeValue([NotNull] TagHelperAttributeDescriptor attributeDescriptor,
32+
[NotNull] CSharpCodeWriter writer,
33+
[NotNull] CodeBuilderContext context,
34+
[NotNull] Action<CSharpCodeWriter> renderAttributeValue)
3835
{
3936
renderAttributeValue(writer);
4037
}

0 commit comments

Comments
 (0)