File: CILParser.SemanticValues.Signatures.cs
Web Access
Project: ILAssembler.csproj (ILAssembler)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Immutable;
using Antlr4.Runtime;

namespace ILAssembler;

public partial class CILParser
{
    public sealed record TypeName(TypeName? ContainingTypeName, string DottedName);

    public sealed record ArrayBoundValue(int? Lower, int? Upper);

    public abstract record ElementTypeValue
    {
        public static ElementTypeValue Error { get; } = new ErrorElementTypeValue();
    }

    public sealed record ErrorElementTypeValue : ElementTypeValue;

    public sealed record PrimitiveElementTypeValue(byte TypeCode) : ElementTypeValue;

    public sealed record ClassElementTypeValue(ClassNameValue ClassName, bool IsValueType) : ElementTypeValue;

    public sealed record FunctionPointerElementTypeValue(
        byte CallingConvention,
        TypeValue ReturnType,
        ImmutableArray<SignatureArgumentValue> Arguments) : ElementTypeValue;

    public abstract record GenericParameterElementTypeValue(bool IsMethodParameter) : ElementTypeValue;

    public sealed record IndexedGenericParameterElementTypeValue(bool IsMethodParameter, int Index)
        : GenericParameterElementTypeValue(IsMethodParameter);

    public sealed record NamedGenericParameterElementTypeValue(
        IToken Token,
        bool IsMethodParameter,
        string Name) : GenericParameterElementTypeValue(IsMethodParameter);

    public sealed record TypedefElementTypeValue(IToken Token, string Alias) : ElementTypeValue;

    public sealed record SentinelElementTypeValue(TypeValue Type) : ElementTypeValue;

    public sealed record TypeValue(
        ElementTypeValue ElementType,
        ImmutableArray<TypeModifierValue> Modifiers)
    {
        public static TypeValue Error { get; } = new(ElementTypeValue.Error, []);
    }

    public abstract record TypeModifierValue
    {
        public static TypeModifierValue Error { get; } = new ErrorTypeModifierValue();
    }

    public sealed record ErrorTypeModifierValue : TypeModifierValue;

    public enum SimpleTypeModifierKind
    {
        SzArray,
        ByReference,
        Pointer,
        Pinned
    }

    public sealed record SimpleTypeModifierValue(SimpleTypeModifierKind Kind) : TypeModifierValue;

    public sealed record ArrayTypeModifierValue(ImmutableArray<ArrayBoundValue> Bounds) : TypeModifierValue;

    public sealed record CustomTypeModifierValue(
        TypeSpecificationValue Type,
        bool IsRequired) : TypeModifierValue;

    public sealed record GenericArgumentsTypeModifierValue(
        ImmutableArray<TypeValue> Arguments) : TypeModifierValue;

    public sealed record SignatureArgumentValue(
        bool IsSentinel,
        int Attributes,
        TypeValue? Type,
        MarshallingDescriptorValue? Marshalling,
        string? Name)
    {
        public static SignatureArgumentValue Error { get; } =
            new(false, 0, TypeValue.Error, null, null);
    }

    public sealed record CalliSignatureValue(
        byte CallingConvention,
        TypeValue ReturnType,
        ImmutableArray<SignatureArgumentValue> Arguments)
    {
        public static CalliSignatureValue Error { get; } = new(0, TypeValue.Error, []);
    }

    public abstract record ClassNameValue
    {
        public static ClassNameValue Error { get; } = new ErrorClassNameValue();
    }

    public sealed record ErrorClassNameValue : ClassNameValue;

    public sealed record UnqualifiedClassNameValue(TypeName Name) : ClassNameValue;

    public sealed record AssemblyQualifiedClassNameValue(
        string AssemblyName,
        TypeName Name) : ClassNameValue;

    public sealed record ModuleQualifiedClassNameValue(
        IToken Token,
        string ModuleName,
        TypeName Name) : ClassNameValue;

    public sealed record TokenQualifiedClassNameValue(
        int Token,
        TypeName Name) : ClassNameValue;

    public sealed record PointerQualifiedClassNameValue(TypeName Name) : ClassNameValue;

    public sealed record TokenClassNameValue(int Token) : ClassNameValue;

    public enum SpecialClassNameKind
    {
        This,
        Base,
        Nester
    }

    public sealed record SpecialClassNameValue(
        IToken Token,
        SpecialClassNameKind Kind) : ClassNameValue;

    public abstract record TypeSpecificationValue
    {
        public static TypeSpecificationValue Error { get; } =
            new ErrorTypeSpecificationValue();
    }

    public sealed record ErrorTypeSpecificationValue : TypeSpecificationValue;

    public sealed record ClassTypeSpecificationValue(
        ClassNameValue ClassName) : TypeSpecificationValue;

    public sealed record AssemblyTypeSpecificationValue(
        string AssemblyName) : TypeSpecificationValue;

    public sealed record ModuleTypeSpecificationValue(
        string ModuleName) : TypeSpecificationValue;

    public sealed record SignatureTypeSpecificationValue(
        TypeValue Type) : TypeSpecificationValue;

    public abstract record MethodReferenceValue
    {
        public static MethodReferenceValue Error { get; } = new ErrorMethodReferenceValue();
    }

    public sealed record ErrorMethodReferenceValue : MethodReferenceValue;

    public sealed record TokenMethodReferenceValue(int Token) : MethodReferenceValue;

    public sealed record TypedefMethodReferenceValue(
        IToken Token,
        string Alias) : MethodReferenceValue;

    public sealed record ParsedMethodReferenceValue(
        IToken Token,
        byte CallingConvention,
        TypeValue ReturnType,
        TypeSpecificationValue? Owner,
        string Name,
        ImmutableArray<TypeValue>? GenericArguments,
        int GenericArity,
        ImmutableArray<SignatureArgumentValue> Arguments) : MethodReferenceValue;

    public abstract record FieldReferenceValue
    {
        public static FieldReferenceValue Error { get; } = new ErrorFieldReferenceValue();
    }

    public sealed record ErrorFieldReferenceValue : FieldReferenceValue;

    public sealed record TypedefFieldReferenceValue(
        IToken Token,
        string Alias) : FieldReferenceValue;

    public sealed record ParsedFieldReferenceValue(
        TypeValue FieldType,
        TypeSpecificationValue? Owner,
        string Name) : FieldReferenceValue;

    public abstract record MemberReferenceValue
    {
        public static MemberReferenceValue Error { get; } = new ErrorMemberReferenceValue();
    }

    public sealed record ErrorMemberReferenceValue : MemberReferenceValue;

    public sealed record MethodMemberReferenceValue(
        MethodReferenceValue Method) : MemberReferenceValue;

    public sealed record FieldMemberReferenceValue(
        FieldReferenceValue Field) : MemberReferenceValue;

    public sealed record TokenMemberReferenceValue(int Token) : MemberReferenceValue;

    public abstract record OwnerTypeValue
    {
        public static OwnerTypeValue Error { get; } = new ErrorOwnerTypeValue();
    }

    public sealed record ErrorOwnerTypeValue : OwnerTypeValue;

    public sealed record TypeOwnerValue(TypeSpecificationValue Type) : OwnerTypeValue;

    public sealed record MemberOwnerValue(MemberReferenceValue Member) : OwnerTypeValue;
}