import { FormatGenerator } from "../generators/index.js";
import { GirVisitor } from "../visitor.js";
import { IntrospectedNamespace } from "./namespace.js";
import type { IntrospectedBaseClass } from "./nodes.js";
import type { OptionsLoad } from "../types/index.js";
export interface Metadata {
    deprecated?: boolean;
    deprecatedVersion?: string;
    deprecatedDoc?: string;
    introducedVersion?: string;
}
export interface BaseOptions {
    isPrivate?: boolean;
    isIntrospectable?: boolean;
    doc?: string | null;
}
export type Options<T> = BaseOptions & T;
export type AnyIntrospectedType = IntrospectedBase<any>;
export declare abstract class IntrospectedBase<Parent extends IntrospectedNamespace | AnyIntrospectedType | null> {
    name: string;
    doc?: string | null;
    metadata?: Metadata;
    deprecated?: boolean;
    resolve_names: string[];
    private _emit;
    private _commentWarning?;
    private _isPrivate;
    private _isIntrospectable;
    private _parent;
    constructor(name: string, parent: Parent, options?: BaseOptions);
    get parent(): Parent;
    /**
     * Set a warning to be emitted with this node. Often used to note type
     * conflicts or potential differences from GJS code.
     *
     * @param warning
     */
    setWarning(warning: string): void;
    getWarning(): string | undefined;
    abstract get namespace(): IntrospectedNamespace;
    get isIntrospectable(): boolean;
    get isPrivate(): boolean;
    setPrivate(priv: boolean): void;
    noEmit(): void;
    get emit(): boolean;
    protected _copyBaseProperties(from: this): this;
    abstract copy(options?: {
        parent?: Parent;
    }): IntrospectedBase<Parent>;
    abstract accept(visitor: GirVisitor): IntrospectedBase<Parent>;
    static fromXML(element: Record<string, any>, parent: IntrospectedNamespace | AnyIntrospectedType, options: OptionsLoad): AnyIntrospectedType | null;
    abstract asString<T extends FormatGenerator<unknown>>(generator: T): (T extends FormatGenerator<infer R> ? R : never) | null;
    abstract asString<T extends FormatGenerator<unknown>>(generator: T): unknown;
}
export declare abstract class IntrospectedNamespaceMember extends IntrospectedBase<IntrospectedNamespace> {
    constructor(name: string, namespace: IntrospectedNamespace, options?: BaseOptions);
    get namespace(): IntrospectedNamespace;
    static fromXML(element: Record<string, any>, parent: IntrospectedNamespace, options: OptionsLoad): IntrospectedNamespaceMember | null;
}
export declare abstract class IntrospectedClassMember<Parent extends IntrospectedBaseClass | null = IntrospectedBaseClass | null> extends IntrospectedBase<Parent> {
    get namespace(): IntrospectedNamespace;
}
