import type { ScopeInfo, TypeCheckerContext } from "./types.js";
/**
 * Emit a diagnostic for every variable reference that doesn't resolve
 * — `let x = undefinedVar`, `print(missingThing)`, `for (item in
 * notArray)`, etc.
 *
 * Severity is controlled by `config.typechecker.undefinedVariables`:
 *   - "silent" (default): no diagnostics emitted
 *   - "warn":  pushed as warnings
 *   - "error": pushed as errors
 *
 * Resolution is delegated to `resolveVariable` (pure function in
 * resolveVariable.ts) — this module just walks the AST and translates
 * "didn't resolve" into a diagnostic.
 *
 * Skipped contexts (handled by other passes / not actually variable
 * lookups):
 *   - `valueAccess.chain[i].kind === "property"` — property names like
 *     `obj.x` are not variable references; the typechecker checks them
 *     against the base's structural type elsewhere.
 *   - The base of a `valueAccess` is checked here (it's the variable),
 *     but only when it's a `variableName`.
 *   - `functionCall.functionName` is checked by `checkUndefinedFunctions`,
 *     not here.
 *   - The `name` of a `namedArgument` is a parameter name, not a variable.
 *   - Object literal keys (`{ key: value }`) are field names, not
 *     variable refs.
 */
export declare function checkUndefinedVariables(scopes: ScopeInfo[], ctx: TypeCheckerContext): void;
