sqllens 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/api.d.ts +5 -1
  2. package/dist/api.js +7 -0
  3. package/dist/bigquery/reserved.generated.d.ts +2 -0
  4. package/dist/bigquery/reserved.generated.js +325 -0
  5. package/dist/completion/complete.d.ts +68 -1
  6. package/dist/completion/complete.js +88 -33
  7. package/dist/databricks/infer.js +24 -6
  8. package/dist/databricks/lower.js +161 -9
  9. package/dist/databricks/reserved.generated.d.ts +2 -0
  10. package/dist/databricks/reserved.generated.js +426 -0
  11. package/dist/dialect-symbols.d.ts +35 -3
  12. package/dist/dialect-symbols.js +54 -2
  13. package/dist/document/document.d.ts +26 -1
  14. package/dist/document/document.js +158 -8
  15. package/dist/document/node-at.js +8 -5
  16. package/dist/duckdb/reserved.generated.d.ts +2 -0
  17. package/dist/duckdb/reserved.generated.js +560 -0
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.js +1 -1
  20. package/dist/infer/infer.js +16 -5
  21. package/dist/ir/ir.d.ts +36 -0
  22. package/dist/ir/walk.d.ts +8 -1
  23. package/dist/ir/walk.js +12 -1
  24. package/dist/mysql/reserved.generated.d.ts +2 -0
  25. package/dist/mysql/reserved.generated.js +1120 -0
  26. package/dist/postgres/reserved.generated.d.ts +2 -0
  27. package/dist/postgres/reserved.generated.js +534 -0
  28. package/dist/redshift/reserved.generated.d.ts +2 -0
  29. package/dist/redshift/reserved.generated.js +827 -0
  30. package/dist/scope/clauses.d.ts +19 -0
  31. package/dist/scope/clauses.js +204 -0
  32. package/dist/scope/frame.d.ts +16 -0
  33. package/dist/scope/frame.js +51 -0
  34. package/dist/scope/scope.d.ts +30 -1
  35. package/dist/scope/scope.js +42 -2
  36. package/dist/scope/setop-arms.d.ts +16 -0
  37. package/dist/scope/setop-arms.js +32 -0
  38. package/dist/scope/walk.js +10 -5
  39. package/dist/session.d.ts +9 -2
  40. package/dist/session.js +12 -2
  41. package/dist/snowflake/lower.js +138 -15
  42. package/dist/snowflake/reserved.generated.d.ts +2 -0
  43. package/dist/snowflake/reserved.generated.js +938 -0
  44. package/dist/sqlite/reserved.generated.d.ts +2 -0
  45. package/dist/sqlite/reserved.generated.js +155 -0
  46. package/dist/symbols/symbols.d.ts +10 -0
  47. package/dist/symbols/symbols.js +192 -76
  48. package/dist/trino/reserved.generated.d.ts +2 -0
  49. package/dist/trino/reserved.generated.js +313 -0
  50. package/dist/tsql/lower.js +235 -4
  51. package/dist/tsql/reserved.generated.d.ts +2 -0
  52. package/dist/tsql/reserved.generated.js +1185 -0
  53. package/package.json +1 -1
package/dist/api.d.ts CHANGED
@@ -116,14 +116,18 @@ export type { Token, TokenRole } from "./token/token.js";
116
116
  export { SqlDocument, type DocumentAnalysis, type StatementCell, type DocumentVariant, type UnionCte, } from "./document/document.js";
117
117
  export { LineIndex } from "./document/line-index.js";
118
118
  export type { StatementCellSpan } from "./document/split.js";
119
- export { complete, completeAt, type Completion, type CompletionResult, type ReplaceRange, } from "./completion/complete.js";
119
+ export { complete, completeAt, type Completion, type CompletionResult, type ReplaceRange, type CompleteOptions, type CandidateIdentity, type CandidateDecoration, type DecorateCandidate, } from "./completion/complete.js";
120
120
  export { jinjaSlotAt, type JinjaSlot } from "./completion/jinja-slot.js";
121
121
  export { signatureAt, type SignatureHelpInfo, type SignatureLabel } from "./signature/signature.js";
122
122
  export { SIGNATURES, lookupSignature, hasSignature, type FnSignature, type ParamSig } from "./signature/signatures.js";
123
123
  export { renderSignature, type RenderSignatureOptions } from "./signature/render.js";
124
124
  export { FN_DOCS, lookupFnDoc, type FnDoc } from "./signature/docs.js";
125
125
  export { referencesAt, type Occurrence, type Occurrences } from "./references/references.js";
126
+ export { frameAt, type Frame } from "./scope/frame.js";
127
+ export { clausesOf, type ClauseInfo, type ClauseKind } from "./scope/clauses.js";
128
+ export { setOpArmsOf, type SetOpArm, type SetOpArms } from "./scope/setop-arms.js";
126
129
  export { dialectSymbols, dialectVocabulary, type DialectSymbols, type DialectVocabulary } from "./dialect-symbols.js";
