From 14944a279169cdf74d4c3c8670a8bf4596f013a0 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 8 Jun 2017 17:02:42 -0700 Subject: [PATCH] Add collection types for IR children --- .../InjectDirectiveIRNode.cs | 3 +- .../Extensions/TemplateIRNode.cs | 3 +- ...reallocatedTagHelperHtmlAttributeIRNode.cs | 3 +- .../AddTagHelperHtmlAttributeIRNode.cs | 2 +- .../CSharpCodeAttributeValueIRNode.cs | 2 +- .../Intermediate/CSharpCodeIRNode.cs | 2 +- .../CSharpExpressionAttributeValueIRNode.cs | 2 +- .../Intermediate/CSharpExpressionIRNode.cs | 2 +- .../Intermediate/ChecksumIRNode.cs | 4 +- .../Intermediate/ClassDeclarationIRNode.cs | 2 +- .../Intermediate/CreateTagHelperIRNode.cs | 2 +- ...arePreallocatedTagHelperAttributeIRNode.cs | 2 +- ...reallocatedTagHelperHtmlAttributeIRNode.cs | 2 +- .../DeclareTagHelperFieldsIRNode.cs | 2 +- .../Intermediate/DefaultIRNodeCollection.cs | 128 +++++++++++++++++ .../Intermediate/DesignTimeDirectiveIRNode.cs | 2 +- .../Intermediate/DirectiveIRNode.cs | 2 +- .../Intermediate/DirectiveTokenIRNode.cs | 2 +- .../Intermediate/DocumentIRNode.cs | 2 +- .../Intermediate/FieldDeclarationIRNode.cs | 2 +- .../Intermediate/HtmlAttributeIRNode.cs | 2 +- .../Intermediate/HtmlAttributeValueIRNode.cs | 2 +- .../Intermediate/HtmlContentIRNode.cs | 2 +- .../Intermediate/MethodDeclarationIRNode.cs | 2 +- .../NamespaceDeclarationIRNode.cs | 2 +- .../Intermediate/PropertyDeclarationIRNode.cs | 2 +- .../Intermediate/RazorIRNode.cs | 2 +- .../Intermediate/RazorIRNodeCollection.cs | 40 ++++++ .../Intermediate/RazorIRToken.cs | 3 +- .../Intermediate/ReadOnlyIRNodeCollection.cs | 133 ++++++++++++++++++ .../SetPreallocatedTagHelperPropertyIRNode.cs | 2 +- .../SetTagHelperPropertyIRNode.cs | 2 +- .../Intermediate/TagHelperBodyIRNode.cs | 2 +- .../Intermediate/TagHelperIRNode.cs | 2 +- .../Intermediate/UsingStatementIRNode.cs | 2 +- .../DesignTimeBasicWriterTest.cs | 3 +- .../CodeGeneration/RuntimeBasicWriterTest.cs | 2 +- .../Intermediate/DefaultRazorIRBuilderTest.cs | 2 +- .../Intermediate/ExtensionIRNodeTest.cs | 2 +- .../Intermediate/RazorIRNodeWalkerTest.cs | 2 +- 40 files changed, 339 insertions(+), 43 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Razor.Language/Intermediate/DefaultIRNodeCollection.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeCollection.cs create mode 100644 src/Microsoft.AspNetCore.Razor.Language/Intermediate/ReadOnlyIRNodeCollection.cs diff --git a/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InjectDirectiveIRNode.cs b/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InjectDirectiveIRNode.cs index 2f0e8f5be4..57b2770065 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InjectDirectiveIRNode.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor.Extensions/InjectDirectiveIRNode.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language.CodeGeneration; using Microsoft.AspNetCore.Razor.Language.Intermediate; @@ -15,7 +14,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Extensions public string MemberName { get; set; } - public override IList Children { get; } = new RazorIRNode[0]; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Extensions/TemplateIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Extensions/TemplateIRNode.cs index 71b2a6510a..cde0ecb2eb 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Extensions/TemplateIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Extensions/TemplateIRNode.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.AspNetCore.Razor.Language.CodeGeneration; using Microsoft.AspNetCore.Razor.Language.Intermediate; @@ -10,7 +9,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Extensions { public sealed class TemplateIRNode : ExtensionIRNode { - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddPreallocatedTagHelperHtmlAttributeIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddPreallocatedTagHelperHtmlAttributeIRNode.cs index 72e59f27d0..0e79381bbf 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddPreallocatedTagHelperHtmlAttributeIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddPreallocatedTagHelperHtmlAttributeIRNode.cs @@ -2,14 +2,13 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.AspNetCore.Razor.Language.CodeGeneration; namespace Microsoft.AspNetCore.Razor.Language.Intermediate { internal sealed class AddPreallocatedTagHelperHtmlAttributeIRNode : ExtensionIRNode { - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddTagHelperHtmlAttributeIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddTagHelperHtmlAttributeIRNode.cs index cd2e8ea435..f57ac7a7e9 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddTagHelperHtmlAttributeIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/AddTagHelperHtmlAttributeIRNode.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeAttributeValueIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeAttributeValueIRNode.cs index 6b57ec7a6f..87c0d7a51f 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeAttributeValueIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeAttributeValueIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeIRNode.cs index 4df3e287f3..293bcd0e41 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpCodeIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionAttributeValueIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionAttributeValueIRNode.cs index 8d79bdeb72..08066000e5 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionAttributeValueIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionAttributeValueIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionIRNode.cs index e8f41f8560..bbe51d6842 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CSharpExpressionIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ChecksumIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ChecksumIRNode.cs index fd5dfe5593..a18908683c 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ChecksumIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ChecksumIRNode.cs @@ -1,8 +1,6 @@ // 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.Collections.Generic; -using System.Security.Cryptography; using System.Text; namespace Microsoft.AspNetCore.Razor.Language.Intermediate @@ -11,7 +9,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children => EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ClassDeclarationIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ClassDeclarationIRNode.cs index 552e658189..1e72a55154 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ClassDeclarationIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ClassDeclarationIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CreateTagHelperIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CreateTagHelperIRNode.cs index c6982894e8..f8f954c348 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CreateTagHelperIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/CreateTagHelperIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperAttributeIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperAttributeIRNode.cs index c69dd55c22..6e7a6a9902 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperAttributeIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperAttributeIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { internal sealed class DeclarePreallocatedTagHelperAttributeIRNode : ExtensionIRNode { - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperHtmlAttributeIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperHtmlAttributeIRNode.cs index 1091e1845e..347ec21fe6 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperHtmlAttributeIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclarePreallocatedTagHelperHtmlAttributeIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { internal sealed class DeclarePreallocatedTagHelperHtmlAttributeIRNode : ExtensionIRNode { - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclareTagHelperFieldsIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclareTagHelperFieldsIRNode.cs index c4866b893c..9684c03102 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclareTagHelperFieldsIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DeclareTagHelperFieldsIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DefaultIRNodeCollection.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DefaultIRNodeCollection.cs new file mode 100644 index 0000000000..6410681806 --- /dev/null +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DefaultIRNodeCollection.cs @@ -0,0 +1,128 @@ +// 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.Language.Intermediate +{ + public sealed class DefaultIRNodeCollection : RazorIRNodeCollection + { + private readonly List _inner = new List(); + + public override RazorIRNode this[int index] + { + get + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + return _inner[index]; + } + set + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + _inner[index] = value; + } + } + + public override int Count => _inner.Count; + + public override bool IsReadOnly => false; + + public override void Add(RazorIRNode item) + { + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + _inner.Add(item); + } + + public override void Clear() + { + _inner.Clear(); + } + + public override bool Contains(RazorIRNode item) + { + return _inner.Contains(item); + } + + public override void CopyTo(RazorIRNode[] array, int arrayIndex) + { + if (array == null) + { + throw new ArgumentNullException(nameof(array)); + } + + if (arrayIndex < 0 || arrayIndex > array.Length) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + } + else if (array.Length - arrayIndex < Count) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + } + + _inner.CopyTo(array, arrayIndex); + } + + public override IEnumerator GetEnumerator() + { + return _inner.GetEnumerator(); + } + + public override int IndexOf(RazorIRNode item) + { + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + return _inner.IndexOf(item); + } + + public override void Insert(int index, RazorIRNode item) + { + if (index < 0 || index > Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + _inner.Insert(index, item); + } + + public override bool Remove(RazorIRNode item) + { + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + return _inner.Remove(item); + } + + public override void RemoveAt(int index) + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + _inner.RemoveAt(index); + } + } +} diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DesignTimeDirectiveIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DesignTimeDirectiveIRNode.cs index 1f97d23ac4..148810f661 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DesignTimeDirectiveIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DesignTimeDirectiveIRNode.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { internal sealed class DesignTimeDirectiveIRNode : ExtensionIRNode { - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveIRNode.cs index 42033d772e..56386f7b9c 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveIRNode.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveTokenIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveTokenIRNode.cs index 6c40a1935d..7d9146e1b2 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveTokenIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DirectiveTokenIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DocumentIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DocumentIRNode.cs index 99e409b03e..1b2acd11df 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DocumentIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/DocumentIRNode.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public string DocumentKind { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/FieldDeclarationIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/FieldDeclarationIRNode.cs index 7293113dad..862b2311d2 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/FieldDeclarationIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/FieldDeclarationIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public IList Modifiers { get; set; } = new List(); diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeIRNode.cs index b9a43f4d39..e0de6e025f 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeValueIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeValueIRNode.cs index 64d839b24c..2c461c7b8c 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeValueIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlAttributeValueIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlContentIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlContentIRNode.cs index 20e1aac356..5a85f33723 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlContentIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/HtmlContentIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/MethodDeclarationIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/MethodDeclarationIRNode.cs index 43ac7664d4..75306499af 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/MethodDeclarationIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/MethodDeclarationIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/NamespaceDeclarationIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/NamespaceDeclarationIRNode.cs index ce61913d58..6f88829eba 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/NamespaceDeclarationIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/NamespaceDeclarationIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/PropertyDeclarationIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/PropertyDeclarationIRNode.cs index 2b85fad3ed..004b9933bb 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/PropertyDeclarationIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/PropertyDeclarationIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public IList Modifiers { get; set; } = new List(); diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNode.cs index 4359a90c00..b23e4bd0a4 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNode.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate public abstract ItemCollection Annotations { get; } - public abstract IList Children { get; } + public abstract RazorIRNodeCollection Children { get; } public abstract RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeCollection.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeCollection.cs new file mode 100644 index 0000000000..898f064f8c --- /dev/null +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRNodeCollection.cs @@ -0,0 +1,40 @@ +// 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.Collections; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.Razor.Language.Intermediate +{ + public abstract class RazorIRNodeCollection : IList + { + public abstract RazorIRNode this[int index] { get; set; } + + public abstract int Count { get; } + + public abstract bool IsReadOnly { get; } + + public abstract void Add(RazorIRNode item); + + public abstract void Clear(); + + public abstract bool Contains(RazorIRNode item); + + public abstract void CopyTo(RazorIRNode[] array, int arrayIndex); + + public abstract IEnumerator GetEnumerator(); + + public abstract int IndexOf(RazorIRNode item); + + public abstract void Insert(int index, RazorIRNode item); + + public abstract bool Remove(RazorIRNode item); + + public abstract void RemoveAt(int index); + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRToken.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRToken.cs index a047db998f..8f56e0f8f2 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRToken.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/RazorIRToken.cs @@ -2,7 +2,6 @@ // 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.Language.Intermediate { @@ -10,7 +9,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children => RazorIRNode.EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public string Content { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ReadOnlyIRNodeCollection.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ReadOnlyIRNodeCollection.cs new file mode 100644 index 0000000000..1cd5f8e79d --- /dev/null +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/ReadOnlyIRNodeCollection.cs @@ -0,0 +1,133 @@ +// 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; +using System.Linq; + +namespace Microsoft.AspNetCore.Razor.Language.Intermediate +{ + public sealed class ReadOnlyIRNodeCollection : RazorIRNodeCollection + { + public static readonly ReadOnlyIRNodeCollection Instance = new ReadOnlyIRNodeCollection(); + + private ReadOnlyIRNodeCollection() + { + } + + public override RazorIRNode this[int index] + { + get + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + throw null; // Unreachable + } + set + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + throw null; // Unreachable + } + } + + public override int Count => 0; + + public override bool IsReadOnly => true; + + public override void Add(RazorIRNode item) + { + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + throw new NotSupportedException(); + } + + public override void Clear() + { + throw new NotSupportedException(); + } + + public override bool Contains(RazorIRNode item) + { + return false; + } + + public override void CopyTo(RazorIRNode[] array, int arrayIndex) + { + if (array == null) + { + throw new ArgumentNullException(nameof(array)); + } + + if (arrayIndex < 0 || arrayIndex > array.Length) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + } + else if (array.Length - arrayIndex < Count) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + } + + throw new NotSupportedException(); + } + + public override IEnumerator GetEnumerator() + { + return Enumerable.Empty().GetEnumerator(); + } + + public override int IndexOf(RazorIRNode item) + { + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + return -1; + } + + public override void Insert(int index, RazorIRNode item) + { + if (index < 0 || index > Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + throw new NotSupportedException(); + } + + public override bool Remove(RazorIRNode item) + { + if (item == null) + { + throw new ArgumentNullException(nameof(item)); + } + + return false; + } + + public override void RemoveAt(int index) + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + throw new NotSupportedException(); + } + } +} diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetPreallocatedTagHelperPropertyIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetPreallocatedTagHelperPropertyIRNode.cs index 3db438a062..08fba87438 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetPreallocatedTagHelperPropertyIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetPreallocatedTagHelperPropertyIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { internal sealed class SetPreallocatedTagHelperPropertyIRNode : ExtensionIRNode { - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetTagHelperPropertyIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetTagHelperPropertyIRNode.cs index 7a0698ac05..6e503fbd18 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetTagHelperPropertyIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/SetTagHelperPropertyIRNode.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperBodyIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperBodyIRNode.cs index bd8f16dfc4..feac7431be 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperBodyIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperBodyIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs index 07caec05d1..7a40379e81 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/TagHelperIRNode.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate } } - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/UsingStatementIRNode.cs b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/UsingStatementIRNode.cs index 9d5fadcfca..41d942395b 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Intermediate/UsingStatementIRNode.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Intermediate/UsingStatementIRNode.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations => ReadOnlyItemCollection.Empty; - public override IList Children { get; } = EmptyArray; + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeBasicWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeBasicWriterTest.cs index 8259773a0e..4707b6a2e1 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeBasicWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/DesignTimeBasicWriterTest.cs @@ -549,9 +549,10 @@ Render Node - CSharpExpressionIRNode private class MyExtensionIRNode : ExtensionIRNode { - public override IList Children => throw new NotImplementedException(); + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } + public override SourceSpan? Source { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public override void Accept(RazorIRNodeVisitor visitor) diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeBasicWriterTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeBasicWriterTest.cs index 38c8a28bea..e6345dc757 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeBasicWriterTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/CodeGeneration/RuntimeBasicWriterTest.cs @@ -650,7 +650,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false); private class MyExtensionIRNode : ExtensionIRNode { - public override IList Children => throw new NotImplementedException(); + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get; set; } public override SourceSpan? Source { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/DefaultRazorIRBuilderTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/DefaultRazorIRBuilderTest.cs index 053a3db2b8..8002f65c71 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/DefaultRazorIRBuilderTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/DefaultRazorIRBuilderTest.cs @@ -216,7 +216,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate { public override ItemCollection Annotations { get; } = new DefaultItemCollection(); - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/ExtensionIRNodeTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/ExtensionIRNodeTest.cs index a7932d2a90..ce7f3cadff 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/ExtensionIRNodeTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/ExtensionIRNodeTest.cs @@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate private class TestExtensionIRNode : ExtensionIRNode { - public override IList Children => throw new NotImplementedException(); + public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance; public override RazorIRNode Parent { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public override SourceSpan? Source { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/RazorIRNodeWalkerTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/RazorIRNodeWalkerTest.cs index 7ce6dcff00..7fd0e59762 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/RazorIRNodeWalkerTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Intermediate/RazorIRNodeWalkerTest.cs @@ -72,7 +72,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate public override ItemCollection Annotations { get; } = new DefaultItemCollection(); - public override IList Children { get; } = new List(); + public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection(); public override RazorIRNode Parent { get; set; }