aspnetcore/src/Microsoft.AspNetCore.Razor..../RazorDesignTimeIRPass.cs

51 lines
1.8 KiB
C#

// 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 Microsoft.AspNetCore.Razor.Language.Intermediate;
namespace Microsoft.AspNetCore.Razor.Language
{
internal class RazorDesignTimeIRPass : RazorIRPassBase, IRazorDirectiveClassifierPass
{
internal const string DesignTimeVariable = "__o";
// This needs to run before other directive classifiers.
public override int Order => -10;
public override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIRNode irDocument)
{
var walker = new DesignTimeHelperWalker();
walker.VisitDocument(irDocument);
}
internal class DesignTimeHelperWalker : RazorIRNodeWalker
{
private DesignTimeDirectiveIRNode _designTimeDirectiveIRNode;
public override void VisitClass(ClassDeclarationIRNode node)
{
var designTimeHelperDeclaration = new CSharpStatementIRNode();
RazorIRBuilder.Create(designTimeHelperDeclaration)
.Add(new RazorIRToken()
{
Kind = RazorIRToken.TokenKind.CSharp,
Content = $"private static {typeof(object).FullName} {DesignTimeVariable} = null;"
});
node.Children.Insert(0, designTimeHelperDeclaration);
_designTimeDirectiveIRNode = new DesignTimeDirectiveIRNode();
VisitDefault(node);
node.Children.Insert(0, _designTimeDirectiveIRNode);
}
public override void VisitDirectiveToken(DirectiveTokenIRNode node)
{
_designTimeDirectiveIRNode.Children.Add(node);
}
}
}
}