python-delphi-lsp 3.2.0__tar.gz → 3.2.1__tar.gz

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.
Files changed (383) hide show
  1. {python_delphi_lsp-3.2.0/python_delphi_lsp.egg-info → python_delphi_lsp-3.2.1}/PKG-INFO +18 -4
  2. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/README.md +17 -3
  3. python_delphi_lsp-3.2.1/delphi_lsp/_version.py +1 -0
  4. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cli.py +7 -1
  5. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_layers.py +6 -1
  6. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lsp_server.py +61 -9
  7. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/project_discovery.py +35 -17
  8. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/performance-delphi.md +103 -15
  9. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.2.0.md +4 -2
  10. python_delphi_lsp-3.2.1/docs/release-3.2.1.md +77 -0
  11. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/pyproject.toml +1 -1
  12. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1/python_delphi_lsp.egg-info}/PKG-INFO +18 -4
  13. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/SOURCES.txt +2 -0
  14. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_fpc_corpus.py +120 -28
  15. python_delphi_lsp-3.2.1/tests/fpc_parse_quality.baseline.json +5430 -0
  16. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_fpc_performance_corpus.py +100 -1
  17. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_lsp_server.py +57 -1
  18. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_lsp_support.py +2 -2
  19. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_package_metadata.py +3 -3
  20. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_project_discovery.py +55 -0
  21. python_delphi_lsp-3.2.1/tests/test_throughput_scaling.py +360 -0
  22. python_delphi_lsp-3.2.0/delphi_lsp/_version.py +0 -1
  23. python_delphi_lsp-3.2.0/tests/fpc_parse_quality.baseline.json +0 -1713
  24. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/.github/workflows/ci.yml +0 -0
  25. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/LICENSE +0 -0
  26. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/MANIFEST.in +0 -0
  27. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/__init__.py +0 -0
  28. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cache.py +0 -0
  29. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_context.py +0 -0
  30. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg.py +0 -0
  31. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg_builder.py +0 -0
  32. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_metrics.py +0 -0
  33. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_protocol.py +0 -0
  34. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_relations.py +0 -0
  35. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_templates.py +0 -0
  36. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_wiki.py +0 -0
  37. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_workspace.py +0 -0
  38. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/binary.py +0 -0
  39. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/comment_builder.py +0 -0
  40. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/consts.py +0 -0
  41. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_lexer.py +0 -0
  42. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_parser.py +0 -0
  43. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_tokens.py +0 -0
  44. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/grammar.py +0 -0
  45. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_builder.py +0 -0
  46. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_tokens.py +0 -0
  47. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lexical_scanner.py +0 -0
  48. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/metrics.py +0 -0
  49. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/navigation_cache.py +0 -0
  50. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/nodes.py +0 -0
  51. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/parallel_outline.py +0 -0
  52. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/parser.py +0 -0
  53. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/parser_backend.py +0 -0
  54. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/preprocessor.py +0 -0
  55. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/progress.py +0 -0
  56. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/project_config.py +0 -0
  57. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/project_indexer.py +0 -0
  58. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/py.typed +0 -0
  59. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic.py +0 -0
  60. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic_builder.py +0 -0
  61. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/source_reader.py +0 -0
  62. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/workspace.py +0 -0
  63. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/writer.py +0 -0
  64. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/performance-fpc.md +0 -0
  65. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-2.3.0.md +0 -0
  66. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-2.3.3.md +0 -0
  67. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.0.0.md +0 -0
  68. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.1.0.md +0 -0
  69. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.1.1.md +0 -0
  70. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.1.2.md +0 -0
  71. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
  72. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
  73. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
  74. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
  75. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
  76. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
  77. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
  78. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
  79. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
  80. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
  81. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
  82. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
  83. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
  84. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
  85. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
  86. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
  87. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
  88. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
  89. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
  90. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
  91. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
  92. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
  93. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
  94. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
  95. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/opencode.json +0 -0
  96. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  97. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  98. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/requires.txt +0 -0
  99. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  100. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/audit_delphi_language_features.py +0 -0
  101. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_cpg.py +0 -0
  102. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_github_corpus.py +0 -0
  103. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_parallel_cache.py +0 -0
  104. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  105. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  106. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  107. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  108. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/build_github_performance_corpus.py +0 -0
  109. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/check_ornith_cache.py +0 -0
  110. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/generate_progress_pdf.py +0 -0
  111. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/generate_release_evidence.py +0 -0
  112. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  113. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/prepare_delphi_corpus.py +0 -0
  114. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/prepare_fpc_corpus.py +0 -0
  115. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/prepare_ornith_cache.py +0 -0
  116. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/run_opencode_lsp_probe.py +0 -0
  117. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/run_openrouter_github_e2e.py +0 -0
  118. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/start_ornith_vllm.sh +0 -0
  119. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/summarize_opencode_request_payloads.py +0 -0
  120. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/setup.cfg +0 -0
  121. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +0 -0
  122. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +0 -0
  123. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +0 -0
  124. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +0 -0
  125. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +0 -0
  126. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +0 -0
  127. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +0 -0
  128. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +0 -0
  129. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +0 -0
  130. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +0 -0
  131. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +0 -0
  132. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +0 -0
  133. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +0 -0
  134. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +0 -0
  135. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +0 -0
  136. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +0 -0
  137. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +0 -0
  138. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +0 -0
  139. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +0 -0
  140. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +0 -0
  141. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +0 -0
  142. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +0 -0
  143. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +0 -0
  144. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +0 -0
  145. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +0 -0
  146. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +0 -0
  147. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +0 -0
  148. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +0 -0
  149. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +0 -0
  150. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +0 -0
  151. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +0 -0
  152. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +0 -0
  153. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +0 -0
  154. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +0 -0
  155. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +0 -0
  156. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +0 -0
  157. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +0 -0
  158. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +0 -0
  159. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +0 -0
  160. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +0 -0
  161. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +0 -0
  162. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +0 -0
  163. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +0 -0
  164. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +0 -0
  165. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +0 -0
  166. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +0 -0
  167. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +0 -0
  168. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +0 -0
  169. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +0 -0
  170. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +0 -0
  171. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +0 -0
  172. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +0 -0
  173. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +0 -0
  174. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +0 -0
  175. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +0 -0
  176. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +0 -0
  177. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +0 -0
  178. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +0 -0
  179. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +0 -0
  180. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +0 -0
  181. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +0 -0
  182. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +0 -0
  183. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +0 -0
  184. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +0 -0
  185. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/LICENSE.txt +0 -0
  186. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +0 -0
  187. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +0 -0
  188. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +0 -0
  189. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +0 -0
  190. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +0 -0
  191. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +0 -0
  192. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +0 -0
  193. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +0 -0
  194. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +0 -0
  195. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +0 -0
  196. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +0 -0
  197. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +0 -0
  198. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +0 -0
  199. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +0 -0
  200. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +0 -0
  201. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +0 -0
  202. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +0 -0
  203. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +0 -0
  204. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +0 -0
  205. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +0 -0
  206. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +0 -0
  207. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +0 -0
  208. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +0 -0
  209. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +0 -0
  210. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +0 -0
  211. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +0 -0
  212. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +0 -0
  213. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +0 -0
  214. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +0 -0
  215. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +0 -0
  216. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +0 -0
  217. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +0 -0
  218. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +0 -0
  219. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +0 -0
  220. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +0 -0
  221. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +0 -0
  222. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +0 -0
  223. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +0 -0
  224. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +0 -0
  225. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +0 -0
  226. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +0 -0
  227. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +0 -0
  228. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +0 -0
  229. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +0 -0
  230. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +0 -0
  231. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +0 -0
  232. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +0 -0
  233. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +0 -0
  234. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +0 -0
  235. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +0 -0
  236. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +0 -0
  237. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +0 -0
  238. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +0 -0
  239. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +0 -0
  240. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +0 -0
  241. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +0 -0
  242. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +0 -0
  243. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +0 -0
  244. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +0 -0
  245. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +0 -0
  246. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +0 -0
  247. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +0 -0
  248. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +0 -0
  249. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +0 -0
  250. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +0 -0
  251. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +0 -0
  252. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.inc +0 -0
  253. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +0 -0
  254. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +0 -0
  255. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +0 -0
  256. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +0 -0
  257. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +0 -0
  258. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +0 -0
  259. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +0 -0
  260. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +0 -0
  261. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +0 -0
  262. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +0 -0
  263. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +0 -0
  264. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +0 -0
  265. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +0 -0
  266. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +0 -0
  267. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +0 -0
  268. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +0 -0
  269. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +0 -0
  270. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +0 -0
  271. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +0 -0
  272. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +0 -0
  273. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +0 -0
  274. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +0 -0
  275. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +0 -0
  276. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +0 -0
  277. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +0 -0
  278. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +0 -0
  279. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +0 -0
  280. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +0 -0
  281. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +0 -0
  282. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +0 -0
  283. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +0 -0
  284. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +0 -0
  285. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +0 -0
  286. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +0 -0
  287. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +0 -0
  288. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +0 -0
  289. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +0 -0
  290. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +0 -0
  291. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +0 -0
  292. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +0 -0
  293. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +0 -0
  294. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/mORMot2/LICENCE.md +0 -0
  295. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/mORMot2/src/mormot.defines.inc +0 -0
  296. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +0 -0
  297. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/corpora.performance.lock.json +0 -0
  298. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  299. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  300. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  301. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  302. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  303. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  304. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  305. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  306. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  307. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  308. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  309. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  310. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  311. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  312. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  313. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  314. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  315. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  316. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  317. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  318. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  319. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  320. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  321. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  322. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  323. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  324. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  325. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  326. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  327. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/library_demo.dpr +0 -0
  328. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/package_demo.dpk +0 -0
  329. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/program_demo.dpr +0 -0
  330. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_advanced.pas +0 -0
  331. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_attributes.pas +0 -0
  332. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_basic.pas +0 -0
  333. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_consumer.pas +0 -0
  334. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_generics.pas +0 -0
  335. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_inheritance.pas +0 -0
  336. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_math.pas +0 -0
  337. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_properties.pas +0 -0
  338. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_sections.pas +0 -0
  339. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_statements.pas +0 -0
  340. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_types.pas +0 -0
  341. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_unresolved.pas +0 -0
  342. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_with.pas +0 -0
  343. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_cache.py +0 -0
  344. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_cli_errors.py +0 -0
  345. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_codebase.py +0 -0
  346. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_context.py +0 -0
  347. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_cpg.py +0 -0
  348. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_metrics.py +0 -0
  349. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_protocol.py +0 -0
  350. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_relations.py +0 -0
  351. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_wiki.py +0 -0
  352. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_worker.py +0 -0
  353. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_workspace.py +0 -0
  354. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
  355. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_opencode.py +0 -0
  356. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphi_performance_corpus.py +0 -0
  357. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_lexer.py +0 -0
  358. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_native_compatibility.py +0 -0
  359. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_parser.py +0 -0
  360. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_semantic_compatibility.py +0 -0
  361. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_diagnostics.py +0 -0
  362. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_github_performance_corpus.py +0 -0
  363. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_language_feature_matrix.py +0 -0
  364. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_legacy_snippets.py +0 -0
  365. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_lsp_features.py +0 -0
  366. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_metrics.py +0 -0
  367. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_navigation_cache.py +0 -0
  368. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_opencode_config.py +0 -0
  369. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_opencode_probe.py +0 -0
  370. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_opencode_request_payloads.py +0 -0
  371. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_openrouter_github_e2e.py +0 -0
  372. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_ornith_cache_prepare.py +0 -0
  373. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_parallel_outline.py +0 -0
  374. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_parser.py +0 -0
  375. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_parser_backends.py +0 -0
  376. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_preprocessor.py +0 -0
  377. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_progress.py +0 -0
  378. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_project_config.py +0 -0
  379. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_project_indexer.py +0 -0
  380. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_release_evidence.py +0 -0
  381. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_semantic.py +0 -0
  382. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_vllm_start_script.py +0 -0
  383. {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_workspace.py +0 -0
@@ -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.1
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.1 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,13 @@ 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
+ layer. It is off by default because it dominates run time on real repositories:
230
+ on a 60-project corpus it cost 36.9 s against 1.0 s for the same index, and it
231
+ adds nothing to the unit model set. Without it the `projects` and `problems`
232
+ layers report `deep_indexed: false`, and `index` records `deep_projects` at the
233
+ top level of its JSON, so a shallow index is never mistaken for a complete one.
234
+
221
235
  The `cache` commands manage one daemon per canonical root. Use these:
222
236
 
223
237
  ```bash
@@ -2,7 +2,7 @@
2
2
 
3
3
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
4
4
  indexes, serves LSP, and provides bounded codebase navigation for agents.
5
- Version 3.2.0 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 3.2.1 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -105,7 +105,10 @@ The root `opencode.json` starts the installed package portably:
105
105
  "delphi": {
106
106
  "command": ["delphi-lsp"],
107
107
  "extensions": [".pas", ".dpr", ".dpk", ".inc"],
108
- "initialization": {"autoDiscoverPaths": true}
108
+ "initialization": {
109
+ "autoDiscoverPaths": true,
110
+ "semanticCacheSize": 512
111
+ }
109
112
  }
110
113
  }
111
114
  }
@@ -115,6 +118,10 @@ The root `opencode.json` starts the installed package portably:
115
118
  environment section; LSP remains available for normal editor and OpenCode use,
116
119
  including large sources.
117
120
 
121
+ `semanticCacheSize` limits retained per-file outline models while keeping
122
+ source text available. Its default is 512; set it to zero to disable retained
123
+ snapshot models. The value is preserved when workspace folders change.
124
+
118
125
  The LSP builds its structural index through the same optimized outline path for
119
126
  every source, with no file-size threshold. Definition, hover, references,
120
127
  rename, completion, document symbols, workspace symbols, and diagnostics remain
@@ -160,7 +167,7 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
160
167
  [--query TEXT] [--format markdown|json] [--deep-projects]
161
168
  [--workers auto|N]
162
169
  delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
163
- [--workers auto|N]
170
+ [--workers auto|N] [--deep-projects]
164
171
  delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
165
172
  [--workers auto|N] [--force] [--quiet]
166
173
  delphi-lsp-agent query --root PATH ACTION [VALUE]
@@ -175,6 +182,13 @@ delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
175
182
  delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
176
183
  ```
177
184
 
185
+ `--deep-projects` opts into per-project dependency parsing for the `projects`
186
+ layer. It is off by default because it dominates run time on real repositories:
187
+ on a 60-project corpus it cost 36.9 s against 1.0 s for the same index, and it
188
+ adds nothing to the unit model set. Without it the `projects` and `problems`
189
+ layers report `deep_indexed: false`, and `index` records `deep_projects` at the
190
+ top level of its JSON, so a shallow index is never mistaken for a complete one.
191
+
178
192
  The `cache` commands manage one daemon per canonical root. Use these:
179
193
 
180
194
  ```bash
@@ -0,0 +1 @@
1
+ __version__ = "3.2.1"
@@ -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.")
@@ -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]:
@@ -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
 
@@ -125,16 +125,107 @@ is therefore:
125
125
  | Delphi realism | 2,983,643 | 5,053 | 497 | 2,366 | 3.230 s | 16.032 s |
126
126
 
127
127
  Clean discovery cost about 0.452 ms per source; realism cost about
128
- 0.639 ms per source. The cold scaling exponents were 0.819 clean and 0.777
129
- with realism, both classified as linear by the harness. The earlier
130
- 30.18-CPU-second pathological discovery result was therefore **not
131
- reproduced**. The overlay still made the known risk measurable: search paths
132
- grew 3.4×, sources 1.5×, and absolute discovery time 2.1×.
128
+ 0.639 ms per source. The earlier 30.18-CPU-second pathological discovery result
129
+ was therefore **not reproduced**. The overlay still made the known risk
130
+ measurable: search paths grew 3.4×, sources 1.5×, and absolute discovery time
131
+ 2.1×.
132
+
133
+ The originally published cold scaling exponents — 0.819 clean and 0.777 with
134
+ realism, both classified linear — were artefacts of fitting `time = b*n**k`
135
+ without a constant term. Fixed per-run cost (interpreter start, imports, worker
136
+ spawn) inflates the smallest slices and flattens the slope, which is how a
137
+ workload that must read every line ended up with an exponent below 1: physically
138
+ impossible. `fit_scaling` now estimates `time = a + b*n**k`. Refitted from the
139
+ slice table above:
140
+
141
+ | Profile | published k | refitted k | fixed cost a | r² | classification |
142
+ |---|---:|---:|---:|---:|---|
143
+ | Delphi clean | 0.819 | **1.1615** | 0.592 s | 0.99895 | n_log_n |
144
+ | Delphi realism | 0.777 | 0.7640 | −0.244 s | 0.99598 | (not meaningful) |
145
+
146
+ Clean is now a sensible reading: slightly worse than linear, with 0.592 s of
147
+ fixed cost separated out. Realism still fits to a negative constant and a
148
+ sub-linear exponent, which means the power law does not describe it — its cold
149
+ curve is concave because the overlay's artifact cost is front-loaded relative to
150
+ slice size rather than growing with it. Read the clean profile for scaling
151
+ behaviour; read realism for the absolute cost of a realistic working tree.
133
152
 
134
153
  The parser audit intentionally covers the pinned base sources, not generated
135
154
  copies. It accepted all 3,416 sources; the role-aware clean ratios were 54.126%
136
155
  for units/projects and 95.916% for include fragments.
137
156
 
157
+ ## Shape-aware RAD pruning, 2026-07-29
158
+
159
+ Discovery now skips `__history` and `__recovery` case-insensitively at every
160
+ level. It skips `bin`, `obj`, `Win32`, and `Win64` only when the directory
161
+ being walked contains a `.dpr`, `.dproj`, or `.dpk` file. The latter guard is
162
+ important: FPC has genuine sources such as
163
+ `packages/ptc/src/win32/base/*.inc`. `Debug`, `Release`, and `.vs` remain
164
+ discoverable because the realism corpus measured no benefit from excluding
165
+ them and those names have a meaningful false-positive risk.
166
+
167
+ The table compares full fresh-process reports made from the same pinned
168
+ corpora with the old and new directory predicate. Times are single report
169
+ runs; the separate interleaved experiment below is the significance check.
170
+
171
+ | Profile | Predicate | Visited | Indexed | Skipped | Search paths | Discovery | Cold | Warm | Peak RSS |
172
+ |---|---|---:|---:|---:|---:|---:|---:|---:|---:|
173
+ | FPC | old | 7,364 | 7,364 | 0 | 332 | 0.630 s | 11.073 s | 11.193 s | 508.5 MiB |
174
+ | FPC | shape-aware | 7,364 | 7,364 | 0 | 332 | 0.692 s | 10.470 s | 10.755 s | 508.1 MiB |
175
+ | Delphi clean | old | 3,416 | 3,416 | 0 | 692 | 1.430 s | 10.262 s | 10.663 s | 443.4 MiB |
176
+ | Delphi clean | shape-aware | 3,416 | 3,416 | 0 | 692 | 1.419 s | 10.035 s | 10.382 s | 444.9 MiB |
177
+ | Delphi realism | old | 5,053 | 5,053 | 0 | 2,366 | 3.332 s | 15.376 s | 15.141 s | 711.3 MiB |
178
+ | Delphi realism | shape-aware | 5,053 | 3,672 | 1,381 | 1,945 | 2.832 s | 11.620 s | 11.561 s | 495.5 MiB |
179
+
180
+ The realism overlay places its synthetic build copies at repository roots,
181
+ which do not themselves contain project files. The literal shape rule
182
+ therefore pruned the 1,176 history and 205 recovery sources, while retaining
183
+ those synthetic `bin`/`obj`/`Win32`/`Win64` copies. A regression fixture
184
+ separately proves that those four output names are pruned when they are
185
+ siblings of a Delphi project file. This preserves the specified safety guard
186
+ instead of weakening it to fit the overlay.
187
+
188
+ Five alternating old/new discovery rounds, plus five alternating old/old null
189
+ rounds, produced these medians:
190
+
191
+ | Profile | Old | Shape-aware | Delta | Null noise | Discovery payload |
192
+ |---|---:|---:|---:|---:|---|
193
+ | FPC | 0.493 s | 0.497 s | +0.9% | 0.05% | byte-identical |
194
+ | Delphi clean | 1.193 s | 1.188 s | -0.4% | 0.39% | byte-identical |
195
+ | Delphi realism | 2.542 s | 2.277 s | -10.5% | 0.68% | intentionally 1,381 fewer sources |
196
+
197
+ The FPC and clean timing differences are not treated as results. The realism
198
+ improvement is over fifteen times its measured null noise. Its fresh-process
199
+ cold result improved by 24.4%; the report's conservative 4x de-rating projects
200
+ 46.479 seconds on the target Windows i5, leaving 13.521 seconds (22.5%) of the
201
+ 60-second budget.
202
+
203
+ All three parser audits were byte-identical before/after apart from their
204
+ elapsed-time field. Accepted, unit-clean, and include-clean ratios were
205
+ respectively 1.0/0.848995/0.744704 for FPC and
206
+ 1.0/0.682184/0.572650 for both Delphi reports.
207
+
208
+ ## Indexed path-origin lookup, 2026-07-29
209
+
210
+ Resolved search and include paths now keep a `casefold` key to canonical
211
+ appended-string index. The observable lists remain lists in insertion order;
212
+ the dictionary only replaces the unconditional linear scan previously used to
213
+ find the canonical spelling for origin recording.
214
+
215
+ Five alternating linear/indexed rounds and five linear/linear null rounds
216
+ produced:
217
+
218
+ | Profile | Linear scan | Indexed lookup | Delta | Null noise | Search paths | Discovery payload |
219
+ |---|---:|---:|---:|---:|---:|---|
220
+ | FPC | 0.489 s | 0.436 s | -10.8% | 0.55% | 332 | byte-identical |
221
+ | Delphi clean | 1.183 s | 1.046 s | -11.5% | 0.10% | 692 | byte-identical |
222
+ | Delphi realism | 2.279 s | 1.187 s | -47.9% | 0.03% | 1,945 | byte-identical |
223
+
224
+ The measured median reductions were 0.053 seconds for FPC, 0.137 seconds for
225
+ Delphi clean, and 1.092 seconds for Delphi realism. Every complete discovery
226
+ payload hash matched between implementations, including ordered
227
+ `search_paths`, `include_paths`, and all origin maps.
228
+
138
229
  ## CI and next optimizations
139
230
 
140
231
  Fast tests use temporary fixtures only. The real smallest-slice probe is
@@ -146,16 +237,13 @@ DELPHI_LSP_DELPHI_CORPUS=/tmp/delphi-corpus \
146
237
  tests/test_delphi_performance_corpus.py
147
238
  ```
148
239
 
149
- The benchmark intentionally leaves these measured product changes for the
150
- next release:
240
+ The benchmark intentionally leaves this semantic product change for a future
241
+ release:
151
242
 
152
243
  1. derive overview `unit_count` directly from discovery/model inventory
153
244
  (`delphi_lsp/agent_layers.py:327`);
154
- 2. replace the linear `next(...casefold())` lookup after every resolved path
155
- with a keyed lookup (`delphi_lsp/project_discovery.py:849-854`);
156
- 3. decide and implement Delphi-specific exclusions for `__history`,
157
- `__recovery`, `bin`, `obj`, `Win32`, `Win64`, `Debug`, `Release`, and `.vs`
158
- (`delphi_lsp/project_discovery.py:22-37`).
159
-
160
- Those changes are deliberately absent from these measurements so a follow-up
161
- can compare against the clean and realism reports above.
245
+
246
+ The shape-aware exclusions and indexed path-origin lookup have now been
247
+ implemented and measured above. The remaining item is deliberately absent
248
+ from these measurements so follow-up work can compare against this
249
+ checkpoint.
@@ -67,8 +67,10 @@ minor version 3.2.0 rather than a major-version bump.
67
67
  ## Verification
68
68
 
69
69
  The release is gated by two full-suite runs, repository-local Ruff and Mypy
70
- baselines, four real-corpus wiki exports, wheel/sdist validation, clean-room
71
- installation, and TestPyPI installation before production publication.
70
+ baselines, four real-corpus wiki exports, wheel/sdist validation, and
71
+ clean-room installation before and after production publication. TestPyPI was
72
+ skipped under the release contract because no dedicated TestPyPI
73
+ configuration was present.
72
74
 
73
75
  Install or upgrade with:
74
76