130
+ export { reservedKeywords, type KeywordEntry, type KeywordReservation } from "./dialect-symbols.js";
127
131
  export { CallbackSchema, type SchemaProvider, type TableResolver } from "./qualify/schema-provider.js";
128
132
  export { DERIVED_DIALECTS, resolveDialect } from "./derived-dialects.js";
129
133
  export { foldIdentifier, displayName } from "./dialect-behavior/public-fold.js";
package/dist/api.js CHANGED
@@ -223,9 +223,16 @@ export { FN_DOCS, lookupFnDoc } from "./signature/docs.js";
223
223
  // cursor offset. The core primitive behind LSP references / documentHighlight / codeLens / rename.
224
224
  // Total: never throws; returns null off-symbol.
225
225
  export { referencesAt } from "./references/references.js";
226
+ // Frame / clause / set-op-arm geometry: the SQL debugger's marker-planting primitives, which frame
227
+ // (CTE) a document position sits in, that frame's ordered clause list, and set-op arm spans. Total:
228
+ // never throws; frameAt/clausesOf/setOpArmsOf all degrade to undefined/[] off-symbol or off-shape.
229
+ export { frameAt } from "./scope/frame.js";
230
+ export { clausesOf } from "./scope/clauses.js";
231
+ export { setOpArmsOf } from "./scope/setop-arms.js";
226
232
  // Per-dialect function/keyword/type-name membership sets — for lint-style "is this identifier a
227
233
  // known X for this dialect?" checks. Computed once per dialect and cached.
228
234
  export { dialectSymbols, dialectVocabulary } from "./dialect-symbols.js";
235
+ export { reservedKeywords } from "./dialect-symbols.js";
229
236
  // The catalog interface the whole pipeline resolves against, plus its resolve-on-demand
230
237
  // implementation. `Schema` (a full upfront mapping) and `CallbackSchema` (a host-driven
231
238
  // lazy resolver whose prime() bumps a version to invalidate SqlDocument.analyze's memo) both
