Skip to content

feat: #206 add configurable SQL formatting with formatSQL API#226

Open
Cythia828 wants to merge 1 commit into
mainfrom
feat/support_format
Open

feat: #206 add configurable SQL formatting with formatSQL API#226
Cythia828 wants to merge 1 commit into
mainfrom
feat/support_format

Conversation

@Cythia828

Copy link
Copy Markdown
Collaborator

Feat

#206

能力概览

能力 说明
配置开关 setupLanguageFeatures(..., { format })默认关闭
右键菜单 开启后增加单项 Format(非 Format Document / Format Selection)
快捷键 Ctrl/Cmd + Alt + F
选区逻辑 有选中 → 只格式化选区;无选中 → 格式化全文
外部 API formatSQL(纯文本)、formatEditorSQL(写回编辑器)
引擎 sql-formatter;失败可走用户 fallback
方言 8 种 LanguageIdEnum 均有映射

实现分层

setupLanguageFeatures({ format })
        │
        ▼
setupLanguageMode → registerFormatAction  (右键 / 快捷键)
        │
        ▼
formatEditorSQL  (选区或全文 → executeEdits)
        │
        ▼
formatSQL  (sql-formatter → fallback → 原文)
  1. src/format.ts:核心纯函数 formatSQL(code, languageId, options?)
  2. src/formatEditor.tsformatEditorSQL + registerFormatAction
  3. 配置FeatureConfiguration.format / ModeConfiguration.format
  4. 入口main.ts 导出 formatSQLformatEditorSQL 及相关类型

配置方式

setupLanguageFeatures(LanguageIdEnum.MYSQL, {
  format: true
  // 或
  format: {
    enable: true,
    fallback: (code, languageId) => myFormat(code)
  }
});
  • format: false / 不传:不注册菜单与快捷键(默认)
  • format: true:开启,无兜底
  • format: { enable, fallback? }:开启并可配兜底

completionItems 一样支持增量合并。


格式化链路

formatSQL

  1. languageId 映射到 sql-formatter 方言并格式化
  2. 抛错 → 调用 options.fallback(支持 sync/async)
  3. 无 fallback 或 fallback 也失败 → 返回原文

formatEditorSQL

  1. 取选区或全文
  2. formatSQL
  3. 结果与原文相同则不改;否则 executeEdits + undo stop

右键 Format 会带上配置里的 fallback


方言映射

LanguageId sql-formatter
mysql mysql
pgsql postgresql
sparksql spark
hivesql hive
trinosql trino
flinksql / impalasql / genericsql sql
未知 id sql

外部调用示例

// 只拿格式化后的字符串
const sql = await formatSQL(code, LanguageIdEnum.MYSQL, { fallback });

// 直接改编辑器(选区优先)
await formatEditorSQL(editor, { fallback });

website demo:各方言 format: formatFeatureOptions,顶部工具栏同样调 formatEditorSQL 并传入同一 formatFallback


未做的事

  • 未注册 Monaco DocumentFormattingEditProvider(避免出现双菜单项)
  • 不提供 sql-formatter 的缩进/关键字大小写等细项配置(目前用库默认)
  • Worker 中不跑格式化(主线程、同步引擎足够轻)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant