From 965ae5490f4105fd934e0c6038f529fbe61ec118 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 17 Feb 2017 09:05:52 -0800 Subject: [PATCH] Introducing RazorIRToken This IR node will be part of the new token model for IR. It will be used by all nodes that contain user content. Going forward, tokens will be the thing that contains text and produces line mappings. This commit just introduces the class. --- .../Intermediate/RazorIRNodeVisitor.cs | 5 ++ .../Intermediate/RazorIRNodeVisitorOfT.cs | 5 ++ .../Intermediate/RazorIRToken.cs | 54 +++++++++++++++++++ .../IntegrationTests/RazorIRNodeWriter.cs | 5 ++ 4 files changed, 69 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Razor.Evolution/Intermediate/RazorIRToken.cs 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);