@@ -0,0 +1,2 @@
1
+ import type { KeywordReservation } from "../dialect-symbols.js";
2
+ export declare const BIGQUERY_RESERVED: Record<string, KeywordReservation>;
@@ -0,0 +1,325 @@
1
+ export const BIGQUERY_RESERVED = {
2
+ ABORT: { reserved: false, alias: true, column: true, table: true },
3
+ ACCESS: { reserved: false, alias: true, column: true, table: true },
4
+ ACTION: { reserved: false, alias: true, column: true, table: true },
5
+ ACYCLIC: { reserved: false, alias: true, column: true, table: true },
6
+ ADD: { reserved: false, alias: true, column: true, table: true },
7
+ AFTER: { reserved: false, alias: true, column: true, table: true },
8
+ AGGREGATE: { reserved: false, alias: true, column: true, table: true },
9
+ ALL: { reserved: true, alias: false, column: false, table: false },
10
+ ALTER: { reserved: false, alias: true, column: true, table: true },
11
+ ALWAYS: { reserved: false, alias: true, column: true, table: true },
12
+ ANALYZE: { reserved: false, alias: true, column: true, table: true },
13
+ AND: { reserved: true, alias: false, column: false, table: false },
14
+ ANY: { reserved: true, alias: false, column: false, table: false },
15
+ APPROX: { reserved: false, alias: true, column: true, table: true },
16
+ ARE: { reserved: false, alias: true, column: true, table: true },
17
+ ARRAY: { reserved: true, alias: false, column: false, table: false },
18
+ AS: { reserved: true, alias: false, column: false, table: false },
19
+ ASC: { reserved: true, alias: false, column: false, table: false },
20
+ ASCENDING: { reserved: false, alias: true, column: true, table: true },
21
+ ASSERT: { reserved: false, alias: true, column: true, table: true },
22
+ ASSERT_ROWS_MODIFIED: { reserved: true, alias: false, column: false, table: false },
23
+ AT: { reserved: false, alias: true, column: true, table: true },
24
+ BATCH: { reserved: false, alias: true, column: true, table: true },
25
+ BEGIN: { reserved: false, alias: true, column: true, table: true },
26
+ BETWEEN: { reserved: true, alias: false, column: false, table: false },
27
+ BIGDECIMAL: { reserved: false, alias: true, column: true, table: true },
28
+ BIGNUMERIC: { reserved: false, alias: true, column: true, table: true },
29
+ BREAK: { reserved: false, alias: true, column: true, table: true },
30
+ BY: { reserved: true, alias: false, column: false, table: false },
31
+ CALL: { reserved: false, alias: true, column: true, table: true },
32
+ CASCADE: { reserved: false, alias: true, column: true, table: true },
33
+ CASE: { reserved: true, alias: false, column: false, table: false },
34
+ CAST: { reserved: true, alias: false, column: false, table: false },
35
+ CHEAPEST: { reserved: false, alias: true, column: true, table: true },
36
+ CHECK: { reserved: false, alias: true, column: true, table: true },
37
+ CLAMPED: { reserved: false, alias: true, column: true, table: true },
38
+ CLONE: { reserved: false, alias: true, column: true, table: true },
39
+ CLUSTER: { reserved: false, alias: true, column: true, table: true },
40
+ COLLATE: { reserved: true, alias: false, column: false, table: false },
41
+ COLUMN: { reserved: false, alias: true, column: true, table: true },
42
+ COLUMNS: { reserved: false, alias: true, column: true, table: true },
43
+ COMMIT: { reserved: false, alias: true, column: true, table: true },
44
+ CONFLICT: { reserved: false, alias: true, column: true, table: true },
45
+ CONNECTION: { reserved: false, alias: true, column: true, table: true },
46
+ CONSTANT: { reserved: false, alias: true, column: true, table: true },
47
+ CONSTRAINT: { reserved: false, alias: true, column: true, table: true },
48
+ CONTINUE: { reserved: false, alias: true, column: true, table: true },
49
+ COPY: { reserved: false, alias: true, column: true, table: true },
50
+ CORRESPONDING: { reserved: false, alias: true, column: true, table: true },
51
+ COST: { reserved: false, alias: true, column: true, table: true },
52
+ CREATE: { reserved: true, alias: false, column: false, table: false },
53
+ CROSS: { reserved: true, alias: false, column: false, table: false },
54
+ CUBE: { reserved: true, alias: false, column: false, table: false },
55
+ CURRENT: { reserved: true, alias: false, column: false, table: false },
56
+ CYCLE: { reserved: false, alias: true, column: true, table: true },
57
+ DATA: { reserved: false, alias: true, column: true, table: true },
58
+ DATABASE: { reserved: false, alias: true, column: true, table: true },
59
+ DATE: { reserved: false, alias: true, column: true, table: true },
60
+ DATETIME: { reserved: false, alias: true, column: true, table: true },
61
+ DECIMAL: { reserved: false, alias: true, column: true, table: true },
62
+ DECLARE: { reserved: false, alias: true, column: true, table: true },
63
+ DEFAULT: { reserved: true, alias: false, column: false, table: false },
64
+ DEFINE: { reserved: true, alias: false, column: false, table: false },
65
+ DEFINER: { reserved: false, alias: true, column: true, table: true },
66
+ DELETE: { reserved: false, alias: true, column: true, table: true },
67
+ DELETION: { reserved: false, alias: true, column: true, table: true },
68
+ DELTA: { reserved: false, alias: true, column: true, table: true },
69
+ DEPTH: { reserved: false, alias: true, column: true, table: true },
70
+ DESC: { reserved: true, alias: false, column: false, table: false },
71
+ DESCENDING: { reserved: false, alias: true, column: true, table: true },
72
+ DESCRIBE: { reserved: false, alias: true, column: true, table: true },
73
+ DESCRIPTOR: { reserved: false, alias: true, column: true, table: true },
74
+ DESTINATION: { reserved: false, alias: true, column: true, table: true },
75
+ DETERMINISTIC: { reserved: false, alias: true, column: true, table: true },
76
+ DIFFERENTIAL_PRIVACY: { reserved: false, alias: true, column: true, table: true },
77
+ DISTINCT: { reserved: true, alias: false, column: false, table: false },
78
+ DO: { reserved: false, alias: true, column: true, table: true },
79
+ DROP: { reserved: false, alias: true, column: true, table: true },
80
+ DYNAMIC: { reserved: false, alias: true, column: true, table: true },
81
+ EDGE: { reserved: false, alias: true, column: true, table: true },
82
+ ELSE: { reserved: true, alias: false, column: false, table: false },
83
+ ELSEIF: { reserved: false, alias: true, column: true, table: true },
84
+ END: { reserved: true, alias: false, column: false, table: false },
85
+ ENFORCED: { reserved: false, alias: true, column: true, table: true },
86
+ ENUM: { reserved: true, alias: false, column: false, table: false },
87
+ EPSILON: { reserved: false, alias: true, column: true, table: true },
88
+ ERROR: { reserved: false, alias: true, column: true, table: true },
89
+ EXCEPT: { reserved: true, alias: false, column: false, table: false },
90
+ EXCEPTION: { reserved: false, alias: true, column: true, table: true },
91
+ EXCLUDE: { reserved: true, alias: false, column: false, table: false },
92
+ EXECUTE: { reserved: false, alias: true, column: true, table: true },
93
+ EXISTS: { reserved: true, alias: false, column: false, table: false },
94
+ EXPLAIN: { reserved: false, alias: true, column: true, table: true },
95
+ EXPORT: { reserved: false, alias: true, column: true, table: true },
96
+ EXTEND: { reserved: false, alias: true, column: true, table: true },
97
+ EXTERNAL: { reserved: false, alias: true, column: true, table: true },
98
+ EXTRACT: { reserved: true, alias: false, column: false, table: false },
99
+ FALSE: { reserved: false, alias: false, column: true, table: false },
100
+ FILES: { reserved: false, alias: true, column: true, table: true },
101
+ FILL: { reserved: false, alias: true, column: true, table: true },
102
+ FILTER: { reserved: false, alias: true, column: true, table: true },
103
+ FIRST: { reserved: false, alias: true, column: true, table: true },
104
+ FOLLOWING: { reserved: true, alias: false, column: false, table: false },
105
+ FOR: { reserved: true, alias: false, column: false, table: false },
106
+ FOREIGN: { reserved: false, alias: true, column: true, table: true },
107
+ FORK: { reserved: false, alias: true, column: true, table: true },
108
+ FORMAT: { reserved: false, alias: true, column: true, table: true },
109
+ FROM: { reserved: true, alias: false, column: false, table: false },
110
+ FULL: { reserved: true, alias: false, column: false, table: false },
111
+ FUNCTION: { reserved: false, alias: true, column: true, table: true },
112
+ GENERATED: { reserved: false, alias: true, column: true, table: true },
113
+ GRANT: { reserved: false, alias: true, column: true, table: true },
114
+ GRAPH: { reserved: false, alias: true, column: true, table: true },
115
+ GRAPH_TABLE: { reserved: false, alias: true, column: true, table: true },
116
+ GROUP: { reserved: true, alias: false, column: false, table: false },
117
+ GROUPING: { reserved: true, alias: false, column: false, table: false },
118
+ GROUP_ROWS: { reserved: false, alias: true, column: true, table: true },
119
+ HASH: { reserved: true, alias: false, column: false, table: false },
120
+ HAVING: { reserved: true, alias: false, column: false, table: false },
121
+ HIDDEN: { reserved: false, alias: true, column: true, table: true },
122
+ IDENTITY: { reserved: false, alias: true, column: true, table: true },
123
+ IF: { reserved: true, alias: false, column: false, table: false },
124
+ IGNORE: { reserved: true, alias: false, column: false, table: false },
125
+ IMMEDIATE: { reserved: false, alias: true, column: true, table: true },
126
+ IMMUTABLE: { reserved: false, alias: true, column: true, table: true },
127
+ IMPORT: { reserved: false, alias: true, column: true, table: true },
128
+ IN: { reserved: true, alias: false, column: false, table: false },
129
+ INCLUDE: { reserved: false, alias: true, column: true, table: true },
130
+ INCREMENT: { reserved: false, alias: true, column: true, table: true },
131
+ INDEX: { reserved: false, alias: true, column: true, table: true },
132
+ INNER: { reserved: true, alias: false, column: false, table: false },
133
+ INOUT: { reserved: false, alias: true, column: true, table: true },
134
+ INPUT: { reserved: false, alias: true, column: true, table: true },
135
+ INSERT: { reserved: false, alias: true, column: true, table: true },
136
+ INTERLEAVE: { reserved: false, alias: true, column: true, table: true },
137
+ INTERSECT: { reserved: true, alias: false, column: false, table: false },
138
+ INTERVAL: { reserved: true, alias: false, column: false, table: false },
139
+ INTO: { reserved: true, alias: false, column: false, table: false },
140
+ INVOKER: { reserved: false, alias: true, column: true, table: true },
141
+ IS: { reserved: true, alias: false, column: false, table: false },
142
+ ISOLATION: { reserved: false, alias: true, column: true, table: true },
143
+ ITERATE: { reserved: false, alias: true, column: true, table: true },
144
+ JOIN: { reserved: true, alias: false, column: false, table: false },
145
+ JSON: { reserved: false, alias: true, column: true, table: true },
146
+ KEY: { reserved: false, alias: true, column: true, table: true },
147
+ KW_MATCH_RECOGNIZE_NONRESERVED: { reserved: false, alias: true, column: true, table: true },
148
+ LABEL: { reserved: false, alias: true, column: true, table: true },
149
+ LABELED: { reserved: false, alias: true, column: true, table: true },
150
+ LANGUAGE: { reserved: false, alias: true, column: true, table: true },
151
+ LAST: { reserved: false, alias: true, column: true, table: true },
152
+ LATERAL: { reserved: true, alias: false, column: false, table: false },
153
+ LEAVE: { reserved: false, alias: true, column: true, table: true },
154
+ LEFT: { reserved: true, alias: false, column: false, table: false },
155
+ LET: { reserved: false, alias: true, column: true, table: true },
156
+ LEVEL: { reserved: false, alias: true, column: true, table: true },
157
+ LIKE: { reserved: true, alias: false, column: false, table: false },
158
+ LIMIT: { reserved: true, alias: false, column: false, table: false },
159
+ LOAD: { reserved: false, alias: true, column: true, table: true },
160
+ LOG: { reserved: false, alias: true, column: true, table: true },
161
+ LOOKUP: { reserved: true, alias: false, column: false, table: false },
162
+ LOOP: { reserved: false, alias: true, column: true, table: true },
163
+ MACRO: { reserved: false, alias: true, column: true, table: true },
164
+ MAP: { reserved: false, alias: true, column: true, table: true },
165
+ MATCH: { reserved: false, alias: true, column: true, table: true },
166
+ MATCHED: { reserved: false, alias: true, column: true, table: true },
167
+ MATCH_RECOGNIZE: { reserved: true, alias: false, column: false, table: false },
168
+ MATERIALIZED: { reserved: false, alias: true, column: true, table: true },
169
+ MAX: { reserved: false, alias: true, column: true, table: true },
170
+ MAXVALUE: { reserved: false, alias: true, column: true, table: true },
171
+ MAX_GROUPS_CONTRIBUTED: { reserved: false, alias: true, column: true, table: true },
172
+ MEASURES: { reserved: false, alias: true, column: true, table: true },
173
+ MERGE: { reserved: true, alias: false, column: false, table: false },
174
+ MESSAGE: { reserved: false, alias: true, column: true, table: true },
175
+ METADATA: { reserved: false, alias: true, column: true, table: true },
176
+ MIN: { reserved: false, alias: true, column: true, table: true },
177
+ MINVALUE: { reserved: false, alias: true, column: true, table: true },
178
+ MODEL: { reserved: false, alias: true, column: true, table: true },
179
+ MODULE: { reserved: false, alias: true, column: true, table: true },
180
+ NAME: { reserved: false, alias: true, column: true, table: true },
181
+ NATURAL: { reserved: true, alias: false, column: false, table: false },
182
+ NEW: { reserved: true, alias: false, column: false, table: false },
183
+ NEXT: { reserved: false, alias: true, column: true, table: true },
184
+ NO: { reserved: true, alias: false, column: false, table: false },
185
+ NODE: { reserved: false, alias: true, column: true, table: true },
186
+ NOT: { reserved: true, alias: false, column: false, table: false },
187
+ NOTHING: { reserved: true, alias: false, column: false, table: false },
188
+ NULL: { reserved: false, alias: false, column: true, table: false },
189
+ NULLS: { reserved: true, alias: false, column: false, table: false },
190
+ NULL_FILTERED: { reserved: false, alias: true, column: true, table: true },
191
+ NUMERIC: { reserved: false, alias: true, column: true, table: true },
192
+ OF: { reserved: true, alias: false, column: false, table: false },
193
+ OFFSET: { reserved: false, alias: true, column: true, table: true },
194
+ ON: { reserved: true, alias: false, column: false, table: false },
195
+ ONLY: { reserved: false, alias: true, column: true, table: true },
196
+ OPTIONAL: { reserved: false, alias: true, column: true, table: true },
197
+ OPTIONS: { reserved: false, alias: true, column: true, table: true },
198
+ OR: { reserved: true, alias: false, column: false, table: false },
199
+ ORDER: { reserved: true, alias: false, column: false, table: false },
200
+ OUT: { reserved: false, alias: true, column: true, table: true },
201
+ OUTER: { reserved: true, alias: false, column: false, table: false },
202
+ OUTPUT: { reserved: false, alias: true, column: true, table: true },
203
+ OVER: { reserved: true, alias: false, column: false, table: false },
204
+ OVERWRITE: { reserved: false, alias: true, column: true, table: true },
205
+ PARENT: { reserved: false, alias: true, column: true, table: true },
206
+ PARTITION: { reserved: true, alias: false, column: false, table: false },
207
+ PARTITIONS: { reserved: false, alias: true, column: true, table: true },
208
+ PAST: { reserved: false, alias: true, column: true, table: true },
209
+ PATH: { reserved: false, alias: true, column: true, table: true },
210
+ PATHS: { reserved: false, alias: true, column: true, table: true },
211
+ PATTERN: { reserved: false, alias: true, column: true, table: true },
212
+ PER: { reserved: false, alias: true, column: true, table: true },
213
+ PERCENT: { reserved: false, alias: true, column: true, table: true },
214
+ PIVOT: { reserved: false, alias: true, column: true, table: true },
215
+ POLICIES: { reserved: false, alias: true, column: true, table: true },
216
+ POLICY: { reserved: false, alias: true, column: true, table: true },
217
+ PRECEDING: { reserved: true, alias: false, column: false, table: false },
218
+ PRIMARY: { reserved: false, alias: true, column: true, table: true },
219
+ PRIVACY_UNIT_COLUMN: { reserved: false, alias: true, column: true, table: true },
220
+ PRIVATE: { reserved: false, alias: true, column: true, table: true },
221
+ PRIVILEGE: { reserved: false, alias: true, column: true, table: true },
222
+ PRIVILEGES: { reserved: false, alias: true, column: true, table: true },
223
+ PROCEDURE: { reserved: false, alias: true, column: true, table: true },
224
+ PROJECT: { reserved: false, alias: true, column: true, table: true },
225
+ PROPERTIES: { reserved: false, alias: true, column: true, table: true },
226
+ PROPERTY: { reserved: false, alias: true, column: true, table: true },
227
+ PROTO: { reserved: true, alias: false, column: false, table: false },
228
+ PUBLIC: { reserved: false, alias: true, column: true, table: true },
229
+ QUALIFY: { reserved: true, alias: false, column: false, table: false },
230
+ RAISE: { reserved: false, alias: true, column: true, table: true },
231
+ RANGE: { reserved: true, alias: false, column: false, table: false },
232
+ READ: { reserved: false, alias: true, column: true, table: true },
233
+ RECURSIVE: { reserved: true, alias: false, column: false, table: false },
234
+ REFERENCES: { reserved: false, alias: true, column: true, table: true },
235
+ REMOTE: { reserved: false, alias: true, column: true, table: true },
236
+ REMOVE: { reserved: false, alias: true, column: true, table: true },
237
+ RENAME: { reserved: false, alias: true, column: true, table: true },
238
+ REPEAT: { reserved: false, alias: true, column: true, table: true },
239
+ REPEATABLE: { reserved: false, alias: true, column: true, table: true },
240
+ REPLACE: { reserved: false, alias: true, column: true, table: true },
241
+ REPLACE_FIELDS: { reserved: false, alias: true, column: true, table: true },
242
+ REPLICA: { reserved: false, alias: true, column: true, table: true },
243
+ REPORT: { reserved: false, alias: true, column: true, table: true },
244
+ RESPECT: { reserved: true, alias: false, column: false, table: false },
245
+ RESTRICT: { reserved: false, alias: true, column: true, table: true },
246
+ RESTRICTION: { reserved: false, alias: true, column: true, table: true },
247
+ RETURN: { reserved: false, alias: true, column: true, table: true },
248
+ RETURNS: { reserved: false, alias: true, column: true, table: true },
249
+ REVOKE: { reserved: false, alias: true, column: true, table: true },
250
+ RIGHT: { reserved: true, alias: false, column: false, table: false },
251
+ ROLLBACK: { reserved: false, alias: true, column: true, table: true },
252
+ ROLLUP: { reserved: true, alias: false, column: false, table: false },
253
+ ROW: { reserved: false, alias: true, column: true, table: true },
254
+ ROWS: { reserved: true, alias: false, column: false, table: false },
255
+ RUN: { reserved: false, alias: true, column: true, table: true },
256
+ SAFE_CAST: { reserved: false, alias: true, column: true, table: true },
257
+ SCHEMA: { reserved: false, alias: true, column: true, table: true },
258
+ SEARCH: { reserved: false, alias: true, column: true, table: true },
259
+ SECURITY: { reserved: false, alias: true, column: true, table: true },
260
+ SELECT: { reserved: true, alias: false, column: false, table: false },
261
+ SEQUENCE: { reserved: false, alias: true, column: true, table: true },
262
+ SET: { reserved: true, alias: false, column: false, table: false },
263
+ SETS: { reserved: false, alias: true, column: true, table: true },
264
+ SHORTEST: { reserved: true, alias: false, column: false, table: false },
265
+ SHOW: { reserved: false, alias: true, column: true, table: true },
266
+ SIMPLE: { reserved: false, alias: true, column: true, table: true },
267
+ SKIP: { reserved: false, alias: true, column: true, table: true },
268
+ SLASH: { reserved: true, alias: false, column: false, table: false },
269
+ SNAPSHOT: { reserved: false, alias: true, column: true, table: true },
270
+ SOME: { reserved: true, alias: false, column: false, table: false },
271
+ SOURCE: { reserved: false, alias: true, column: true, table: true },
272
+ SQL: { reserved: false, alias: true, column: true, table: true },
273
+ STABLE: { reserved: false, alias: true, column: true, table: true },
274
+ START: { reserved: false, alias: true, column: true, table: true },
275
+ STATIC_DESCRIBE: { reserved: false, alias: true, column: true, table: true },
276
+ STORED: { reserved: false, alias: true, column: true, table: true },
277
+ STORING: { reserved: false, alias: true, column: true, table: true },
278
+ STRICT: { reserved: false, alias: true, column: true, table: true },
279
+ STRUCT: { reserved: true, alias: false, column: false, table: false },
280
+ SYSTEM: { reserved: false, alias: true, column: true, table: true },
281
+ SYSTEM_TIME: { reserved: false, alias: true, column: true, table: true },
282
+ TABLE: { reserved: false, alias: true, column: true, table: true },
283
+ TABLES: { reserved: false, alias: true, column: true, table: true },
284
+ TABLESAMPLE: { reserved: true, alias: false, column: false, table: false },
285
+ TARGET: { reserved: false, alias: true, column: true, table: true },
286
+ TEE: { reserved: false, alias: true, column: true, table: true },
287
+ TEMP: { reserved: false, alias: true, column: true, table: true },
288
+ TEMPORARY: { reserved: false, alias: true, column: true, table: true },
289
+ THEN: { reserved: true, alias: false, column: false, table: false },
290
+ TIME: { reserved: false, alias: true, column: true, table: true },
291
+ TIMESTAMP: { reserved: false, alias: true, column: true, table: true },
292
+ TO: { reserved: true, alias: false, column: false, table: false },
293
+ TRAIL: { reserved: false, alias: true, column: true, table: true },
294
+ TRANSACTION: { reserved: false, alias: true, column: true, table: true },
295
+ TRANSFORM: { reserved: false, alias: true, column: true, table: true },
296
+ TRUE: { reserved: false, alias: false, column: true, table: false },
297
+ TRUNCATE: { reserved: false, alias: true, column: true, table: true },
298
+ TYPE: { reserved: false, alias: true, column: true, table: true },
299
+ UNBOUNDED: { reserved: true, alias: false, column: false, table: false },
300
+ UNDROP: { reserved: false, alias: true, column: true, table: true },
301
+ UNION: { reserved: true, alias: false, column: false, table: false },
302
+ UNIQUE: { reserved: false, alias: true, column: true, table: true },
303
+ UNKNOWN: { reserved: false, alias: true, column: true, table: true },
304
+ UNNEST: { reserved: true, alias: false, column: false, table: false },
305
+ UNPIVOT: { reserved: false, alias: true, column: true, table: true },
306
+ UNTIL: { reserved: false, alias: true, column: true, table: true },
307
+ UPDATE: { reserved: false, alias: true, column: true, table: true },
308
+ USING: { reserved: true, alias: false, column: false, table: false },
309
+ VALUE: { reserved: false, alias: true, column: true, table: true },
310
+ VALUES: { reserved: false, alias: true, column: true, table: true },
311
+ VECTOR: { reserved: false, alias: true, column: true, table: true },
312
+ VIEW: { reserved: false, alias: true, column: true, table: true },
313
+ VIEWS: { reserved: false, alias: true, column: true, table: true },
314
+ VOLATILE: { reserved: false, alias: true, column: true, table: true },
315
+ WALK: { reserved: false, alias: true, column: true, table: true },
316
+ WEIGHT: { reserved: false, alias: true, column: true, table: true },
317
+ WHEN: { reserved: true, alias: false, column: false, table: false },
318
+ WHERE: { reserved: true, alias: false, column: false, table: false },
319
+ WHILE: { reserved: false, alias: true, column: true, table: true },
320
+ WINDOW: { reserved: true, alias: false, column: false, table: false },
321
+ WITH: { reserved: true, alias: false, column: false, table: false },
322
+ WRITE: { reserved: false, alias: true, column: true, table: true },
323
+ YIELD: { reserved: false, alias: true, column: true, table: true },
324
+ ZONE: { reserved: false, alias: true, column: true, table: true },
325
+ };
@@ -1,5 +1,8 @@
1
1
  import type { SqlDocument } from "../document/document.js";
