python-delphi-lsp 3.2.0__py3-none-any.whl → 3.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- delphi_lsp/_version.py +1 -1
- delphi_lsp/agent_cli.py +8 -2
- delphi_lsp/agent_layers.py +6 -1
- delphi_lsp/lsp_server.py +61 -9
- delphi_lsp/project_discovery.py +35 -17
- {python_delphi_lsp-3.2.0.dist-info → python_delphi_lsp-3.2.2.dist-info}/METADATA +19 -4
- {python_delphi_lsp-3.2.0.dist-info → python_delphi_lsp-3.2.2.dist-info}/RECORD +11 -11
- {python_delphi_lsp-3.2.0.dist-info → python_delphi_lsp-3.2.2.dist-info}/WHEEL +0 -0
- {python_delphi_lsp-3.2.0.dist-info → python_delphi_lsp-3.2.2.dist-info}/entry_points.txt +0 -0
- {python_delphi_lsp-3.2.0.dist-info → python_delphi_lsp-3.2.2.dist-info}/licenses/LICENSE +0 -0
- {python_delphi_lsp-3.2.0.dist-info → python_delphi_lsp-3.2.2.dist-info}/top_level.txt +0 -0
delphi_lsp/_version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "3.2.
|
|
1
|
+
__version__ = "3.2.2"
|
delphi_lsp/agent_cli.py
CHANGED
|
@@ -93,6 +93,11 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
93
93
|
index.add_argument("--project-file", type=Path)
|
|
94
94
|
index.add_argument("--out", type=Path, default=Path(".delphi-lsp") / "agent-index" / "index.json")
|
|
95
95
|
index.add_argument("--workers", type=parse_worker_setting, default=0)
|
|
96
|
+
index.add_argument(
|
|
97
|
+
"--deep-projects",
|
|
98
|
+
action="store_true",
|
|
99
|
+
help="Deep-parse project dependencies for the projects layer.",
|
|
100
|
+
)
|
|
96
101
|
index.set_defaults(func=_index)
|
|
97
102
|
|
|
98
103
|
wiki = subcommands.add_parser("wiki", help="Export a portable Markdown knowledge wiki.")
|
|
@@ -315,7 +320,7 @@ def _view(args: argparse.Namespace) -> None:
|
|
|
315
320
|
index = build_codebase_index(
|
|
316
321
|
args.root,
|
|
317
322
|
project_file=args.project_file,
|
|
318
|
-
index_projects=args.deep_projects
|
|
323
|
+
index_projects=args.deep_projects,
|
|
319
324
|
workers=args.workers,
|
|
320
325
|
)
|
|
321
326
|
sys.stdout.write(render_layer(index, args.layer, query=args.query, output_format=args.format))
|
|
@@ -328,10 +333,11 @@ def _index(args: argparse.Namespace) -> None:
|
|
|
328
333
|
index = build_codebase_index(
|
|
329
334
|
args.root,
|
|
330
335
|
project_file=args.project_file,
|
|
331
|
-
index_projects=
|
|
336
|
+
index_projects=args.deep_projects,
|
|
332
337
|
workers=args.workers,
|
|
333
338
|
)
|
|
334
339
|
payload = {
|
|
340
|
+
"deep_projects": bool(args.deep_projects),
|
|
335
341
|
"overview": layer_payload(index, "overview"),
|
|
336
342
|
"projects": layer_payload(index, "projects"),
|
|
337
343
|
"problems": layer_payload(index, "problems"),
|
delphi_lsp/agent_layers.py
CHANGED
|
@@ -654,7 +654,12 @@ def _problems_payload(index: CodebaseIndex) -> dict[str, Any]:
|
|
|
654
654
|
"file": problem.file_name,
|
|
655
655
|
}
|
|
656
656
|
)
|
|
657
|
-
return {
|
|
657
|
+
return {
|
|
658
|
+
"layer": "problems",
|
|
659
|
+
"root": index.root,
|
|
660
|
+
"items": items,
|
|
661
|
+
"deep_indexed": bool(index.project_results),
|
|
662
|
+
}
|
|
658
663
|
|
|
659
664
|
|
|
660
665
|
def _metrics_payload(index: CodebaseIndex, *, query: str) -> dict[str, Any]:
|
delphi_lsp/lsp_server.py
CHANGED
|
@@ -39,6 +39,7 @@ from .source_reader import read_source_text
|
|
|
39
39
|
from .workspace import WorkspaceSemanticResult
|
|
40
40
|
|
|
41
41
|
_WORKSPACE_SYMBOL_QUERY_CACHE_SIZE = 8
|
|
42
|
+
_DEFAULT_SEMANTIC_CACHE_SIZE = 512
|
|
42
43
|
_MAX_WORKSPACE_SYMBOLS = 1_000
|
|
43
44
|
_DELPHI_IDENTIFIER_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]*\Z")
|
|
44
45
|
_DELPHI_KEYWORDS = frozenset(keyword.casefold() for keyword in KEYWORDS)
|
|
@@ -70,6 +71,7 @@ class WorkspaceConfig:
|
|
|
70
71
|
extensions: tuple[str, ...] = ('.pas', '.dpr', '.dpk', '.inc')
|
|
71
72
|
eager_index: bool = False
|
|
72
73
|
auto_discover_paths: bool = True
|
|
74
|
+
semantic_cache_size: int = _DEFAULT_SEMANTIC_CACHE_SIZE
|
|
73
75
|
discovered_include_paths: list[str] = field(default_factory=list)
|
|
74
76
|
discovered_search_paths: list[str] = field(default_factory=list)
|
|
75
77
|
discovered_defines: list[str] = field(default_factory=list)
|
|
@@ -86,6 +88,10 @@ class LspWorkspaceState:
|
|
|
86
88
|
)
|
|
87
89
|
workspace_files: set[str] = field(default_factory=set)
|
|
88
90
|
file_cache: dict[str, FileSnapshot] = field(default_factory=dict)
|
|
91
|
+
semantic_cache_lru: OrderedDict[str, None] = field(
|
|
92
|
+
default_factory=OrderedDict,
|
|
93
|
+
)
|
|
94
|
+
semantic_evicted_paths: set[str] = field(default_factory=set)
|
|
89
95
|
config_warnings: list[str] = field(default_factory=list)
|
|
90
96
|
project_configs: tuple[ProjectPathConfig, ...] = field(
|
|
91
97
|
default_factory=tuple,
|
|
@@ -111,6 +117,8 @@ class LspWorkspaceState:
|
|
|
111
117
|
self.config = configured
|
|
112
118
|
self.workspace_files = set()
|
|
113
119
|
self.file_cache = {}
|
|
120
|
+
self.semantic_cache_lru.clear()
|
|
121
|
+
self.semantic_evicted_paths.clear()
|
|
114
122
|
self.workspace = None
|
|
115
123
|
self.workspace_symbol_index = None
|
|
116
124
|
self.workspace_symbol_query_cache.clear()
|
|
@@ -156,6 +164,7 @@ class LspWorkspaceState:
|
|
|
156
164
|
extensions=config.extensions,
|
|
157
165
|
eager_index=config.eager_index,
|
|
158
166
|
auto_discover_paths=config.auto_discover_paths,
|
|
167
|
+
semantic_cache_size=config.semantic_cache_size,
|
|
159
168
|
discovered_include_paths=discovered_include_paths,
|
|
160
169
|
discovered_search_paths=discovered_search_paths,
|
|
161
170
|
discovered_defines=discovered_defines,
|
|
@@ -270,6 +279,8 @@ class LspWorkspaceState:
|
|
|
270
279
|
to_remove = [path for path in self.file_cache if path not in self.workspace_files]
|
|
271
280
|
for path in to_remove:
|
|
272
281
|
self.file_cache.pop(path, None)
|
|
282
|
+
self.semantic_cache_lru.pop(path, None)
|
|
283
|
+
self.semantic_evicted_paths.discard(path)
|
|
273
284
|
for path in self.workspace_files:
|
|
274
285
|
try:
|
|
275
286
|
mtime = os.path.getmtime(path)
|
|
@@ -282,6 +293,8 @@ class LspWorkspaceState:
|
|
|
282
293
|
text = read_source_text(Path(path))
|
|
283
294
|
except (OSError, UnicodeError):
|
|
284
295
|
continue
|
|
296
|
+
self.semantic_cache_lru.pop(path, None)
|
|
297
|
+
self.semantic_evicted_paths.discard(path)
|
|
285
298
|
self.file_cache[path] = FileSnapshot(path=path, text=text, mtime=mtime)
|
|
286
299
|
|
|
287
300
|
def _collect_sources(self) -> dict[str, str]:
|
|
@@ -324,11 +337,15 @@ class LspWorkspaceState:
|
|
|
324
337
|
text = read_source_text(path)
|
|
325
338
|
except (OSError, UnicodeError):
|
|
326
339
|
return None
|
|
327
|
-
|
|
340
|
+
model = build_outline_semantic_model(
|
|
328
341
|
text,
|
|
329
342
|
file_name,
|
|
330
343
|
defines=self.config.defines,
|
|
331
344
|
)
|
|
345
|
+
cached = self.file_cache.get(file_name)
|
|
346
|
+
if cached is not None and cached.text == text:
|
|
347
|
+
self._retain_cached_semantic(file_name, cached, model)
|
|
348
|
+
return model
|
|
332
349
|
|
|
333
350
|
def full_semantic_for_uri(self, uri: str) -> SemanticModel | None:
|
|
334
351
|
file_name = uri_to_path(uri)
|
|
@@ -435,15 +452,19 @@ class LspWorkspaceState:
|
|
|
435
452
|
if not sources:
|
|
436
453
|
return None
|
|
437
454
|
models: dict[str, SemanticModel] = {}
|
|
455
|
+
previous_models = self.workspace.models if self.workspace is not None else {}
|
|
456
|
+
pending: list[tuple[str, str, FileSnapshot | None]] = []
|
|
438
457
|
for file_name, text in sources.items():
|
|
439
458
|
cached = self.file_cache.get(file_name)
|
|
440
|
-
if
|
|
441
|
-
|
|
442
|
-
and
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
459
|
+
if cached is not None and cached.text == text:
|
|
460
|
+
model = cached.semantic
|
|
461
|
+
if model is None and file_name in self.semantic_evicted_paths:
|
|
462
|
+
model = previous_models.get(file_name)
|
|
463
|
+
if model is not None:
|
|
464
|
+
models[file_name] = model
|
|
465
|
+
continue
|
|
466
|
+
pending.append((file_name, text, cached))
|
|
467
|
+
for file_name, text, cached in pending:
|
|
447
468
|
model = build_outline_semantic_model(
|
|
448
469
|
text,
|
|
449
470
|
file_name,
|
|
@@ -451,7 +472,7 @@ class LspWorkspaceState:
|
|
|
451
472
|
)
|
|
452
473
|
models[file_name] = model
|
|
453
474
|
if cached is not None and cached.text == text:
|
|
454
|
-
|
|
475
|
+
self._retain_cached_semantic(file_name, cached, model)
|
|
455
476
|
index = SymbolIndex()
|
|
456
477
|
for model in models.values():
|
|
457
478
|
index.register_unit(model.unit_scope.name, model.unit_scope)
|
|
@@ -459,6 +480,27 @@ class LspWorkspaceState:
|
|
|
459
480
|
model.index = index
|
|
460
481
|
return WorkspaceSemanticResult(models=models, index=index)
|
|
461
482
|
|
|
483
|
+
def _retain_cached_semantic(
|
|
484
|
+
self,
|
|
485
|
+
file_name: str,
|
|
486
|
+
snapshot: FileSnapshot,
|
|
487
|
+
model: SemanticModel,
|
|
488
|
+
) -> None:
|
|
489
|
+
snapshot.semantic = model
|
|
490
|
+
self.semantic_evicted_paths.discard(file_name)
|
|
491
|
+
self._touch_cached_semantic(file_name)
|
|
492
|
+
|
|
493
|
+
def _touch_cached_semantic(self, file_name: str) -> None:
|
|
494
|
+
self.semantic_cache_lru[file_name] = None
|
|
495
|
+
self.semantic_cache_lru.move_to_end(file_name)
|
|
496
|
+
limit = max(0, self.config.semantic_cache_size)
|
|
497
|
+
while len(self.semantic_cache_lru) > limit:
|
|
498
|
+
evicted, _ = self.semantic_cache_lru.popitem(last=False)
|
|
499
|
+
snapshot = self.file_cache.get(evicted)
|
|
500
|
+
if snapshot is not None:
|
|
501
|
+
snapshot.semantic = None
|
|
502
|
+
self.semantic_evicted_paths.add(evicted)
|
|
503
|
+
|
|
462
504
|
def model_for_path(self, path: str) -> SemanticModel | None:
|
|
463
505
|
if self.workspace is None:
|
|
464
506
|
return None
|
|
@@ -2247,12 +2289,21 @@ def create_server():
|
|
|
2247
2289
|
search_paths = [uri_to_path(path) for path in init_opts.get('searchPaths', [])]
|
|
2248
2290
|
defines = init_opts.get('defines', [])
|
|
2249
2291
|
auto_discover_paths = init_opts.get('autoDiscoverPaths', True)
|
|
2292
|
+
raw_semantic_cache_size = init_opts.get(
|
|
2293
|
+
'semanticCacheSize',
|
|
2294
|
+
_DEFAULT_SEMANTIC_CACHE_SIZE,
|
|
2295
|
+
)
|
|
2296
|
+
try:
|
|
2297
|
+
semantic_cache_size = max(0, int(raw_semantic_cache_size))
|
|
2298
|
+
except (TypeError, ValueError):
|
|
2299
|
+
semantic_cache_size = _DEFAULT_SEMANTIC_CACHE_SIZE
|
|
2250
2300
|
config = WorkspaceConfig(
|
|
2251
2301
|
roots=roots,
|
|
2252
2302
|
include_paths=include_paths,
|
|
2253
2303
|
search_paths=search_paths,
|
|
2254
2304
|
defines=defines,
|
|
2255
2305
|
auto_discover_paths=bool(auto_discover_paths),
|
|
2306
|
+
semantic_cache_size=semantic_cache_size,
|
|
2256
2307
|
)
|
|
2257
2308
|
state.configure(config)
|
|
2258
2309
|
for warning in state.config_warnings:
|
|
@@ -2396,6 +2447,7 @@ def create_server():
|
|
|
2396
2447
|
extensions=state.config.extensions,
|
|
2397
2448
|
eager_index=state.config.eager_index,
|
|
2398
2449
|
auto_discover_paths=state.config.auto_discover_paths,
|
|
2450
|
+
semantic_cache_size=state.config.semantic_cache_size,
|
|
2399
2451
|
)
|
|
2400
2452
|
)
|
|
2401
2453
|
source_line_cache.clear()
|
delphi_lsp/project_discovery.py
CHANGED
|
@@ -34,6 +34,9 @@ SKIP_DIRS = {
|
|
|
34
34
|
".worktrees",
|
|
35
35
|
"node_modules",
|
|
36
36
|
}
|
|
37
|
+
_RAD_STUDIO_ALWAYS_SKIP_DIRS = {"__history", "__recovery"}
|
|
38
|
+
_RAD_STUDIO_PROJECT_OUTPUT_DIRS = {"bin", "obj", "win32", "win64"}
|
|
39
|
+
_DELPHI_PROJECT_MARKER_EXTENSIONS = {".dpr", ".dproj", ".dpk"}
|
|
37
40
|
|
|
38
41
|
|
|
39
42
|
@dataclass(frozen=True)
|
|
@@ -102,8 +105,8 @@ def discover_delphi_project(
|
|
|
102
105
|
)
|
|
103
106
|
_emit_progress(on_progress, "discovery", str(root_path), 0, 0, None, "project discovery started")
|
|
104
107
|
|
|
105
|
-
seen_search:
|
|
106
|
-
seen_include:
|
|
108
|
+
seen_search: dict[str, str] = {}
|
|
109
|
+
seen_include: dict[str, str] = {}
|
|
107
110
|
seen_defines: set[str] = set()
|
|
108
111
|
seen_projects: set[str] = set()
|
|
109
112
|
seen_configs: set[str] = set()
|
|
@@ -115,7 +118,7 @@ def discover_delphi_project(
|
|
|
115
118
|
|
|
116
119
|
def add_path(
|
|
117
120
|
target: list[str],
|
|
118
|
-
|
|
121
|
+
canonical_by_key: dict[str, str],
|
|
119
122
|
origins: dict[str, list[str]],
|
|
120
123
|
path: Path | str,
|
|
121
124
|
*,
|
|
@@ -124,7 +127,7 @@ def discover_delphi_project(
|
|
|
124
127
|
) -> None:
|
|
125
128
|
_add_resolved_path(
|
|
126
129
|
target,
|
|
127
|
-
|
|
130
|
+
canonical_by_key,
|
|
128
131
|
origins,
|
|
129
132
|
str(path),
|
|
130
133
|
base=base,
|
|
@@ -277,8 +280,8 @@ def populate_workspace_sources(
|
|
|
277
280
|
) -> DelphiProjectDiscovery:
|
|
278
281
|
root_path = Path(discovery.root).expanduser().resolve()
|
|
279
282
|
seen_sources = {source.casefold() for source in discovery.source_files}
|
|
280
|
-
seen_search = {path.casefold() for path in discovery.search_paths}
|
|
281
|
-
seen_include = {path.casefold() for path in discovery.include_paths}
|
|
283
|
+
seen_search = {path.casefold(): path for path in discovery.search_paths}
|
|
284
|
+
seen_include = {path.casefold(): path for path in discovery.include_paths}
|
|
282
285
|
|
|
283
286
|
_scan_sources(root_path, discovery, seen_sources, on_progress=on_progress)
|
|
284
287
|
total_sources = len(discovery.source_files)
|
|
@@ -526,7 +529,7 @@ def _read_dpr_paths(
|
|
|
526
529
|
project: Path,
|
|
527
530
|
discovery: DelphiProjectDiscovery,
|
|
528
531
|
search_paths: list[str],
|
|
529
|
-
seen_search:
|
|
532
|
+
seen_search: dict[str, str],
|
|
530
533
|
search_path_origins: dict[str, list[str]],
|
|
531
534
|
) -> None:
|
|
532
535
|
try:
|
|
@@ -558,10 +561,10 @@ def _read_dproj(
|
|
|
558
561
|
path: Path,
|
|
559
562
|
discovery: DelphiProjectDiscovery,
|
|
560
563
|
search_paths: list[str],
|
|
561
|
-
seen_search:
|
|
564
|
+
seen_search: dict[str, str],
|
|
562
565
|
search_path_origins: dict[str, list[str]],
|
|
563
566
|
include_paths: list[str],
|
|
564
|
-
seen_include:
|
|
567
|
+
seen_include: dict[str, str],
|
|
565
568
|
include_path_origins: dict[str, list[str]],
|
|
566
569
|
add_define,
|
|
567
570
|
) -> None:
|
|
@@ -619,10 +622,10 @@ def _read_cfg(
|
|
|
619
622
|
path: Path,
|
|
620
623
|
discovery: DelphiProjectDiscovery,
|
|
621
624
|
search_paths: list[str],
|
|
622
|
-
seen_search:
|
|
625
|
+
seen_search: dict[str, str],
|
|
623
626
|
search_path_origins: dict[str, list[str]],
|
|
624
627
|
include_paths: list[str],
|
|
625
|
-
seen_include:
|
|
628
|
+
seen_include: dict[str, str],
|
|
626
629
|
include_path_origins: dict[str, list[str]],
|
|
627
630
|
add_define,
|
|
628
631
|
) -> None:
|
|
@@ -801,7 +804,7 @@ def _walk_files(
|
|
|
801
804
|
directory_names[:] = sorted(
|
|
802
805
|
name
|
|
803
806
|
for name in directory_names
|
|
804
|
-
if
|
|
807
|
+
if not _skip_walk_directory(name, file_names)
|
|
805
808
|
and (
|
|
806
809
|
project_config is None
|
|
807
810
|
or not project_config.excludes_workspace_path(current / name)
|
|
@@ -823,13 +826,27 @@ def _walk_files(
|
|
|
823
826
|
raise
|
|
824
827
|
|
|
825
828
|
|
|
829
|
+
def _skip_walk_directory(name: str, sibling_file_names: list[str]) -> bool:
|
|
830
|
+
if name in SKIP_DIRS:
|
|
831
|
+
return True
|
|
832
|
+
normalized = name.casefold()
|
|
833
|
+
if normalized in _RAD_STUDIO_ALWAYS_SKIP_DIRS:
|
|
834
|
+
return True
|
|
835
|
+
if normalized not in _RAD_STUDIO_PROJECT_OUTPUT_DIRS:
|
|
836
|
+
return False
|
|
837
|
+
return any(
|
|
838
|
+
Path(file_name).suffix.casefold() in _DELPHI_PROJECT_MARKER_EXTENSIONS
|
|
839
|
+
for file_name in sibling_file_names
|
|
840
|
+
)
|
|
841
|
+
|
|
842
|
+
|
|
826
843
|
def _is_path_too_long(error: OSError) -> bool:
|
|
827
844
|
return getattr(error, "winerror", None) == 206 or error.errno == errno.ENAMETOOLONG
|
|
828
845
|
|
|
829
846
|
|
|
830
847
|
def _add_resolved_path(
|
|
831
848
|
target: list[str],
|
|
832
|
-
|
|
849
|
+
canonical_by_key: dict[str, str],
|
|
833
850
|
origins: dict[str, list[str]],
|
|
834
851
|
value: str,
|
|
835
852
|
*,
|
|
@@ -846,10 +863,11 @@ def _add_resolved_path(
|
|
|
846
863
|
):
|
|
847
864
|
return
|
|
848
865
|
key = str(resolved).casefold()
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
866
|
+
exposed_path = canonical_by_key.get(key)
|
|
867
|
+
if exposed_path is None:
|
|
868
|
+
exposed_path = str(resolved)
|
|
869
|
+
canonical_by_key[key] = exposed_path
|
|
870
|
+
target.append(exposed_path)
|
|
853
871
|
_record_origin(origins, exposed_path, origin)
|
|
854
872
|
|
|
855
873
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-delphi-lsp
|
|
3
|
-
Version: 3.2.
|
|
3
|
+
Version: 3.2.2
|
|
4
4
|
Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
|
|
5
5
|
Author: Dark Light
|
|
6
6
|
License-Expression: MPL-2.0
|
|
@@ -45,7 +45,7 @@ Dynamic: license-file
|
|
|
45
45
|
|
|
46
46
|
`python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
|
|
47
47
|
indexes, serves LSP, and provides bounded codebase navigation for agents.
|
|
48
|
-
Version 3.2.
|
|
48
|
+
Version 3.2.2 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
49
49
|
|
|
50
50
|
## Install and quick start
|
|
51
51
|
|
|
@@ -148,7 +148,10 @@ The root `opencode.json` starts the installed package portably:
|
|
|
148
148
|
"delphi": {
|
|
149
149
|
"command": ["delphi-lsp"],
|
|
150
150
|
"extensions": [".pas", ".dpr", ".dpk", ".inc"],
|
|
151
|
-
"initialization": {
|
|
151
|
+
"initialization": {
|
|
152
|
+
"autoDiscoverPaths": true,
|
|
153
|
+
"semanticCacheSize": 512
|
|
154
|
+
}
|
|
152
155
|
}
|
|
153
156
|
}
|
|
154
157
|
}
|
|
@@ -158,6 +161,10 @@ The root `opencode.json` starts the installed package portably:
|
|
|
158
161
|
environment section; LSP remains available for normal editor and OpenCode use,
|
|
159
162
|
including large sources.
|
|
160
163
|
|
|
164
|
+
`semanticCacheSize` limits retained per-file outline models while keeping
|
|
165
|
+
source text available. Its default is 512; set it to zero to disable retained
|
|
166
|
+
snapshot models. The value is preserved when workspace folders change.
|
|
167
|
+
|
|
161
168
|
The LSP builds its structural index through the same optimized outline path for
|
|
162
169
|
every source, with no file-size threshold. Definition, hover, references,
|
|
163
170
|
rename, completion, document symbols, workspace symbols, and diagnostics remain
|
|
@@ -203,7 +210,7 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
|
|
|
203
210
|
[--query TEXT] [--format markdown|json] [--deep-projects]
|
|
204
211
|
[--workers auto|N]
|
|
205
212
|
delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
|
|
206
|
-
[--workers auto|N]
|
|
213
|
+
[--workers auto|N] [--deep-projects]
|
|
207
214
|
delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
|
|
208
215
|
[--workers auto|N] [--force] [--quiet]
|
|
209
216
|
delphi-lsp-agent query --root PATH ACTION [VALUE]
|
|
@@ -218,6 +225,14 @@ delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
|
|
|
218
225
|
delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
|
|
219
226
|
```
|
|
220
227
|
|
|
228
|
+
`--deep-projects` opts into per-project dependency parsing for the `projects`
|
|
229
|
+
and `problems` layers. It is off by default because it dominates run time on
|
|
230
|
+
real repositories:
|
|
231
|
+
on a 60-project corpus it cost 36.9 s against 1.0 s for the same index, and it
|
|
232
|
+
adds nothing to the unit model set. Without it the `projects` and `problems`
|
|
233
|
+
layers report `deep_indexed: false`, and `index` records `deep_projects` at the
|
|
234
|
+
top level of its JSON, so a shallow index is never mistaken for a complete one.
|
|
235
|
+
|
|
221
236
|
The `cache` commands manage one daemon per canonical root. Use these:
|
|
222
237
|
|
|
223
238
|
```bash
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
delphi_lsp/__init__.py,sha256=rl0cqM15YQft_uI5FrUxK7SW2fGqTYHID14fIVULJ00,3972
|
|
2
|
-
delphi_lsp/_version.py,sha256=
|
|
2
|
+
delphi_lsp/_version.py,sha256=OJQIBNbQHrD-7P_K3hC3uL5U-npkRV8MuTvtRrG4OZw,22
|
|
3
3
|
delphi_lsp/agent_cache.py,sha256=eEyDPqQhjKAlhkaqMmoIF-F0RMmrdQnWunbgvv3scu4,49938
|
|
4
|
-
delphi_lsp/agent_cli.py,sha256=
|
|
4
|
+
delphi_lsp/agent_cli.py,sha256=xGmY-qemmHjJgUMJ3UC6MbjScwq-CTV1D3mOeI4a-P8,27777
|
|
5
5
|
delphi_lsp/agent_context.py,sha256=Wd68qnV1Auedp5RyBEInavlxcAO5eA2mziw4sC0gMNk,109798
|
|
6
6
|
delphi_lsp/agent_cpg.py,sha256=Mk4-jgcIGy06NuyId-kKZr6rVHmD5FHfZhVXS3THDeU,10661
|
|
7
7
|
delphi_lsp/agent_cpg_builder.py,sha256=2hlE1dsksOwOORXwQiYsi5hVFMOlyyPO2ScqS-9Ga7Q,22593
|
|
8
|
-
delphi_lsp/agent_layers.py,sha256=
|
|
8
|
+
delphi_lsp/agent_layers.py,sha256=YfdGQDf076ZERVeP9c9xdhg9ZxEssgJLa92g1ifSsFU,30782
|
|
9
9
|
delphi_lsp/agent_metrics.py,sha256=nE1fFB30OSW7yGqvpU6O6K25-dRf-gQeCuDANb8fm7s,9629
|
|
10
10
|
delphi_lsp/agent_protocol.py,sha256=IejuVLSs7UsMWOEVG0SiD28W_6k2k5fSTYfpFh1LovI,14033
|
|
11
11
|
delphi_lsp/agent_relations.py,sha256=AyR8e6mNT5jS8iQ_JvKyIeetpozgpP8fzngX1qR8o6k,45941
|
|
@@ -22,7 +22,7 @@ delphi_lsp/grammar.py,sha256=VNsEuFeI5R9mHj6GjgeURe_nLdMEbwvRUhJXzAMUE0U,18576
|
|
|
22
22
|
delphi_lsp/lark_builder.py,sha256=AuiP8BqFnBQ-Vjwk_7-EewKUO5ukBeh3sg7M7QSmd_M,119073
|
|
23
23
|
delphi_lsp/lark_tokens.py,sha256=MGzIFNepDF3-3slHKDPq0go8RydOdfeAlPlaCCoEB5U,4175
|
|
24
24
|
delphi_lsp/lexical_scanner.py,sha256=ASUcCRkUpHQIgX9nxV6G7Bj3tU6_YBc-cSF9XPnYRko,793
|
|
25
|
-
delphi_lsp/lsp_server.py,sha256=
|
|
25
|
+
delphi_lsp/lsp_server.py,sha256=lXouP9pR7bXz-WiQA6U5PPI0KUfY5ymQLMXnfDSXH3A,97109
|
|
26
26
|
delphi_lsp/metrics.py,sha256=mehmOtlSfM2aPJPipHuV6WvFn9ye1IwkVwItm4JOUjU,29526
|
|
27
27
|
delphi_lsp/navigation_cache.py,sha256=9ZWvPXYYux6kIKRGgi072GOiiPyh1ipnmAzN70d8odE,6311
|
|
28
28
|
delphi_lsp/nodes.py,sha256=7jaz3ra60WaFctmOGU07Moyk8ut4hVoAHkYgP19Z7x8,13503
|
|
@@ -32,7 +32,7 @@ delphi_lsp/parser_backend.py,sha256=_-veK3B4OreA5wkv5pm96-JTTZtNZUQ92JZMktp2tPU,
|
|
|
32
32
|
delphi_lsp/preprocessor.py,sha256=lUQ7r9tRhx0soeACFWN0Q52rj3AoXF6qB3Nt2lOx4nA,39442
|
|
33
33
|
delphi_lsp/progress.py,sha256=6G1-5CjJnnISU-dd8jb9JHwK9YBG5MPtlYjqOAWbT_I,544
|
|
34
34
|
delphi_lsp/project_config.py,sha256=gsVsUnYAfMT1EUllA0lkKs2KxCluAFlsDhc9EMD28wk,8530
|
|
35
|
-
delphi_lsp/project_discovery.py,sha256=
|
|
35
|
+
delphi_lsp/project_discovery.py,sha256=1KVzxGp1lK5Lpkkj9yKNk9kBpb7OQQez3Xq4kKvqg88,29611
|
|
36
36
|
delphi_lsp/project_indexer.py,sha256=trrcIJ4fPKBf5nb0YQDe8Th3CPtSluhyKQEQUkgiEs4,15830
|
|
37
37
|
delphi_lsp/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
38
38
|
delphi_lsp/semantic.py,sha256=q0UgY3djupf4FtWT5upKO6gJ--Dui1CVgOhytO56f0k,10092
|
|
@@ -40,9 +40,9 @@ delphi_lsp/semantic_builder.py,sha256=nJTMkFtr1HjmP94IJ3dMM0_HJJnV5sRl-yGw0IV3tk
|
|
|
40
40
|
delphi_lsp/source_reader.py,sha256=HWiw25sLVZ6s1GGpMl17uZ-o68HoxTEd3Z0__m1vsSE,520
|
|
41
41
|
delphi_lsp/workspace.py,sha256=rkRtrg-Hi9h8SGdsQ-sGwgJgE96GnFRnN1wsMgzJ7ZE,2792
|
|
42
42
|
delphi_lsp/writer.py,sha256=j-cnyiHFNOTFECL7Ehm-m43ye7ev7qFeCCscFMjrAOY,2503
|
|
43
|
-
python_delphi_lsp-3.2.
|
|
44
|
-
python_delphi_lsp-3.2.
|
|
45
|
-
python_delphi_lsp-3.2.
|
|
46
|
-
python_delphi_lsp-3.2.
|
|
47
|
-
python_delphi_lsp-3.2.
|
|
48
|
-
python_delphi_lsp-3.2.
|
|
43
|
+
python_delphi_lsp-3.2.2.dist-info/licenses/LICENSE,sha256=-rPda9qyJvHAhjCx3ZF-Efy07F4eAg4sFvg6ChOGPoU,16726
|
|
44
|
+
python_delphi_lsp-3.2.2.dist-info/METADATA,sha256=3IgRwD4u4PaNkA1M74151OAHM2aSDH0S-Qb3BidpXkQ,32042
|
|
45
|
+
python_delphi_lsp-3.2.2.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
|
|
46
|
+
python_delphi_lsp-3.2.2.dist-info/entry_points.txt,sha256=rh_yGH7diowge_acQcST87A-ewH1QezEsAYC8T5ineY,103
|
|
47
|
+
python_delphi_lsp-3.2.2.dist-info/top_level.txt,sha256=0Zp0sjw5Qtic3EQX9zNeegURga8NuXk6c2e9PN-3OTs,11
|
|
48
|
+
python_delphi_lsp-3.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|