SharpGen/Generator/StatementSyntaxList.cs (65 lines of code) (raw):
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using SharpGen.Generator.Marshallers;
using SharpGen.Model;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
namespace SharpGen.Generator
{
internal sealed class StatementSyntaxList : IReadOnlyList<StatementSyntax>, ICollection<StatementSyntax>,
ICollection
{
private readonly List<StatementSyntax> listImplementation = new(8);
private readonly MarshallingRegistry registry;
private MarshallingRegistry Registry =>
registry ?? throw new Exception($"{nameof(MarshallingRegistry)} is required");
public StatementSyntaxList(MarshallingRegistry registry = null) => this.registry = registry;
public void Add(StatementSyntax item)
{
if (item == null)
return;
listImplementation.Add(item);
}
public void AddRange(IEnumerable<StatementSyntax> collection)
{
if (collection == null)
return;
listImplementation.AddRange(collection.Where(x => x != null));
}
public void AddRange<T>(T source, Func<IMarshaller, T, IEnumerable<StatementSyntax>> transform)
where T : CsMarshalBase => AddRange(transform(Registry.GetMarshaller(source), source));
public void AddRange<T>(IEnumerable<T> source, Func<IMarshaller, T, IEnumerable<StatementSyntax>> transform)
where T : CsMarshalBase => AddRange(source.SelectMany(x => transform(Registry.GetMarshaller(x), x)));
public void Add<T>(T source, Func<IMarshaller, T, StatementSyntax> transform)
where T : CsMarshalBase => Add(transform(Registry.GetMarshaller(source), source));
public void AddRange<T>(IEnumerable<T> source, Func<IMarshaller, T, StatementSyntax> transform)
where T : CsMarshalBase => AddRange(source.Select(x => transform(Registry.GetMarshaller(x), x)));
public void Add<T>(T source, Func<T, StatementSyntax> transform) => Add(transform(source));
public void AddRange<T>(IEnumerable<T> source, Func<T, StatementSyntax> transform) =>
AddRange(source.Select(transform));
public void AddRange<T>(IEnumerable<T> source, Func<T, IEnumerable<StatementSyntax>> transform) =>
AddRange(source.SelectMany(transform));
public BlockSyntax ToBlock()
{
var statement = ToStatement();
return statement is BlockSyntax block ? block : Block(statement);
}
public StatementSyntax ToStatement() => Count == 1 ? this[0] : Block(this);
public IEnumerator<StatementSyntax> GetEnumerator() => listImplementation.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => listImplementation.GetEnumerator();
public void Clear() => listImplementation.Clear();
public bool Contains(StatementSyntax item) => listImplementation.Contains(item);
public void CopyTo(StatementSyntax[] array, int arrayIndex) => listImplementation.CopyTo(array, arrayIndex);
public void CopyTo(Array array, int index) => ((ICollection) listImplementation).CopyTo(array, index);
public bool Remove(StatementSyntax item) => listImplementation.Remove(item);
public int Count => listImplementation.Count;
public bool IsSynchronized => false;
public object SyncRoot => listImplementation;
public bool IsReadOnly => false;
public int IndexOf(StatementSyntax item) => listImplementation.IndexOf(item);
public void RemoveAt(int index) => listImplementation.RemoveAt(index);
public StatementSyntax this[int index] => listImplementation[index];
}
}