From 1efcdafa450cdae1478de6695d6ee31957909152 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Fri, 19 May 2017 15:16:45 -0700 Subject: [PATCH] Removed ExecuteTagHelpersIRNode --- .../InstrumentationPass.cs | 9 +- .../CodeGeneration/DefaultDocumentWriter.cs | 19 +- .../DesignTimeTagHelperWriter.cs | 14 +- .../CodeGeneration/RuntimeTagHelperWriter.cs | 185 +++++++++--------- .../TagHelperRenderingContext.cs | 4 + .../CodeGeneration/TagHelperWriter.cs | 10 +- .../DefaultRazorIRLoweringPhase.cs | 18 +- .../InitializeTagHelperStructureIRNode.cs | 33 ---- .../Intermediate/RazorIRNodeVisitor.cs | 7 +- ...elpersIRNode.cs => TagHelperBodyIRNode.cs} | 4 +- .../Intermediate/TagHelperIRNode.cs | 4 + .../InstrumentationPassTest.cs | 73 +------ ...ModelExpressionTagHelper_DesignTime.ir.txt | 10 +- ...odelExpressionTagHelper_Runtime.codegen.cs | 4 +- .../ModelExpressionTagHelper_Runtime.ir.txt | 26 ++- .../RazorPagesWithoutModel_DesignTime.ir.txt | 25 +-- .../RazorPagesWithoutModel_Runtime.codegen.cs | 10 +- .../RazorPagesWithoutModel_Runtime.ir.txt | 65 +++--- .../RazorPages_DesignTime.ir.txt | 25 +-- .../RazorPages_Runtime.codegen.cs | 10 +- .../RazorPages_Runtime.ir.txt | 65 +++--- .../BasicTest.codegen.cs | 4 +- .../BasicTest.ir.txt | 26 ++- .../RuntimeTagHelperWriterTest.cs | 22 ++- ...aultRazorIRLoweringPhaseIntegrationTest.cs | 129 ++++++------ ...ibuteTargetingTagHelpers_DesignTime.ir.txt | 20 +- ...ttributeTargetingTagHelpers_Runtime.ir.txt | 20 +- .../BasicTagHelpers_DesignTime.ir.txt | 20 +- ...BasicTagHelpers_Prefixed_DesignTime.ir.txt | 10 +- .../BasicTagHelpers_Prefixed_Runtime.ir.txt | 10 +- ...cTagHelpers_RemoveTagHelper_Runtime.ir.txt | 20 +- .../BasicTagHelpers_Runtime.ir.txt | 20 +- .../ComplexTagHelpers_DesignTime.ir.txt | 90 ++++----- .../ComplexTagHelpers_Runtime.ir.txt | 90 ++++----- ...SelectorTagHelperAttributes_Runtime.ir.txt | 50 ++--- ...icateAttributeTagHelpers_DesignTime.ir.txt | 20 +- ...uplicateAttributeTagHelpers_Runtime.ir.txt | 20 +- ...namicAttributeTagHelpers_DesignTime.ir.txt | 30 ++- .../DynamicAttributeTagHelpers_Runtime.ir.txt | 30 ++- ...EmptyAttributeTagHelpers_DesignTime.ir.txt | 15 +- .../EmptyAttributeTagHelpers_Runtime.ir.txt | 15 +- .../EnumTagHelpers_DesignTime.ir.txt | 25 +-- .../EnumTagHelpers_Runtime.ir.txt | 25 +-- .../EscapedTagHelpers_DesignTime.ir.txt | 5 +- .../EscapedTagHelpers_Runtime.ir.txt | 5 +- .../IncompleteTagHelper_DesignTime.ir.txt | 5 +- .../IncompleteTagHelper_Runtime.ir.txt | 5 +- .../MinimizedTagHelpers_DesignTime.ir.txt | 25 +-- .../MinimizedTagHelpers_Runtime.ir.txt | 25 +-- ...estedScriptTagTagHelpers_DesignTime.ir.txt | 10 +- .../NestedScriptTagTagHelpers_Runtime.ir.txt | 10 +- .../NestedTagHelpers_DesignTime.ir.txt | 15 +- .../NestedTagHelpers_Runtime.ir.txt | 15 +- ...fixedAttributeTagHelpers_DesignTime.ir.txt | 20 +- ...PrefixedAttributeTagHelpers_Runtime.ir.txt | 20 +- .../SimpleTagHelpers_DesignTime.ir.txt | 5 +- .../SimpleTagHelpers_Runtime.ir.txt | 5 +- ...hNewlineBeforeAttributes_DesignTime.ir.txt | 5 +- ...WithNewlineBeforeAttributes_Runtime.ir.txt | 5 +- .../SingleTagHelper_DesignTime.ir.txt | 5 +- .../SingleTagHelper_Runtime.ir.txt | 5 +- .../SymbolBoundAttributes_DesignTime.ir.txt | 35 ++-- .../SymbolBoundAttributes_Runtime.ir.txt | 35 ++-- .../TagHelpersInSection_Runtime.ir.txt | 10 +- ...lpersWithBoundAttributes_DesignTime.ir.txt | 5 +- ...gHelpersWithBoundAttributes_Runtime.ir.txt | 5 +- .../TagHelpersWithPrefix_DesignTime.ir.txt | 5 +- .../TagHelpersWithPrefix_Runtime.ir.txt | 5 +- .../TagHelpersWithTemplate_DesignTime.ir.txt | 15 +- .../TagHelpersWithTemplate_Runtime.ir.txt | 15 +- ...hWeirdlySpacedAttributes_DesignTime.ir.txt | 20 +- ...WithWeirdlySpacedAttributes_Runtime.ir.txt | 20 +- ...onsInTagHelperAttributes_DesignTime.ir.txt | 30 ++- ...itionsInTagHelperAttributes_Runtime.ir.txt | 30 ++- .../NestedTagHelpers.ir.txt | 15 +- .../SimpleTagHelpers.ir.txt | 5 +- .../TagHelpersWithBoundAttributes.ir.txt | 5 +- .../IntegrationTests/RazorIRNodeWriter.cs | 2 +- .../Langauge/Intermediate/RazorIRAssert.cs | 12 +- 79 files changed, 736 insertions(+), 1054 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.Razor.Language/Intermediate/InitializeTagHelperStructureIRNode.cs rename src/Microsoft.AspNetCore.Razor.Language/Intermediate/{ExecuteTagHelpersIRNode.cs => TagHelperBodyIRNode.cs} (87%) diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InstrumentationPass.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InstrumentationPass.cs index 10e59547a7..cdaf2cb082 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InstrumentationPass.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InstrumentationPass.cs @@ -101,14 +101,11 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions VisitDefault(node); } - public override void VisitExecuteTagHelpers(ExecuteTagHelpersIRNode node) + public override void VisitTagHelper(TagHelperIRNode node) { - // As a special case the TagHelperIRNode (which must be the parent) is the one that carries - // the location. The execute node won't have one, but the instrumentation goes around the call - // to execute. - if (node.Parent is TagHelperIRNode && node.Parent.Source != null) + if (node.Source != null) { - Items.Add(new InstrumentationItem(node, isLiteral: false, source: node.Parent.Source.Value)); + Items.Add(new InstrumentationItem(node, isLiteral: false, source: node.Source.Value)); } VisitDefault(node); diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs index 40f12281a7..8b119c0c34 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DefaultDocumentWriter.cs @@ -226,15 +226,21 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration public override void VisitTagHelper(TagHelperIRNode node) { - using (Context.Push(new TagHelperRenderingContext())) + var tagHelperRenderingContext = new TagHelperRenderingContext() { - Context.RenderChildren(node); + TagName = node.TagName, + TagMode = node.TagMode + }; + + using (Context.Push(tagHelperRenderingContext)) + { + Context.TagHelperWriter.WriteTagHelper(Context, node); } } - public override void VisitInitializeTagHelperStructure(InitializeTagHelperStructureIRNode node) + public override void VisitTagHelperBody(TagHelperBodyIRNode node) { - Context.TagHelperWriter.WriteInitializeTagHelperStructure(Context, node); + Context.TagHelperWriter.WriteTagHelperBody(Context, node); } public override void VisitCreateTagHelper(CreateTagHelperIRNode node) @@ -252,11 +258,6 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration Context.TagHelperWriter.WriteSetTagHelperProperty(Context, node); } - public override void VisitExecuteTagHelpers(ExecuteTagHelpersIRNode node) - { - Context.TagHelperWriter.WriteExecuteTagHelpers(Context, node); - } - public override void VisitDefault(RazorIRNode node) { Context.RenderChildren(node); diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs index 3eeda1ddf7..83885b9a28 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/DesignTimeTagHelperWriter.cs @@ -28,7 +28,12 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration } } - public override void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIRNode node) + public override void WriteTagHelper(CSharpRenderingContext context, TagHelperIRNode node) + { + context.RenderChildren(node); + } + + public override void WriteTagHelperBody(CSharpRenderingContext context, TagHelperBodyIRNode node) { context.RenderChildren(node); } @@ -45,12 +50,7 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration .WriteEndMethodInvocation(); } - public override void WriteExecuteTagHelpers(CSharpRenderingContext context, ExecuteTagHelpersIRNode node) - { - // Do nothing - } - - public override void WriteInitializeTagHelperStructure(CSharpRenderingContext context, InitializeTagHelperStructureIRNode node) + public override void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIRNode node) { context.RenderChildren(node); } diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs index 354f38fc94..c90a2f0db1 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/RuntimeTagHelperWriter.cs @@ -50,6 +50,8 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration public string TagModeTypeName { get; set; } = "global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode"; + public string HtmlAttributeValueStyleTypeName { get; set; } = "global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle"; + public string CreateTagHelperMethodName { get; set; } = "CreateTagHelper"; public string TagHelperOutputIsContentModifiedPropertyName { get; set; } = "IsContentModified"; @@ -145,9 +147,101 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration } } + public override void WriteTagHelper(CSharpRenderingContext context, TagHelperIRNode node) + { + context.RenderChildren(node); + + // Execute tag helpers + context.Writer + .Write("await ") + .WriteStartInstanceMethodInvocation( + RunnerVariableName, + RunnerRunAsyncMethodName) + .Write(ExecutionContextVariableName) + .WriteEndMethodInvocation(); + + var tagHelperOutputAccessor = $"{ExecutionContextVariableName}.{ExecutionContextOutputPropertyName}"; + + context.Writer + .Write("if (!") + .Write(tagHelperOutputAccessor) + .Write(".") + .Write(TagHelperOutputIsContentModifiedPropertyName) + .WriteLine(")"); + + using (context.Writer.BuildScope()) + { + context.Writer + .Write("await ") + .WriteInstanceMethodInvocation( + ExecutionContextVariableName, + ExecutionContextSetOutputContentAsyncMethodName); + } + + context.Writer + .WriteStartMethodInvocation(WriteTagHelperOutputMethod) + .Write(tagHelperOutputAccessor) + .WriteEndMethodInvocation() + .WriteStartAssignment(ExecutionContextVariableName) + .WriteInstanceMethodInvocation( + ScopeManagerVariableName, + ScopeManagerEndMethodName); + } + + public override void WriteTagHelperBody(CSharpRenderingContext context, TagHelperBodyIRNode node) + { + // Call into the tag helper scope manager to start a new tag helper scope. + // Also capture the value as the current execution context. + context.Writer + .WriteStartAssignment(ExecutionContextVariableName) + .WriteStartInstanceMethodInvocation( + ScopeManagerVariableName, + ScopeManagerBeginMethodName); + + // Assign a unique ID for this instance of the source HTML tag. This must be unique + // per call site, e.g. if the tag is on the view twice, there should be two IDs. + context.Writer.WriteStringLiteral(context.TagHelperRenderingContext.TagName) + .WriteParameterSeparator() + .Write(TagModeTypeName) + .Write(".") + .Write(context.TagHelperRenderingContext.TagMode.ToString()) + .WriteParameterSeparator() + .WriteStringLiteral(context.IdGenerator()) + .WriteParameterSeparator(); + + // We remove and redirect writers so TagHelper authors can retrieve content. + using (context.Push(new RuntimeBasicWriter())) + using (context.Push(new RuntimeTagHelperWriter())) + { + using (context.Writer.BuildAsyncLambda(endLine: false)) + { + context.RenderChildren(node); + } + } + + context.Writer.WriteEndMethodInvocation(); + } + + public override void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIRNode node) + { + var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); + + context.Writer + .WriteStartAssignment(tagHelperVariableName) + .WriteStartMethodInvocation( + CreateTagHelperMethodName, + "global::" + node.TagHelperTypeName) + .WriteEndMethodInvocation(); + + context.Writer.WriteInstanceMethodInvocation( + ExecutionContextVariableName, + ExecutionContextAddMethodName, + tagHelperVariableName); + } + public override void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIRNode node) { - var attributeValueStyleParameter = $"global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.{node.ValueStyle}"; + var attributeValueStyleParameter = $"{HtmlAttributeValueStyleTypeName}.{node.ValueStyle}"; var isConditionalAttributeValue = node.Children.Any(child => child is CSharpAttributeValueIRNode); // All simple text and minimized attributes will be pre-allocated. @@ -217,95 +311,6 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration } } - public override void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIRNode node) - { - 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) - { - context.Writer - .Write("await ") - .WriteStartInstanceMethodInvocation( - RunnerVariableName, - RunnerRunAsyncMethodName) - .Write(ExecutionContextVariableName) - .WriteEndMethodInvocation(); - - var tagHelperOutputAccessor = $"{ExecutionContextVariableName}.{ExecutionContextOutputPropertyName}"; - - context.Writer - .Write("if (!") - .Write(tagHelperOutputAccessor) - .Write(".") - .Write(TagHelperOutputIsContentModifiedPropertyName) - .WriteLine(")"); - - using (context.Writer.BuildScope()) - { - context.Writer - .Write("await ") - .WriteInstanceMethodInvocation( - ExecutionContextVariableName, - ExecutionContextSetOutputContentAsyncMethodName); - } - - context.Writer - .WriteStartMethodInvocation(WriteTagHelperOutputMethod) - .Write(tagHelperOutputAccessor) - .WriteEndMethodInvocation() - .WriteStartAssignment(ExecutionContextVariableName) - .WriteInstanceMethodInvocation( - ScopeManagerVariableName, - ScopeManagerEndMethodName); - } - - public override void WriteInitializeTagHelperStructure(CSharpRenderingContext context, InitializeTagHelperStructureIRNode node) - { - // Call into the tag helper scope manager to start a new tag helper scope. - // Also capture the value as the current execution context. - context.Writer - .WriteStartAssignment(ExecutionContextVariableName) - .WriteStartInstanceMethodInvocation( - ScopeManagerVariableName, - ScopeManagerBeginMethodName); - - // Assign a unique ID for this instance of the source HTML tag. This must be unique - // per call site, e.g. if the tag is on the view twice, there should be two IDs. - context.Writer.WriteStringLiteral(node.TagName) - .WriteParameterSeparator() - .Write(TagModeTypeName) - .Write(".") - .Write(node.TagMode.ToString()) - .WriteParameterSeparator() - .WriteStringLiteral(context.IdGenerator()) - .WriteParameterSeparator(); - - // We remove and redirect writers so TagHelper authors can retrieve content. - using (context.Push(new RuntimeBasicWriter())) - using (context.Push(new RuntimeTagHelperWriter())) - { - using (context.Writer.BuildAsyncLambda(endLine: false)) - { - context.RenderChildren(node); - } - } - - context.Writer.WriteEndMethodInvocation(); - } - public override void WriteSetTagHelperProperty(CSharpRenderingContext context, SetTagHelperPropertyIRNode node) { var tagHelperVariableName = GetTagHelperVariableName(node.TagHelperTypeName); diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperRenderingContext.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperRenderingContext.cs index a8cbe5c96c..97e38631ea 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperRenderingContext.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperRenderingContext.cs @@ -11,6 +11,10 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration private Dictionary _renderedBoundAttributes; private HashSet _verifiedPropertyDictionaries; + public string TagName { get; set; } + + public TagMode TagMode { get; set; } + public Dictionary RenderedBoundAttributes { get diff --git a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs index c485635c2e..9453f37681 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/CodeGeneration/TagHelperWriter.cs @@ -9,14 +9,14 @@ namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { public abstract void WriteDeclareTagHelperFields(CSharpRenderingContext context, DeclareTagHelperFieldsIRNode node); - public abstract void WriteInitializeTagHelperStructure(CSharpRenderingContext context, InitializeTagHelperStructureIRNode node); + public abstract void WriteTagHelper(CSharpRenderingContext context, TagHelperIRNode node); - public abstract void WriteSetTagHelperProperty(CSharpRenderingContext context, SetTagHelperPropertyIRNode node); - - public abstract void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIRNode node); + public abstract void WriteTagHelperBody(CSharpRenderingContext context, TagHelperBodyIRNode node); public abstract void WriteCreateTagHelper(CSharpRenderingContext context, CreateTagHelperIRNode node); - public abstract void WriteExecuteTagHelpers(CSharpRenderingContext context, ExecuteTagHelpersIRNode node); + public abstract void WriteAddTagHelperHtmlAttribute(CSharpRenderingContext context, AddTagHelperHtmlAttributeIRNode node); + + public abstract void WriteSetTagHelperProperty(CSharpRenderingContext context, SetTagHelperPropertyIRNode node); } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIRLoweringPhase.cs b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIRLoweringPhase.cs index 38d21b575f..f6e97ebec8 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIRLoweringPhase.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/DefaultRazorIRLoweringPhase.cs @@ -472,30 +472,27 @@ namespace Microsoft.AspNetCore.Razor.Language DeclareTagHelperFields(tagHelperBlock); - _builder.Push(new TagHelperIRNode() - { - Source = BuildSourceSpanFromNode(block) - }); - var tagName = tagHelperBlock.TagName; if (_tagHelperPrefix != null) { tagName = tagName.Substring(_tagHelperPrefix.Length); } - _builder.Push(new InitializeTagHelperStructureIRNode() + _builder.Push(new TagHelperIRNode() { TagName = tagName, - TagMode = tagHelperBlock.TagMode + TagMode = tagHelperBlock.TagMode, + Source = BuildSourceSpanFromNode(block) }); + _builder.Push(new TagHelperBodyIRNode()); + VisitDefault(block); _builder.Pop(); // Pop InitializeTagHelperStructureIRNode AddTagHelperCreation(tagHelperBlock.Binding); AddTagHelperAttributes(tagHelperBlock.Attributes, tagHelperBlock.Binding); - AddExecuteTagHelpers(); _builder.Pop(); // Pop TagHelperIRNode } @@ -614,11 +611,6 @@ namespace Microsoft.AspNetCore.Razor.Language } } } - - private void AddExecuteTagHelpers() - { - _builder.Add(new ExecuteTagHelpersIRNode()); - } } } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/InitializeTagHelperStructureIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/InitializeTagHelperStructureIRNode.cs deleted file mode 100644 index 403367ec20..0000000000 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/InitializeTagHelperStructureIRNode.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNetCore.Razor.Language.Intermediate -{ - public sealed class InitializeTagHelperStructureIRNode : RazorIRNode - { - public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - - public override IList Children { get; } = new List(); - - public override RazorIRNode Parent { get; set; } - - public override SourceSpan? Source { get; set; } - - public string TagName { get; set; } - - internal TagMode TagMode { get; set; } - - public override void Accept(RazorIRNodeVisitor visitor) - { - if (visitor == null) - { - throw new ArgumentNullException(nameof(visitor)); - } - - visitor.VisitInitializeTagHelperStructure(this); - } - } -} diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeVisitor.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeVisitor.cs index 922f05415b..33cec8b2b1 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeVisitor.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeVisitor.cs @@ -114,7 +114,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate VisitDefault(node); } - public virtual void VisitInitializeTagHelperStructure(InitializeTagHelperStructureIRNode node) + public virtual void VisitTagHelperBody(TagHelperBodyIRNode node) { VisitDefault(node); } @@ -133,10 +133,5 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { VisitDefault(node); } - - public virtual void VisitExecuteTagHelpers(ExecuteTagHelpersIRNode node) - { - VisitDefault(node); - } } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ExecuteTagHelpersIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperBodyIRNode.cs similarity index 87% rename from src/Microsoft.AspNetCore.Razor.Language/Intermediate/ExecuteTagHelpersIRNode.cs rename to src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperBodyIRNode.cs index d25c1eb2bc..bd8f16dfc4 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ExecuteTagHelpersIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperBodyIRNode.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Microsoft.AspNetCore.Razor.Language.Intermediate { - public sealed class ExecuteTagHelpersIRNode : RazorIRNode + public sealed class TagHelperBodyIRNode : RazorIRNode { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate throw new ArgumentNullException(nameof(visitor)); } - visitor.VisitExecuteTagHelpers(this); + visitor.VisitTagHelperBody(this); } } } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs index 894534ac6b..07caec05d1 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs @@ -29,6 +29,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate public override SourceSpan? Source { get; set; } + public string TagName { get; set; } + + public TagMode TagMode { get; set; } + public override void Accept(RazorIRNodeVisitor visitor) { if (visitor == null) diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InstrumentationPassTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InstrumentationPassTest.cs index f162afaffd..96fcbd57a4 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InstrumentationPassTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/InstrumentationPassTest.cs @@ -138,10 +138,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions // Arrange var document = new DocumentIRNode(); var builder = RazorIRBuilder.Create(document); - builder.Push(new TagHelperIRNode() - { - Source = CreateSource(3) - }); + builder.Push(new TagHelperIRNode()); builder.Push(new AddTagHelperHtmlAttributeIRNode()); @@ -188,10 +185,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions // Arrange var document = new DocumentIRNode(); var builder = RazorIRBuilder.Create(document); - builder.Push(new TagHelperIRNode() - { - Source = CreateSource(3) - }); + builder.Push(new TagHelperIRNode()); builder.Push(new SetTagHelperPropertyIRNode()); @@ -233,18 +227,16 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions } [Fact] - public void InstrumentationPass_InstrumentsExecuteTagHelper_InsideTagHelper() + public void InstrumentationPass_InstrumentsTagHelper() { // Arrange var document = new DocumentIRNode(); var builder = RazorIRBuilder.Create(document); - builder.Push(new TagHelperIRNode() + builder.Add(new TagHelperIRNode() { Source = CreateSource(3), }); - builder.Add(new ExecuteTagHelpersIRNode()); - var pass = new InstrumentationPass() { Engine = RazorEngine.CreateEmpty(b => { }), @@ -256,27 +248,19 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions // Assert Children( document, - n => - { - Assert.IsType(n); - Children( - n, - c => BeginInstrumentation("3, 3, false", c), - c => Assert.IsType(c), - c => EndInstrumentation(c)); - }); + n => BeginInstrumentation("3, 3, false", n), + n => Assert.IsType(n), + n => EndInstrumentation(n)); } [Fact] - public void InstrumentationPass_SkipsExecuteTagHelper_WithoutLocation() + public void InstrumentationPass_SkipsTagHelper_WithoutLocation() { // Arrange var document = new DocumentIRNode(); var builder = RazorIRBuilder.Create(document); builder.Push(new TagHelperIRNode()); - builder.Add(new ExecuteTagHelpersIRNode()); - var pass = new InstrumentationPass() { Engine = RazorEngine.CreateEmpty(b => { }), @@ -288,46 +272,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions // Assert Children( document, - n => - { - Assert.IsType(n); - Children( - n, - c => Assert.IsType(c)); - }); - } - - [Fact] - public void InstrumentationPass_SkipsExecuteTagHelper_MalformedTagHelper() - { - // Arrange - var document = new DocumentIRNode(); - var builder = RazorIRBuilder.Create(document); - builder.Push(new TagHelperIRNode() - { - Source = CreateSource(3), - }); - builder.Push(new CSharpExpressionIRNode()); - builder.Add(new ExecuteTagHelpersIRNode()); // Malformed - - var pass = new InstrumentationPass() - { - Engine = RazorEngine.CreateEmpty(b => { }), - }; - - // Act - pass.Execute(TestRazorCodeDocument.CreateEmpty(), document); - - // Assert - Children( - document, - n => - { - Assert.IsType(n); - Children( - n, - c => SingleChild(Assert.IsType(c))); - }); + n => Assert.IsType(n)); } private SourceSpan CreateSource(int number) diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_DesignTime.ir.txt b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_DesignTime.ir.txt index 80cec8c792..246db4459f 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_DesignTime.ir.txt +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_DesignTime.ir.txt @@ -34,8 +34,8 @@ Document - RazorIRToken - (17:1,0 [2] ModelExpressionTagHelper.cshtml) - Html - \n HtmlContent - (62:2,43 [4] ModelExpressionTagHelper.cshtml) RazorIRToken - (62:2,43 [4] ModelExpressionTagHelper.cshtml) - Html - \n\n - TagHelper - (66:4,0 [25] ModelExpressionTagHelper.cshtml) - InitializeTagHelperStructure - - input-test - TagMode.SelfClosing + TagHelper - (66:4,0 [25] ModelExpressionTagHelper.cshtml) - input-test - TagMode.SelfClosing + TagHelperBody - CreateTagHelper - - InputTestTagHelper SetTagHelperProperty - (83:4,17 [4] ModelExpressionTagHelper.cshtml) - for - For - HtmlAttributeValueStyle.DoubleQuotes CSharpExpression - @@ -43,18 +43,16 @@ Document - RazorIRToken - - CSharp - __model. RazorIRToken - (83:4,17 [4] ModelExpressionTagHelper.cshtml) - CSharp - Date RazorIRToken - - CSharp - ) - ExecuteTagHelpers - HtmlContent - (91:4,25 [2] ModelExpressionTagHelper.cshtml) RazorIRToken - (91:4,25 [2] ModelExpressionTagHelper.cshtml) - Html - \n - TagHelper - (93:5,0 [27] ModelExpressionTagHelper.cshtml) - InitializeTagHelperStructure - - input-test - TagMode.SelfClosing + TagHelper - (93:5,0 [27] ModelExpressionTagHelper.cshtml) - input-test - TagMode.SelfClosing + TagHelperBody - CreateTagHelper - - InputTestTagHelper SetTagHelperProperty - (110:5,17 [6] ModelExpressionTagHelper.cshtml) - for - For - HtmlAttributeValueStyle.DoubleQuotes CSharpExpression - RazorIRToken - - CSharp - ModelExpressionProvider.CreateModelExpression(ViewData, __model => RazorIRToken - (111:5,18 [5] ModelExpressionTagHelper.cshtml) - CSharp - Model RazorIRToken - - CSharp - ) - ExecuteTagHelpers - HtmlContent - (120:5,27 [2] ModelExpressionTagHelper.cshtml) RazorIRToken - (120:5,27 [2] ModelExpressionTagHelper.cshtml) - Html - \n InjectDirective - diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.codegen.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.codegen.cs index 853f469d4b..d7fd4d17f5 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.codegen.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.codegen.cs @@ -39,6 +39,7 @@ namespace AspNetCore BeginContext(64, 2, true); WriteLiteral("\r\n"); EndContext(); + BeginContext(66, 25, false); __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input-test", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.SelfClosing, "test", async() => { } ); @@ -50,7 +51,6 @@ __InputTestTagHelper.For = ModelExpressionProvider.CreateModelExpression(ViewDat #line default #line hidden __tagHelperExecutionContext.AddTagHelperAttribute("for", __InputTestTagHelper.For, global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes); - BeginContext(66, 25, false); await __tagHelperRunner.RunAsync(__tagHelperExecutionContext); if (!__tagHelperExecutionContext.Output.IsContentModified) { @@ -62,6 +62,7 @@ __InputTestTagHelper.For = ModelExpressionProvider.CreateModelExpression(ViewDat BeginContext(91, 2, true); WriteLiteral("\r\n"); EndContext(); + BeginContext(93, 27, false); __tagHelperExecutionContext = __tagHelperScopeManager.Begin("input-test", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.SelfClosing, "test", async() => { } ); @@ -73,7 +74,6 @@ __InputTestTagHelper.For = ModelExpressionProvider.CreateModelExpression(ViewDat #line default #line hidden __tagHelperExecutionContext.AddTagHelperAttribute("for", __InputTestTagHelper.For, global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes); - BeginContext(93, 27, false); await __tagHelperRunner.RunAsync(__tagHelperExecutionContext); if (!__tagHelperExecutionContext.Output.IsContentModified) { diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.ir.txt b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.ir.txt index 880c2ed49d..4a37d48ded 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.ir.txt +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ModelExpressionTagHelper_Runtime.ir.txt @@ -23,8 +23,10 @@ Document - RazorIRToken - (64:3,0 [2] ModelExpressionTagHelper.cshtml) - Html - \n CSharpStatement - RazorIRToken - - CSharp - EndContext(); - TagHelper - (66:4,0 [25] ModelExpressionTagHelper.cshtml) - InitializeTagHelperStructure - - input-test - TagMode.SelfClosing + CSharpStatement - + RazorIRToken - - CSharp - BeginContext(66, 25, false); + TagHelper - (66:4,0 [25] ModelExpressionTagHelper.cshtml) - input-test - TagMode.SelfClosing + TagHelperBody - CreateTagHelper - - InputTestTagHelper SetTagHelperProperty - (83:4,17 [4] ModelExpressionTagHelper.cshtml) - for - For - HtmlAttributeValueStyle.DoubleQuotes CSharpExpression - @@ -32,30 +34,26 @@ Document - RazorIRToken - - CSharp - __model. RazorIRToken - (83:4,17 [4] ModelExpressionTagHelper.cshtml) - CSharp - Date RazorIRToken - - CSharp - ) - CSharpStatement - - RazorIRToken - - CSharp - BeginContext(66, 25, false); - ExecuteTagHelpers - - CSharpStatement - - RazorIRToken - - CSharp - EndContext(); + CSharpStatement - + RazorIRToken - - CSharp - EndContext(); CSharpStatement - RazorIRToken - - CSharp - BeginContext(91, 2, true); HtmlContent - (91:4,25 [2] ModelExpressionTagHelper.cshtml) RazorIRToken - (91:4,25 [2] ModelExpressionTagHelper.cshtml) - Html - \n CSharpStatement - RazorIRToken - - CSharp - EndContext(); - TagHelper - (93:5,0 [27] ModelExpressionTagHelper.cshtml) - InitializeTagHelperStructure - - input-test - TagMode.SelfClosing + CSharpStatement - + RazorIRToken - - CSharp - BeginContext(93, 27, false); + TagHelper - (93:5,0 [27] ModelExpressionTagHelper.cshtml) - input-test - TagMode.SelfClosing + TagHelperBody - CreateTagHelper - - InputTestTagHelper SetTagHelperProperty - (110:5,17 [6] ModelExpressionTagHelper.cshtml) - for - For - HtmlAttributeValueStyle.DoubleQuotes CSharpExpression - RazorIRToken - - CSharp - ModelExpressionProvider.CreateModelExpression(ViewData, __model => RazorIRToken - (111:5,18 [5] ModelExpressionTagHelper.cshtml) - CSharp - Model RazorIRToken - - CSharp - ) - CSharpStatement - - RazorIRToken - - CSharp - BeginContext(93, 27, false); - ExecuteTagHelpers - - CSharpStatement - - RazorIRToken - - CSharp - EndContext(); + CSharpStatement - + RazorIRToken - - CSharp - EndContext(); CSharpStatement - RazorIRToken - - CSharp - BeginContext(120, 2, true); HtmlContent - (120:5,27 [2] ModelExpressionTagHelper.cshtml) diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/RazorPagesWithoutModel_DesignTime.ir.txt b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/RazorPagesWithoutModel_DesignTime.ir.txt index b9ee6f0d75..528500dd15 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/RazorPagesWithoutModel_DesignTime.ir.txt +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/RazorPagesWithoutModel_DesignTime.ir.txt @@ -47,17 +47,16 @@ Document - RazorIRToken - (425:21,19 [24] RazorPagesWithoutModel.cshtml) - Html - class="form-horizontal" RazorIRToken - (449:21,43 [1] RazorPagesWithoutModel.cshtml) - Html - > RazorIRToken - (450:21,44 [6] RazorPagesWithoutModel.cshtml) - Html - \n - TagHelper - (456:22,4 [31] RazorPagesWithoutModel.cshtml) - InitializeTagHelperStructure - - div - TagMode.StartTagAndEndTag + TagHelper - (456:22,4 [31] RazorPagesWithoutModel.cshtml) - div - TagMode.StartTagAndEndTag + TagHelperBody - CreateTagHelper - - DivTagHelper AddTagHelperHtmlAttribute - - class - HtmlAttributeValueStyle.DoubleQuotes HtmlContent - (468:22,16 [11] RazorPagesWithoutModel.cshtml) RazorIRToken - (468:22,16 [11] RazorPagesWithoutModel.cshtml) - Html - text-danger - ExecuteTagHelpers - HtmlContent - (487:22,35 [6] RazorPagesWithoutModel.cshtml) RazorIRToken - (487:22,35 [6] RazorPagesWithoutModel.cshtml) - Html - \n - TagHelper - (493:23,4 [237] RazorPagesWithoutModel.cshtml) - InitializeTagHelperStructure - - div - TagMode.StartTagAndEndTag + TagHelper - (493:23,4 [237] RazorPagesWithoutModel.cshtml) - div - TagMode.StartTagAndEndTag + TagHelperBody - HtmlContent - (517:23,28 [48] RazorPagesWithoutModel.cshtml) RazorIRToken - (517:23,28 [10] RazorPagesWithoutModel.cshtml) - Html - \n RazorIRToken - (527:24,8 [6] RazorPagesWithoutModel.cshtml) - Html -