Ensure `CodeVisitor`s consistenctly find tag helpers

- #412
- fix `CSharpTagHelperRunnerInitializationVisitor` and `CSharpUsingVisitor`
- fix existing test of the tag helper in a section scenario
This commit is contained in:
Doug Bunting 2015-06-01 09:03:09 -07:00
parent d545f47fe4
commit 113d80c6f5
3 changed files with 40 additions and 0 deletions

View File

@ -26,6 +26,25 @@ namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
_tagHelperContext = Context.Host.GeneratedClassContext.GeneratedTagHelperContext; _tagHelperContext = Context.Host.GeneratedClassContext.GeneratedTagHelperContext;
} }
/// <inheritdoc />
public override void Accept(Chunk chunk)
{
// If at any ParentChunk other than a TagHelperChunk, then dive into its Children to search for more
// TagHelperChunk nodes. This method avoids overriding each of the ParentChunk-specific Visit() methods to
// dive into Children.
var parentChunk = chunk as ParentChunk;
if (parentChunk != null && !(parentChunk is TagHelperChunk))
{
Accept(parentChunk.Children);
}
else
{
// If at a TagHelperChunk or any non-ParentChunk, "Accept()" it. This ensures the Visit(TagHelperChunk)
// method below is called.
base.Accept(chunk);
}
}
/// <summary> /// <summary>
/// Writes the TagHelperRunner initialization code to the Writer. /// Writes the TagHelperRunner initialization code to the Writer.
/// </summary> /// </summary>

View File

@ -23,6 +23,25 @@ namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors
public IList<string> ImportedUsings { get; set; } public IList<string> ImportedUsings { get; set; }
/// <inheritdoc />
public override void Accept(Chunk chunk)
{
// If at any ParentChunk other than a TagHelperChunk, then dive into its Children to search for more
// TagHelperChunk or UsingChunk nodes. This method avoids overriding each of the ParentChunk-specific
// Visit() methods to dive into Children.
var parentChunk = chunk as ParentChunk;
if (parentChunk != null && !(parentChunk is TagHelperChunk))
{
Accept(parentChunk.Children);
}
else
{
// If at a TagHelperChunk or any non-ParentChunk (e.g. UsingChunk), "Accept()" it. This ensures the
// Visit(UsingChunk) and Visit(TagHelperChunk) methods below are called.
base.Accept(chunk);
}
}
protected override void Visit(UsingChunk chunk) protected override void Visit(UsingChunk chunk)
{ {
var documentContent = ((Span)chunk.Association).Content.Trim(); var documentContent = ((Span)chunk.Association).Content.Trim();

View File

@ -1,6 +1,7 @@
#pragma checksum "TagHelpersInSection.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "b6492c68360b85d4993de94eeac547b7fb012a26" #pragma checksum "TagHelpersInSection.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "b6492c68360b85d4993de94eeac547b7fb012a26"
namespace TestOutput namespace TestOutput
{ {
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -23,6 +24,7 @@ namespace TestOutput
#pragma warning disable 1998 #pragma warning disable 1998
public override async Task ExecuteAsync() public override async Task ExecuteAsync()
{ {
__tagHelperRunner = __tagHelperRunner ?? new TagHelperRunner();
Instrumentation.BeginContext(33, 2, true); Instrumentation.BeginContext(33, 2, true);
WriteLiteral("\r\n"); WriteLiteral("\r\n");
Instrumentation.EndContext(); Instrumentation.EndContext();