This commit is contained in:
Ajay Bhargav Baaskaran 2017-02-14 10:56:50 -08:00
parent eb820106e2
commit 38e1e7d14e
11 changed files with 35 additions and 80 deletions

View File

@ -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);
}
}
}
}
}
}

View File

@ -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;
}
}

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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();

View File

@ -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();

View File

@ -187,12 +187,12 @@ public class __Generated__TagCloudViewComponentTagHelper : Microsoft.AspNetCore.
// Assert
var tagHelper = FindTagHelperNode(irDocument);
Assert.Equal(expectedVCTHName, Assert.IsType<CreateTagHelperIRNode>(tagHelper.Children[1]).TagHelperTypeName);
Assert.IsType<AddPreallocatedTagHelperHtmlAttributeIRNode>(tagHelper.Children[2]);
Assert.IsType<AddTagHelperHtmlAttributeIRNode>(tagHelper.Children[2]);
var @class = FindClassNode(irDocument);
Assert.Equal(4, @class.Children.Count);
Assert.Equal(3, @class.Children.Count);
var vcthClass = Assert.IsType<CSharpStatementIRNode>(@class.Children[3]);
var vcthClass = Assert.IsType<CSharpStatementIRNode>(@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;
}