Skip to content

Commit a463427

Browse files
fix: relative paths hints now work as intended
1 parent 6ac774c commit a463427

File tree

11 files changed

+83
-71
lines changed

11 files changed

+83
-71
lines changed

aegis-core/aegis_core/ast/features/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from dataclasses import dataclass, field
22

33
from beet import Context
4-
from bolt import AstAttribute, AstIdentifier, AstImportedItem, AstTargetIdentifier
4+
from bolt import AstAttribute, AstIdentifier, AstImportedItem, AstTargetAttribute, AstTargetIdentifier
55
from mecha import AstNode, AstResourceLocation
66

77
from .provider import *
@@ -13,6 +13,7 @@ def get_default_providers() -> dict[type[AstNode], type[BaseFeatureProvider]]:
1313
return {
1414
AstIdentifier: VariableFeatureProvider,
1515
AstAttribute: VariableFeatureProvider,
16+
AstTargetAttribute: VariableFeatureProvider,
1617
AstTargetIdentifier: VariableFeatureProvider,
1718
AstImportedItem: VariableFeatureProvider,
1819
AstResourceLocation: ResourceLocationFeatureProvider,

aegis-core/aegis_core/ast/features/provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class BaseFeatureProvider(Generic[Node]):
5757
@classmethod
5858
def completion(
5959
cls, params: CompletionParams[Node]
60-
) -> list[lsp.CompletionItem] | None:
60+
) -> lsp.CompletionList | None:
6161
return None
6262

6363
@classmethod

aegis-core/aegis_core/ast/features/resource_location.py

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
__all__ = ["ResourceLocationFeatureProvider"]
22

33
import logging
4+
import os
45
from pathlib import Path
6+
import re
57
from typing import cast
68

79
import lsprotocol.types as lsp
@@ -120,13 +122,12 @@ def completion(cls, params):
120122

121123
metadata = retrieve_metadata(node, ResourceLocationMetadata)
122124

123-
if not metadata or metadata.represents is not type[NamespaceFile]:
125+
if not metadata or not metadata.represents:
124126
return
125127

126128
represents = metadata.represents
127129

128-
if represents is type[NamespaceFile]:
129-
file_type = cast(type[NamespaceFile], represents)
130+
if not isinstance(represents, str):
130131

131132
path = node.get_canonical_value()
132133

@@ -135,27 +136,38 @@ def completion(cls, params):
135136

136137
resolved = get_path(path)
137138

138-
unresolved = get_path(metadata.unresolved_path or path)
139+
if not metadata.unresolved_path:
140+
return
141+
142+
unresolved = get_path(metadata.unresolved_path)
139143

140-
if unresolved[1].name == "~":
144+
if unresolved[1].name == "~" or metadata.unresolved_path.endswith("/"):
141145
resolved_parent = resolved[1]
142146
unresolved_parent = unresolved[1]
143147
else:
144148
resolved_parent = resolved[1].parent
145149
unresolved_parent = unresolved[1].parent
146150

151+
logging.debug(f"{resolved[0]}:{resolved_parent}, {unresolved[0]}:{unresolved_parent}")
152+
147153
items = []
148154

149-
for file in project_index[file_type]:
155+
for file in project_index[represents]:
150156
file_path = get_path(file)
157+
logging.debug(file_path)
151158

152159
if not (
153160
file_path[0] == resolved[0]
154-
and file_path[1].is_relative_to(resolved_parent)
155161
):
156162
continue
163+
164+
if unresolved[0]:
165+
if not file_path[1].is_relative_to(resolved_parent):
166+
continue
157167

158-
relative = file_path[1].relative_to(resolved_parent)
168+
relative = file_path[1].relative_to(resolved_parent)
169+
else:
170+
relative = os.path.relpath(file_path[1], resolved_parent)
159171

160172
if unresolved[0] is None and unresolved[1].name == "":
161173
new_path = "./" + str(relative)
@@ -168,10 +180,13 @@ def completion(cls, params):
168180
if node.is_tag:
169181
insert_text = "#" + insert_text
170182

183+
height_above = len(re.compile(r"\.\./").findall(str(relative)))
184+
171185
items.append(
172186
lsp.CompletionItem(
173187
label=insert_text,
174188
documentation=file,
189+
sort_text=str(height_above),
175190
text_edit=lsp.InsertReplaceEdit(
176191
insert_text,
177192
node_location_to_range(node),
@@ -180,9 +195,9 @@ def completion(cls, params):
180195
)
181196
)
182197

183-
return items
198+
return lsp.CompletionList(False, items)
184199

185-
elif isinstance(represents, str):
200+
else:
186201
registries = params.ctx.inject(AegisGameRegistries)
187202
items = []
188203

@@ -196,4 +211,4 @@ def completion(cls, params):
196211
)
197212
)
198213

199-
return items
214+
return lsp.CompletionList(False, items)

aegis-core/aegis_core/ast/features/variable.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import lsprotocol.types as lsp
2-
from bolt import AstAttribute, AstIdentifier, AstImportedItem, AstTargetIdentifier
2+
from bolt import AstAttribute, AstIdentifier, AstImportedItem, AstTargetAttribute, AstTargetIdentifier
33

44
from ...reflection import get_annotation_description
55
from ..metadata import VariableMetadata, retrieve_metadata
@@ -10,7 +10,7 @@
1010

