diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Host/InjectDirective.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Host/InjectDirective.cs index 986e5eb191..ec0f4650b5 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Host/InjectDirective.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Host/InjectDirective.cs @@ -20,13 +20,9 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host return builder; } - internal class Pass : IRazorIRPass + internal class Pass : RazorIRPassBase, IRazorDirectiveClassifierPass { - public RazorEngine Engine { get; set; } - - public int Order => RazorIRPass.DirectiveClassifierOrder; - - public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument) + public override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIRNode irDocument) { var visitor = new Visitor(); visitor.Visit(irDocument); @@ -62,8 +58,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host visitor.Class.Children.Add(member); } - - return irDocument; } } @@ -89,7 +83,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host { Directives.Add(node); } - } } } + } } diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelDirective.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelDirective.cs index 82d8d172ce..0516f026d3 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelDirective.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelDirective.cs @@ -56,14 +56,12 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host } } - internal class Pass : IRazorIRPass + internal class Pass : RazorIRPassBase, IRazorDirectiveClassifierPass { - public RazorEngine Engine { get; set; } - // Runs after the @inherits directive - public int Order => RazorIRPass.DirectiveClassifierOrder + 5; + public override int Order => 5; - public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument) + public override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIRNode irDocument) { var visitor = new Visitor(); var modelType = GetModelType(irDocument, visitor); @@ -82,7 +80,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host } visitor.Class.BaseType = baseType; - return irDocument; } } diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelExpressionPass.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelExpressionPass.cs index ef8c93b678..e1267892ad 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelExpressionPass.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Host/ModelExpressionPass.cs @@ -8,18 +8,12 @@ using Microsoft.AspNetCore.Razor.Evolution.Intermediate; namespace Microsoft.AspNetCore.Mvc.Razor.Host { - public class ModelExpressionPass : IRazorIRPass + public class ModelExpressionPass : RazorIRPassBase, IRazorIROptimizationPass { - public RazorEngine Engine { get; set; } - - public int Order => RazorIRPass.LoweringOrder; - - public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument) + public override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIRNode irDocument) { var visitor = new Visitor(); visitor.Visit(irDocument); - - return irDocument; } private class Visitor : RazorIRNodeWalker diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Host/PagesPropertyInjectionPass.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Host/PagesPropertyInjectionPass.cs index e6a8867b9e..939fad1e88 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Host/PagesPropertyInjectionPass.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Host/PagesPropertyInjectionPass.cs @@ -6,17 +6,13 @@ using Microsoft.AspNetCore.Razor.Evolution.Intermediate; namespace Microsoft.AspNetCore.Mvc.Razor.Host { - public class PagesPropertyInjectionPass : IRazorIRPass + public class PagesPropertyInjectionPass : RazorIRPassBase, IRazorIROptimizationPass { - public RazorEngine Engine { get; set; } - - public int Order => RazorIRPass.LoweringOrder; - - public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument) + public override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIRNode irDocument) { if (irDocument.DocumentKind != RazorPageDocumentClassifierPass.RazorPageDocumentKind) { - return irDocument; + return; } var modelType = ModelDirective.GetModelType(irDocument); @@ -39,8 +35,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host @class.Children.Add(vddProperty); @class.Children.Add(modelProperty); - - return irDocument; } private class Visitor : RazorIRNodeWalker diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Host/ViewComponentTagHelperPass.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Host/ViewComponentTagHelperPass.cs index 99d1269fd9..da7107c281 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Host/ViewComponentTagHelperPass.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Host/ViewComponentTagHelperPass.cs @@ -11,13 +11,9 @@ using Microsoft.AspNetCore.Razor.Evolution.Legacy; namespace Microsoft.AspNetCore.Mvc.Razor.Host { - public class ViewComponentTagHelperPass : IRazorIRPass + public class ViewComponentTagHelperPass : RazorIRPassBase, IRazorIROptimizationPass { - public RazorEngine Engine { get; set; } - - public int Order => RazorIRPass.LoweringOrder; - - public DocumentIRNode Execute(RazorCodeDocument codeDocument, DocumentIRNode irDocument) + public override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIRNode irDocument) { var visitor = new Visitor(); visitor.Visit(irDocument); @@ -25,7 +21,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host if (visitor.Class == null || visitor.TagHelpers.Count == 0) { // Nothing to do, bail. - return irDocument; + return; } foreach (var tagHelper in visitor.TagHelpers) @@ -42,8 +38,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host { RewriteCreateNode(visitor.Namespace, visitor.Class, createNode); } - - return irDocument; } private void GenerateVCTHClass(ClassDeclarationIRNode @class, TagHelperDescriptor tagHelper) diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/InjectDirectiveTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/InjectDirectiveTest.cs index 3053fb767b..6dc6561254 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/InjectDirectiveTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/InjectDirectiveTest.cs @@ -197,19 +197,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host // Notice we're not registering the InjectDirective.Pass here so we can run it on demand. b.AddDirective(InjectDirective.Directive); b.AddDirective(ModelDirective.Directive); - - // HACK - Remove the DefaultDirectiveIRPass so it can't remove our directives. - IRazorEngineFeature badFeature = null; - foreach (var feature in b.Features) - { - if (string.Equals("DefaultDirectiveIRPass", feature.GetType().Name, StringComparison.Ordinal)) - { - badFeature = feature; - break; - } - } - - b.Features.Remove(badFeature); }); } @@ -220,7 +207,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host var phase = engine.Phases[i]; phase.Execute(codeDocument); - if (phase is IRazorIRPhase) + if (phase is IRazorDocumentClassifierPhase) { break; } diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelDirectiveTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelDirectiveTest.cs index c547641050..2f1bf73845 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelDirectiveTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelDirectiveTest.cs @@ -180,19 +180,6 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host { // Notice we're not registering the ModelDirective.Pass here so we can run it on demand. b.AddDirective(ModelDirective.Directive); - - // HACK - Remove the DefaultDirectiveIRPass so it can't remove our directives. - IRazorEngineFeature badFeature = null; - foreach (var feature in b.Features) - { - if (string.Equals("DefaultDirectiveIRPass", feature.GetType().Name, StringComparison.Ordinal)) - { - badFeature = feature; - break; - } - } - - b.Features.Remove(badFeature); }); } @@ -203,7 +190,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host var phase = engine.Phases[i]; phase.Execute(codeDocument); - if (phase is IRazorIRPhase) + if (phase is IRazorDocumentClassifierPhase) { break; } diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelExpressionPassTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelExpressionPassTest.cs index ed245b4fa4..81190f6512 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelExpressionPassTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ModelExpressionPassTest.cs @@ -192,7 +192,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host var phase = engine.Phases[i]; phase.Execute(codeDocument); - if (phase is IRazorIRPhase) + if (phase is IRazorDirectiveClassifierPhase) { break; } diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/MvcViewDocumentClassifierPassTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/MvcViewDocumentClassifierPassTest.cs index 9598a90dd6..a13fc414cd 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/MvcViewDocumentClassifierPassTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/MvcViewDocumentClassifierPassTest.cs @@ -207,11 +207,15 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host private static DocumentIRNode CreateIRDocument(RazorEngine engine, RazorCodeDocument codeDocument) { - var phases = engine.Phases.TakeWhile(p => !(p is IRazorIRPhase)); - - foreach (var phase in phases) + for (var i = 0; i < engine.Phases.Count; i++) { + var phase = engine.Phases[i]; phase.Execute(codeDocument); + + if (phase is IRazorIRLoweringPhase) + { + break; + } } return codeDocument.GetIRDocument(); diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/RazorPageDocumentClassifierPassTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/RazorPageDocumentClassifierPassTest.cs index 9de9fb693a..62fbd0776e 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/RazorPageDocumentClassifierPassTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/RazorPageDocumentClassifierPassTest.cs @@ -233,11 +233,15 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Host private static DocumentIRNode CreateIRDocument(RazorEngine engine, RazorCodeDocument codeDocument) { - var phases = engine.Phases.TakeWhile(p => !(p is IRazorIRPhase)); - - foreach (var phase in phases) + for (var i = 0; i < engine.Phases.Count; i++) { + var phase = engine.Phases[i]; phase.Execute(codeDocument); + + if (phase is IRazorIRLoweringPhase) + { + break; + } } return codeDocument.GetIRDocument(); diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ViewComponentTagHelperPassTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ViewComponentTagHelperPassTest.cs index 66298712d3..6f3e875c69 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ViewComponentTagHelperPassTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Host.Test/ViewComponentTagHelperPassTest.cs @@ -187,12 +187,12 @@ public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore. // Assert var tagHelper = FindTagHelperNode(irDocument); Assert.Equal(expectedVCTHName, Assert.IsType(tagHelper.Children[1]).TagHelperTypeName); - Assert.IsType(tagHelper.Children[2]); + Assert.IsType(tagHelper.Children[2]); var @class = FindClassNode(irDocument); - Assert.Equal(4, @class.Children.Count); + Assert.Equal(3, @class.Children.Count); - var vcthClass = Assert.IsType(@class.Children[3]); + var vcthClass = Assert.IsType(@class.Children[2]); Assert.Equal(@"[Microsoft.AspNetCore.Razor.TagHelpers.HtmlTargetElementAttribute(""tagcloud"")] public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.Razor.TagHelpers.TagHelper { @@ -339,7 +339,7 @@ public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore. var phase = engine.Phases[i]; phase.Execute(codeDocument); - if (phase is IRazorIRPhase) + if (phase is IRazorDirectiveClassifierPhase) { break; }