export declare class ScopeManager {
    private scopes;
    private scopeTypes;
    private scopeCounts;
    private contextBoundVars;
    private arrayPatternElements;
    private rootParams;
    private localSeriesVars;
    private varKinds;
    private loopVars;
    private loopVarNames;
    private paramIdCounter;
    private cacheIdCounter;
    private tempVarCounter;
    private taCallIdCounter;
    private userCallIdCounter;
    private plotCallIdCounter;
    private alertCallIdCounter;
    private loopGuardCounter;
    private hoistingStack;
    private suppressHoisting;
    private reservedNames;
    private userFunctions;
    private userMethods;
    get nextParamIdArg(): any;
    get nextCacheIdArg(): any;
    getNextTACallId(): any;
    getNextUserCallId(): any;
    getNextPlotCallId(): any;
    getNextAlertCallId(): any;
    getNextLoopGuardName(): string;
    constructor();
    pushScope(type: string): void;
    popScope(): void;
    getCurrentScopeType(): string;
    getCurrentScopeCount(): number;
    addLocalSeriesVar(name: string): void;
    removeLocalSeriesVar(name: string): void;
    isLocalSeriesVar(name: string): boolean;
    addContextBoundVar(name: string, isRootParam?: boolean): void;
    removeContextBoundVar(name: any): void;
    addArrayPatternElement(name: string): void;
    isContextBound(name: string): boolean;
    isArrayPatternElement(name: string): boolean;
    isRootParam(name: string): boolean;
    addLoopVariable(originalName: string, transformedName: string): void;
    removeLoopVariable(originalName: string): void;
    getLoopVariableName(name: string): string | undefined;
    isLoopVariable(name: string): boolean;
    addReservedName(name: string): void;
    addUserFunction(name: string): void;
    isUserFunction(name: string): boolean;
    addUserMethod(name: string): void;
    isUserMethod(name: string): boolean;
    addVariable(name: string, kind: string): string;
    getVariable(name: string): [string, string];
    /**
     * Check if a variable (by original name) lives inside a function scope.
     * Walks the scope stack to find which scope owns the variable, then checks
     * whether any scope from the root up to (and including) that level is a
     * function scope ('fn').  This allows nested scopes (if, else, for, while)
     * inside functions to be correctly treated as function-local.
     */
    isVariableInFunctionScope(name: string): boolean;
    generateTempVar(): string;
    enterHoistingScope(): void;
    exitHoistingScope(): any[];
    addHoistedStatement(stmt: any): void;
    /**
     * Hoist a statement to the script body scope (inside the async IIFE).
     * Used for TA built-in variable auto-calls (e.g. ta.obv) that must run
     * every bar, even when referenced inside conditional blocks.
     *
     * hoistingStack layout for PineTS:
     *   [0] = Program level (outside IIFE — variables not in scope)
     *   [1] = IIFE body level (script's top-level — correct target)
     *   [2+] = inner scopes (if-blocks, loops, etc.)
     */
    addOuterHoistedStatement(stmt: any): void;
    getCurrentHoistingScope(): any[] | null;
    setSuppressHoisting(suppress: boolean): void;
    shouldSuppressHoisting(): boolean;
    hasVariableInScope(name: string): boolean;
    generateParamId(): string;
}
export default ScopeManager;
