declare type Metadata = number; export declare enum TypeTag { ANY = 1, UNKNOWN = 2, GLOBAL = 3, LOCAL = 4, LOCAL_STATIC = 5 } export declare type Type = StaticType | GlobalType | LocalType | AnyType | UnknownType; export declare type AnyStaticType = StaticType; export declare abstract class BaseType { } export declare class AnyType extends BaseType { readonly tag = TypeTag.ANY; } export declare class UnknownType extends BaseType { readonly tag = TypeTag.UNKNOWN; } export declare class StaticType extends BaseType { readonly meta: Metadata; readonly name: string; readonly tag = TypeTag.LOCAL_STATIC; constructor(meta: Metadata, name: string); } export declare class GlobalType extends BaseType { readonly meta: Metadata; readonly namespace: string; readonly name: string; readonly tag = TypeTag.GLOBAL; constructor(meta: Metadata, namespace: string, name: string); } export declare class LocalType extends BaseType { readonly meta: Metadata; readonly name: string; readonly tag = TypeTag.LOCAL; constructor(meta: Metadata, name: string); } export declare enum TypeConstraintTag { TYPE = 0, WITH_TRAIT = 1 } export declare type TypeConstraint = TypeConstraintType | TypeConstraintWithTrait; declare abstract class BaseConstraint { abstract tag: TypeConstraintTag; } export declare class TypeConstraintType extends BaseConstraint { readonly meta: Metadata; readonly type: Type; readonly tag = TypeConstraintTag.TYPE; constructor(meta: Metadata, type: Type); } export declare class TypeConstraintWithTrait extends BaseConstraint { readonly meta: Metadata; readonly type: TypeConstraint; readonly traits: Trait[]; readonly tag = TypeConstraintTag.WITH_TRAIT; constructor(meta: Metadata, type: TypeConstraint, traits: Trait[]); } export declare enum TraitTag { LOCAL = 0 } export declare type Trait = LocalTrait; declare abstract class BaseTrait { abstract tag: TraitTag; } export declare class LocalTrait extends BaseTrait { readonly meta: Metadata; readonly name: string; readonly tag = TraitTag.LOCAL; constructor(meta: Metadata, name: string); } export {};