import type { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
import type { DataflowGraph } from '../../graph/graph';
import type { ControlFlowGraph } from '../../../control-flow/control-flow-graph';
import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
import { ControlDependency } from '../../info';
/** a resolved `setwd`-style call: its `dir` is `undefined` when it cannot be determined statically */
export interface WorkingDirectoryChange {
    readonly id: NodeId;
    readonly dir: string | undefined;
    readonly cds: readonly ControlDependency[];
    readonly iterated: boolean;
    readonly enclosedInFunction: boolean;
}
/** over-approximating candidate set (empty means unbounded), and whether exactly one directory is guaranteed */
export interface WorkingDirectoryResolution {
    readonly candidates: readonly string[];
    readonly certain: boolean;
}
type Guards = readonly ControlDependency[];
declare function resolveAt(target: NodeId, targetCds: Guards, baseWd: string, changes: readonly WorkingDirectoryChange[], cfg: ControlFlowGraph): WorkingDirectoryResolution;
declare function collect(graph: DataflowGraph, ctx: ReadOnlyFlowrAnalyzerContext): WorkingDirectoryChange[];
/** Resolve R's process-global working directory (sensitive to `setwd`) at a program point; path-sensitive, unbounded rather than wrong under loops/functions. */
export declare const WorkingDirectory: {
    readonly collect: typeof collect;
    readonly resolveAt: typeof resolveAt;
    /** reusable `(callId, scriptFile?) => candidate roots`, collecting the changes once for the whole graph */
    readonly rootsResolver: (graph: DataflowGraph, cfg: ControlFlowGraph, ctx: ReadOnlyFlowrAnalyzerContext) => (id: NodeId, file?: string) => readonly string[];
};
export {};
