import { Flags } from './signifiers.flags.js';
import { Signifier } from './signifiers.js';
import { type KnownOrGenerics, type KnownTypesMap } from './types.feather.js';
import { PrimitiveName, withableTypes } from './types.primitives.js';
export type AnyType = Type<'Any'>;
export type ArrayType = Type<'Array'>;
export type BoolType = Type<'Bool'>;
export type EnumType = Type<'Enum'>;
export type FunctionType = Type<'Function'>;
export type PointerType = Type<'Pointer'>;
export type RealType = Type<'Real'>;
export type StringType = Type<'String'>;
export type StructType = Type<'Struct'>;
export type UndefinedType = Type<'Undefined'>;
export type UnknownType = Type<'Unknown'>;
export type WithableType = Type<(typeof withableTypes)[number]>;
/**
 * A stable entity that represents a type. It should be used
 * as the referenced container for any type information, so
 * that the types can be changed within the container without
 * breaking references.
 */
export declare class TypeStore<T extends PrimitiveName = PrimitiveName> extends Flags {
    readonly $tag = "TypeStore";
    protected _types: Type<T>[];
    constructor();
    /** If this store has only one type, its kind. Else throws. */
    get kind(): "Array" | "Bool" | "Enum" | "Function" | "Pointer" | "Real" | "String" | "Struct" | "Undefined" | "ArgumentIdentity" | "Any" | "Asset.GMAnimCurve" | "Asset.GMAudioGroup" | "Asset.GMFont" | "Asset.GMObject" | "Asset.GMParticleSystem" | "Asset.GMPath" | "Asset.GMRoom" | "Asset.GMScript" | "Asset.GMSequence" | "Asset.GMShader" | "Asset.GMSound" | "Asset.GMSprite" | "Asset.GMTileSet" | "Asset.GMTimeline" | "Asset.Script" | "Id.AudioEmitter" | "Id.AudioListener" | "Id.AudioSyncGroup" | "Id.BackgroundElement" | "Id.BinaryFile" | "Id.Buffer" | "Id.Camera" | "Id.DsGrid" | "Id.DsList" | "Id.DsMap" | "Id.DsPriority" | "Id.DsQueue" | "Id.DsStack" | "Id.ExternalCall" | "Id.Gif" | "Id.Instance" | "Id.Layer" | "Id.MpGrid" | "Id.ParticleEmitter" | "Id.ParticleSystem" | "Id.ParticleType" | "Id.PhysicsIndex" | "Id.PhysicsParticleGroup" | "Id.Sampler" | "Id.SequenceElement" | "Id.Socket" | "Id.Sound" | "Id.SpriteElement" | "Id.Surface" | "Id.TextFile" | "Id.Texture" | "Id.TileElementId" | "Id.TileMapElement" | "Id.TimeSource" | "Id.Uniform" | "Id.VertexBuffer" | "Id.VertexFormat" | "Mixed" | "EnumMember" | "Unknown" | "Never" | "InstanceType" | "ObjectType" | "StaticType";
    get type(): Type<T>[];
    set type(types: Type<T> | Type<T>[] | undefined);
    get hasTypes(): boolean;
    get constructs(): StructType[];
    get items(): TypeStore[];
    get returns(): TypeStore[];
    /**
     * Should be used sparingly, since it means we're adding types in multiple steps instead of all at once.
     */
    addType(type: Type<T> | Type<T>[]): this;
    narrows(other: TypeStore | Type | Type[]): boolean;
    toFeatherString(): string;
}
export declare class Type<T extends PrimitiveName = PrimitiveName> {
    protected _kind: T;
    readonly $tag = "Type";
    name: string | undefined;
    description: string | undefined;
    /** Signifiers associated with this type. */
    _signifier: Signifier | undefined;
    /**
     * If set, then this Type is treated as a subset of the parent.
     * It will only "match" another type if that type is in its
     * parent somewhere. Useful for struct/constructor inheritence, as well
     * as for e.g. representing a subset of Real constants in a type. */
    protected _extends: Type | undefined;
    protected _derived: Set<Type> | undefined;
    protected flags: number;
    /** Named members of Structs and Enums */
    protected _members: Map<string, Signifier> | undefined;
    /** Types of the items found in arrays and various ds types, or the fallback type found in Structs */
    items: TypeStore | undefined;
    /**
     * For functions, the local variables declared within the function.
     * A subset of these will be parameters, which are also signifiers.
     */
    local: Type<'Struct'> | undefined;
    /**
     * If this is a constructor function, then this is the
     * type of the struct that it constructs.
     * Otherwise it's the self-context of the function */
    self: WithableType | undefined;
    returns: TypeStore | undefined;
    constructor(_kind: T);
    protected setFlag(flag: number, value: boolean): void;
    protected getFlag(flag: number): boolean;
    /**
     * Native and primitive types are typically read-only once
     * they've been defined. This property should be set once a type
     * is intended to be immutable.
     */
    get isReadonly(): boolean;
    set isReadonly(value: boolean);
    /**
     * If this is a type used as a generic, then this will be true
     */
    get isGeneric(): boolean;
    set isGeneric(value: boolean);
    get isConstructor(): boolean;
    set isConstructor(value: boolean);
    get kind(): PrimitiveName;
    set kind(newKind: PrimitiveName);
    get signifier(): Signifier | undefined;
    set signifier(signifier: Signifier);
    get extends(): Type | undefined;
    set extends(type: Type | undefined);
    listDerived(recursive?: boolean): Type[];
    get canBeSelf(): boolean;
    /** If this type narrows `other` type, returns `true` */
    narrows(other: Type | Type[] | TypeStore): boolean;
    /** Get this type as a Feather-compatible string */
    toFeatherString(): string;
    get code(): string;
    get details(): string;
    get isFunction(): boolean;
    setReturnType(type: Type | TypeStore | (Type | TypeStore)[]): this;
    /** Prefer `setReturnType` where possible */
    addReturnType(type: Type | Type[]): this;
    listParameters(): (Signifier | undefined)[];
    getParameter(name: string): Signifier | undefined;
    getParameter(idx: number): Signifier | undefined;
    /** A parameter is a special type of local variable. */
    addParameter(idx: number, nameOrParam: string | Signifier, options?: {
        type?: Type | Type[];
        optional?: boolean;
    }): Signifier;
    truncateParameters(count: number): void;
    totalMembers(excludeParents?: boolean): number;
    listMembers(excludeParents?: boolean): Signifier[];
    getMember(name: string, excludeParents?: boolean): Signifier | undefined;
    /** For container types that have named members, like Structs and Enums */
    addMember(newMember: Signifier | string, options?: {
        type?: Type | Type[];
        writable?: boolean;
        override?: boolean;
    }): Signifier | undefined;
    protected replaceMemberInChildren(member: Signifier): void;
    removeMember(name: string): void;
    /**
     * For container types that have non-named members, like arrays and DsTypes.
     * Can also be used for default Struct values. */
    addItemType(type: Type): this;
    /**
     * For container types that have non-named members, like arrays and DsTypes.
     * Can also be used for default Struct values. */
    setItemType(type: Type): this;
    /**
     * Create a derived type: of the same kind, pointing to
     * this type as its parent. */
    derive(): Type<T>;
    named(name: string | undefined): this;
    describe(description: string | undefined): this;
    genericize(): this;
    /** Given a Feather-compatible type string, get a fully parsed type. */
    static fromFeatherString(typeString: string, knownTypes: KnownTypesMap | KnownOrGenerics[], addMissing: boolean): Type[];
    static get Any(): Type<"Any">;
    static get Real(): Type<"Real">;
    static get String(): Type<"String">;
    static get Bool(): Type<"Bool">;
    static get Undefined(): Type<"Undefined">;
    static get Struct(): Type<"Struct">;
    static get Function(): Type<"Function">;
}
//# sourceMappingURL=types.d.ts.map