Add annotations
Fixes #990. This should make a lot of IR manipulations very simple.
This commit is contained in:
parent
51fb1b787a
commit
eb3c47b6ca
|
|
@ -48,24 +48,14 @@ namespace Microsoft.AspNetCore.Razor.Language
|
||||||
var children = new List<RazorIRNode>(irDocument.Children);
|
var children = new List<RazorIRNode>(irDocument.Children);
|
||||||
irDocument.Children.Clear();
|
irDocument.Children.Clear();
|
||||||
|
|
||||||
var @namespace = new NamespaceDeclarationIRNode()
|
var @namespace = new NamespaceDeclarationIRNode();
|
||||||
{
|
@namespace.Annotations[CommonAnnotations.PrimaryNamespace] = CommonAnnotations.PrimaryNamespace;
|
||||||
//Content = "GeneratedNamespace",
|
|
||||||
};
|
|
||||||
|
|
||||||
var @class = new ClassDeclarationIRNode()
|
var @class = new ClassDeclarationIRNode();
|
||||||
{
|
@class.Annotations[CommonAnnotations.PrimaryClass] = CommonAnnotations.PrimaryClass;
|
||||||
//AccessModifier = "public",
|
|
||||||
//Name = "GeneratedClass",
|
|
||||||
};
|
|
||||||
|
|
||||||
var method = new RazorMethodDeclarationIRNode()
|
var method = new RazorMethodDeclarationIRNode();
|
||||||
{
|
method.Annotations[CommonAnnotations.PrimaryMethod] = CommonAnnotations.PrimaryMethod;
|
||||||
//AccessModifier = "public",
|
|
||||||
// Modifiers = new List<string>() { "async" },
|
|
||||||
//Name = "Execute",
|
|
||||||
//ReturnType = "Task",
|
|
||||||
};
|
|
||||||
|
|
||||||
var documentBuilder = RazorIRBuilder.Create(irDocument);
|
var documentBuilder = RazorIRBuilder.Create(irDocument);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class AddTagHelperHtmlAttributeIRNode : RazorIRNode
|
public class AddTagHelperHtmlAttributeIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class CSharpAttributeValueIRNode : RazorIRNode
|
public class CSharpAttributeValueIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class CSharpExpressionIRNode : RazorIRNode
|
public class CSharpExpressionIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class CSharpStatementIRNode : RazorIRNode
|
public class CSharpStatementIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class ChecksumIRNode : RazorIRNode
|
public class ChecksumIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children => EmptyArray;
|
public override IList<RazorIRNode> Children => EmptyArray;
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,20 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class ClassDeclarationIRNode : RazorIRNode
|
public class ClassDeclarationIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
{
|
||||||
|
internal static class CommonAnnotations
|
||||||
|
{
|
||||||
|
public static readonly object PrimaryClass = "PrimaryClass";
|
||||||
|
|
||||||
|
public static readonly object PrimaryMethod = "PrimaryMethod";
|
||||||
|
|
||||||
|
public static readonly object PrimaryNamespace = "PrimaryNamespace";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class CreateTagHelperIRNode : RazorIRNode
|
public class CreateTagHelperIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class DeclareTagHelperFieldsIRNode : RazorIRNode
|
public class DeclareTagHelperFieldsIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class DirectiveIRNode : RazorIRNode
|
public class DirectiveIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class DirectiveTokenIRNode : RazorIRNode
|
public class DirectiveTokenIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public sealed class DocumentIRNode : RazorIRNode
|
public sealed class DocumentIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public string DocumentKind { get; set; }
|
public string DocumentKind { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
{
|
||||||
|
public static class DocumentIRNodeExtensions
|
||||||
|
{
|
||||||
|
public static ClassDeclarationIRNode FindPrimaryClass(this DocumentIRNode node)
|
||||||
|
{
|
||||||
|
if (node == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
return FindWithAnnotation<ClassDeclarationIRNode>(node, CommonAnnotations.PrimaryClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RazorMethodDeclarationIRNode FindPrimaryMethod(this DocumentIRNode node)
|
||||||
|
{
|
||||||
|
if (node == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
return FindWithAnnotation<RazorMethodDeclarationIRNode>(node, CommonAnnotations.PrimaryMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NamespaceDeclarationIRNode FindPrimaryNamespace(this DocumentIRNode node)
|
||||||
|
{
|
||||||
|
if (node == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
return FindWithAnnotation<NamespaceDeclarationIRNode>(node, CommonAnnotations.PrimaryNamespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static T FindWithAnnotation<T>(RazorIRNode node, object annotation) where T : RazorIRNode
|
||||||
|
{
|
||||||
|
if (node is T target && object.ReferenceEquals(target.Annotations[annotation], annotation))
|
||||||
|
{
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < node.Children.Count; i++)
|
||||||
|
{
|
||||||
|
var result = FindWithAnnotation<T>(node.Children[i], annotation);
|
||||||
|
if (result != null)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class ExecuteTagHelpersIRNode : RazorIRNode
|
public class ExecuteTagHelpersIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public abstract class ExtensionIRNode : RazorIRNode
|
public abstract class ExtensionIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void WriteNode(RuntimeTarget target, CSharpRenderingContext context);
|
public abstract void WriteNode(RuntimeTarget target, CSharpRenderingContext context);
|
||||||
|
|
||||||
protected static void AcceptExtensionNode<TNode>(TNode node, RazorIRNodeVisitor visitor)
|
protected static void AcceptExtensionNode<TNode>(TNode node, RazorIRNodeVisitor visitor)
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class HtmlAttributeIRNode : RazorIRNode
|
public class HtmlAttributeIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class HtmlAttributeValueIRNode : RazorIRNode
|
public class HtmlAttributeValueIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public sealed class HtmlContentIRNode : RazorIRNode
|
public sealed class HtmlContentIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,13 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.AspNetCore.Razor.Language.Legacy;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class InitializeTagHelperStructureIRNode : RazorIRNode
|
public sealed class InitializeTagHelperStructureIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class NamespaceDeclarationIRNode : RazorIRNode
|
public class NamespaceDeclarationIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
internal static readonly RazorIRNode[] EmptyArray = new RazorIRNode[0];
|
internal static readonly RazorIRNode[] EmptyArray = new RazorIRNode[0];
|
||||||
|
|
||||||
|
public abstract ItemCollection Annotations { get; }
|
||||||
|
|
||||||
public abstract IList<RazorIRNode> Children { get; }
|
public abstract IList<RazorIRNode> Children { get; }
|
||||||
|
|
||||||
public abstract RazorIRNode Parent { get; set; }
|
public abstract RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public sealed class RazorIRToken : RazorIRNode
|
public sealed class RazorIRToken : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children => RazorIRNode.EmptyArray;
|
public override IList<RazorIRNode> Children => RazorIRNode.EmptyArray;
|
||||||
|
|
||||||
public string Content { get; set; }
|
public string Content { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class RazorMethodDeclarationIRNode : RazorIRNode
|
public class RazorMethodDeclarationIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class SetTagHelperPropertyIRNode : RazorIRNode
|
public class SetTagHelperPropertyIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,21 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class TagHelperIRNode : RazorIRNode
|
public class TagHelperIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
private ItemCollection _annotations;
|
||||||
|
|
||||||
|
public override ItemCollection Annotations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_annotations == null)
|
||||||
|
{
|
||||||
|
_annotations = new DefaultItemCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _annotations;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
{
|
{
|
||||||
public class UsingStatementIRNode : RazorIRNode
|
public class UsingStatementIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations => ReadonlyItemCollection.Empty;
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
public override IList<RazorIRNode> Children { get; } = EmptyArray;
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Language
|
||||||
|
{
|
||||||
|
internal class ReadonlyItemCollection : ItemCollection
|
||||||
|
{
|
||||||
|
public static readonly ItemCollection Empty = new ReadonlyItemCollection();
|
||||||
|
|
||||||
|
public override object this[object key]
|
||||||
|
{
|
||||||
|
get => null;
|
||||||
|
set => throw new NotSupportedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -259,6 +259,41 @@ namespace Microsoft.AspNetCore.Razor.Language
|
||||||
Assert.Equal("TestMethod", method.Name);
|
Assert.Equal("TestMethod", method.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Execute_AddsPrimaryAnnotations()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var irDocument = new DocumentIRNode()
|
||||||
|
{
|
||||||
|
Options = RazorParserOptions.CreateDefaultOptions(),
|
||||||
|
};
|
||||||
|
|
||||||
|
var builder = RazorIRBuilder.Create(irDocument);
|
||||||
|
builder.Add(new HtmlContentIRNode());
|
||||||
|
builder.Add(new CSharpStatementIRNode());
|
||||||
|
|
||||||
|
var pass = new TestDocumentClassifierPass()
|
||||||
|
{
|
||||||
|
Engine = RazorEngine.CreateEmpty(b => { }),
|
||||||
|
Namespace = "TestNamespace",
|
||||||
|
Class = "TestClass",
|
||||||
|
Method = "TestMethod",
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
pass.Execute(TestRazorCodeDocument.CreateEmpty(), irDocument);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var @namespace = SingleChild<NamespaceDeclarationIRNode>(irDocument);
|
||||||
|
AnnotationEquals(@namespace, CommonAnnotations.PrimaryNamespace);
|
||||||
|
|
||||||
|
var @class = SingleChild<ClassDeclarationIRNode>(@namespace);
|
||||||
|
AnnotationEquals(@class, CommonAnnotations.PrimaryClass);
|
||||||
|
|
||||||
|
var method = SingleChild<RazorMethodDeclarationIRNode>(@class);
|
||||||
|
AnnotationEquals(method, CommonAnnotations.PrimaryMethod);
|
||||||
|
}
|
||||||
|
|
||||||
private class TestDocumentClassifierPass : DocumentClassifierPassBase
|
private class TestDocumentClassifierPass : DocumentClassifierPassBase
|
||||||
{
|
{
|
||||||
public override int Order => RazorIRPass.DefaultFeatureOrder;
|
public override int Order => RazorIRPass.DefaultFeatureOrder;
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
|
||||||
private class BasicIRNode : RazorIRNode
|
private class BasicIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations { get; } = new DefaultItemCollection();
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
// 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 Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
{
|
||||||
|
public class DocumentIRNodeExtensionsTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void FindPrimaryClass_FindsClassWithAnnotation()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = new DocumentIRNode();
|
||||||
|
var @class = new ClassDeclarationIRNode();
|
||||||
|
@class.Annotations[CommonAnnotations.PrimaryClass] = CommonAnnotations.PrimaryClass;
|
||||||
|
|
||||||
|
var builder = RazorIRBuilder.Create(document);
|
||||||
|
builder.Add(@class);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = document.FindPrimaryClass();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Same(@class, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void FindPrimaryMethod_FindsMethodWithAnnotation()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = new DocumentIRNode();
|
||||||
|
var method = new RazorMethodDeclarationIRNode();
|
||||||
|
method.Annotations[CommonAnnotations.PrimaryMethod] = CommonAnnotations.PrimaryMethod;
|
||||||
|
|
||||||
|
var builder = RazorIRBuilder.Create(document);
|
||||||
|
builder.Add(method);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = document.FindPrimaryMethod();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Same(method, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void FindPrimaryNamespace_FindsNamespaceWithAnnotation()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = new DocumentIRNode();
|
||||||
|
var @namespace = new NamespaceDeclarationIRNode();
|
||||||
|
@namespace.Annotations[CommonAnnotations.PrimaryNamespace] = CommonAnnotations.PrimaryNamespace;
|
||||||
|
|
||||||
|
var builder = RazorIRBuilder.Create(document);
|
||||||
|
builder.Add(@namespace);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = document.FindPrimaryNamespace();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Same(@namespace, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -61,6 +61,37 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void AnnotationEquals(RazorIRNode node, object value)
|
||||||
|
{
|
||||||
|
AnnotationEquals(node, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AnnotationEquals(RazorIRNode node, object key, object value)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Assert.NotNull(node);
|
||||||
|
Assert.Equal(value, node.Annotations[key]);
|
||||||
|
}
|
||||||
|
catch (XunitException e)
|
||||||
|
{
|
||||||
|
throw new IRAssertException(node, node.Children, e.Message, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void HasAnnotation(RazorIRNode node, object key)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Assert.NotNull(node);
|
||||||
|
Assert.NotNull(node.Annotations[key]);
|
||||||
|
}
|
||||||
|
catch (XunitException e)
|
||||||
|
{
|
||||||
|
throw new IRAssertException(node, node.Children, e.Message, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void Html(string expected, RazorIRNode node)
|
public static void Html(string expected, RazorIRNode node)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
|
||||||
private class BasicIRNode : RazorIRNode
|
private class BasicIRNode : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations { get; } = new DefaultItemCollection();
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
@ -88,6 +90,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
|
||||||
private class BasicIRNode2 : RazorIRNode
|
private class BasicIRNode2 : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations { get; } = new DefaultItemCollection();
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
@ -102,6 +106,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
|
||||||
private class BasicIRNode3 : RazorIRNode
|
private class BasicIRNode3 : RazorIRNode
|
||||||
{
|
{
|
||||||
|
public override ItemCollection Annotations { get; } = new DefaultItemCollection();
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
|
||||||
|
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
|
|
||||||
|
public override ItemCollection Annotations { get; } = new DefaultItemCollection();
|
||||||
|
|
||||||
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
|
||||||
|
|
||||||
public override RazorIRNode Parent { get; set; }
|
public override RazorIRNode Parent { get; set; }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue