Skip to content

Commit 4dcd41d

Browse files
committed
feat(lsp): include macros in autocomplete
1 parent 2595aca commit 4dcd41d

5 files changed

Lines changed: 18 additions & 0 deletions

File tree

sqlmesh/lsp/completions.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from functools import lru_cache
22
from sqlglot import Dialect, Tokenizer
33
from sqlmesh.lsp.custom import AllModelsResponse
4+
from sqlmesh import macro
45
import typing as t
56
from sqlmesh.lsp.context import AuditTarget, LSPContext, ModelTarget
67
from sqlmesh.lsp.uri import URI
@@ -26,6 +27,7 @@ def get_sql_completions(
2627
return AllModelsResponse(
2728
models=list(get_models(context, file_uri)),
2829
keywords=all_keywords,
30+
macros=list(get_macros(context)),
2931
)
3032

3133

@@ -56,6 +58,11 @@ def get_models(context: t.Optional[LSPContext], file_uri: t.Optional[URI]) -> t.
5658
return all_models
5759

5860

61+
def get_macros(context: t.Optional[LSPContext]) -> t.Set[str]:
62+
"""Return a list of all macros available in the context."""
63+
return set(macro.get_registry().keys())
64+
65+
5966
def get_keywords(context: t.Optional[LSPContext], file_uri: t.Optional[URI]) -> t.Set[str]:
6067
"""
6168
Return a list of sql keywords for a given file.
@@ -159,3 +166,4 @@ def extract_keywords_from_content(content: str, dialect: t.Optional[str] = None)
159166
pass
160167

161168
return keywords
169+

sqlmesh/lsp/custom.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class AllModelsResponse(PydanticModel):
2020

2121
models: t.List[str]
2222
keywords: t.List[str]
23+
macros: t.List[str]
2324

2425

2526
RENDER_MODEL_FEATURE = "sqlmesh/render_model"

tests/lsp/test_completions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def test_get_sql_completions_no_context():
2020
completions = get_sql_completions(None, None)
2121
assert len(completions.keywords) >= len(TOKENIZER_KEYWORDS)
2222
assert len(completions.models) == 0
23+
assert "each" in completions.macros
2324

2425

2526
def test_get_sql_completions_with_context_no_file_uri():
@@ -30,6 +31,7 @@ def test_get_sql_completions_with_context_no_file_uri():
3031
assert len(completions.keywords) > len(TOKENIZER_KEYWORDS)
3132
assert "sushi.active_customers" in completions.models
3233
assert "sushi.customers" in completions.models
34+
assert "add_one" in completions.macros
3335

3436

3537
def test_get_sql_completions_with_context_and_file_uri():
@@ -40,6 +42,7 @@ def test_get_sql_completions_with_context_and_file_uri():
4042
completions = lsp_context.get_autocomplete(URI.from_path(file_uri))
4143
assert len(completions.keywords) > len(TOKENIZER_KEYWORDS)
4244
assert "sushi.active_customers" not in completions.models
45+
assert "add_one" in completions.macros
4346

4447

4548
def test_extract_keywords_from_content():

vscode/extension/src/completion/completion.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,17 @@ export const completionProvider = (
2323
model =>
2424
new vscode.CompletionItem(model, vscode.CompletionItemKind.Reference),
2525
)
26+
const macroCompletions = result.value.macros.map(
27+
macro =>
28+
new vscode.CompletionItem(macro, vscode.CompletionItemKind.Function),
29+
)
2630
const keywordCompletions = result.value.keywords.map(
2731
keyword =>
2832
new vscode.CompletionItem(keyword, vscode.CompletionItemKind.Keyword),
2933
)
3034
return new vscode.CompletionList([
3135
...modelCompletions,
36+
...macroCompletions,
3237
...keywordCompletions,
3338
])
3439
},

vscode/extension/src/lsp/custom.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ interface AllModelsRequest {
4141
interface AllModelsResponse {
4242
models: string[]
4343
keywords: string[]
44+
macros: string[]
4445
}
4546

4647
export interface AbstractAPICallRequest {

0 commit comments

Comments
 (0)