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.
- {python_delphi_lsp-3.2.0/python_delphi_lsp.egg-info → python_delphi_lsp-3.2.1}/PKG-INFO +18 -4
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/README.md +17 -3
- python_delphi_lsp-3.2.1/delphi_lsp/_version.py +1 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cli.py +7 -1
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_layers.py +6 -1
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lsp_server.py +61 -9
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/project_discovery.py +35 -17
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/performance-delphi.md +103 -15
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.2.0.md +4 -2
- python_delphi_lsp-3.2.1/docs/release-3.2.1.md +77 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/pyproject.toml +1 -1
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1/python_delphi_lsp.egg-info}/PKG-INFO +18 -4
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/SOURCES.txt +2 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_fpc_corpus.py +120 -28
- python_delphi_lsp-3.2.1/tests/fpc_parse_quality.baseline.json +5430 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_fpc_performance_corpus.py +100 -1
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_lsp_server.py +57 -1
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_lsp_support.py +2 -2
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_package_metadata.py +3 -3
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_project_discovery.py +55 -0
- python_delphi_lsp-3.2.1/tests/test_throughput_scaling.py +360 -0
- python_delphi_lsp-3.2.0/delphi_lsp/_version.py +0 -1
- python_delphi_lsp-3.2.0/tests/fpc_parse_quality.baseline.json +0 -1713
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/.github/workflows/ci.yml +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/LICENSE +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/MANIFEST.in +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/__init__.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cache.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_context.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg_builder.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_metrics.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_protocol.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_relations.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_templates.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_wiki.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_workspace.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/binary.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/comment_builder.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/consts.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_lexer.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_parser.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_tokens.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/grammar.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_builder.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_tokens.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/lexical_scanner.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/metrics.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/navigation_cache.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/nodes.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/parallel_outline.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/parser.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/parser_backend.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/preprocessor.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/progress.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/project_config.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/project_indexer.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/py.typed +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic_builder.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/source_reader.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/workspace.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/delphi_lsp/writer.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/performance-fpc.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-2.3.0.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-2.3.3.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.0.0.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.1.0.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.1.1.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/release-3.1.2.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
- {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
- {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
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/opencode.json +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/requires.txt +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/top_level.txt +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/audit_delphi_language_features.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_cpg.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_github_corpus.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/benchmark_parallel_cache.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/build_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/check_ornith_cache.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/generate_progress_pdf.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/generate_release_evidence.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/prepare_delphi_corpus.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/prepare_fpc_corpus.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/prepare_ornith_cache.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/run_opencode_lsp_probe.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/run_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/start_ornith_vllm.sh +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/scripts/summarize_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/setup.cfg +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/LICENSE.txt +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +0 -0
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +0 -0
- {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
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Source/DUnitX.inc +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +0 -0
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +0 -0
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +0 -0
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/mORMot2/LICENCE.md +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/test_projects/github_repos/mORMot2/src/mormot.defines.inc +0 -0
- {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
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/corpora.performance.lock.json +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/constset.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/properties.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/library_demo.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/package_demo.dpk +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/program_demo.dpr +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_advanced.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_attributes.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_basic.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_consumer.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_generics.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_inheritance.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_math.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_properties.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_sections.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_statements.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_types.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_unresolved.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_with.pas +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_cache.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_cli_errors.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_codebase.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_context.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_cpg.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_metrics.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_protocol.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_relations.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_wiki.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_worker.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_agent_workspace.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_opencode.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphi_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_lexer.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_native_compatibility.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_parser.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_delphiast_semantic_compatibility.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_diagnostics.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_language_feature_matrix.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_legacy_snippets.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_lsp_features.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_metrics.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_navigation_cache.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_opencode_config.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_opencode_probe.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_ornith_cache_prepare.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_parallel_outline.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_parser.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_parser_backends.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_preprocessor.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_progress.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_project_config.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_project_indexer.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_release_evidence.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_semantic.py +0 -0
- {python_delphi_lsp-3.2.0 → python_delphi_lsp-3.2.1}/tests/test_vllm_start_script.py +0 -0
- {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.
|
|
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.
|
|
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": {
|
|
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.
|
|
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": {
|
|
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=
|
|
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 {
|
|
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
|
-
|
|
340
|
+
model = build_outline_semantic_model(
|
|
328
341
|
text,
|
|
329
342
|
file_name,
|
|
330
343
|
defines=self.config.defines,
|
|
331
344
|
)
|
|
345
|
+
cached = self.file_cache.get(file_name)
|
|
346
|
+
if cached is not None and cached.text == text:
|
|
347
|
+
self._retain_cached_semantic(file_name, cached, model)
|
|
348
|
+
return model
|
|
332
349
|
|
|
333
350
|
def full_semantic_for_uri(self, uri: str) -> SemanticModel | None:
|
|
334
351
|
file_name = uri_to_path(uri)
|
|
@@ -435,15 +452,19 @@ class LspWorkspaceState:
|
|
|
435
452
|
if not sources:
|
|
436
453
|
return None
|
|
437
454
|
models: dict[str, SemanticModel] = {}
|
|
455
|
+
previous_models = self.workspace.models if self.workspace is not None else {}
|
|
456
|
+
pending: list[tuple[str, str, FileSnapshot | None]] = []
|
|
438
457
|
for file_name, text in sources.items():
|
|
439
458
|
cached = self.file_cache.get(file_name)
|
|
440
|
-
if
|
|
441
|
-
|
|
442
|
-
and
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
459
|
+
if cached is not None and cached.text == text:
|
|
460
|
+
model = cached.semantic
|
|
461
|
+
if model is None and file_name in self.semantic_evicted_paths:
|
|
462
|
+
model = previous_models.get(file_name)
|
|
463
|
+
if model is not None:
|
|
464
|
+
models[file_name] = model
|
|
465
|
+
continue
|
|
466
|
+
pending.append((file_name, text, cached))
|
|
467
|
+
for file_name, text, cached in pending:
|
|
447
468
|
model = build_outline_semantic_model(
|
|
448
469
|
text,
|
|
449
470
|
file_name,
|
|
@@ -451,7 +472,7 @@ class LspWorkspaceState:
|
|
|
451
472
|
)
|
|
452
473
|
models[file_name] = model
|
|
453
474
|
if cached is not None and cached.text == text:
|
|
454
|
-
|
|
475
|
+
self._retain_cached_semantic(file_name, cached, model)
|
|
455
476
|
index = SymbolIndex()
|
|
456
477
|
for model in models.values():
|
|
457
478
|
index.register_unit(model.unit_scope.name, model.unit_scope)
|
|
@@ -459,6 +480,27 @@ class LspWorkspaceState:
|
|
|
459
480
|
model.index = index
|
|
460
481
|
return WorkspaceSemanticResult(models=models, index=index)
|
|
461
482
|
|
|
483
|
+
def _retain_cached_semantic(
|
|
484
|
+
self,
|
|
485
|
+
file_name: str,
|
|
486
|
+
snapshot: FileSnapshot,
|
|
487
|
+
model: SemanticModel,
|
|
488
|
+
) -> None:
|
|
489
|
+
snapshot.semantic = model
|
|
490
|
+
self.semantic_evicted_paths.discard(file_name)
|
|
491
|
+
self._touch_cached_semantic(file_name)
|
|
492
|
+
|
|
493
|
+
def _touch_cached_semantic(self, file_name: str) -> None:
|
|
494
|
+
self.semantic_cache_lru[file_name] = None
|
|
495
|
+
self.semantic_cache_lru.move_to_end(file_name)
|
|
496
|
+
limit = max(0, self.config.semantic_cache_size)
|
|
497
|
+
while len(self.semantic_cache_lru) > limit:
|
|
498
|
+
evicted, _ = self.semantic_cache_lru.popitem(last=False)
|
|
499
|
+
snapshot = self.file_cache.get(evicted)
|
|
500
|
+
if snapshot is not None:
|
|
501
|
+
snapshot.semantic = None
|
|
502
|
+
self.semantic_evicted_paths.add(evicted)
|
|
503
|
+
|
|
462
504
|
def model_for_path(self, path: str) -> SemanticModel | None:
|
|
463
505
|
if self.workspace is None:
|
|
464
506
|
return None
|
|
@@ -2247,12 +2289,21 @@ def create_server():
|
|
|
2247
2289
|
search_paths = [uri_to_path(path) for path in init_opts.get('searchPaths', [])]
|
|
2248
2290
|
defines = init_opts.get('defines', [])
|
|
2249
2291
|
auto_discover_paths = init_opts.get('autoDiscoverPaths', True)
|
|
2292
|
+
raw_semantic_cache_size = init_opts.get(
|
|
2293
|
+
'semanticCacheSize',
|
|
2294
|
+
_DEFAULT_SEMANTIC_CACHE_SIZE,
|
|
2295
|
+
)
|
|
2296
|
+
try:
|
|
2297
|
+
semantic_cache_size = max(0, int(raw_semantic_cache_size))
|
|
2298
|
+
except (TypeError, ValueError):
|
|
2299
|
+
semantic_cache_size = _DEFAULT_SEMANTIC_CACHE_SIZE
|
|
2250
2300
|
config = WorkspaceConfig(
|
|
2251
2301
|
roots=roots,
|
|
2252
2302
|
include_paths=include_paths,
|
|
2253
2303
|
search_paths=search_paths,
|
|
2254
2304
|
defines=defines,
|
|
2255
2305
|
auto_discover_paths=bool(auto_discover_paths),
|
|
2306
|
+
semantic_cache_size=semantic_cache_size,
|
|
2256
2307
|
)
|
|
2257
2308
|
state.configure(config)
|
|
2258
2309
|
for warning in state.config_warnings:
|
|
@@ -2396,6 +2447,7 @@ def create_server():
|
|
|
2396
2447
|
extensions=state.config.extensions,
|
|
2397
2448
|
eager_index=state.config.eager_index,
|
|
2398
2449
|
auto_discover_paths=state.config.auto_discover_paths,
|
|
2450
|
+
semantic_cache_size=state.config.semantic_cache_size,
|
|
2399
2451
|
)
|
|
2400
2452
|
)
|
|
2401
2453
|
source_line_cache.clear()
|
|
@@ -34,6 +34,9 @@ SKIP_DIRS = {
|
|
|
34
34
|
".worktrees",
|
|
35
35
|
"node_modules",
|
|
36
36
|
}
|
|
37
|
+
_RAD_STUDIO_ALWAYS_SKIP_DIRS = {"__history", "__recovery"}
|
|
38
|
+
_RAD_STUDIO_PROJECT_OUTPUT_DIRS = {"bin", "obj", "win32", "win64"}
|
|
39
|
+
_DELPHI_PROJECT_MARKER_EXTENSIONS = {".dpr", ".dproj", ".dpk"}
|
|
37
40
|
|
|
38
41
|
|
|
39
42
|
@dataclass(frozen=True)
|
|
@@ -102,8 +105,8 @@ def discover_delphi_project(
|
|
|
102
105
|
)
|
|
103
106
|
_emit_progress(on_progress, "discovery", str(root_path), 0, 0, None, "project discovery started")
|
|
104
107
|
|
|
105
|
-
seen_search:
|
|
106
|
-
seen_include:
|
|
108
|
+
seen_search: dict[str, str] = {}
|
|
109
|
+
seen_include: dict[str, str] = {}
|
|
107
110
|
seen_defines: set[str] = set()
|
|
108
111
|
seen_projects: set[str] = set()
|
|
109
112
|
seen_configs: set[str] = set()
|
|
@@ -115,7 +118,7 @@ def discover_delphi_project(
|
|
|
115
118
|
|
|
116
119
|
def add_path(
|
|
117
120
|
target: list[str],
|
|
118
|
-
|
|
121
|
+
canonical_by_key: dict[str, str],
|
|
119
122
|
origins: dict[str, list[str]],
|
|
120
123
|
path: Path | str,
|
|
121
124
|
*,
|
|
@@ -124,7 +127,7 @@ def discover_delphi_project(
|
|
|
124
127
|
) -> None:
|
|
125
128
|
_add_resolved_path(
|
|
126
129
|
target,
|
|
127
|
-
|
|
130
|
+
canonical_by_key,
|
|
128
131
|
origins,
|
|
129
132
|
str(path),
|
|
130
133
|
base=base,
|
|
@@ -277,8 +280,8 @@ def populate_workspace_sources(
|
|
|
277
280
|
) -> DelphiProjectDiscovery:
|
|
278
281
|
root_path = Path(discovery.root).expanduser().resolve()
|
|
279
282
|
seen_sources = {source.casefold() for source in discovery.source_files}
|
|
280
|
-
seen_search = {path.casefold() for path in discovery.search_paths}
|
|
281
|
-
seen_include = {path.casefold() for path in discovery.include_paths}
|
|
283
|
+
seen_search = {path.casefold(): path for path in discovery.search_paths}
|
|
284
|
+
seen_include = {path.casefold(): path for path in discovery.include_paths}
|
|
282
285
|
|
|
283
286
|
_scan_sources(root_path, discovery, seen_sources, on_progress=on_progress)
|
|
284
287
|
total_sources = len(discovery.source_files)
|
|
@@ -526,7 +529,7 @@ def _read_dpr_paths(
|
|
|
526
529
|
project: Path,
|
|
527
530
|
discovery: DelphiProjectDiscovery,
|
|
528
531
|
search_paths: list[str],
|
|
529
|
-
seen_search:
|
|
532
|
+
seen_search: dict[str, str],
|
|
530
533
|
search_path_origins: dict[str, list[str]],
|
|
531
534
|
) -> None:
|
|
532
535
|
try:
|
|
@@ -558,10 +561,10 @@ def _read_dproj(
|
|
|
558
561
|
path: Path,
|
|
559
562
|
discovery: DelphiProjectDiscovery,
|
|
560
563
|
search_paths: list[str],
|
|
561
|
-
seen_search:
|
|
564
|
+
seen_search: dict[str, str],
|
|
562
565
|
search_path_origins: dict[str, list[str]],
|
|
563
566
|
include_paths: list[str],
|
|
564
|
-
seen_include:
|
|
567
|
+
seen_include: dict[str, str],
|
|
565
568
|
include_path_origins: dict[str, list[str]],
|
|
566
569
|
add_define,
|
|
567
570
|
) -> None:
|
|
@@ -619,10 +622,10 @@ def _read_cfg(
|
|
|
619
622
|
path: Path,
|
|
620
623
|
discovery: DelphiProjectDiscovery,
|
|
621
624
|
search_paths: list[str],
|
|
622
|
-
seen_search:
|
|
625
|
+
seen_search: dict[str, str],
|
|
623
626
|
search_path_origins: dict[str, list[str]],
|
|
624
627
|
include_paths: list[str],
|
|
625
|
-
seen_include:
|
|
628
|
+
seen_include: dict[str, str],
|
|
626
629
|
include_path_origins: dict[str, list[str]],
|
|
627
630
|
add_define,
|
|
628
631
|
) -> None:
|
|
@@ -801,7 +804,7 @@ def _walk_files(
|
|
|
801
804
|
directory_names[:] = sorted(
|
|
802
805
|
name
|
|
803
806
|
for name in directory_names
|
|
804
|
-
if
|
|
807
|
+
if not _skip_walk_directory(name, file_names)
|
|
805
808
|
and (
|
|
806
809
|
project_config is None
|
|
807
810
|
or not project_config.excludes_workspace_path(current / name)
|
|
@@ -823,13 +826,27 @@ def _walk_files(
|
|
|
823
826
|
raise
|
|
824
827
|
|
|
825
828
|
|
|
829
|
+
def _skip_walk_directory(name: str, sibling_file_names: list[str]) -> bool:
|
|
830
|
+
if name in SKIP_DIRS:
|
|
831
|
+
return True
|
|
832
|
+
normalized = name.casefold()
|
|
833
|
+
if normalized in _RAD_STUDIO_ALWAYS_SKIP_DIRS:
|
|
834
|
+
return True
|
|
835
|
+
if normalized not in _RAD_STUDIO_PROJECT_OUTPUT_DIRS:
|
|
836
|
+
return False
|
|
837
|
+
return any(
|
|
838
|
+
Path(file_name).suffix.casefold() in _DELPHI_PROJECT_MARKER_EXTENSIONS
|
|
839
|
+
for file_name in sibling_file_names
|
|
840
|
+
)
|
|
841
|
+
|
|
842
|
+
|
|
826
843
|
def _is_path_too_long(error: OSError) -> bool:
|
|
827
844
|
return getattr(error, "winerror", None) == 206 or error.errno == errno.ENAMETOOLONG
|
|
828
845
|
|
|
829
846
|
|
|
830
847
|
def _add_resolved_path(
|
|
831
848
|
target: list[str],
|
|
832
|
-
|
|
849
|
+
canonical_by_key: dict[str, str],
|
|
833
850
|
origins: dict[str, list[str]],
|
|
834
851
|
value: str,
|
|
835
852
|
*,
|
|
@@ -846,10 +863,11 @@ def _add_resolved_path(
|
|
|
846
863
|
):
|
|
847
864
|
return
|
|
848
865
|
key = str(resolved).casefold()
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
866
|
+
exposed_path = canonical_by_key.get(key)
|
|
867
|
+
if exposed_path is None:
|
|
868
|
+
exposed_path = str(resolved)
|
|
869
|
+
canonical_by_key[key] = exposed_path
|
|
870
|
+
target.append(exposed_path)
|
|
853
871
|
_record_origin(origins, exposed_path, origin)
|
|
854
872
|
|
|
855
873
|
|
|
@@ -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
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
150
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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,
|
|
71
|
-
installation
|
|
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
|
|