2
+ import { type PartSpan } from "../ir/part-span.js";
2
3
  import type { SchemaProvider } from "../qualify/schema-provider.js";
4
+ import { type TemplateCall } from "../qualify/template-provider.js";
5
+ import { type ResolvedSource } from "../scope/scope.js";
3
6
  /** One completion candidate, already pruned to the typed prefix (2026-07-12 ruling) and applied at
4
7
  * the caret / `CompletionResult.replaceRange`. The `"template"` kind is a host candidate for a
5
8
  * jinja call slot (a dbt model for a ref's arg) — its own, separately-decided contract (the
@@ -9,6 +12,10 @@ export interface Completion {
9
12
  kind: "keyword" | "column" | "table" | "cte" | "namespace" | "function" | "template";
10
13
  /** Extra display info, e.g. a column's type when the schema knows it. */
11
14
  detail?: string;
15
+ /** Long-form documentation for the candidate. completeAt's own resolution never fills this in —
16
+ * it is set ONLY by a `decorate` hook (CompleteOptions.decorate) answering one. Absent when no
17
+ * hook ran, or the hook answered nothing for this candidate. */
18
+ documentation?: string;
12
19
  }
13
20
  /** The caret-anchored span of the partial identifier/keyword the candidates were pruned against —
14
21
  * `text.slice(start, end)` is what's already typed. `start` includes an opening delimiter when the
@@ -29,12 +36,72 @@ export interface ReplaceRange {
29
36
  export interface CompletionResult extends Array<Completion> {
30
37
  replaceRange?: ReplaceRange;
31
38
  }
39
+ /** The decoration hook's answer for ONE candidate — display text supplied from real structure,
40
+ * merged onto the Completion completeAt is about to return. Every field optional: an absent field
41
+ * leaves that part of the candidate as completeAt itself produced it (a schema-fed column's own
42
+ * `detail` survives unless the hook overrides it); returning nothing at all leaves the candidate
43
+ * wholly undecorated. */
44
+ export interface CandidateDecoration {
45
+ detail?: string;
46
+ documentation?: string;
47
+ }
48
+ /**
49
+ * The STRUCTURAL identity of a candidate completeAt is about to return — anvil's decoration-hook ask
50
+ * (channel, 2026-07-20): "hand back STRUCTURAL identity, not just the label string". Discriminated by
51
+ * the candidate's own `kind`. Every extra field is present ONLY when completeAt's own resolution
52
+ * already produced it (never-wrong: nothing here is synthesized or re-derived) — e.g. a "column"
53
+ * candidate from the broken-input FROM/JOIN token-stream fallback (fromRelationColumns /
54
+ * qualifiedFallbackColumns) carries no `source`, because no ResolvedSource exists on that path.
55
+ *
56
+ * `"template"` covers the jinja call-slot candidates (a dbt model name for a `ref('|` arg, a source
57
+ * name for `source('|`) — the "table candidate that resolves through a templated call" from the
58
+ * ask: its `call` is the SAME TemplateCall (`JinjaSlot.call`) `templateCandidates` was already asked
59
+ * with, so a consumer names the model/source without re-parsing the call text.
60
+ */
61
+ export type CandidateIdentity = {
62
+ kind: "keyword";
63
+ } | {
64
+ kind: "function";
65
+ } | {
66
+ kind: "namespace";
67
+ } | {
68
+ kind: "table";
69
+ } | {
70
+ kind: "cte";
71
+ /** The CTE name's own declaration span (`CteDef.nameCst`, falling back to the whole
72
+ * `CteDef.cst` when the name has no real token) — pins the RIGHT declaration even when
73
+ * another CTE of the same name shadows it in a nested scope. Absent only when the CTE
74
+ * itself has no real token to key on (a broken/nameless mid-edit CTE). */
75
+ declarationSpan?: PartSpan;
76
+ } | {
77
+ kind: "column";
78
+ /** The resolved scope source this column came from (the same ResolvedSource
79
+ * scope/qualify already produced — a table/CTE/subquery/lateral/relation/graphtable/pivot).
80
+ * Absent when the column came from the broken-input token-stream fallback, which has no
81
+ * ResolvedSource to carry. */
82
+ source?: ResolvedSource;
83
+ } | {
84
+ kind: "template";
85
+ call: TemplateCall;
86
+ };
87
+ /** Per-candidate decoration hook (`CompleteOptions.decorate`): completeAt calls this once for each
88
+ * candidate it is about to return, with the candidate as built so far and its structural identity,
89
+ * and merges the answer's `detail`/`documentation` onto it. The candidate SET is unaffected — this
90
+ * only supplies display text, never adds/removes/reorders a candidate. Total-safe: a throwing hook
91
+ * degrades to the undecorated candidate (never breaks completeAt), the same total-by-contract
92
+ * posture every other completeAt internal failure gets (SQLLENS_DEBUG=1 rethrows — src/debug.ts). */
93
+ export type DecorateCandidate = (candidate: Completion, identity: CandidateIdentity) => CandidateDecoration | undefined | void;
94
+ /** completeAt's options — currently just the decoration hook. Additive: every existing 3-arg call
95
+ * site keeps compiling and behaving byte-identically (no `opts`, no decoration). */
96
+ export interface CompleteOptions {
97
+ decorate?: DecorateCandidate;
98
+ }
32
99
  /**
33
100
  * Completion candidates for the caret at `offset` in `doc`, pruned to the identifier/keyword
34
101
  * fragment already typed there (case-insensitive, dialect-fold-aware; plain prefix match — never
35
102
  * fuzzy). Schema-aware when a `Schema` is given (table names + column types). NEVER throws: on
36
103
  * broken / mid-edit input it still returns the keyword candidates the walk can reach.
37
104
  */
38
- export declare function completeAt(doc: SqlDocument, offset: number, schema?: SchemaProvider): CompletionResult;
105
+ export declare function completeAt(doc: SqlDocument, offset: number, schema?: SchemaProvider, opts?: CompleteOptions): CompletionResult;
39
106
  /** @deprecated Use completeAt — same function, uniform cursor-verb naming. */
40
107
  export declare const complete: typeof completeAt;