diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitor.cs b/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitor.cs index 263f4341bd..318cddcb1a 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitor.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitor.cs @@ -19,6 +19,11 @@ namespace Microsoft.AspNetCore.Razor.Evolution.Intermediate VisitDefault(node); } + public virtual void VisitToken(RazorIRToken node) + { + VisitDefault(node); + } + public virtual void VisitDirectiveToken(DirectiveTokenIRNode node) { VisitDefault(node); diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitorOfT.cs b/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitorOfT.cs index b8f9a6d33b..7585a82ae9 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitorOfT.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRNodeVisitorOfT.cs @@ -20,6 +20,11 @@ namespace Microsoft.AspNetCore.Razor.Evolution.Intermediate return VisitDefault(node); } + public virtual TResult VisitToken(RazorIRToken node) + { + return VisitDefault(node); + } + public virtual TResult VisitDirectiveToken(DirectiveTokenIRNode node) { return VisitDefault(node); diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRToken.cs b/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRToken.cs new file mode 100644 index 0000000000..fe8e299b04 --- /dev/null +++ b/src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRToken.cs @@ -0,0 +1,54 @@ +// 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.Evolution.Intermediate +{ + public sealed class RazorIRToken : RazorIRNode + { + public override IList Children => RazorIRNode.EmptyArray; + + public string Content { get; set; } + + public bool IsCSharp => Kind == TokenKind.CSharp; + + public bool IsHtml => Kind == TokenKind.Html; + + public TokenKind Kind { get; set; } = TokenKind.Unknown; + + public override RazorIRNode Parent { get; set; } + + public override SourceSpan? Source { get; set; } + + public override void Accept(RazorIRNodeVisitor visitor) + { + if (visitor == null) + { + throw new ArgumentNullException(nameof(visitor)); + } + + visitor.VisitToken(this); + } + + public override TResult Accept(RazorIRNodeVisitor visitor) + { + if (visitor == null) + { + throw new ArgumentNullException(nameof(visitor)); + } + + return visitor.VisitToken(this); + } + + public enum TokenKind + { + Unknown, + CSharp, + Html, + } + } +} + + diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/IntegrationTests/RazorIRNodeWriter.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/IntegrationTests/RazorIRNodeWriter.cs index 38cab4d11f..356e9c8e5b 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/IntegrationTests/RazorIRNodeWriter.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/IntegrationTests/RazorIRNodeWriter.cs @@ -47,6 +47,11 @@ namespace Microsoft.AspNetCore.Razor.Evolution.IntegrationTests WriteContentNode(node, node.Content); } + public override void VisitToken(RazorIRToken node) + { + WriteContentNode(node, node.Kind.ToString(), node.Content); + } + public override void VisitDirective(DirectiveIRNode node) { WriteContentNode(node, node.Name);