Skip to content

Commit 2719428

Browse files
fix(aegis-server, aegis-core): remove dereferenced files from compilation database
1 parent cc9a68d commit 2719428

File tree

5 files changed

+55
-17
lines changed

5 files changed

+55
-17
lines changed

aegis-core/aegis_core/indexing/project_index.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
from heapq import heapify
12
import logging
23
import re
34
from dataclasses import dataclass, field
45
from pathlib import Path
56
from threading import Lock
67
from typing import ClassVar
78

8-
from beet import Context, File, NamespaceFile
9+
from beet import Context, File, Function, NamespaceFile
910
from beet.core.utils import extra_field, required_field
11+
from bolt import Module
12+
from mecha import Mecha
1013
from tokenstream import SourceLocation
1114

1215
__all__ = ["FilePointer", "ResourceIndex", "AegisProjectIndex"]
@@ -43,22 +46,27 @@ class ResourceIndex:
4346
_files: dict[str, ResourceIndice] = extra_field(default_factory=dict)
4447
_lock: Lock = extra_field(default_factory=Lock)
4548

46-
def remove_associated(self, path: str | File):
49+
def remove_associated(self, path: str | File) -> list[str]:
4750
self._lock.acquire()
4851

4952
if isinstance(path, File):
5053
path = str(Path(path.ensure_source_path()).absolute())
5154

55+
removed = []
56+
5257
for file, indice in list(self._files.items()):
53-
if path in indice.definitions:
54-
del indice.definitions[path]
58+
5559
if path in indice.references:
5660
del indice.references[path]
61+
if path in indice.definitions:
62+
del indice.definitions[path]
5763

58-
if len(indice.definitions) == 0:
59-
del self._files[file]
64+
if len(indice.definitions) == 0:
65+
del self._files[file]
66+
removed.append(file)
6067

6168
self._lock.release()
69+
return removed
6270

6371
def add_definition(
6472
self,
@@ -158,8 +166,31 @@ def __getitem__(self, key: type[NamespaceFile]):
158166
return self._resources.setdefault(key, ResourceIndex())
159167

160168
def remove_associated(self, path: str):
161-
for resource in self._resources.values():
162-
resource.remove_associated(path)
169+
for resource, index in self._resources.items():
170+
removed_files = index.remove_associated(path)
171+
172+
for removed in removed_files:
173+
for pack in self._ctx.packs:
174+
if not removed in pack[resource]:
175+
continue
176+
177+
file = pack[resource][removed]
178+
179+
mecha = self._ctx.inject(Mecha)
180+
if file in mecha.database:
181+
del mecha.database[file]
182+
self._remove_from_queue(file, mecha)
183+
184+
def _remove_from_queue(self, file, mecha: Mecha):
185+
index = -1
186+
for i, (_, _, _, _, queued_file) in enumerate(mecha.database.queue):
187+
if file == queued_file:
188+
index = i
189+
break
190+
191+
if index != -1:
192+
mecha.database.queue.pop(i)
193+
heapify(mecha.database.queue)
163194

164195
def dump(self) -> str:
165196
dump = ""

aegis-server/aegis_server/providers/resource_location.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,10 @@ def completion(cls, params):
146146
resolved_parent = resolved[1].parent
147147
unresolved_parent = unresolved[1].parent
148148

149-
logging.debug(f"{resolved[0]}:{resolved_parent}, {unresolved[0]}:{unresolved_parent}")
150-
151149
items = []
152150

153151
for file in project_index[represents]:
154152
file_path = get_path(file)
155-
logging.debug(file_path)
156153

157154
if not (
158155
file_path[0] == resolved[0]

aegis-server/aegis_server/server/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from contextlib import contextmanager
1010
from pathlib import Path
1111
from threading import Lock, Thread
12+
import traceback
1213
from typing import Generator, cast
1314
from urllib import request
1415
from urllib.parse import unquote, urlparse
@@ -65,7 +66,7 @@ def __init__(self, *args):
6566
target=lambda self, parent: self.scan_functions(parent),
6667
args=[self, threading.current_thread()],
6768
)
68-
self._index_thread.start()
69+
# self._index_thread.start()
6970

7071
def index_functions(self, ctx: LanguageServerContext):
7172
for function, file in cast(
@@ -93,7 +94,8 @@ def scan_functions(self, parent_thread: Thread):
9394
time.sleep(0.1)
9495
except Exception as exc:
9596
lock.release()
96-
logging.error(f"Fatal error occured while indexing function!\n{exc}")
97+
tb = "\n".join(traceback.format_tb(exc.__traceback__))
98+
logging.error(f"Fatal error occured while indexing function!\n{exc}\n{tb}")
9799

98100
logging.info("Stopped Indexing Thread")
99101

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,13 @@ def compile(
211211
mecha = ctx.inject(Mecha)
212212
diagnostics = []
213213

214+
try:
215+
project_index = ctx.inject(AegisProjectIndex)
216+
project_index.remove_associated(source_path)
217+
except Exception as e:
218+
tb = "\n".join(traceback.format_tb(e.__traceback__))
219+
logging.error(f"{e}\n{tb}")
220+
214221
indexer = Indexer(
215222
ctx=ctx,
216223
resource_location=resource_location,
@@ -224,10 +231,12 @@ def compile(
224231
compiled_unit = CompilationUnit(
225232
resource_location=resource_location, pack=ctx.data
226233
)
227-
mecha.database[source_file] = compiled_unit
228-
mecha.database.enqueue(source_file)
234+
database = mecha.database
235+
database[source_file] = compiled_unit
236+
database.enqueue(source_file)
237+
229238

230-
for step, file_instance in mecha.database.process_queue():
239+
for step, file_instance in database.process_queue():
231240
compilation_unit = mecha.database[file_instance]
232241

233242
if step < 0:

aegis-server/aegis_server/server/indexing.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,6 @@ def __call__(self, ast: AstRoot, *args) -> AbstractNode:
683683

684684
# A file always defines itself
685685
source_type = type(self.file_instance)
686-
project_index.remove_associated(self.source_path)
687686

688687
project_index[source_type].add_definition(
689688
self.resource_location, self.source_path

0 commit comments

Comments
 (0)