1111
class VariableFeatureProvider(
1212
BaseFeatureProvider[
13-
AstIdentifier | AstAttribute | AstTargetIdentifier | AstImportedItem
13+
AstIdentifier | AstAttribute | AstTargetAttribute | AstTargetIdentifier | AstImportedItem
1414
]
1515
):
1616
@classmethod
@@ -21,7 +21,7 @@ def hover(cls, params) -> lsp.Hover | None:
2121
metadata = retrieve_metadata(node, VariableMetadata)
2222
name = (
2323
node.value
24-
if not isinstance(node, (AstAttribute, AstImportedItem))
24+
if not isinstance(node, (AstAttribute, AstTargetAttribute, AstImportedItem))
2525
else node.name
2626
)
2727

aegis-server/aegis_server/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def hover(ls: AegisServer, params: lsp.HoverParams):
7272
@server.feature(lsp.TEXT_DOCUMENT_RENAME)
7373
def rename(ls: AegisServer, params: lsp.RenameParams):
7474
return rename_variable(ls, params)
75-
75+
7676
@server.command("mecha.server.dumpIndices")
7777
def dump(ls: AegisServer, *args):
7878
for _, i in ls._instances.values():

aegis-server/aegis_server/server/features/completion.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,22 @@ def completion(ls: AegisServer, params: lsp.CompletionParams):
9292

9393
with ls.context(text_doc) as ctx:
9494
if ctx is None:
95-
items = []
95+
items = None
9696
else:
9797
items = get_completions(ctx, params.position, text_doc)
9898

99-
return lsp.CompletionList(False, items or [])
99+
return items
100100

101101

102102
def get_completions(
103103
ctx: LanguageServerContext,
104104
pos: lsp.Position,
105105
text_doc: TextDocument,
106-
) -> list[lsp.CompletionItem] | None:
106+
) -> lsp.CompletionList | None:
107107
mecha = ctx.inject(Mecha)
108108

109109
if not (compiled_doc := get_compilation_data(ctx, text_doc)):
110-
return []
110+
return None
111111

112112
ast = compiled_doc.ast
113113
diagnostics = compiled_doc.diagnostics
@@ -190,7 +190,7 @@ def get_diag_completions(
190190
add_raw_definition(items, name, getattr(builtins, name))
191191

192192
break
193-
return items
193+
return lsp.CompletionList(False, items)
194194

195195

196196
def add_variable_definition(

aegis-server/aegis_server/server/features/validate.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ def try_to_mount_file(ctx: LanguageServerContext, file_path: str):
134134
ctx.path_to_resource[path] = (location, file)
135135
ctx.data[type(file)][location] = file
136136

137+
logging.debug(f"Mounted {path} to {location}")
137138
return True
138139
except Exception as exc:
139140
logging.error(f"Failed to mount {path}, reloading datapack,\n{exc}")

aegis-server/aegis_server/server/indexing.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,10 @@ def get_referenced_type(
214214

215215

216216
def add_representation(arg_node: AstNode, type: Any):
217-
metadata = (
218-
retrieve_metadata(arg_node, ResourceLocationMetadata)
219-
or ResourceLocationMetadata()
220-
)
217+
metadata = retrieve_metadata(arg_node, ResourceLocationMetadata)
218+
219+
if metadata is None:
220+
metadata = ResourceLocationMetadata()
221221

222222
metadata.represents = type
223223

@@ -304,18 +304,16 @@ def value(self, value: AstValue):
304304

305305
@rule(AstResourceLocation)
306306
def resource_location(self, node: AstResourceLocation):
307-
metadata = (
308-
retrieve_metadata(node, ResourceLocationMetadata)
309-
or ResourceLocationMetadata()
310-
)
311307

312308
if isinstance(node, AstNestedLocation):
313-
metadata.unresolved_path = f"~/" + node.path
314-
else:
315-
metadata.unresolved_path = node.get_canonical_value()
309+
metadata = (
310+
retrieve_metadata(node, ResourceLocationMetadata)
311+
or ResourceLocationMetadata()
312+
)
316313

317-
attach_metadata(node, metadata)
314+
metadata.unresolved_path = f"~/" + node.path
318315

316+
attach_metadata(node, metadata)
319317

320318
@dataclass
321319
class BindingStep(Reducer):

aegis-server/aegis_server/server/patches/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from dataclasses import replace
22
from functools import partial
3+
import logging
34
from typing import Callable, TypeVar, cast
45

56
from mecha import AstNode, AstResourceLocation, Rule
@@ -34,7 +35,6 @@ def parse_relative_path(
3435
retrieve_metadata(node, ResourceLocationMetadata) or ResourceLocationMetadata()
3536
)
3637

37-
attach_metadata(node, metadata)
3838

3939
if node.namespace is None and node.path.startswith(("./", "../")):
4040
unresolved = node.path
@@ -50,6 +50,9 @@ def parse_relative_path(
5050
metadata.unresolved_path = unresolved
5151
else:
5252
metadata.unresolved_path = node.get_canonical_value()
53+
54+
attach_metadata(node, metadata)
55+
5356
return node
5457

5558

aegis-vscode/aegis.png

22.6 KB
Loading

0 commit comments

Comments
 (0)