Skip to content

Commit 00a0c50

Browse files
authored
refactor(lsp): move references to internal types (#5039)
1 parent fbd2632 commit 00a0c50

File tree

7 files changed

+47
-45
lines changed

7 files changed

+47
-45
lines changed

sqlmesh/core/linter/helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from pathlib import Path
22

3-
from sqlmesh.core.linter.rule import Position, Range
3+
from sqlmesh.core.linter.rule import Range, Position
44
from sqlmesh.utils.pydantic import PydanticModel
55
from sqlglot import tokenize, TokenType
66
import typing as t

sqlmesh/lsp/main.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
CustomMethod,
4949
)
5050
from sqlmesh.lsp.errors import ContextFailedError, context_error_to_diagnostic
51+
from sqlmesh.lsp.helpers import to_lsp_range, to_sqlmesh_position
5152
from sqlmesh.lsp.hints import get_hints
5253
from sqlmesh.lsp.reference import (
5354
LSPCteReference,
@@ -418,7 +419,7 @@ def hover(ls: LanguageServer, params: types.HoverParams) -> t.Optional[types.Hov
418419
context = self._context_get_or_load(uri)
419420
document = ls.workspace.get_text_document(params.text_document.uri)
420421

421-
references = get_references(context, uri, params.position)
422+
references = get_references(context, uri, to_sqlmesh_position(params.position))
422423
if not references:
423424
return None
424425
reference = references[0]
@@ -429,7 +430,7 @@ def hover(ls: LanguageServer, params: types.HoverParams) -> t.Optional[types.Hov
429430
kind=types.MarkupKind.Markdown,
430431
value=reference.markdown_description,
431432
),
432-
range=reference.range,
433+
range=to_lsp_range(reference.range),
433434
)
434435

435436
except Exception as e:
@@ -464,7 +465,7 @@ def goto_definition(
464465
uri = URI(params.text_document.uri)
465466
context = self._context_get_or_load(uri)
466467

467-
references = get_references(context, uri, params.position)
468+
references = get_references(context, uri, to_sqlmesh_position(params.position))
468469
location_links = []
469470
for reference in references:
470471
# Use target_range if available (CTEs, Macros, and external models in YAML)
@@ -489,20 +490,20 @@ def goto_definition(
489490
end=types.Position(line=0, character=0),
490491
)
491492
if reference.target_range is not None:
492-
target_range = reference.target_range
493-
target_selection_range = reference.target_range
493+
target_range = to_lsp_range(reference.target_range)
494+
target_selection_range = to_lsp_range(reference.target_range)
494495
else:
495496
# CTEs and Macros always have target_range
496-
target_range = reference.target_range
497-
target_selection_range = reference.target_range
497+
target_range = to_lsp_range(reference.target_range)
498+
target_selection_range = to_lsp_range(reference.target_range)
498499

499500
if reference.path is not None:
500501
location_links.append(
501502
types.LocationLink(
502503
target_uri=URI.from_path(reference.path).value,
503504
target_selection_range=target_selection_range,
504505
target_range=target_range,
505-
origin_selection_range=reference.range,
506+
origin_selection_range=to_lsp_range(reference.range),
506507
)
507508
)
508509
return location_links
@@ -519,11 +520,13 @@ def find_references(
519520
uri = URI(params.text_document.uri)
520521
context = self._context_get_or_load(uri)
521522

522-
all_references = get_all_references(context, uri, params.position)
523+
all_references = get_all_references(
524+
context, uri, to_sqlmesh_position(params.position)
525+
)
523526

524527
# Convert references to Location objects
525528
locations = [
526-
types.Location(uri=URI.from_path(ref.path).value, range=ref.range)
529+
types.Location(uri=URI.from_path(ref.path).value, range=to_lsp_range(ref.range))
527530
for ref in all_references
528531
if ref.path is not None
529532
]

sqlmesh/lsp/reference.py

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from lsprotocol.types import Range, Position
21
import typing as t
32
from pathlib import Path
43
from pydantic import Field
@@ -8,13 +7,13 @@
87
from sqlmesh.core.linter.helpers import (
98
TokenPositionDetails,
109
)
10+
from sqlmesh.core.linter.rule import Range, Position
1111
from sqlmesh.core.model.definition import SqlModel, ExternalModel
1212
from sqlmesh.lsp.context import LSPContext, ModelTarget, AuditTarget
1313
from sqlglot import exp
1414
from sqlmesh.lsp.description import generate_markdown_description
1515
from sqlglot.optimizer.scope import build_scope
1616

17-
from sqlmesh.lsp.helpers import to_lsp_range, to_lsp_position
1817
from sqlmesh.lsp.uri import URI
1918
from sqlmesh.utils.pydantic import PydanticModel
2019
from sqlglot.optimizer.normalize_identifiers import normalize_identifiers
@@ -203,15 +202,11 @@ def get_model_definitions_for_a_path(
203202
table.this.meta
204203
).to_range(read_file)
205204

206-
# Convert SQLMesh Range to LSP Range
207-
target_range = to_lsp_range(target_range_sqlmesh)
208-
table_range = to_lsp_range(table_range_sqlmesh)
209-
210205
references.append(
211206
LSPCteReference(
212207
path=document_uri.to_path(), # Same file
213-
range=table_range,
214-
target_range=target_range,
208+
range=table_range_sqlmesh,
209+
target_range=target_range_sqlmesh,
215210
)
216211
)
217212

@@ -222,7 +217,7 @@ def get_model_definitions_for_a_path(
222217
referenced_model_path=document_uri.to_path(),
223218
description="",
224219
reference_type="cte",
225-
cte_target_range=target_range,
220+
cte_target_range=target_range_sqlmesh,
226221
)
227222
references.extend(column_references)
228223
continue
@@ -257,8 +252,8 @@ def get_model_definitions_for_a_path(
257252
references.append(
258253
LSPExternalModelReference(
259254
range=Range(
260-
start=to_lsp_position(start_pos_sqlmesh),
261-
end=to_lsp_position(end_pos_sqlmesh),
255+
start=start_pos_sqlmesh,
256+
end=end_pos_sqlmesh,
262257
),
263258
markdown_description="Unregistered external model",
264259
)
@@ -300,8 +295,8 @@ def get_model_definitions_for_a_path(
300295
LSPExternalModelReference(
301296
path=referenced_model_path,
302297
range=Range(
303-
start=to_lsp_position(start_pos_sqlmesh),
304-
end=to_lsp_position(end_pos_sqlmesh),
298+
start=start_pos_sqlmesh,
299+
end=end_pos_sqlmesh,
305300
),
306301
markdown_description=description,
307302
target_range=yaml_target_range,
@@ -325,8 +320,8 @@ def get_model_definitions_for_a_path(
325320
LSPModelReference(
326321
path=referenced_model_path,
327322
range=Range(
328-
start=to_lsp_position(start_pos_sqlmesh),
329-
end=to_lsp_position(end_pos_sqlmesh),
323+
start=start_pos_sqlmesh,
324+
end=end_pos_sqlmesh,
330325
),
331326
markdown_description=description,
332327
)
@@ -432,7 +427,7 @@ def get_macro_reference(
432427
macro_range = TokenPositionDetails.from_meta(node.meta).to_range(read_file)
433428

434429
# Check if it's a built-in method
435-
if builtin := get_built_in_macro_reference(macro_name, to_lsp_range(macro_range)):
430+
if builtin := get_built_in_macro_reference(macro_name, macro_range):
436431
return builtin
437432
else:
438433
# Skip if we can't get the position
@@ -483,7 +478,7 @@ def get_macro_reference(
483478

484479
return LSPMacroReference(
485480
path=path,
486-
range=to_lsp_range(macro_range),
481+
range=macro_range,
487482
target_range=Range(
488483
start=Position(line=start_line - 1, character=0),
489484
end=Position(line=end_line - 1, character=get_length_of_end_line),
@@ -811,8 +806,8 @@ def _get_column_table_range(column: exp.Column, read_file: t.List[str]) -> Range
811806
end_range = TokenPositionDetails.from_meta(table_parts[-1].meta).to_range(read_file)
812807

813808
return Range(
814-
start=to_lsp_position(start_range.start),
815-
end=to_lsp_position(end_range.end),
809+
start=start_range.start,
810+
end=end_range.end,
816811
)
817812

818813

sqlmesh/lsp/rename.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
)
1010

1111
from sqlmesh.lsp.context import LSPContext
12+
from sqlmesh.lsp.helpers import to_sqlmesh_position, to_lsp_range
1213
from sqlmesh.lsp.reference import (
1314
_position_within_range,
1415
get_cte_references,
@@ -18,7 +19,7 @@
1819

1920

2021
def prepare_rename(
21-
lsp_context: LSPContext, document_uri: URI, position: Position
22+
lsp_context: LSPContext, document_uri: URI, lsp_position: Position
2223
) -> t.Optional[PrepareRenameResult_Type1]:
2324
"""
2425
Prepare for rename operation by checking if the symbol at the position can be renamed.
@@ -32,6 +33,7 @@ def prepare_rename(
3233
PrepareRenameResult if the symbol can be renamed, None otherwise
3334
"""
3435
# Check if there's a CTE at this position
36+
position = to_sqlmesh_position(lsp_position)
3537
cte_references = get_cte_references(lsp_context, document_uri, position)
3638
if cte_references:
3739
# Find the target CTE definition to get its range
@@ -46,14 +48,16 @@ def prepare_rename(
4648
target_range = ref.target_range
4749
break
4850
if target_range:
49-
return PrepareRenameResult_Type1(range=target_range, placeholder="cte_name")
51+
return PrepareRenameResult_Type1(
52+
range=to_lsp_range(target_range), placeholder="cte_name"
53+
)
5054

5155
# For now, only CTEs are supported
5256
return None
5357

5458

5559
def rename_symbol(
56-
lsp_context: LSPContext, document_uri: URI, position: Position, new_name: str
60+
lsp_context: LSPContext, document_uri: URI, lsp_position: Position, new_name: str
5761
) -> t.Optional[WorkspaceEdit]:
5862
"""
5963
Perform rename operation on the symbol at the given position.
@@ -68,7 +72,9 @@ def rename_symbol(
6872
WorkspaceEdit with the changes, or None if no symbol to rename
6973
"""
7074
# Check if there's a CTE at this position
71-
cte_references = get_cte_references(lsp_context, document_uri, position)
75+
cte_references = get_cte_references(
76+
lsp_context, document_uri, to_sqlmesh_position(lsp_position)
77+
)
7278
if cte_references:
7379
return _rename_cte(cte_references, new_name)
7480

@@ -95,7 +101,7 @@ def _rename_cte(cte_references: t.List[LSPCteReference], new_name: str) -> Works
95101
changes[uri] = []
96102

97103
# Create a text edit for this reference
98-
text_edit = TextEdit(range=ref.range, new_text=new_name)
104+
text_edit = TextEdit(range=to_lsp_range(ref.range), new_text=new_name)
99105
changes[uri].append(text_edit)
100106

101107
return WorkspaceEdit(changes=changes)
@@ -119,7 +125,7 @@ def get_document_highlights(
119125
List of DocumentHighlight objects or None if no symbol found
120126
"""
121127
# Check if there's a CTE at this position
122-
cte_references = get_cte_references(lsp_context, document_uri, position)
128+
cte_references = get_cte_references(lsp_context, document_uri, to_sqlmesh_position(position))
123129
if cte_references:
124130
highlights = []
125131
for ref in cte_references:
@@ -130,7 +136,7 @@ def get_document_highlights(
130136
else DocumentHighlightKind.Read
131137
)
132138

133-
highlights.append(DocumentHighlight(range=ref.range, kind=kind))
139+
highlights.append(DocumentHighlight(range=to_lsp_range(ref.range), kind=kind))
134140
return highlights
135141

136142
# For now, only CTEs are supported

tests/lsp/test_reference.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from lsprotocol.types import Position
21
from sqlmesh.core.context import Context
2+
from sqlmesh.core.linter.rule import Position
33
from sqlmesh.lsp.context import LSPContext, ModelTarget, AuditTarget
44
from sqlmesh.lsp.reference import LSPModelReference, get_model_definitions_for_a_path, by_position
55
from sqlmesh.lsp.uri import URI

tests/lsp/test_reference_external_model.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
from pathlib import Path
22

3-
from lsprotocol.types import Position
4-
53
from sqlmesh import Config
64
from sqlmesh.core.context import Context
75
from sqlmesh.core.linter.helpers import read_range_from_file
6+
from sqlmesh.core.linter.rule import Position
87
from sqlmesh.lsp.context import LSPContext, ModelTarget
9-
from sqlmesh.lsp.helpers import to_sqlmesh_range
108
from sqlmesh.lsp.reference import get_references, LSPExternalModelReference
119
from sqlmesh.lsp.uri import URI
1210
from tests.utils.test_filesystem import create_temp_file
@@ -34,14 +32,14 @@ def test_reference() -> None:
3432
assert path is not None
3533
assert str(path).endswith("external_models.yaml")
3634

37-
source_range = read_range_from_file(customers, to_sqlmesh_range(reference.range))
35+
source_range = read_range_from_file(customers, reference.range)
3836
assert source_range == "raw.demographics"
3937

4038
if reference.target_range is None:
4139
raise AssertionError("Reference target range should not be None")
4240
path = reference.path
4341
assert path is not None
44-
target_range = read_range_from_file(path, to_sqlmesh_range(reference.target_range))
42+
target_range = read_range_from_file(path, reference.target_range)
4543
assert target_range == "raw.demographics"
4644

4745

@@ -61,4 +59,4 @@ def test_unregistered_external_model(tmp_path: Path):
6159
assert reference.path is None
6260
assert reference.target_range is None
6361
assert reference.markdown_description == "Unregistered external model"
64-
assert read_range_from_file(model_path, to_sqlmesh_range(reference.range)) == "external_model"
62+
assert read_range_from_file(model_path, reference.range) == "external_model"

tests/lsp/test_reference_model_column_prefix.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from pathlib import Path
22

3-
from lsprotocol.types import Position
43
from sqlmesh.cli.project_init import init_example_project
54
from sqlmesh.core.context import Context
5+
from sqlmesh.core.linter.rule import Position
66
from sqlmesh.lsp.context import LSPContext, ModelTarget
77
from sqlmesh.lsp.reference import get_all_references
88
from sqlmesh.lsp.uri import URI

0 commit comments

Comments
 (0)