1
1
__all__ = ["ResourceLocationFeatureProvider" ]
2
2
3
3
import logging
4
+ import os
4
5
from pathlib import Path
6
+ import re
5
7
from typing import cast
6
8
7
9
import lsprotocol .types as lsp
@@ -120,13 +122,12 @@ def completion(cls, params):
120
122
121
123
metadata = retrieve_metadata (node , ResourceLocationMetadata )
122
124
123
- if not metadata or metadata .represents is not type [ NamespaceFile ] :
125
+ if not metadata or not metadata .represents :
124
126
return
125
127
126
128
represents = metadata .represents
127
129
128
- if represents is type [NamespaceFile ]:
129
- file_type = cast (type [NamespaceFile ], represents )
130
+ if not isinstance (represents , str ):
130
131
131
132
path = node .get_canonical_value ()
132
133
@@ -135,27 +136,38 @@ def completion(cls, params):
135
136
136
137
resolved = get_path (path )
137
138
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 )
139
143
140
- if unresolved [1 ].name == "~" :
144
+ if unresolved [1 ].name == "~" or metadata . unresolved_path . endswith ( "/" ) :
141
145
resolved_parent = resolved [1 ]
142
146
unresolved_parent = unresolved [1 ]
143
147
else :
144
148
resolved_parent = resolved [1 ].parent
145
149
unresolved_parent = unresolved [1 ].parent
146
150
151
+ logging .debug (f"{ resolved [0 ]} :{ resolved_parent } , { unresolved [0 ]} :{ unresolved_parent } " )
152
+
147
153
items = []
148
154
149
- for file in project_index [file_type ]:
155
+ for file in project_index [represents ]:
150
156
file_path = get_path (file )
157
+ logging .debug (file_path )
151
158
152
159
if not (
153
160
file_path [0 ] == resolved [0 ]
154
- and file_path [1 ].is_relative_to (resolved_parent )
155
161
):
156
162
continue
163
+
164
+ if unresolved [0 ]:
165
+ if not file_path [1 ].is_relative_to (resolved_parent ):
166
+ continue
157
167
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 )
159
171
160
172
if unresolved [0 ] is None and unresolved [1 ].name == "" :
161
173
new_path = "./" + str (relative )
@@ -168,10 +180,13 @@ def completion(cls, params):
168
180
if node .is_tag :
169
181
insert_text = "#" + insert_text
170
182
183
+ height_above = len (re .compile (r"\.\./" ).findall (str (relative )))
184
+
171
185
items .append (
172
186
lsp .CompletionItem (
173
187
label = insert_text ,
174
188
documentation = file ,
189
+ sort_text = str (height_above ),
175
190
text_edit = lsp .InsertReplaceEdit (
176
191
insert_text ,
177
192
node_location_to_range (node ),
@@ -180,9 +195,9 @@ def completion(cls, params):
180
195
)
181
196
)
182
197
183
- return items
198
+ return lsp . CompletionList ( False , items )
184
199
185
- elif isinstance ( represents , str ) :
200
+ else :
186
201
registries = params .ctx .inject (AegisGameRegistries )
187
202
items = []
188
203
@@ -196,4 +211,4 @@ def completion(cls, params):
196
211
)
197
212
)
198
213
199
- return items
214
+ return lsp . CompletionList ( False , items )
0 commit comments