diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DefaultDocumentWriter.cs b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DefaultDocumentWriter.cs index cea9ceef79..1f3c4934bd 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DefaultDocumentWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DefaultDocumentWriter.cs @@ -206,6 +206,11 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration Context.TagHelperWriter.WriteInitializeTagHelperStructure(Context, node); } + public override void VisitCreateTagHelper(CreateTagHelperIRNode node) + { + Context.TagHelperWriter.WriteCreateTagHelper(Context, node); + } + public override void VisitDefault(RazorIRNode node) { // This is a temporary bridge to the renderer, which allows us to move functionality piecemeal diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeCSharpRenderer.cs b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeCSharpRenderer.cs index 3fc5e0b651..ca4b4bcd67 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeCSharpRenderer.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeCSharpRenderer.cs @@ -204,18 +204,6 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration Context.Writer.WriteLine("))();"); } - public override void VisitCreateTagHelper(CreateTagHelperIRNode node) - { - var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); - - Context.Writer - .WriteStartAssignment(tagHelperVariableName) - .WriteStartMethodInvocation( - "CreateTagHelper" /* ORIGINAL: CreateTagHelperMethodName */, - "global::" + node.TagHelperTypeName) - .WriteEndMethodInvocation(); - } - public override void VisitSetTagHelperProperty(SetTagHelperPropertyIRNode node) { var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeTagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeTagHelperWriter.cs index 89bf46b18e..ec42ea0b06 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeTagHelperWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/DesignTimeTagHelperWriter.cs @@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration { public class DesignTimeTagHelperWriter : TagHelperWriter { + public string CreateTagHelperMethodName { get; set; } = "CreateTagHelper"; + public override void WriteDeclareTagHelperFields(CSharpRenderingContext context, DeclareTagHelperFieldsIRNode node) { foreach (var tagHelperTypeName in node.UsedTagHelperTypeNames) @@ -29,7 +31,14 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration public override void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIRNode node) { - throw new NotImplementedException(); + var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); + + context.Writer + .WriteStartAssignment(tagHelperVariableName) + .WriteStartMethodInvocation( + CreateTagHelperMethodName, + "global::" + node.TagHelperTypeName) + .WriteEndMethodInvocation(); } public override void WriteExecuteTagHelpers(CSharpRenderingContext context, ExecuteTagHelpersIRNode node) diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeCSharpRenderer.cs b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeCSharpRenderer.cs index 8346047925..c6010eb486 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeCSharpRenderer.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeCSharpRenderer.cs @@ -255,23 +255,6 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration linePragmaScope?.Dispose(); } - public override void VisitCreateTagHelper(CreateTagHelperIRNode node) - { - var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); - - Context.Writer - .WriteStartAssignment(tagHelperVariableName) - .WriteStartMethodInvocation( - "CreateTagHelper" /* ORIGINAL: CreateTagHelperMethodName */, - "global::" + node.TagHelperTypeName) - .WriteEndMethodInvocation(); - - Context.Writer.WriteInstanceMethodInvocation( - "__tagHelperExecutionContext" /* ORIGINAL: ExecutionContextVariableName */, - "Add" /* ORIGINAL: ExecutionContextAddMethodName */, - tagHelperVariableName); - } - public override void VisitAddPreallocatedTagHelperHtmlAttribute(AddPreallocatedTagHelperHtmlAttributeIRNode node) { Context.Writer diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeTagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeTagHelperWriter.cs index cb5d222216..395425fcb4 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeTagHelperWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/CodeGeneration/RuntimeTagHelperWriter.cs @@ -14,6 +14,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration public string ExecutionContextVariableName { get; set; } = "__tagHelperExecutionContext"; + public string ExecutionContextAddMethodName { get; set; } = "Add"; + public string RunnerTypeName { get; set; } = "global::Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner"; public string RunnerVariableName { get; set; } = "__tagHelperRunner"; @@ -30,6 +32,8 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration public string TagModeTypeName { get; set; } = "global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode"; + public string CreateTagHelperMethodName { get; set; } = "CreateTagHelper"; + public override void WriteDeclareTagHelperFields(CSharpRenderingContext context, DeclareTagHelperFieldsIRNode node) { context.Writer.WriteLineHiddenDirective(); @@ -116,7 +120,19 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration public override void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIRNode node) { - throw new NotImplementedException(); + var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); + + context.Writer + .WriteStartAssignment(tagHelperVariableName) + .WriteStartMethodInvocation( + CreateTagHelperMethodName, + "global::" + node.TagHelperTypeName) + .WriteEndMethodInvocation(); + + context.Writer.WriteInstanceMethodInvocation( + ExecutionContextVariableName, + ExecutionContextAddMethodName, + tagHelperVariableName); } public override void WriteExecuteTagHelpers(CSharpRenderingContext context, ExecuteTagHelpersIRNode node) diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/DesignTimeTagHelperWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/DesignTimeTagHelperWriterTest.cs index a7ae3e8803..b98d1da9b1 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/DesignTimeTagHelperWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/DesignTimeTagHelperWriterTest.cs @@ -29,6 +29,32 @@ namespace Microsoft.AspNetCore.Razor.Evolution.CodeGeneration Assert.Equal( @"private global::PTagHelper __PTagHelper = null; private global::MyTagHelper __MyTagHelper = null; +", + csharp, + ignoreLineEndingDifferences: true); + } + + [Fact] + public void WriteCreateTagHelper_RendersCorrectly_UsesSpecifiedTagHelperType() + { + // Arrange + var writer = new DesignTimeTagHelperWriter(); + var context = new CSharpRenderingContext() + { + Writer = new Legacy.CSharpCodeWriter(), + }; + var node = new CreateTagHelperIRNode() + { + TagHelperTypeName = "TestNamespace.MyTagHelper" + }; + + // Act + writer.WriteCreateTagHelper(context, node); + + // Assert + var csharp = context.Writer.Builder.ToString(); + Assert.Equal( +@"__TestNamespace_MyTagHelper = CreateTagHelper(); ", csharp, ignoreLineEndingDifferences: true); diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/RuntimeTagHelperWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/RuntimeTagHelperWriterTest.cs index 9ee12ad4c0..6f2808c4dd 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/RuntimeTagHelperWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/CodeGeneration/RuntimeTagHelperWriterTest.cs @@ -119,6 +119,33 @@ private global::MyTagHelper __MyTagHelper = null; @"__tagHelperExecutionContext = __tagHelperScopeManager.Begin(""p"", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.SelfClosing, ""test"", async() => { } ); +", + csharp, + ignoreLineEndingDifferences: true); + } + + [Fact] + public void WriteCreateTagHelper_RendersCorrectly_UsesSpecifiedTagHelperType() + { + // Arrange + var writer = new RuntimeTagHelperWriter(); + var context = new CSharpRenderingContext() + { + Writer = new Legacy.CSharpCodeWriter(), + }; + var node = new CreateTagHelperIRNode() + { + TagHelperTypeName = "TestNamespace.MyTagHelper" + }; + + // Act + writer.WriteCreateTagHelper(context, node); + + // Assert + var csharp = context.Writer.Builder.ToString(); + Assert.Equal( +@"__TestNamespace_MyTagHelper = CreateTagHelper(); +__tagHelperExecutionContext.Add(__TestNamespace_MyTagHelper); ", csharp, ignoreLineEndingDifferences: true);