python-delphi-lsp 3.1.1__tar.gz → 3.1.2__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.1.1 → python_delphi_lsp-3.1.2}/MANIFEST.in +7 -0
- {python_delphi_lsp-3.1.1/python_delphi_lsp.egg-info → python_delphi_lsp-3.1.2}/PKG-INFO +8 -2
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/README.md +7 -1
- python_delphi_lsp-3.1.2/delphi_lsp/_version.py +1 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/preprocessor.py +6 -0
- python_delphi_lsp-3.1.2/docs/performance-delphi.md +161 -0
- python_delphi_lsp-3.1.2/docs/performance-fpc.md +239 -0
- python_delphi_lsp-3.1.2/docs/release-3.1.2.md +39 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/pyproject.toml +5 -2
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2/python_delphi_lsp.egg-info}/PKG-INFO +8 -2
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/SOURCES.txt +9 -0
- python_delphi_lsp-3.1.2/scripts/benchmark_fpc_corpus.py +2056 -0
- python_delphi_lsp-3.1.2/scripts/prepare_delphi_corpus.py +213 -0
- python_delphi_lsp-3.1.2/scripts/prepare_fpc_corpus.py +171 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/corpora.performance.lock.json +6 -1
- python_delphi_lsp-3.1.2/tests/fpc_parse_quality.baseline.json +10266 -0
- python_delphi_lsp-3.1.2/tests/test_delphi_performance_corpus.py +210 -0
- python_delphi_lsp-3.1.2/tests/test_fpc_performance_corpus.py +521 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_github_performance_corpus.py +1 -1
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_package_metadata.py +13 -3
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_preprocessor.py +139 -0
- python_delphi_lsp-3.1.1/delphi_lsp/_version.py +0 -1
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/.github/workflows/ci.yml +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/LICENSE +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/__init__.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cache.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cli.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_context.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cpg.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_cpg_builder.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_layers.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_metrics.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_protocol.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_relations.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_templates.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_wiki.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/agent_workspace.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/binary.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/comment_builder.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/consts.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/delphiast_lexer.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/delphiast_parser.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/delphiast_tokens.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/grammar.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/lark_builder.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/lark_tokens.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/lsp_server.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/metrics.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/navigation_cache.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/nodes.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/parallel_outline.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/parser.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/parser_backend.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/progress.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/project_config.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/project_discovery.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/project_indexer.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/py.typed +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/semantic.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/semantic_builder.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/source_reader.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/workspace.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/delphi_lsp/writer.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-2.3.0.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-2.3.3.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-3.0.0.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-3.1.0.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/release-3.1.1.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/opencode.json +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/requires.txt +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/python_delphi_lsp.egg-info/top_level.txt +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/audit_delphi_language_features.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/benchmark_cpg.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/benchmark_github_corpus.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/benchmark_parallel_cache.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_opencode_test.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/build_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/check_ornith_cache.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/generate_progress_pdf.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/generate_release_evidence.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/prepare_ornith_cache.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/run_opencode_lsp_probe.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/run_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/start_ornith_vllm.sh +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/scripts/summarize_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/setup.cfg +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/constset.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/properties.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/library_demo.dpr +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/package_demo.dpk +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/program_demo.dpr +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_advanced.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_attributes.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_basic.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_consumer.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_generics.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_inheritance.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_math.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_properties.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_sections.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_statements.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_types.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_unresolved.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/fixtures/unit_with.pas +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_cache.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_cli_errors.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_codebase.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_context.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_cpg.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_metrics.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_protocol.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_relations.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_wiki.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_worker.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_agent_workspace.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_bootstrap_vllm_codebase_skill.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_bootstrap_vllm_opencode.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_lexer.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_native_compatibility.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_parser.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_delphiast_semantic_compatibility.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_diagnostics.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_language_feature_matrix.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_legacy_snippets.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_lsp_features.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_lsp_server.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_lsp_support.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_metrics.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_navigation_cache.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_opencode_config.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_opencode_probe.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_openrouter_github_e2e.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_ornith_cache_prepare.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_parallel_outline.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_parser.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_parser_backends.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_progress.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_project_config.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_project_discovery.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_project_indexer.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_release_evidence.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_semantic.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_vllm_start_script.py +0 -0
- {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.1.2}/tests/test_workspace.py +0 -0
|
@@ -7,6 +7,9 @@ include scripts/check_ornith_cache.py
|
|
|
7
7
|
include scripts/audit_delphi_language_features.py
|
|
8
8
|
include scripts/build_github_performance_corpus.py
|
|
9
9
|
include scripts/benchmark_github_corpus.py
|
|
10
|
+
include scripts/prepare_fpc_corpus.py
|
|
11
|
+
include scripts/benchmark_fpc_corpus.py
|
|
12
|
+
include scripts/prepare_delphi_corpus.py
|
|
10
13
|
include scripts/benchmark_cpg.py
|
|
11
14
|
include scripts/benchmark_parallel_cache.py
|
|
12
15
|
include scripts/bootstrap_vllm_opencode_test.py
|
|
@@ -22,5 +25,9 @@ include scripts/start_ornith_vllm.sh
|
|
|
22
25
|
include scripts/summarize_opencode_request_payloads.py
|
|
23
26
|
include scripts/ollama/ornith-lspctx.Modelfile
|
|
24
27
|
include tests/corpora.performance.lock.json
|
|
28
|
+
include tests/fpc_parse_quality.baseline.json
|
|
29
|
+
include tests/test_fpc_performance_corpus.py
|
|
30
|
+
include tests/test_delphi_performance_corpus.py
|
|
31
|
+
include docs/performance-delphi.md
|
|
25
32
|
recursive-include docs *.md
|
|
26
33
|
recursive-include tests *.py *.pas *.inc *.dpr *.dpk
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-delphi-lsp
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.2
|
|
4
4
|
Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
|
|
5
5
|
Author: Dark Light
|
|
6
6
|
License-Expression: MPL-2.0
|
|
@@ -45,7 +45,7 @@ Dynamic: license-file
|
|
|
45
45
|
|
|
46
46
|
`python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
|
|
47
47
|
indexes, serves LSP, and provides bounded codebase navigation for agents.
|
|
48
|
-
Version 3.1.
|
|
48
|
+
Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
49
49
|
|
|
50
50
|
## Install and quick start
|
|
51
51
|
|
|
@@ -521,6 +521,12 @@ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
|
|
|
521
521
|
in-run control throughput, above the 95-percent release floor. Reproduce it
|
|
522
522
|
with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
|
|
523
523
|
|
|
524
|
+
Separate reproducible performance profiles cover the coherent FPC compiler
|
|
525
|
+
tree and a project-file-dense Delphi corpus. The Delphi profile can add a
|
|
526
|
+
deterministic `__history`/recovery/build/search-path overlay without changing
|
|
527
|
+
the pinned base corpus. See [the FPC benchmark](docs/performance-fpc.md) and
|
|
528
|
+
[the Delphi discovery benchmark](docs/performance-delphi.md).
|
|
529
|
+
|
|
524
530
|
For every source size the navigator builds an outline first, loads source detail
|
|
525
531
|
lazily for a selected target, and returns only selected fragments. Typed source
|
|
526
532
|
chunks are at most 6000 characters and also respect the response budget. This
|
|
@@ -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.1.
|
|
5
|
+
Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
6
6
|
|
|
7
7
|
## Install and quick start
|
|
8
8
|
|
|
@@ -478,6 +478,12 @@ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
|
|
|
478
478
|
in-run control throughput, above the 95-percent release floor. Reproduce it
|
|
479
479
|
with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
|
|
480
480
|
|
|
481
|
+
Separate reproducible performance profiles cover the coherent FPC compiler
|
|
482
|
+
tree and a project-file-dense Delphi corpus. The Delphi profile can add a
|
|
483
|
+
deterministic `__history`/recovery/build/search-path overlay without changing
|
|
484
|
+
the pinned base corpus. See [the FPC benchmark](docs/performance-fpc.md) and
|
|
485
|
+
[the Delphi discovery benchmark](docs/performance-delphi.md).
|
|
486
|
+
|
|
481
487
|
For every source size the navigator builds an outline first, loads source detail
|
|
482
488
|
lazily for a selected target, and returns only selected fragments. Typed source
|
|
483
489
|
chunks are at most 6000 characters and also respect the response budget. This
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.1.2"
|
|
@@ -472,6 +472,12 @@ class Preprocessor:
|
|
|
472
472
|
self._emit_text(output, active_replacement, ctx.file_name, start_line, active=True)
|
|
473
473
|
return
|
|
474
474
|
|
|
475
|
+
if name == 'I' and param.strip() in {'+', '-'}:
|
|
476
|
+
if self._is_active():
|
|
477
|
+
self._apply_named_option(name, param)
|
|
478
|
+
self._emit_text(output, active_replacement, ctx.file_name, start_line, active=True)
|
|
479
|
+
return
|
|
480
|
+
|
|
475
481
|
if name in {'I', 'INCLUDE'}:
|
|
476
482
|
if self._is_active():
|
|
477
483
|
include_name = self._extract_include_name(param)
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Delphi-shaped discovery performance profile
|
|
2
|
+
|
|
3
|
+
The `delphi` corpus profile complements the coherent FPC compiler benchmark.
|
|
4
|
+
FPC exercises parsing and outline construction well, but contains few Delphi
|
|
5
|
+
project files. This profile preserves the project density that drives search
|
|
6
|
+
path discovery and can optionally add deterministic IDE/build artifacts.
|
|
7
|
+
|
|
8
|
+
## Corpus preparation
|
|
9
|
+
|
|
10
|
+
The profile uses the five revisions pinned in
|
|
11
|
+
`tests/corpora.performance.lock.json`: mORMot2, DUnitX, DelphiAST,
|
|
12
|
+
python4delphi, and castle-engine. It deliberately takes the full checkout of
|
|
13
|
+
each pinned repository so project files outside the lock's source subpaths are
|
|
14
|
+
not lost.
|
|
15
|
+
|
|
16
|
+
```console
|
|
17
|
+
.venv/bin/python scripts/prepare_delphi_corpus.py \
|
|
18
|
+
--workspace /tmp/delphi-corpus \
|
|
19
|
+
--fetch
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Cached revisions can subsequently be used with `--offline`. A local clean
|
|
23
|
+
checkout at the exact locked revision can be supplied repeatedly as
|
|
24
|
+
`--checkout NAME=PATH`.
|
|
25
|
+
|
|
26
|
+
The manifest schema records `.pas`, `.inc`, `.dpr`, `.dpk`, `.dproj`, `.lpi`,
|
|
27
|
+
and `.lpr` files. The measured preparation contained 4,055 files and
|
|
28
|
+
2,983,643 physical lines:
|
|
29
|
+
|
|
30
|
+
| Repository | Files | Lines |
|
|
31
|
+
|---|---:|---:|
|
|
32
|
+
| mORMot2 | 638 | 673,177 |
|
|
33
|
+
| DUnitX | 249 | 65,805 |
|
|
34
|
+
| DelphiAST | 70 | 18,598 |
|
|
35
|
+
| python4delphi | 261 | 98,965 |
|
|
36
|
+
| castle-engine | 2,837 | 2,127,098 |
|
|
37
|
+
|
|
38
|
+
The extension inventory contained 1,930 `.pas`, 1,053 `.inc`, 384 `.dpr`,
|
|
39
|
+
49 `.dpk`, 373 `.dproj`, 235 `.lpi`, and 31 `.lpr` files. The corpus is
|
|
40
|
+
16,357 lines short of 3 million. Reports therefore say
|
|
41
|
+
`requested_max_reached: false` and record 2,983,643 as the honest available
|
|
42
|
+
and measured maximum; they never label it as a 3M result.
|
|
43
|
+
|
|
44
|
+
## Clean and realism runs
|
|
45
|
+
|
|
46
|
+
The default profile is still `fpc`. Select Delphi explicitly:
|
|
47
|
+
|
|
48
|
+
```console
|
|
49
|
+
.venv/bin/python scripts/benchmark_fpc_corpus.py \
|
|
50
|
+
--profile delphi \
|
|
51
|
+
--workspace /tmp/delphi-corpus \
|
|
52
|
+
--no-worker-sweep \
|
|
53
|
+
--output /tmp/delphi-clean.json
|
|
54
|
+
|
|
55
|
+
.venv/bin/python scripts/benchmark_fpc_corpus.py \
|
|
56
|
+
--profile delphi \
|
|
57
|
+
--realism \
|
|
58
|
+
--workspace /tmp/delphi-corpus \
|
|
59
|
+
--no-worker-sweep \
|
|
60
|
+
--output /tmp/delphi-realism.json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Default Delphi targets are 100k, 250k, 500k, 1M, 2M, and 3M lines. Targets
|
|
64
|
+
above the available corpus are replaced by the exact maximum. Every slice
|
|
65
|
+
reports the requested and actual line count.
|
|
66
|
+
|
|
67
|
+
The opt-in realism overlay is off by default. Its defaults are:
|
|
68
|
+
|
|
69
|
+
- `__history` copies for a stable 30% of `.pas` files, with one to three
|
|
70
|
+
versions selected from a BLAKE2b hash;
|
|
71
|
+
- `__recovery` copies for a stable 10%;
|
|
72
|
+
- source plus plausible `.dcu` output under `bin`, `obj`, `Win32/Debug`, or
|
|
73
|
+
`Win64/Release` for a stable 10%;
|
|
74
|
+
- 64 synthetic `.dpr`/`.dproj` pairs, each with 16 unique search paths.
|
|
75
|
+
|
|
76
|
+
The CLI exposes each parameter as `--realism-*`. Selection never uses Python's
|
|
77
|
+
random state or wall-clock time. All targets are constrained to the temporary
|
|
78
|
+
slice root, copies use hardlinks with a copy fallback, and the report records
|
|
79
|
+
parameters, generated-file count, and a BLAKE2b digest per slice.
|
|
80
|
+
|
|
81
|
+
The overlay simulates discovery pressure, not a complete RAD Studio
|
|
82
|
+
installation. It does not synthesize BDS/RTL source trees, real DCU contents,
|
|
83
|
+
registry state, ACL failures, symlink loops, or arbitrary corrupt files.
|
|
84
|
+
|
|
85
|
+
## Measured results, 2026-07-28
|
|
86
|
+
|
|
87
|
+
Both reports were measured on Darwin arm64, Python 3.14.3, 10 logical CPUs,
|
|
88
|
+
and 32 GiB RAM. Cold and warm are fresh Python processes; no wall-clock number
|
|
89
|
+
is asserted by CI.
|
|
90
|
+
|
|
91
|
+
| Base lines | Clean cold | Realism cold | Clean sources | Realism sources | Clean paths | Realism paths |
|
|
92
|
+
|---:|---:|---:|---:|---:|---:|---:|
|
|
93
|
+
| 107,263 | 0.752 s | 1.339 s | 383 | 695 | 157 | 1,352 |
|
|
94
|
+
| 251,329 | 1.144 s | 2.159 s | 408 | 738 | 157 | 1,353 |
|
|
95
|
+
| 505,892 | 1.996 s | 3.362 s | 480 | 867 | 162 | 1,374 |
|
|
96
|
+
| 1,009,316 | 3.704 s | 7.328 s | 1,224 | 2,074 | 430 | 1,808 |
|
|
97
|
+
| 2,000,333 | 6.938 s | 12.073 s | 2,959 | 4,299 | 646 | 2,249 |
|
|
98
|
+
| 2,983,643 | 11.113 s | 16.032 s | 3,416 | 5,053 | 692 | 2,366 |
|
|
99
|
+
|
|
100
|
+
At the largest slice the overlay generated 1,893 files. Every one of the
|
|
101
|
+
1,637 additional source-shaped files was indexed: `sources_visited` equaled
|
|
102
|
+
`sources_indexed`, `sources_skipped` was zero, and the skip-reason histogram
|
|
103
|
+
was empty. That is the intended evidence that the current scanner does not
|
|
104
|
+
exclude `__history`, `__recovery`, `bin`, `obj`, `Win32`, or `Win64`.
|
|
105
|
+
Project entries grew from 433 to 497.
|
|
106
|
+
|
|
107
|
+
| Largest-slice diagnostic | Clean | Realism |
|
|
108
|
+
|---|---:|---:|
|
|
109
|
+
| Discovery | 1.546 s | 3.230 s |
|
|
110
|
+
| Outline/preprocess/model | 8.677 s | 10.689 s |
|
|
111
|
+
| Semantic assembly | 0.135 s | 0.143 s |
|
|
112
|
+
| Total index diagnostic | 10.361 s | 14.066 s |
|
|
113
|
+
| Sources | 3,416 | 5,053 |
|
|
114
|
+
| Search paths | 692 | 2,366 |
|
|
115
|
+
|
|
116
|
+
For context, a fresh diagnostic on the post-F39 3,000,891-line FPC slice
|
|
117
|
+
reported 7,364 sources, zero project entries, 332 search paths, 0.641 seconds
|
|
118
|
+
of discovery, and a 10.975-second cold overview. The largest-slice comparison
|
|
119
|
+
is therefore:
|
|
120
|
+
|
|
121
|
+
| Profile | Base lines | Sources indexed | Projects | Search paths | Discovery | Cold overview |
|
|
122
|
+
|---|---:|---:|---:|---:|---:|---:|
|
|
123
|
+
| FPC | 3,000,891 | 7,364 | 0 | 332 | 0.641 s | 10.975 s |
|
|
124
|
+
| Delphi clean | 2,983,643 | 3,416 | 433 | 692 | 1.546 s | 11.113 s |
|
|
125
|
+
| Delphi realism | 2,983,643 | 5,053 | 497 | 2,366 | 3.230 s | 16.032 s |
|
|
126
|
+
|
|
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×.
|
|
133
|
+
|
|
134
|
+
The parser audit intentionally covers the pinned base sources, not generated
|
|
135
|
+
copies. It accepted all 3,416 sources; the role-aware clean ratios were 54.126%
|
|
136
|
+
for units/projects and 95.916% for include fragments.
|
|
137
|
+
|
|
138
|
+
## CI and next optimizations
|
|
139
|
+
|
|
140
|
+
Fast tests use temporary fixtures only. The real smallest-slice probe is
|
|
141
|
+
opt-in:
|
|
142
|
+
|
|
143
|
+
```console
|
|
144
|
+
DELPHI_LSP_DELPHI_CORPUS=/tmp/delphi-corpus \
|
|
145
|
+
.venv/bin/python -m pytest -q -m perf \
|
|
146
|
+
tests/test_delphi_performance_corpus.py
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The benchmark intentionally leaves these measured product changes for the
|
|
150
|
+
next release:
|
|
151
|
+
|
|
152
|
+
1. derive overview `unit_count` directly from discovery/model inventory
|
|
153
|
+
(`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.
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# FPC overview performance benchmark
|
|
2
|
+
|
|
3
|
+
This benchmark answers one product question:
|
|
4
|
+
|
|
5
|
+
> On an Intel Core i5 laptop with 16 GB RAM and Windows 11, can
|
|
6
|
+
> `delphi-lsp-agent view --layer overview` process a repository with
|
|
7
|
+
> 3,000,000 physical Object Pascal lines within 60 seconds?
|
|
8
|
+
|
|
9
|
+
The corpus is the coherent Free Pascal compiler source tree pinned in
|
|
10
|
+
`tests/corpora.performance.lock.json`. Corpus files and reports stay outside
|
|
11
|
+
the repository and are never included in a distribution.
|
|
12
|
+
|
|
13
|
+
## Prepare the corpus
|
|
14
|
+
|
|
15
|
+
```console
|
|
16
|
+
.venv/bin/python scripts/prepare_fpc_corpus.py \
|
|
17
|
+
--target-lines 3000000 \
|
|
18
|
+
--workspace /tmp/fpc-3m \
|
|
19
|
+
--fetch
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Preparation clones or reuses the exact locked revision, selects anchors
|
|
23
|
+
followed by a deterministic path-sorted prefix of `.pas` and `.inc` files,
|
|
24
|
+
hard-links or copies those files into the external workspace, and verifies
|
|
25
|
+
every line count and SHA-256 before writing `corpus-manifest.json`. An existing
|
|
26
|
+
non-empty workspace is never cleared implicitly.
|
|
27
|
+
|
|
28
|
+
Use `--offline` after the revision is cached. An existing clean checkout at
|
|
29
|
+
the locked revision can be supplied with `--checkout PATH`.
|
|
30
|
+
|
|
31
|
+
## Run the benchmark
|
|
32
|
+
|
|
33
|
+
```console
|
|
34
|
+
.venv/bin/python scripts/benchmark_fpc_corpus.py \
|
|
35
|
+
--profile fpc \
|
|
36
|
+
--workspace /tmp/fpc-3m \
|
|
37
|
+
--sizes 250000,500000,1000000,2000000,3000000 \
|
|
38
|
+
--workers 0,1,2,4 \
|
|
39
|
+
--output /tmp/fpc-report.json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`fpc` is the default profile, so existing invocations may omit
|
|
43
|
+
`--profile fpc`. The project-file-dense companion profile is documented in
|
|
44
|
+
`docs/performance-delphi.md`.
|
|
45
|
+
|
|
46
|
+
The default run performs:
|
|
47
|
+
|
|
48
|
+
- cold and warm overview calls in separate Python processes;
|
|
49
|
+
- five deterministic scaling slices and a log-log scaling fit;
|
|
50
|
+
- a 1M-line worker sweep;
|
|
51
|
+
- import-floor and phase diagnostics;
|
|
52
|
+
- a full recovery-oriented DelphiAST compatibility audit.
|
|
53
|
+
|
|
54
|
+
`--skip-warm`, `--no-parse-audit`, `--no-worker-sweep`, and
|
|
55
|
+
`--no-phase-breakdown` shorten exploratory runs. `--report-only` writes all
|
|
56
|
+
failures but exits successfully. The release budgets are configurable with
|
|
57
|
+
`--budget-cold`, `--budget-warm`, `--budget-rss-gib`,
|
|
58
|
+
`--min-parse-ratio`, `--max-scaling-exponent`,
|
|
59
|
+
`--max-clean-ratio-regression`, `--max-problem-count-regression`, and
|
|
60
|
+
`--new-problem-threshold`.
|
|
61
|
+
|
|
62
|
+
The parser-quality gate compares the run with
|
|
63
|
+
`tests/fpc_parse_quality.baseline.json`. Regenerate that file deliberately
|
|
64
|
+
only after a passing run:
|
|
65
|
+
|
|
66
|
+
```console
|
|
67
|
+
.venv/bin/python scripts/benchmark_fpc_corpus.py \
|
|
68
|
+
--workspace /tmp/fpc-3m \
|
|
69
|
+
--output /tmp/fpc-report.json \
|
|
70
|
+
--update-baseline
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`--update-baseline` refuses to write when any non-quality release gate fails
|
|
74
|
+
or when the parser audit is disabled. This prevents accepting a slow, crashing,
|
|
75
|
+
or pathologically scaling run merely by replacing its baseline.
|
|
76
|
+
|
|
77
|
+
The opt-in pytest integration probe uses the smallest slice:
|
|
78
|
+
|
|
79
|
+
```console
|
|
80
|
+
DELPHI_LSP_FPC_CORPUS=/tmp/fpc-3m \
|
|
81
|
+
.venv/bin/python -m pytest -q -m perf \
|
|
82
|
+
tests/test_fpc_performance_corpus.py
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Normal pytest runs exclude the `perf` marker and require neither network nor
|
|
86
|
+
an external corpus.
|
|
87
|
+
|
|
88
|
+
## Budgets and interpretation
|
|
89
|
+
|
|
90
|
+
| Gate | Default | Meaning |
|
|
91
|
+
|---|---:|---|
|
|
92
|
+
| 3M cold overview | 60.0 s | Primary product question |
|
|
93
|
+
| 3M warm overview | 5.0 s | Second invocation in a fresh process |
|
|
94
|
+
| Peak RSS | 11 GiB | Leaves room on a 16 GB Windows/editor machine |
|
|
95
|
+
| Parse acceptance ratio | 0.95 | Parser returned, cleanly or through recovery |
|
|
96
|
+
| Clean ratio regression | 0.01 absolute | Per-role drop from the committed baseline |
|
|
97
|
+
| Known problem growth | 5% relative | Per-description increase from baseline |
|
|
98
|
+
| New problem threshold | 50 | Previously unseen description count |
|
|
99
|
+
| Scaling exponent | 1.15 | Rejects growth that extrapolates poorly |
|
|
100
|
+
|
|
101
|
+
Cold means the exact slice-local `.delphi-lsp` directory is removed and its
|
|
102
|
+
absence verified. Warm means a second fresh process without another removal.
|
|
103
|
+
The current `view` path does not write a persistent navigation cache, so its
|
|
104
|
+
warm result benefits only from the operating system's filesystem cache.
|
|
105
|
+
|
|
106
|
+
The overview command performs project/source discovery, source reads,
|
|
107
|
+
conditional outline processing, outline semantic-model construction, unit
|
|
108
|
+
scope registration, and overview payload construction. It does not full-parse
|
|
109
|
+
units or traverse complete reference relations. The full parser audit is
|
|
110
|
+
therefore measured and reported separately. It selects recovery-oriented
|
|
111
|
+
DelphiAST tolerant mode so every recoverable FPC problem remains countable;
|
|
112
|
+
the report states that mode and that the small-file Lark fallback is disabled
|
|
113
|
+
for this audit.
|
|
114
|
+
|
|
115
|
+
The report distinguishes three ratios:
|
|
116
|
+
|
|
117
|
+
- `accepted_ratio` is unchanged: it counts files for which parsing did not
|
|
118
|
+
raise. It remains the 0.95 crash floor.
|
|
119
|
+
- `clean_parse_ratio_units` counts complete units, programs, libraries, and
|
|
120
|
+
packages with zero reported problems.
|
|
121
|
+
- `clean_parse_ratio_includes` counts fragments with zero applicable problems.
|
|
122
|
+
It excludes only
|
|
123
|
+
`Expected unit, program, library, or package header`, because a fragment is
|
|
124
|
+
not a standalone compilation unit. The report records this exact rule and
|
|
125
|
+
rationale in `clean_ratio_exclusions`; no other problem is silently dropped.
|
|
126
|
+
|
|
127
|
+
`parse_success_ratio` remains a deprecated alias of `accepted_ratio` for one
|
|
128
|
+
report-schema release. `metric_definitions` identifies the alias explicitly.
|
|
129
|
+
|
|
130
|
+
Role detection is source-shaped rather than extension-only. After leading
|
|
131
|
+
whitespace, comments, and compiler directives are skipped, a first token of
|
|
132
|
+
`unit`, `program`, `library`, or `package` makes the file a unit. This catches
|
|
133
|
+
complete `.inc` files. Headerless `.pas` files are fragments, while `.dpr` and
|
|
134
|
+
`.dpk` retain unit status if preprocessing hides their header. In the measured
|
|
135
|
+
FPC slice this classified 3,682 files in each role, including 27 complete
|
|
136
|
+
`.inc` units and 53 `.pas` fragments.
|
|
137
|
+
|
|
138
|
+
## Measured result, 2026-07-28
|
|
139
|
+
|
|
140
|
+
The report was produced at
|
|
141
|
+
`/tmp/python-delphi-lsp-fpc-report.json` from FPC revision
|
|
142
|
+
`a8e7ad4e2f2f6d3bdc240850075d85e659a42ff8` on Darwin arm64, Python
|
|
143
|
+
3.14.3, 10 logical CPUs, and 32 GiB RAM. These are not target-hardware
|
|
144
|
+
measurements.
|
|
145
|
+
|
|
146
|
+
| Requested slice | Files | Physical lines | Cold | Warm | Peak RSS | Accepted |
|
|
147
|
+
|---:|---:|---:|---:|---:|---:|---:|
|
|
148
|
+
| 250k | 268 | 290,162 | 1.074 s | 1.121 s | 64.2 MiB | 100% |
|
|
149
|
+
| 500k | 584 | 500,068 | 1.816 s | 1.787 s | 95.7 MiB | 100% |
|
|
150
|
+
| 1M | 2,505 | 1,000,095 | 4.610 s | 4.140 s | 187.6 MiB | 100% |
|
|
151
|
+
| 2M | 6,007 | 2,000,205 | 9.015 s | 8.818 s | 422.7 MiB | 100% |
|
|
152
|
+
| 3M | 7,364 | 3,000,891 | 13.608 s | 12.819 s | 538.3 MiB | 100% |
|
|
153
|
+
|
|
154
|
+
The cold scaling exponent was **1.1054**, classified as **n_log_n**
|
|
155
|
+
(`R² = 0.9966`). This passes the 1.15 scaling gate. The run's overall status
|
|
156
|
+
was **fail** because the 3M fresh-process warm result exceeded its budget. The
|
|
157
|
+
measured cold 60-second target, RSS, parse-ratio, and scaling gates passed.
|
|
158
|
+
Cold throughput declined from 270,231 lines/s on the smallest slice to
|
|
159
|
+
220,529 lines/s at 3M; exact cold and warm throughput is present on every
|
|
160
|
+
slice in the JSON report.
|
|
161
|
+
|
|
162
|
+
After the IOChecks-directive correction, a fresh 3M parser audit processed
|
|
163
|
+
3,000,891 physical and 4,957,004 post-preprocessing lines. All 7,364 files
|
|
164
|
+
returned a recoverable result. The raw problem-free count rose from 1,171 to
|
|
165
|
+
1,208, and files carrying problems fell from 6,193 to 6,156. Unresolved
|
|
166
|
+
include problems fell from 2,533 to 2,261; all 228
|
|
167
|
+
`include not found: -` and 44 `include not found: +` reports disappeared.
|
|
168
|
+
Syntax recoveries remained 20,686.
|
|
169
|
+
|
|
170
|
+
The post-fix role-aware clean ratios committed in the baseline are:
|
|
171
|
+
|
|
172
|
+
| Role | Clean | Total | Clean ratio |
|
|
173
|
+
|---|---:|---:|---:|
|
|
174
|
+
| Units/projects | 1,192 | 3,682 | 32.374% |
|
|
175
|
+
| Include fragments | 3,364 | 3,682 | 91.363% |
|
|
176
|
+
|
|
177
|
+
The include ratio applies the one documented structural exclusion above. The
|
|
178
|
+
committed baseline also contains every problem-description count, not only a
|
|
179
|
+
top-ten summary, so a frequent new recovery mode is gated even when the crash
|
|
180
|
+
ratio stays at 100%.
|
|
181
|
+
|
|
182
|
+
## Largest-slice phase profile
|
|
183
|
+
|
|
184
|
+
| Phase | Seconds |
|
|
185
|
+
|---|---:|
|
|
186
|
+
| Discovery | 1.497 |
|
|
187
|
+
| Read-only source probe | 0.619 |
|
|
188
|
+
| Conditional outline, parse, and model construction | 15.785 |
|
|
189
|
+
| Semantic index assembly | 0.199 |
|
|
190
|
+
| Full relation traversal | not used |
|
|
191
|
+
| Overview payload | 0.000009 |
|
|
192
|
+
| Total index diagnostic | 17.491 |
|
|
193
|
+
|
|
194
|
+
Outline workers combine reads, conditional preprocessing, outline parsing,
|
|
195
|
+
and model construction, so the read number is a separate diagnostic pass and
|
|
196
|
+
is not subtracted from the measured outline time.
|
|
197
|
+
|
|
198
|
+
## Worker sweep at 1M lines
|
|
199
|
+
|
|
200
|
+
| Workers | Cold | Speedup vs. one worker | Peak RSS |
|
|
201
|
+
|---:|---:|---:|---:|
|
|
202
|
+
| default/0 | 6.707 s | 2.261× | 186.7 MiB |
|
|
203
|
+
| 1 | 15.165 s | 1.000× | 221.1 MiB |
|
|
204
|
+
| 2 | 9.206 s | 1.647× | 185.3 MiB |
|
|
205
|
+
| 4 | 9.350 s | 1.622× | 188.2 MiB |
|
|
206
|
+
|
|
207
|
+
The automatic/default worker count was fastest on the measured machine.
|
|
208
|
+
Windows uses spawned workers too, but the optimum must be measured on the
|
|
209
|
+
target laptop.
|
|
210
|
+
|
|
211
|
+
## Verdict and findings
|
|
212
|
+
|
|
213
|
+
On the measured machine the answer is **yes**: the 3M cold overview completed
|
|
214
|
+
in 13.608 seconds. Applying the explicitly assumed, unverified 4× slowdown
|
|
215
|
+
projects 54.431 seconds on the Windows i5 target, within the 60-second budget.
|
|
216
|
+
That projection is not a Windows measurement, so the target-hardware question
|
|
217
|
+
remains projected rather than proven.
|
|
218
|
+
|
|
219
|
+
Important findings:
|
|
220
|
+
|
|
221
|
+
- `view` creates no persistent `.delphi-lsp` cache
|
|
222
|
+
(`delphi_lsp/agent_cli.py:313-321`), so the second fresh-process invocation
|
|
223
|
+
still rebuilds the whole outline and misses the 5-second warm budget.
|
|
224
|
+
- Outline/preprocessing/model work dominates the largest slice
|
|
225
|
+
(`delphi_lsp/agent_layers.py:76-127`); overview payload construction is
|
|
226
|
+
negligible.
|
|
227
|
+
- Discovery indexed all 7,364 manifest source files and skipped none. `.pp`
|
|
228
|
+
files are excluded because the product task filter accepts `.pas`, `.inc`,
|
|
229
|
+
`.dpr`, and `.dpk` (`delphi_lsp/agent_layers.py:76-81`).
|
|
230
|
+
- Recovery parsing exposes broad FPC-dialect incompatibility despite a 100%
|
|
231
|
+
recoverable-result ratio: 84.1% of files report at least one problem
|
|
232
|
+
(`delphi_lsp/parser.py:88-127`).
|
|
233
|
+
- The strict small-file Lark branch
|
|
234
|
+
(`delphi_lsp/parser.py:99-108`) is not the overview path and proved
|
|
235
|
+
unsuitable for a bounded full-corpus compatibility audit; the report uses
|
|
236
|
+
and labels DelphiAST tolerant mode instead.
|
|
237
|
+
- The parent-process RSS measurement reuses the existing Windows PSAPI
|
|
238
|
+
implementation but cannot aggregate spawned-worker RSS
|
|
239
|
+
(`delphi_lsp/parallel_outline.py:123-181`).
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Python Delphi LSP 3.1.2
|
|
2
|
+
|
|
3
|
+
Version 3.1.2 is a parser-correctness and benchmark-quality release.
|
|
4
|
+
|
|
5
|
+
## Preprocessor correctness
|
|
6
|
+
|
|
7
|
+
- Delphi compiler switches such as `{$I-}` and `{$I+}` are no longer
|
|
8
|
+
interpreted as include directives.
|
|
9
|
+
- The adversarial FPC corpus check reduced phantom include problems from 272
|
|
10
|
+
to zero.
|
|
11
|
+
|
|
12
|
+
## Honest parse-quality metrics
|
|
13
|
+
|
|
14
|
+
- The existing accepted-unit ratio remains available for continuity.
|
|
15
|
+
- `clean_parse_ratio_units` and `clean_parse_ratio_includes` now expose how
|
|
16
|
+
much source parsed without recovered errors.
|
|
17
|
+
- Benchmark gates can compare those clean ratios with a pinned baseline and
|
|
18
|
+
fail on regressions.
|
|
19
|
+
|
|
20
|
+
## Reproducible performance profiles
|
|
21
|
+
|
|
22
|
+
- A Delphi corpus profile pins five public repositories and records project
|
|
23
|
+
files deterministically.
|
|
24
|
+
- A deterministic realism overlay exercises malformed and deeply nested
|
|
25
|
+
Delphi input without changing the checked-out upstream sources.
|
|
26
|
+
- This release improves the benchmark harness and reporting; it does not claim
|
|
27
|
+
a product-speedup from those measurement changes.
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
|
|
31
|
+
- Full unit and integration suite
|
|
32
|
+
- Opt-in FPC and Delphi corpus performance tests
|
|
33
|
+
- Wheel and source-distribution metadata checks
|
|
34
|
+
|
|
35
|
+
Install or upgrade with:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
python -m pip install --upgrade python-delphi-lsp==3.1.2
|
|
39
|
+
```
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-delphi-lsp"
|
|
7
|
-
version = "3.1.
|
|
7
|
+
version = "3.1.2"
|
|
8
8
|
description = "Python Delphi/Object Pascal parser, semantic indexer, and language server."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -68,4 +68,7 @@ delphi_lsp = ["py.typed"]
|
|
|
68
68
|
[tool.pytest.ini_options]
|
|
69
69
|
testpaths = ["tests"]
|
|
70
70
|
pythonpath = ["."]
|
|
71
|
-
addopts = "--timeout=120 --timeout-method=thread"
|
|
71
|
+
addopts = "--timeout=120 --timeout-method=thread -m 'not perf'"
|
|
72
|
+
markers = [
|
|
73
|
+
"perf: opt-in benchmarks that require an externally prepared real-world corpus",
|
|
74
|
+
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-delphi-lsp
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.2
|
|
4
4
|
Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
|
|
5
5
|
Author: Dark Light
|
|
6
6
|
License-Expression: MPL-2.0
|
|
@@ -45,7 +45,7 @@ Dynamic: license-file
|
|
|
45
45
|
|
|
46
46
|
`python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
|
|
47
47
|
indexes, serves LSP, and provides bounded codebase navigation for agents.
|
|
48
|
-
Version 3.1.
|
|
48
|
+
Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
|
|
49
49
|
|
|
50
50
|
## Install and quick start
|
|
51
51
|
|
|
@@ -521,6 +521,12 @@ source was parsed for CPG. Legacy navigation retained 98.43 percent of its
|
|
|
521
521
|
in-run control throughput, above the 95-percent release floor. Reproduce it
|
|
522
522
|
with `python scripts/benchmark_cpg.py --root CORPUS --query Run --workers 8`.
|
|
523
523
|
|
|
524
|
+
Separate reproducible performance profiles cover the coherent FPC compiler
|
|
525
|
+
tree and a project-file-dense Delphi corpus. The Delphi profile can add a
|
|
526
|
+
deterministic `__history`/recovery/build/search-path overlay without changing
|
|
527
|
+
the pinned base corpus. See [the FPC benchmark](docs/performance-fpc.md) and
|
|
528
|
+
[the Delphi discovery benchmark](docs/performance-delphi.md).
|
|
529
|
+
|
|
524
530
|
For every source size the navigator builds an outline first, loads source detail
|
|
525
531
|
lazily for a selected target, and returns only selected fragments. Typed source
|
|
526
532
|
chunks are at most 6000 characters and also respect the response budget. This
|
|
@@ -45,11 +45,14 @@ delphi_lsp/semantic_builder.py
|
|
|
45
45
|
delphi_lsp/source_reader.py
|
|
46
46
|
delphi_lsp/workspace.py
|
|
47
47
|
delphi_lsp/writer.py
|
|
48
|
+
docs/performance-delphi.md
|
|
49
|
+
docs/performance-fpc.md
|
|
48
50
|
docs/release-2.3.0.md
|
|
49
51
|
docs/release-2.3.3.md
|
|
50
52
|
docs/release-3.0.0.md
|
|
51
53
|
docs/release-3.1.0.md
|
|
52
54
|
docs/release-3.1.1.md
|
|
55
|
+
docs/release-3.1.2.md
|
|
53
56
|
docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md
|
|
54
57
|
docs/superpowers/plans/2026-07-17-large-codebase-performance.md
|
|
55
58
|
docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md
|
|
@@ -82,6 +85,7 @@ python_delphi_lsp.egg-info/requires.txt
|
|
|
82
85
|
python_delphi_lsp.egg-info/top_level.txt
|
|
83
86
|
scripts/audit_delphi_language_features.py
|
|
84
87
|
scripts/benchmark_cpg.py
|
|
88
|
+
scripts/benchmark_fpc_corpus.py
|
|
85
89
|
scripts/benchmark_github_corpus.py
|
|
86
90
|
scripts/benchmark_parallel_cache.py
|
|
87
91
|
scripts/bootstrap_vllm_codebase_skill_test.py
|
|
@@ -92,6 +96,8 @@ scripts/build_github_performance_corpus.py
|
|
|
92
96
|
scripts/check_ornith_cache.py
|
|
93
97
|
scripts/generate_progress_pdf.py
|
|
94
98
|
scripts/generate_release_evidence.py
|
|
99
|
+
scripts/prepare_delphi_corpus.py
|
|
100
|
+
scripts/prepare_fpc_corpus.py
|
|
95
101
|
scripts/prepare_ornith_cache.py
|
|
96
102
|
scripts/run_opencode_lsp_probe.py
|
|
97
103
|
scripts/run_openrouter_github_e2e.py
|
|
@@ -99,6 +105,7 @@ scripts/start_ornith_vllm.sh
|
|
|
99
105
|
scripts/summarize_opencode_request_payloads.py
|
|
100
106
|
scripts/ollama/ornith-lspctx.Modelfile
|
|
101
107
|
tests/corpora.performance.lock.json
|
|
108
|
+
tests/fpc_parse_quality.baseline.json
|
|
102
109
|
tests/test_agent_cache.py
|
|
103
110
|
tests/test_agent_cli_errors.py
|
|
104
111
|
tests/test_agent_codebase.py
|
|
@@ -112,11 +119,13 @@ tests/test_agent_worker.py
|
|
|
112
119
|
tests/test_agent_workspace.py
|
|
113
120
|
tests/test_bootstrap_vllm_codebase_skill.py
|
|
114
121
|
tests/test_bootstrap_vllm_opencode.py
|
|
122
|
+
tests/test_delphi_performance_corpus.py
|
|
115
123
|
tests/test_delphiast_lexer.py
|
|
116
124
|
tests/test_delphiast_native_compatibility.py
|
|
117
125
|
tests/test_delphiast_parser.py
|
|
118
126
|
tests/test_delphiast_semantic_compatibility.py
|
|
119
127
|
tests/test_diagnostics.py
|
|
128
|
+
tests/test_fpc_performance_corpus.py
|
|
120
129
|
tests/test_github_performance_corpus.py
|
|
121
130
|
tests/test_language_feature_matrix.py
|
|
122
131
|
tests/test_legacy_snippets.py
|