rawsql-ts 0.11.33-beta → 0.11.34-beta
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.
- package/dist/esm/index.js +19 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +43 -35
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/index.d.ts +21 -0
- package/dist/esm/src/index.js +19 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/tokenReaders/CommandTokenReader.js +5 -0
- package/dist/esm/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/CTEBuilder.js +2 -2
- package/dist/esm/src/transformers/CTEBuilder.js.map +1 -1
- package/dist/esm/src/utils/CursorContextAnalyzer.d.ts +70 -0
- package/dist/esm/src/utils/CursorContextAnalyzer.js +322 -0
- package/dist/esm/src/utils/CursorContextAnalyzer.js.map +1 -0
- package/dist/esm/src/utils/IntelliSenseApi.d.ts +114 -0
- package/dist/esm/src/utils/IntelliSenseApi.js +284 -0
- package/dist/esm/src/utils/IntelliSenseApi.js.map +1 -0
- package/dist/esm/src/utils/KeywordCache.d.ts +65 -0
- package/dist/esm/src/utils/KeywordCache.js +202 -0
- package/dist/esm/src/utils/KeywordCache.js.map +1 -0
- package/dist/esm/src/utils/MultiQuerySplitter.d.ts +131 -0
- package/dist/esm/src/utils/MultiQuerySplitter.js +287 -0
- package/dist/esm/src/utils/MultiQuerySplitter.js.map +1 -0
- package/dist/esm/src/utils/PositionAwareParser.d.ts +85 -0
- package/dist/esm/src/utils/PositionAwareParser.js +336 -0
- package/dist/esm/src/utils/PositionAwareParser.js.map +1 -0
- package/dist/esm/src/utils/ScopeResolver.d.ts +127 -0
- package/dist/esm/src/utils/ScopeResolver.js +268 -0
- package/dist/esm/src/utils/ScopeResolver.js.map +1 -0
- package/dist/esm/src/utils/TextPositionUtils.d.ts +62 -0
- package/dist/esm/src/utils/TextPositionUtils.js +124 -0
- package/dist/esm/src/utils/TextPositionUtils.js.map +1 -0
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/index.min.js +43 -35
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.js +20 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/tokenReaders/CommandTokenReader.js +5 -0
- package/dist/src/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/src/transformers/CTEBuilder.js +2 -2
- package/dist/src/transformers/CTEBuilder.js.map +1 -1
- package/dist/src/utils/CursorContextAnalyzer.d.ts +70 -0
- package/dist/src/utils/CursorContextAnalyzer.js +338 -0
- package/dist/src/utils/CursorContextAnalyzer.js.map +1 -0
- package/dist/src/utils/IntelliSenseApi.d.ts +114 -0
- package/dist/src/utils/IntelliSenseApi.js +292 -0
- package/dist/src/utils/IntelliSenseApi.js.map +1 -0
- package/dist/src/utils/KeywordCache.d.ts +65 -0
- package/dist/src/utils/KeywordCache.js +206 -0
- package/dist/src/utils/KeywordCache.js.map +1 -0
- package/dist/src/utils/MultiQuerySplitter.d.ts +131 -0
- package/dist/src/utils/MultiQuerySplitter.js +292 -0
- package/dist/src/utils/MultiQuerySplitter.js.map +1 -0
- package/dist/src/utils/PositionAwareParser.d.ts +85 -0
- package/dist/src/utils/PositionAwareParser.js +363 -0
- package/dist/src/utils/PositionAwareParser.js.map +1 -0
- package/dist/src/utils/ScopeResolver.d.ts +127 -0
- package/dist/src/utils/ScopeResolver.js +272 -0
- package/dist/src/utils/ScopeResolver.js.map +1 -0
- package/dist/src/utils/TextPositionUtils.d.ts +62 -0
- package/dist/src/utils/TextPositionUtils.js +128 -0
- package/dist/src/utils/TextPositionUtils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
@@ -0,0 +1,85 @@
|
|
1
|
+
import { SelectQuery } from '../models/SelectQuery';
|
2
|
+
import { ParseAnalysisResult } from '../parsers/SelectQueryParser';
|
3
|
+
import { Lexeme } from '../models/Lexeme';
|
4
|
+
import { LineColumn } from './LexemeCursor';
|
5
|
+
/**
|
6
|
+
* Options for position-aware parsing
|
7
|
+
*/
|
8
|
+
export interface ParseToPositionOptions {
|
9
|
+
/** Enable error recovery to continue parsing after syntax errors */
|
10
|
+
errorRecovery?: boolean;
|
11
|
+
/** Insert missing tokens (e.g., missing FROM keywords) */
|
12
|
+
insertMissingTokens?: boolean;
|
13
|
+
/** Parse only up to the specified position */
|
14
|
+
parseToPosition?: {
|
15
|
+
line: number;
|
16
|
+
column: number;
|
17
|
+
} | number;
|
18
|
+
/** Maximum number of error recovery attempts */
|
19
|
+
maxRecoveryAttempts?: number;
|
20
|
+
}
|
21
|
+
/**
|
22
|
+
* Result of position-aware parsing
|
23
|
+
*/
|
24
|
+
export interface PositionParseResult extends ParseAnalysisResult {
|
25
|
+
/** Tokens that were parsed up to the cursor position */
|
26
|
+
parsedTokens?: Lexeme[];
|
27
|
+
/** Token immediately before the cursor position */
|
28
|
+
tokenBeforeCursor?: Lexeme;
|
29
|
+
/** Whether parsing stopped at the cursor position */
|
30
|
+
stoppedAtCursor?: boolean;
|
31
|
+
/** Number of error recovery attempts made */
|
32
|
+
recoveryAttempts?: number;
|
33
|
+
/** Partial AST even if parsing failed */
|
34
|
+
partialAST?: SelectQuery;
|
35
|
+
}
|
36
|
+
/**
|
37
|
+
* Position-aware SQL parser with error recovery for IntelliSense
|
38
|
+
*
|
39
|
+
* Extends the standard parser to handle incomplete SQL and provide context
|
40
|
+
* for IntelliSense scenarios where users are actively typing.
|
41
|
+
*
|
42
|
+
* @example
|
43
|
+
* ```typescript
|
44
|
+
* // Parse incomplete SQL with error recovery
|
45
|
+
* const sql = "SELECT user.name FROM users user WHERE user.";
|
46
|
+
* const result = PositionAwareParser.parseToPosition(sql, sql.length, {
|
47
|
+
* errorRecovery: true,
|
48
|
+
* insertMissingTokens: true
|
49
|
+
* });
|
50
|
+
*
|
51
|
+
* console.log(result.tokenBeforeCursor?.value); // "."
|
52
|
+
* console.log(result.success); // true (with recovery)
|
53
|
+
* ```
|
54
|
+
*/
|
55
|
+
export declare class PositionAwareParser {
|
56
|
+
/**
|
57
|
+
* Parse SQL text up to a specific position with error recovery
|
58
|
+
*
|
59
|
+
* @param sql - SQL text to parse
|
60
|
+
* @param cursorPosition - Character position to parse up to (0-based) or line/column
|
61
|
+
* @param options - Parsing options including error recovery
|
62
|
+
* @returns Parse result with position-specific information
|
63
|
+
*/
|
64
|
+
static parseToPosition(sql: string, cursorPosition: number | LineColumn, options?: ParseToPositionOptions): PositionParseResult;
|
65
|
+
/**
|
66
|
+
* Parse current query from multi-query text at cursor position
|
67
|
+
*
|
68
|
+
* @param sql - Complete SQL text (may contain multiple statements)
|
69
|
+
* @param cursorPosition - Cursor position
|
70
|
+
* @param options - Parsing options
|
71
|
+
* @returns Parse result for the current query only
|
72
|
+
*/
|
73
|
+
static parseCurrentQuery(sql: string, cursorPosition: number | LineColumn, options?: ParseToPositionOptions): PositionParseResult;
|
74
|
+
private static tryNormalParse;
|
75
|
+
private static tryErrorRecovery;
|
76
|
+
private static recoverWithTokenInsertion;
|
77
|
+
private static recoverWithTruncation;
|
78
|
+
private static recoverWithCompletion;
|
79
|
+
private static recoverWithMinimalSQL;
|
80
|
+
private static getAllTokens;
|
81
|
+
private static findTokenAtPosition;
|
82
|
+
private static findTokenBeforePosition;
|
83
|
+
private static findQueryBoundaries;
|
84
|
+
private static findQueryAtPosition;
|
85
|
+
}
|
@@ -0,0 +1,363 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.PositionAwareParser = void 0;
|
4
|
+
const SelectQueryParser_1 = require("../parsers/SelectQueryParser");
|
5
|
+
const LexemeCursor_1 = require("./LexemeCursor");
|
6
|
+
const TextPositionUtils_1 = require("./TextPositionUtils");
|
7
|
+
/**
|
8
|
+
* Position-aware SQL parser with error recovery for IntelliSense
|
9
|
+
*
|
10
|
+
* Extends the standard parser to handle incomplete SQL and provide context
|
11
|
+
* for IntelliSense scenarios where users are actively typing.
|
12
|
+
*
|
13
|
+
* @example
|
14
|
+
* ```typescript
|
15
|
+
* // Parse incomplete SQL with error recovery
|
16
|
+
* const sql = "SELECT user.name FROM users user WHERE user.";
|
17
|
+
* const result = PositionAwareParser.parseToPosition(sql, sql.length, {
|
18
|
+
* errorRecovery: true,
|
19
|
+
* insertMissingTokens: true
|
20
|
+
* });
|
21
|
+
*
|
22
|
+
* console.log(result.tokenBeforeCursor?.value); // "."
|
23
|
+
* console.log(result.success); // true (with recovery)
|
24
|
+
* ```
|
25
|
+
*/
|
26
|
+
class PositionAwareParser {
|
27
|
+
/**
|
28
|
+
* Parse SQL text up to a specific position with error recovery
|
29
|
+
*
|
30
|
+
* @param sql - SQL text to parse
|
31
|
+
* @param cursorPosition - Character position to parse up to (0-based) or line/column
|
32
|
+
* @param options - Parsing options including error recovery
|
33
|
+
* @returns Parse result with position-specific information
|
34
|
+
*/
|
35
|
+
static parseToPosition(sql, cursorPosition, options = {}) {
|
36
|
+
const charPosition = typeof cursorPosition === 'number'
|
37
|
+
? cursorPosition
|
38
|
+
: TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
|
39
|
+
if (charPosition === -1) {
|
40
|
+
return {
|
41
|
+
success: false,
|
42
|
+
error: 'Invalid cursor position',
|
43
|
+
stoppedAtCursor: false
|
44
|
+
};
|
45
|
+
}
|
46
|
+
try {
|
47
|
+
// First, try normal parsing
|
48
|
+
const normalResult = this.tryNormalParse(sql, charPosition, options);
|
49
|
+
if (normalResult.success) {
|
50
|
+
return normalResult;
|
51
|
+
}
|
52
|
+
// If normal parsing fails and error recovery is enabled, try recovery
|
53
|
+
if (options.errorRecovery) {
|
54
|
+
return this.tryErrorRecovery(sql, charPosition, options);
|
55
|
+
}
|
56
|
+
return normalResult;
|
57
|
+
}
|
58
|
+
catch (error) {
|
59
|
+
return {
|
60
|
+
success: false,
|
61
|
+
error: error instanceof Error ? error.message : String(error),
|
62
|
+
stoppedAtCursor: false
|
63
|
+
};
|
64
|
+
}
|
65
|
+
}
|
66
|
+
/**
|
67
|
+
* Parse current query from multi-query text at cursor position
|
68
|
+
*
|
69
|
+
* @param sql - Complete SQL text (may contain multiple statements)
|
70
|
+
* @param cursorPosition - Cursor position
|
71
|
+
* @param options - Parsing options
|
72
|
+
* @returns Parse result for the current query only
|
73
|
+
*/
|
74
|
+
static parseCurrentQuery(sql, cursorPosition, options = {}) {
|
75
|
+
const charPosition = typeof cursorPosition === 'number'
|
76
|
+
? cursorPosition
|
77
|
+
: TextPositionUtils_1.TextPositionUtils.lineColumnToCharOffset(sql, cursorPosition);
|
78
|
+
if (charPosition === -1) {
|
79
|
+
return {
|
80
|
+
success: false,
|
81
|
+
error: 'Invalid cursor position',
|
82
|
+
stoppedAtCursor: false
|
83
|
+
};
|
84
|
+
}
|
85
|
+
// Split SQL by semicolons and find the query containing the cursor
|
86
|
+
const queryBoundaries = this.findQueryBoundaries(sql);
|
87
|
+
const currentQuery = this.findQueryAtPosition(queryBoundaries, charPosition);
|
88
|
+
if (!currentQuery) {
|
89
|
+
return {
|
90
|
+
success: false,
|
91
|
+
error: 'No query found at cursor position',
|
92
|
+
stoppedAtCursor: false
|
93
|
+
};
|
94
|
+
}
|
95
|
+
// Parse just the current query
|
96
|
+
const relativePosition = charPosition - currentQuery.start;
|
97
|
+
const querySQL = sql.substring(currentQuery.start, currentQuery.end);
|
98
|
+
return this.parseToPosition(querySQL, relativePosition, options);
|
99
|
+
}
|
100
|
+
static tryNormalParse(sql, cursorPosition, options) {
|
101
|
+
// Check for invalid cursor position first
|
102
|
+
if (cursorPosition < 0 || cursorPosition > sql.length) {
|
103
|
+
return {
|
104
|
+
success: false,
|
105
|
+
error: 'Invalid cursor position',
|
106
|
+
stoppedAtCursor: false
|
107
|
+
};
|
108
|
+
}
|
109
|
+
// Check if SQL appears incomplete (ends with dot, comma, etc.)
|
110
|
+
const trimmedSql = sql.trim();
|
111
|
+
const incompletePatterns = ['.', ',', 'SELECT', 'FROM', 'WHERE', 'JOIN', 'ON', 'GROUP BY', 'ORDER BY'];
|
112
|
+
const appearsIncomplete = incompletePatterns.some(pattern => trimmedSql.toLowerCase().endsWith(pattern.toLowerCase()));
|
113
|
+
// Try to parse the complete SQL
|
114
|
+
const analysisResult = SelectQueryParser_1.SelectQueryParser.analyze(sql);
|
115
|
+
// If parsing failed OR SQL appears incomplete, return failure to trigger error recovery
|
116
|
+
if (!analysisResult.success || appearsIncomplete) {
|
117
|
+
return { ...analysisResult, success: false };
|
118
|
+
}
|
119
|
+
// Get tokens and find cursor token
|
120
|
+
const allTokens = this.getAllTokens(sql);
|
121
|
+
const cursorToken = this.findTokenAtPosition(allTokens, cursorPosition);
|
122
|
+
const beforeCursor = this.findTokenBeforePosition(allTokens, cursorPosition);
|
123
|
+
return {
|
124
|
+
...analysisResult,
|
125
|
+
parsedTokens: allTokens,
|
126
|
+
tokenBeforeCursor: beforeCursor,
|
127
|
+
stoppedAtCursor: cursorPosition < sql.length, // True if cursor is before end of SQL
|
128
|
+
recoveryAttempts: 0 // Normal parse, no recovery needed
|
129
|
+
};
|
130
|
+
}
|
131
|
+
static tryErrorRecovery(sql, cursorPosition, options) {
|
132
|
+
const maxAttempts = options.maxRecoveryAttempts || 5;
|
133
|
+
let attempts = 0;
|
134
|
+
// Error recovery strategies in order of preference
|
135
|
+
const strategies = [
|
136
|
+
() => this.recoverWithTokenInsertion(sql, cursorPosition, options),
|
137
|
+
() => this.recoverWithTruncation(sql, cursorPosition, options),
|
138
|
+
() => this.recoverWithCompletion(sql, cursorPosition, options),
|
139
|
+
() => this.recoverWithMinimalSQL(sql, cursorPosition, options)
|
140
|
+
];
|
141
|
+
for (const strategy of strategies) {
|
142
|
+
if (attempts >= maxAttempts)
|
143
|
+
break;
|
144
|
+
attempts++;
|
145
|
+
try {
|
146
|
+
const result = strategy();
|
147
|
+
if (result.success) {
|
148
|
+
result.recoveryAttempts = attempts;
|
149
|
+
return result;
|
150
|
+
}
|
151
|
+
}
|
152
|
+
catch (error) {
|
153
|
+
continue; // Try next strategy
|
154
|
+
}
|
155
|
+
}
|
156
|
+
// All recovery attempts failed
|
157
|
+
return {
|
158
|
+
success: false,
|
159
|
+
error: 'All error recovery attempts failed',
|
160
|
+
recoveryAttempts: attempts,
|
161
|
+
stoppedAtCursor: false
|
162
|
+
};
|
163
|
+
}
|
164
|
+
static recoverWithTokenInsertion(sql, cursorPosition, options) {
|
165
|
+
if (!options.insertMissingTokens) {
|
166
|
+
throw new Error('Token insertion disabled');
|
167
|
+
}
|
168
|
+
// Common patterns to fix
|
169
|
+
const fixes = [
|
170
|
+
{ pattern: /SELECT\s*$/i, replacement: 'SELECT 1 ' },
|
171
|
+
{ pattern: /FROM\s*$/i, replacement: 'FROM dual ' },
|
172
|
+
{ pattern: /WHERE\s*$/i, replacement: 'WHERE 1=1 ' },
|
173
|
+
{ pattern: /JOIN\s*$/i, replacement: 'JOIN dual ON 1=1 ' },
|
174
|
+
{ pattern: /ON\s*$/i, replacement: 'ON 1=1 ' },
|
175
|
+
{ pattern: /GROUP\s+BY\s*$/i, replacement: 'GROUP BY 1 ' },
|
176
|
+
{ pattern: /ORDER\s+BY\s*$/i, replacement: 'ORDER BY 1 ' }
|
177
|
+
];
|
178
|
+
let fixedSQL = sql;
|
179
|
+
for (const fix of fixes) {
|
180
|
+
if (fix.pattern.test(sql)) {
|
181
|
+
fixedSQL = sql.replace(fix.pattern, fix.replacement);
|
182
|
+
break;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
if (fixedSQL === sql) {
|
186
|
+
throw new Error('No applicable token insertion found');
|
187
|
+
}
|
188
|
+
const result = SelectQueryParser_1.SelectQueryParser.analyze(fixedSQL);
|
189
|
+
const tokens = this.getAllTokens(sql); // Use original SQL for tokens
|
190
|
+
return {
|
191
|
+
...result,
|
192
|
+
parsedTokens: tokens,
|
193
|
+
tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
|
194
|
+
stoppedAtCursor: true,
|
195
|
+
recoveryAttempts: 1
|
196
|
+
};
|
197
|
+
}
|
198
|
+
static recoverWithTruncation(sql, cursorPosition, options) {
|
199
|
+
// Try truncating at cursor position and adding minimal completion
|
200
|
+
const truncated = sql.substring(0, cursorPosition);
|
201
|
+
const completions = [
|
202
|
+
'', // Try as-is first
|
203
|
+
' 1', // Add simple expression
|
204
|
+
' FROM dual', // Add FROM clause
|
205
|
+
' WHERE 1=1' // Add WHERE clause
|
206
|
+
];
|
207
|
+
for (const completion of completions) {
|
208
|
+
try {
|
209
|
+
const testSQL = truncated + completion;
|
210
|
+
const result = SelectQueryParser_1.SelectQueryParser.analyze(testSQL);
|
211
|
+
if (result.success) {
|
212
|
+
const tokens = this.getAllTokens(sql);
|
213
|
+
return {
|
214
|
+
...result,
|
215
|
+
parsedTokens: tokens.filter(t => t.position && t.position.startPosition <= cursorPosition),
|
216
|
+
tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
|
217
|
+
stoppedAtCursor: true,
|
218
|
+
recoveryAttempts: 1
|
219
|
+
};
|
220
|
+
}
|
221
|
+
}
|
222
|
+
catch (error) {
|
223
|
+
continue;
|
224
|
+
}
|
225
|
+
}
|
226
|
+
throw new Error('Truncation recovery failed');
|
227
|
+
}
|
228
|
+
static recoverWithCompletion(sql, cursorPosition, options) {
|
229
|
+
// Try completing common incomplete patterns
|
230
|
+
const beforeCursor = sql.substring(0, cursorPosition);
|
231
|
+
const afterCursor = sql.substring(cursorPosition);
|
232
|
+
const completions = [
|
233
|
+
{ pattern: /\.\s*$/, completion: 'id' }, // Complete column reference
|
234
|
+
{ pattern: /\w+\s*$/, completion: '' }, // Complete identifier
|
235
|
+
{ pattern: /,\s*$/, completion: '1' }, // Complete list item
|
236
|
+
{ pattern: /\(\s*$/, completion: '1)' } // Complete parentheses
|
237
|
+
];
|
238
|
+
for (const comp of completions) {
|
239
|
+
if (comp.pattern.test(beforeCursor)) {
|
240
|
+
const testSQL = beforeCursor + comp.completion + afterCursor;
|
241
|
+
try {
|
242
|
+
const result = SelectQueryParser_1.SelectQueryParser.analyze(testSQL);
|
243
|
+
if (result.success) {
|
244
|
+
const tokens = this.getAllTokens(sql);
|
245
|
+
return {
|
246
|
+
...result,
|
247
|
+
parsedTokens: tokens,
|
248
|
+
tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
|
249
|
+
stoppedAtCursor: true,
|
250
|
+
recoveryAttempts: 1
|
251
|
+
};
|
252
|
+
}
|
253
|
+
}
|
254
|
+
catch (error) {
|
255
|
+
continue;
|
256
|
+
}
|
257
|
+
}
|
258
|
+
}
|
259
|
+
throw new Error('Completion recovery failed');
|
260
|
+
}
|
261
|
+
static recoverWithMinimalSQL(sql, cursorPosition, options) {
|
262
|
+
// Generate minimal valid SQL that preserves structure up to cursor
|
263
|
+
const minimalSQL = 'SELECT 1 FROM dual WHERE 1=1';
|
264
|
+
try {
|
265
|
+
const result = SelectQueryParser_1.SelectQueryParser.analyze(minimalSQL);
|
266
|
+
const tokens = this.getAllTokens(sql);
|
267
|
+
return {
|
268
|
+
success: true,
|
269
|
+
query: result.query,
|
270
|
+
parsedTokens: tokens.filter(t => t.position && t.position.startPosition <= cursorPosition),
|
271
|
+
tokenBeforeCursor: this.findTokenBeforePosition(tokens, cursorPosition),
|
272
|
+
stoppedAtCursor: true,
|
273
|
+
partialAST: result.query,
|
274
|
+
recoveryAttempts: 1
|
275
|
+
};
|
276
|
+
}
|
277
|
+
catch (error) {
|
278
|
+
throw new Error('Minimal SQL recovery failed');
|
279
|
+
}
|
280
|
+
}
|
281
|
+
static getAllTokens(sql) {
|
282
|
+
try {
|
283
|
+
// Use LexemeCursor which includes position information
|
284
|
+
return LexemeCursor_1.LexemeCursor.getAllLexemesWithPosition(sql);
|
285
|
+
}
|
286
|
+
catch (error) {
|
287
|
+
return [];
|
288
|
+
}
|
289
|
+
}
|
290
|
+
static findTokenAtPosition(tokens, position) {
|
291
|
+
return tokens.find(token => token.position &&
|
292
|
+
position >= token.position.startPosition &&
|
293
|
+
position < token.position.endPosition);
|
294
|
+
}
|
295
|
+
static findTokenBeforePosition(tokens, position) {
|
296
|
+
// Find the last token that ends at or before the position
|
297
|
+
let beforeToken;
|
298
|
+
for (const token of tokens) {
|
299
|
+
if (token.position) {
|
300
|
+
if (token.position.endPosition <= position) {
|
301
|
+
beforeToken = token;
|
302
|
+
}
|
303
|
+
else if (token.position.startPosition < position) {
|
304
|
+
// Current position is within this token, so previous token is the one before
|
305
|
+
break;
|
306
|
+
}
|
307
|
+
else {
|
308
|
+
// We've passed the cursor position
|
309
|
+
break;
|
310
|
+
}
|
311
|
+
}
|
312
|
+
}
|
313
|
+
return beforeToken;
|
314
|
+
}
|
315
|
+
static findQueryBoundaries(sql) {
|
316
|
+
const boundaries = [];
|
317
|
+
let currentStart = 0;
|
318
|
+
let inString = false;
|
319
|
+
let stringChar = '';
|
320
|
+
let inComment = false;
|
321
|
+
for (let i = 0; i < sql.length; i++) {
|
322
|
+
const char = sql[i];
|
323
|
+
const nextChar = i < sql.length - 1 ? sql[i + 1] : '';
|
324
|
+
// Handle string literals
|
325
|
+
if (!inComment && (char === "'" || char === '"')) {
|
326
|
+
if (!inString) {
|
327
|
+
inString = true;
|
328
|
+
stringChar = char;
|
329
|
+
}
|
330
|
+
else if (char === stringChar) {
|
331
|
+
inString = false;
|
332
|
+
stringChar = '';
|
333
|
+
}
|
334
|
+
continue;
|
335
|
+
}
|
336
|
+
// Handle comments
|
337
|
+
if (!inString && char === '-' && nextChar === '-') {
|
338
|
+
inComment = true;
|
339
|
+
i++; // Skip next char
|
340
|
+
continue;
|
341
|
+
}
|
342
|
+
if (inComment && char === '\n') {
|
343
|
+
inComment = false;
|
344
|
+
continue;
|
345
|
+
}
|
346
|
+
// Handle semicolons (query boundaries)
|
347
|
+
if (!inString && !inComment && char === ';') {
|
348
|
+
boundaries.push({ start: currentStart, end: i });
|
349
|
+
currentStart = i + 1;
|
350
|
+
}
|
351
|
+
}
|
352
|
+
// Add final query if no trailing semicolon
|
353
|
+
if (currentStart < sql.length) {
|
354
|
+
boundaries.push({ start: currentStart, end: sql.length });
|
355
|
+
}
|
356
|
+
return boundaries;
|
357
|
+
}
|
358
|
+
static findQueryAtPosition(boundaries, position) {
|
359
|
+
return boundaries.find(boundary => position >= boundary.start && position <= boundary.end);
|
360
|
+
}
|
361
|
+
}
|
362
|
+
exports.PositionAwareParser = PositionAwareParser;
|
363
|
+
//# sourceMappingURL=PositionAwareParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"PositionAwareParser.js","sourceRoot":"","sources":["../../../src/utils/PositionAwareParser.ts"],"names":[],"mappings":";;;AACA,oEAAsF;AAGtF,iDAA0D;AAC1D,2DAAwD;AAgCxD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,mBAAmB;IAC5B;;;;;;;OAOG;IACI,MAAM,CAAC,eAAe,CACzB,GAAW,EACX,cAAmC,EACnC,UAAkC,EAAE;QAEpC,MAAM,YAAY,GAAG,OAAO,cAAc,KAAK,QAAQ;YACnD,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,qCAAiB,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAEpE,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yBAAyB;gBAChC,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;QAED,IAAI,CAAC;YACD,4BAA4B;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YACrE,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACvB,OAAO,YAAY,CAAC;YACxB,CAAC;YAED,sEAAsE;YACtE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,YAAY,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,iBAAiB,CAC3B,GAAW,EACX,cAAmC,EACnC,UAAkC,EAAE;QAEpC,MAAM,YAAY,GAAG,OAAO,cAAc,KAAK,QAAQ;YACnD,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,qCAAiB,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAEpE,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yBAAyB;gBAChC,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;QAED,mEAAmE;QACnE,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAE7E,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mCAAmC;gBAC1C,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;QAED,+BAA+B;QAC/B,MAAM,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC;QAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAErE,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAEO,MAAM,CAAC,cAAc,CACzB,GAAW,EACX,cAAsB,EACtB,OAA+B;QAE/B,0CAA0C;QAC1C,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YACpD,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yBAAyB;gBAChC,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;QAED,+DAA+D;QAC/D,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACvG,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CACxD,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAC3D,CAAC;QAEF,gCAAgC;QAChC,MAAM,cAAc,GAAG,qCAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEtD,wFAAwF;QACxF,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;YAC/C,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAE7E,OAAO;YACH,GAAG,cAAc;YACjB,YAAY,EAAE,SAAS;YACvB,iBAAiB,EAAE,YAAY;YAC/B,eAAe,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,sCAAsC;YACpF,gBAAgB,EAAE,CAAC,CAAC,mCAAmC;SAC1D,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAC3B,GAAW,EACX,cAAsB,EACtB,OAA+B;QAE/B,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,IAAI,CAAC,CAAC;QACrD,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,mDAAmD;QACnD,MAAM,UAAU,GAAG;YACf,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC;YAClE,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC;YAC9D,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC;YAC9D,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC;SACjE,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAChC,IAAI,QAAQ,IAAI,WAAW;gBAAE,MAAM;YACnC,QAAQ,EAAE,CAAC;YAEX,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC1B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC;oBACnC,OAAO,MAAM,CAAC;gBAClB,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,SAAS,CAAC,oBAAoB;YAClC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,oCAAoC;YAC3C,gBAAgB,EAAE,QAAQ;YAC1B,eAAe,EAAE,KAAK;SACzB,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,yBAAyB,CACpC,GAAW,EACX,cAAsB,EACtB,OAA+B;QAE/B,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QAED,yBAAyB;QACzB,MAAM,KAAK,GAAG;YACV,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE;YACpD,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE;YACnD,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE;YACpD,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE;YAC1D,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;YAC9C,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE;YAC1D,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE;SAC7D,CAAC;QAEF,IAAI,QAAQ,GAAG,GAAG,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrD,MAAM;YACV,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,qCAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B;QAErE,OAAO;YACH,GAAG,MAAM;YACT,YAAY,EAAE,MAAM;YACpB,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,cAAc,CAAC;YACvE,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,CAAC;SACtB,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAChC,GAAW,EACX,cAAsB,EACtB,OAA+B;QAE/B,kEAAkE;QAClE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG;YAChB,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,wBAAwB;YAC9B,YAAY,EAAE,kBAAkB;YAChC,YAAY,CAAC,mBAAmB;SACnC,CAAC;QAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;gBACvC,MAAM,MAAM,GAAG,qCAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAElD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;oBACtC,OAAO;wBACH,GAAG,MAAM;wBACT,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,IAAI,cAAc,CAC3D;wBACD,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,cAAc,CAAC;wBACvE,eAAe,EAAE,IAAI;wBACrB,gBAAgB,EAAE,CAAC;qBACtB,CAAC;gBACN,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,SAAS;YACb,CAAC;QACL,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAChC,GAAW,EACX,cAAsB,EACtB,OAA+B;QAE/B,4CAA4C;QAC5C,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAElD,MAAM,WAAW,GAAG;YAChB,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,4BAA4B;YACrE,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,sBAAsB;YAC9D,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,qBAAqB;YAC5D,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,uBAAuB;SAClE,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;gBAC7D,IAAI,CAAC;oBACD,MAAM,MAAM,GAAG,qCAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAClD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;wBACtC,OAAO;4BACH,GAAG,MAAM;4BACT,YAAY,EAAE,MAAM;4BACpB,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,cAAc,CAAC;4BACvE,eAAe,EAAE,IAAI;4BACrB,gBAAgB,EAAE,CAAC;yBACtB,CAAC;oBACN,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,SAAS;gBACb,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAChC,GAAW,EACX,cAAsB,EACtB,OAA+B;QAE/B,mEAAmE;QACnE,MAAM,UAAU,GAAG,8BAA8B,CAAC;QAElD,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,qCAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAEtC,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,IAAI,cAAc,CAC3D;gBACD,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,cAAc,CAAC;gBACvE,eAAe,EAAE,IAAI;gBACrB,UAAU,EAAE,MAAM,CAAC,KAAK;gBACxB,gBAAgB,EAAE,CAAC;aACtB,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,GAAW;QACnC,IAAI,CAAC;YACD,uDAAuD;YACvD,OAAO,2BAAY,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAAC,MAAgB,EAAE,QAAgB;QACjE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACvB,KAAK,CAAC,QAAQ;YACd,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa;YACxC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CACxC,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,uBAAuB,CAAC,MAAgB,EAAE,QAAgB;QACrE,0DAA0D;QAC1D,IAAI,WAA+B,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,EAAE,CAAC;oBACzC,WAAW,GAAG,KAAK,CAAC;gBACxB,CAAC;qBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,EAAE,CAAC;oBACjD,6EAA6E;oBAC7E,MAAM;gBACV,CAAC;qBAAM,CAAC;oBACJ,mCAAmC;oBACnC,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAAC,GAAW;QAC1C,MAAM,UAAU,GAA0C,EAAE,CAAC;QAC7D,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEtD,yBAAyB;YACzB,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACZ,QAAQ,GAAG,IAAI,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAC;gBACtB,CAAC;qBAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC7B,QAAQ,GAAG,KAAK,CAAC;oBACjB,UAAU,GAAG,EAAE,CAAC;gBACpB,CAAC;gBACD,SAAS;YACb,CAAC;YAED,kBAAkB;YAClB,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBAChD,SAAS,GAAG,IAAI,CAAC;gBACjB,CAAC,EAAE,CAAC,CAAC,iBAAiB;gBACtB,SAAS;YACb,CAAC;YAED,IAAI,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC7B,SAAS,GAAG,KAAK,CAAC;gBAClB,SAAS;YACb,CAAC;YAED,uCAAuC;YACvC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBAC1C,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjD,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QAED,2CAA2C;QAC3C,IAAI,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAC9B,UAAiD,EACjD,QAAgB;QAEhB,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAC9B,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG,CACzD,CAAC;IACN,CAAC;CAEJ;AAvaD,kDAuaC"}
|
@@ -0,0 +1,127 @@
|
|
1
|
+
import { SelectQuery } from '../models/SelectQuery';
|
2
|
+
/**
|
3
|
+
* Information about a table available in the current scope
|
4
|
+
*/
|
5
|
+
export interface AvailableTable {
|
6
|
+
/** Table name (unqualified) */
|
7
|
+
name: string;
|
8
|
+
/** Table alias (if any) */
|
9
|
+
alias?: string;
|
10
|
+
/** Schema name (if qualified) */
|
11
|
+
schema?: string;
|
12
|
+
/** Full qualified name */
|
13
|
+
fullName: string;
|
14
|
+
/** Source type: 'table', 'cte', 'subquery' */
|
15
|
+
sourceType: 'table' | 'cte' | 'subquery';
|
16
|
+
/** Original table reference for subqueries */
|
17
|
+
originalQuery?: SelectQuery;
|
18
|
+
}
|
19
|
+
/**
|
20
|
+
* Information about a CTE available in the current scope
|
21
|
+
*/
|
22
|
+
export interface AvailableCTE {
|
23
|
+
/** CTE name */
|
24
|
+
name: string;
|
25
|
+
/** Column names if determinable */
|
26
|
+
columns?: string[];
|
27
|
+
/** The CTE query definition */
|
28
|
+
query: SelectQuery;
|
29
|
+
/** Whether the CTE is materialized */
|
30
|
+
materialized?: boolean;
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Information about columns available for a specific table
|
34
|
+
*/
|
35
|
+
export interface AvailableColumn {
|
36
|
+
/** Column name */
|
37
|
+
name: string;
|
38
|
+
/** Table name the column belongs to */
|
39
|
+
tableName: string;
|
40
|
+
/** Table alias (if any) */
|
41
|
+
tableAlias?: string;
|
42
|
+
/** Data type (if known) */
|
43
|
+
type?: string;
|
44
|
+
/** Whether column is nullable */
|
45
|
+
nullable?: boolean;
|
46
|
+
/** Full qualified column reference */
|
47
|
+
fullReference: string;
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Complete scope information at a cursor position
|
51
|
+
*/
|
52
|
+
export interface ScopeInfo {
|
53
|
+
/** Tables available at the current position */
|
54
|
+
availableTables: AvailableTable[];
|
55
|
+
/** CTEs available at the current position */
|
56
|
+
availableCTEs: AvailableCTE[];
|
57
|
+
/** Nesting level (0 = root query) */
|
58
|
+
subqueryLevel: number;
|
59
|
+
/** Columns visible from all tables in scope */
|
60
|
+
visibleColumns: AvailableColumn[];
|
61
|
+
/** Current query being analyzed */
|
62
|
+
currentQuery?: SelectQuery;
|
63
|
+
/** Parent queries (for nested contexts) */
|
64
|
+
parentQueries: SelectQuery[];
|
65
|
+
}
|
66
|
+
/**
|
67
|
+
* Resolves scope information at cursor positions for SQL IntelliSense
|
68
|
+
*
|
69
|
+
* Provides comprehensive scope analysis including table availability, CTE resolution,
|
70
|
+
* and column visibility for intelligent code completion suggestions.
|
71
|
+
*
|
72
|
+
* @example
|
73
|
+
* ```typescript
|
74
|
+
* const sql = `
|
75
|
+
* WITH users AS (SELECT id, name FROM accounts)
|
76
|
+
* SELECT u.name FROM users u
|
77
|
+
* LEFT JOIN orders o ON u.id = o.user_id
|
78
|
+
* WHERE u.|
|
79
|
+
* `;
|
80
|
+
* const scope = ScopeResolver.resolveAt(sql, { line: 4, column: 12 });
|
81
|
+
*
|
82
|
+
* console.log(scope.availableTables); // [{ name: 'users', alias: 'u' }, { name: 'orders', alias: 'o' }]
|
83
|
+
* console.log(scope.availableCTEs); // [{ name: 'users', columns: ['id', 'name'] }]
|
84
|
+
* ```
|
85
|
+
*/
|
86
|
+
export declare class ScopeResolver {
|
87
|
+
/**
|
88
|
+
* Resolve scope information at the specified cursor position
|
89
|
+
*
|
90
|
+
* @param sql - SQL text to analyze
|
91
|
+
* @param cursorPosition - Character position of cursor (0-based)
|
92
|
+
* @returns Complete scope information
|
93
|
+
*/
|
94
|
+
static resolve(sql: string, cursorPosition: number): ScopeInfo;
|
95
|
+
/**
|
96
|
+
* Resolve scope information at line/column position
|
97
|
+
*
|
98
|
+
* @param sql - SQL text to analyze
|
99
|
+
* @param position - Line and column position (1-based)
|
100
|
+
* @returns Complete scope information
|
101
|
+
*/
|
102
|
+
static resolveAt(sql: string, position: {
|
103
|
+
line: number;
|
104
|
+
column: number;
|
105
|
+
}): ScopeInfo;
|
106
|
+
/**
|
107
|
+
* Get available columns for a specific table or alias
|
108
|
+
*
|
109
|
+
* @param sql - SQL text containing the query
|
110
|
+
* @param cursorPosition - Cursor position for scope resolution
|
111
|
+
* @param tableOrAlias - Table name or alias to get columns for
|
112
|
+
* @returns Array of available columns for the specified table
|
113
|
+
*/
|
114
|
+
static getColumnsForTable(sql: string, cursorPosition: number, tableOrAlias: string): AvailableColumn[];
|
115
|
+
private static analyzeScopeFromQuery;
|
116
|
+
private static collectCTEs;
|
117
|
+
private static collectTablesFromQuery;
|
118
|
+
private static extractTablesFromFromClause;
|
119
|
+
private static extractTablesFromJoin;
|
120
|
+
private static getQualifiedNameString;
|
121
|
+
private static extractTableName;
|
122
|
+
private static extractSchemaName;
|
123
|
+
private static extractCTEColumns;
|
124
|
+
private static extractColumnNameFromExpression;
|
125
|
+
private static collectVisibleColumns;
|
126
|
+
private static createEmptyScope;
|
127
|
+
}
|