import type { AgencyNode } from "../types.js"; import type { Tag } from "../types/tag.js"; import type { EffectDeclaration } from "../types/effectDeclaration.js"; /** One node and the `@tag(...)` nodes written directly above it. `node` is * null for tags at the end of a list, which nothing can own. */ export type NodeWithTagsAbove = { node: AgencyNode | null; tags: Tag[]; }; /** * Pair every non-tag node with the tags written directly above it, at every * nesting level, without mutating anything. The preprocessor's `attachTags` * later moves those tags onto the node. The symbol table and the typechecker * run before that and see the raw list, so they use this to read tags the * same way codegen will. Recurses through every statement body (`if` * branches, `match` arms, handlers) via `bodySlots`. */ export declare function tagsAbove(nodes: AgencyNode[]): NodeWithTagsAbove[]; /** Every effect declaration in the program, each carrying the tags written * above it as if the preprocessor had already attached them. A copy, so * running this twice never doubles a tag. */ export declare function effectDeclarationsWithTags(nodes: AgencyNode[]): EffectDeclaration[];