import { Node, Identifier, Reference, Declarator, Expression } from "./ast";
import { IsType } from "./analysis/isType";
export declare type NodeMap<T> = {
    get(global: null): T;
    get(node: Node): T;
    set(node: Node, t: T): any;
};
export declare type ScopeMap = {
    [id: string]: Declarator;
};
export declare type ScopeMaps = NodeMap<ScopeMap>;
export declare class ScopeContext {
    identifiers: Set<String>;
    ancestors: Map<Node, Node>;
    scopes: ScopeMaps;
    isType: IsType;
    constructor(root: any, isType?: boolean);
    isConsequent(a: Expression, b: Expression): boolean | null;
    getParent(node: Node): Node | undefined;
    getAncestor<T>(node: Node, predicate: (node: T) => node is T): T | null;
    /**
     * Returns an array of self and ancestors starting at [self, parent...]
     */
    getAncestorList(node: Node): Node[];
    getDeclarator(node: Reference): any;
    getDeclarator(node: Node, name: string): any;
    getScope(node: Node): ScopeMap;
}
/**
 * Returns a Map which will contain a scope object with variable names returning Declarations.
 * scopes.get(null) will return the global scope
 * @param root the ast
 */
export default function createScopeMaps(root: any, options?: {
    identifiers?: Set<String>;
    ancestorsMap?: Map<Node, Node>;
    implements?: Identifier[][];
}): ScopeMaps;
