aspnetcore/src/Microsoft.AspNetCore.Razor..../Extensions/DesignTimeDirectivePass.cs

76 lines
2.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.Extensions
{
internal class DesignTimeDirectivePass : IntermediateNodePassBase, IRazorDirectiveClassifierPass
{
internal const string DesignTimeVariable = "__o";
// This needs to run after other directive classifiers. Any DirectiveToken that is not removed
// by the previous classifiers will have auto-generated design time support.
public override int Order => DefaultFeatureOrder;
protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode)
{
var walker = new DesignTimeHelperWalker();
walker.VisitDocument(documentNode);
}
internal class DesignTimeHelperWalker : IntermediateNodeWalker
{
private DesignTimeDirectiveIntermediateNode _directiveNode;
public override void VisitClassDeclaration(ClassDeclarationIntermediateNode node)
{
node.Children.Insert(0, new CSharpCodeIntermediateNode()
{
Children =
{
new IntermediateToken()
{
Kind = TokenKind.CSharp,
Content = "#pragma warning disable 0414",
}
}
});
node.Children.Insert(1, new CSharpCodeIntermediateNode()
{
Children =
{
new IntermediateToken()
{
Kind = TokenKind.CSharp,
Content = $"private static {typeof(object).FullName} {DesignTimeVariable} = null;",
}
}
});
node.Children.Insert(2, new CSharpCodeIntermediateNode()
{
Children =
{
new IntermediateToken()
{
Kind = TokenKind.CSharp,
Content = "#pragma warning restore 0414",
}
}
});
_directiveNode = new DesignTimeDirectiveIntermediateNode();
VisitDefault(node);
node.Children.Insert(0, _directiveNode);
}
public override void VisitDirectiveToken(DirectiveTokenIntermediateNode node)
{
_directiveNode.Children.Add(node);
}
}
}
}