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 CHANGED
@@ -1 +1 @@
1
- __version__ = "3.2.0"
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 or args.layer == "problems",
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=True,
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"),
@@ -654,7 +654,12 @@ def _problems_payload(index: CodebaseIndex) -> dict[str, Any]:
654
654
  "file": problem.file_name,
655
655
  }
656
656
  )
657
- return {"layer": "problems", "root": index.root, "items": items}
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
- return build_outline_semantic_model(
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
- cached is not None
442
- and cached.text == text
443
- and cached.semantic is not None
444
- ):
445
- models[file_name] = cached.semantic
446
- continue
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
- cached.semantic = model
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()
@@ -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: set[str] = set()
106
- seen_include: set[str] = set()
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
- seen: set[str],
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
- seen,
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: set[str],
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: set[str],
564
+ seen_search: dict[str, str],
562
565
  search_path_origins: dict[str, list[str]],
563
566
  include_paths: list[str],
564
- seen_include: set[str],
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: set[str],
625
+ seen_search: dict[str, str],
623
626
  search_path_origins: dict[str, list[str]],
624
627
  include_paths: list[str],
625
- seen_include: set[str],
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 name not in SKIP_DIRS
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
- seen: set[str],
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
- if key not in seen:
850
- seen.add(key)
851
- target.append(str(resolved))
852
- exposed_path = next(item for item in target if item.casefold() == key)
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.0
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.0 is authored by Dark Light and supports Windows, macOS, and Linux.
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": {"autoDiscoverPaths": true}
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=OUX37Yd6ZO82d0GJL2dmK0gZTtc_xvlTvGQIl2I-D8k,22
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=Jg1-1DSXwPfqdJMC6DInEeHaEjOzhxXallh83HyXlOY,27582
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=v7zZkOanBUkeOKszEsVxvnn5V0Wy9IoypKDASgEz28E,30698
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=VLeZlyRpjse1Qwd0ZaoPGCItaTIovaKdbgIA6tkcSE8,94638
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=qStDIwKRKLWbCDjfCJCn6vbpqelKM-0WYqK5iEEmEzg,28819
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.0.dist-info/licenses/LICENSE,sha256=-rPda9qyJvHAhjCx3ZF-Efy07F4eAg4sFvg6ChOGPoU,16726
44
- python_delphi_lsp-3.2.0.dist-info/METADATA,sha256=DMs0AfGXxvFW2QeBpBxrKeEF23b0_qeMuk1pwGi1FjI,31259
45
- python_delphi_lsp-3.2.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
46
- python_delphi_lsp-3.2.0.dist-info/entry_points.txt,sha256=rh_yGH7diowge_acQcST87A-ewH1QezEsAYC8T5ineY,103
47
- python_delphi_lsp-3.2.0.dist-info/top_level.txt,sha256=0Zp0sjw5Qtic3EQX9zNeegURga8NuXk6c2e9PN-3OTs,11
48
- python_delphi_lsp-3.2.0.dist-info/RECORD,,
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,,