fix(editor): suppress SQL completion in strings
This commit is contained in:
1 parent
62951de2b3
commit
1499008ba8
3 files changed
+60
-3
No files matched your search
@@ -18,7 +18,17 @@ import { useConnectionStore } from "@/stores/connectionStore";
|
||||
import { useSettingsStore } from "@/stores/settingsStore";
|
||||
import { useTheme } from "@/composables/useTheme";
|
||||
import { useToast } from "@/composables/useToast";
|
||||
import { buildSqlCompletionItemsFromContext, getSqlFunctionSignatureHelp, getSqlCompletionContext, getSqlCompletionResultValidFor, isSqlLikeCompletionStatement, recordCompletionSelection, shouldAutoOpenSqlCompletion, extractCteDefinitions } from "@/lib/sqlCompletion";
|
||||
import {
|
||||
buildSqlCompletionItemsFromContext,
|
||||
getSqlFunctionSignatureHelp,
|
||||
getSqlCompletionContext,
|
||||
getSqlCompletionResultValidFor,
|
||||
isSqlCompletionSuppressedContext,
|
||||
isSqlLikeCompletionStatement,
|
||||
recordCompletionSelection,
|
||||
shouldAutoOpenSqlCompletion,
|
||||
extractCteDefinitions,
|
||||
} from "@/lib/sqlCompletion";
|
||||
import { buildElasticsearchCompletionItemsFromContext, getElasticsearchCompletionContext, getElasticsearchCompletionResultValidFor, shouldAutoOpenElasticsearchCompletion, type ElasticsearchCompletionItem } from "@/lib/elasticsearchCompletion";
|
||||
import { buildMongoCompletionItemsFromContext, getMongoCompletionContext, getMongoCompletionResultValidFor, shouldAutoOpenMongoCompletion, type MongoCompletionItem } from "@/lib/mongoCompletion";
|
||||
import { extractIdentifierAt, isSqlKeyword, matchTable } from "@/lib/sqlNavigation";
|
||||
@@ -1410,6 +1420,7 @@ async function provideSqlCompletions(currentState: import("@codemirror/state").E
|
||||
const epoch = ++completionEpoch;
|
||||
|
||||
try {
|
||||
if (isSqlCompletionSuppressedContext(fullDoc, position)) return null;
|
||||
if (!explicit && !shouldAutoOpenSqlCompletion(fullDoc, position)) return null;
|
||||
|
||||
const completionContext = getSqlCompletionContext(fullDoc, position);
|
||||
|
||||
@@ -1185,6 +1185,7 @@ export function buildSqlCompletionItems(
|
||||
autoAliasTables?: boolean;
|
||||
},
|
||||
): SqlCompletionItem[] {
|
||||
if (isSqlCompletionSuppressedContext(sql, cursor)) return [];
|
||||
const context = getSqlCompletionContext(sql, cursor);
|
||||
return buildSqlCompletionItemsFromContext(context, input);
|
||||
}
|
||||
@@ -1290,7 +1291,7 @@ class SqlCompletionProvider {
|
||||
}
|
||||
|
||||
export function shouldAutoOpenSqlCompletion(sql: string, cursor: number): boolean {
|
||||
if (isSqlCommentContext(sql, cursor)) return false;
|
||||
if (isSqlCompletionSuppressedContext(sql, cursor)) return false;
|
||||
const previousChar = sql[cursor - 1];
|
||||
if (!previousChar) return false;
|
||||
if (/\bon\s+$/i.test(sql.slice(0, cursor))) return true;
|
||||
@@ -1303,7 +1304,21 @@ export function shouldAutoOpenSqlCompletion(sql: string, cursor: number): boolea
|
||||
return /[\w$.@]/.test(previousChar);
|
||||
}
|
||||
|
||||
export function isSqlCompletionSuppressedContext(sql: string, cursor: number): boolean {
|
||||
const context = getSqlLexicalContext(sql, cursor);
|
||||
return context.inLineComment || context.inBlockComment || context.inStringLiteral;
|
||||
}
|
||||
|
||||
export function isSqlStringLiteralContext(sql: string, cursor: number): boolean {
|
||||
return getSqlLexicalContext(sql, cursor).inStringLiteral;
|
||||
}
|
||||
|
||||
export function isSqlCommentContext(sql: string, cursor: number): boolean {
|
||||
const context = getSqlLexicalContext(sql, cursor);
|
||||
return context.inLineComment || context.inBlockComment;
|
||||
}
|
||||
|
||||
function getSqlLexicalContext(sql: string, cursor: number): { inLineComment: boolean; inBlockComment: boolean; inStringLiteral: boolean } {
|
||||
const end = Math.max(0, Math.min(cursor, sql.length));
|
||||
let inSingleQuote = false;
|
||||
let inDoubleQuote = false;
|
||||
@@ -1376,7 +1391,14 @@ export function isSqlCommentContext(sql: string, cursor: number): boolean {
|
||||
}
|
||||
}
|
||||
|
||||
return inLineComment || inBlockComment;
|
||||
// Only single-quoted text is a value literal here. Double quotes, backticks,
|
||||
// and brackets delimit identifiers in common SQL dialects, so they must not
|
||||
// suppress identifier completion.
|
||||
return {
|
||||
inLineComment,
|
||||
inBlockComment,
|
||||
inStringLiteral: inSingleQuote,
|
||||
};
|
||||
}
|
||||
|
||||
export function isSqlLikeCompletionStatement(sql: string, cursor: number): boolean {
|
||||
|
||||
Reference in new issue
Block a user