Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【WIP】feat: support built-in sql snippets #154

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

JackWang032
Copy link
Collaborator

@JackWang032 JackWang032 commented Nov 5, 2024

新增功能: #23 支持SQL代码片段

功能描述:对每种语言内置部分常用的SQL片段,在合适的时机可以通过关键字或者空格触发代码片段补全列表

Preview

iShot_2024-11-05_15 45 37

使用方式:

默认情况下自动启用内置的代码片段,如果自定义了 completionService , 则需要在 completionService 中将 snippets 返回

setupLanguageFeatures(LanguageIdEnum.HIVE, {
	completionItems: {
		enable: true,
              // your own completionService
		completionService
	},
	preprocessCode: (code: string) => preprocessCodeHive(code, '`')
});

需要手动包裹 snippets 补全项并返回

const completionService: CompletionService = async function (
	model,
	_position,
	_completionContext,
	suggestions,
	_entities,
	snippets
) {
	const { keywords, syntax } = suggestions;

	const keywordsCompletionItems: ICompletionItem[] = keywords.map((kw) => ({
		label: kw,
		kind: languages.CompletionItemKind.Keyword,
		detail: '关键字',
		sortText: '2' + kw
	}));

	// wrapped snippets
	const snippetCompletionItems: ICompletionItem[] =
		snippets?.map((item) => ({
			label: item.label || item.prefix,
			kind: languages.CompletionItemKind.Snippet,
			filterText: item.prefix,
			insertText: item.insertText,
			insertTextRules: languages.CompletionItemInsertTextRule.InsertAsSnippet,
			sortText: '1' + item.prefix,
			detail: item.description !== undefined ? item.description : 'SQL模板'
		})) || [];

	return [...keywordsCompletionItems, ...snippetCompletionItems];
};

设置自定义用户片段
snippets 配置参数与 vscode 的 snippet 基本相同, 详见 vscode snippets

setupLanguageFeatures(LanguageIdEnum.HIVE, {
	completionItems: {
		enable: true,
		completionService,
		snippets: [
			{
				label: 'select join',
				prefix: 'SELECT-JOIN',
				body: [
					'SELECT ${8:column1} FROM ${1:table_name} ${2:t1}',
					'${3:LEFT} JOIN ${4:table2} ${5:t2} ON ${2:t1}.${6:column1} = ${5:t2}.${7:column2};\n$9'
				],
				description: 'SQL-Snippet'
			}
		]
	}
});

使用 setupLanguageFeatures 方式配置的 snippets , 只有在当前输入上下文为新语句开头时才能在 completionService 中访问到,如果不需要该特性, 可以直接在 completionService 中使用自己的代码片段列表

@JackWang032 JackWang032 self-assigned this Nov 5, 2024
@JackWang032 JackWang032 added the new features New feature or request label Nov 5, 2024
@liuxy0551
Copy link
Collaborator

ts失败了

@JackWang032
Copy link
Collaborator Author

ts失败了

需要等dt-sql-parser出包

@@ -45,17 +46,32 @@ export abstract class BaseSQLWorker {
async doCompletionWithEntities(
code: string,
position: Position
): Promise<[Suggestions | null, EntityContext[] | null]> {
): Promise<{
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

返回结构的变更,需要检查使用到的地方,目前没有发现其他地方有使用到

@@ -80,6 +81,27 @@ export function setupLanguageFeatures(
}
}

function getDefaultSnippets(languageId: LanguageIdEnum) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

当前文件函数内容缩进异常

@@ -183,5 +185,17 @@ export const completionService: CompletionService = async function (
}
}
}
return [...syntaxCompletionItems, ...keywordsCompletionItems];

const snippetCompletionItems: ICompletionItem[] =
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

当前文件缩进异常

@@ -0,0 +1,7 @@
export { hiveSnippets } from './languages/hive/hive.snippet';
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

模板需要和产品经理确认

@@ -159,13 +159,22 @@ export class CompletionAdapter<T extends BaseSQLWorker>
}
return worker.doCompletionWithEntities(code, position);
})
.then(([suggestions, allEntities]) => {
.then(async ({ suggestions, allEntities, context: semanticContext }) => {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

async 有无必要?

src/languages/hive/hive.snippet.ts Show resolved Hide resolved
@@ -183,5 +185,17 @@ export const completionService: CompletionService = async function (
}
}
}
return [...syntaxCompletionItems, ...keywordsCompletionItems];

const snippetCompletionItems: ICompletionItem[] =
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

将和 getCatalogs 一样写在 dbMetaProvider.ts 文件中

@@ -183,5 +185,17 @@ export const completionService: CompletionService = async function (
}
}
}
return [...syntaxCompletionItems, ...keywordsCompletionItems];

const snippetCompletionItems: ICompletionItem[] =
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

离线可以验证下接口获取是否可行,看代码应该是没问题的

{
prefix: 'INSERT',
label: 'INSERT代码片段',
body: ['insert', 'into', '\t`${1:table1}`', 'values', '\t(`$2`);', '${3}']
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image
pg 应该是不支持 tableName 使用 ` 包裹

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
new features New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants