Add collection types for IR children

This commit is contained in:
Ryan Nowak 2017-06-08 17:02:42 -07:00
parent 118fefb7e2
commit 14944a2791
40 changed files with 339 additions and 43 deletions

View File

@ -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<RazorIRNode> Children { get; } = new RazorIRNode[0];
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -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<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -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<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -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<RazorIRNode> Children => EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
internal sealed class DeclarePreallocatedTagHelperAttributeIRNode : ExtensionIRNode
{
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
internal sealed class DeclarePreallocatedTagHelperHtmlAttributeIRNode : ExtensionIRNode
{
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -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<RazorIRNode> _inner = new List<RazorIRNode>();
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<RazorIRNode> 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);
}
}
}

View File

@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
internal sealed class DesignTimeDirectiveIRNode : ExtensionIRNode
{
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public string DocumentKind { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public IList<string> Modifiers { get; set; } = new List<string>();

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public IList<string> Modifiers { get; set; } = new List<string>();

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
public abstract ItemCollection Annotations { get; }
public abstract IList<RazorIRNode> Children { get; }
public abstract RazorIRNodeCollection Children { get; }
public abstract RazorIRNode Parent { get; set; }

View File

@ -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<RazorIRNode>
{
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<RazorIRNode> 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();
}
}
}

View File

@ -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<RazorIRNode> Children => RazorIRNode.EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public string Content { get; set; }

View File

@ -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<RazorIRNode> GetEnumerator()
{
return Enumerable.Empty<RazorIRNode>().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();
}
}
}

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
internal sealed class SetPreallocatedTagHelperPropertyIRNode : ExtensionIRNode
{
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
}
}
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations => ReadOnlyItemCollection.Empty;
public override IList<RazorIRNode> Children { get; } = EmptyArray;
public override RazorIRNodeCollection Children => ReadOnlyIRNodeCollection.Instance;
public override RazorIRNode Parent { get; set; }

View File

@ -549,9 +549,10 @@ Render Node - CSharpExpressionIRNode
private class MyExtensionIRNode : ExtensionIRNode
{
public override IList<RazorIRNode> 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)

View File

@ -650,7 +650,7 @@ WriteAttributeValue("" "", 27, false, 28, 6, false);
private class MyExtensionIRNode : ExtensionIRNode
{
public override IList<RazorIRNode> 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(); }

View File

@ -216,7 +216,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
{
public override ItemCollection Annotations { get; } = new DefaultItemCollection();
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }

View File

@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
private class TestExtensionIRNode : ExtensionIRNode
{
public override IList<RazorIRNode> 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(); }

View File

@ -72,7 +72,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Intermediate
public override ItemCollection Annotations { get; } = new DefaultItemCollection();
public override IList<RazorIRNode> Children { get; } = new List<RazorIRNode>();
public override RazorIRNodeCollection Children { get; } = new DefaultIRNodeCollection();
public override RazorIRNode Parent { get; set; }