python-delphi-lsp 3.1.2__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.1.2 → python_delphi_lsp-3.2.1}/MANIFEST.in +5 -0
- {python_delphi_lsp-3.1.2/python_delphi_lsp.egg-info → python_delphi_lsp-3.2.1}/PKG-INFO +18 -4
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/README.md +17 -3
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/__init__.py +105 -89
- python_delphi_lsp-3.2.1/delphi_lsp/_version.py +1 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cache.py +95 -42
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cli.py +33 -7
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_context.py +47 -18
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg.py +3 -4
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg_builder.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_layers.py +17 -8
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_metrics.py +2 -4
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_protocol.py +2 -3
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_relations.py +52 -8
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_templates.py +1 -2
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_wiki.py +6 -6
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_workspace.py +9 -5
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/binary.py +5 -5
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/comment_builder.py +1 -2
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_lexer.py +3 -5
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_parser.py +384 -52
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/grammar.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_builder.py +5 -10
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_tokens.py +0 -1
- python_delphi_lsp-3.2.1/delphi_lsp/lexical_scanner.py +30 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/lsp_server.py +603 -110
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/metrics.py +50 -15
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/navigation_cache.py +3 -4
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/nodes.py +19 -19
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/parallel_outline.py +3 -4
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/parser.py +101 -17
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/preprocessor.py +232 -25
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/progress.py +1 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/project_config.py +2 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/project_discovery.py +38 -21
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/project_indexer.py +18 -18
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic.py +28 -17
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic_builder.py +29 -20
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/workspace.py +1 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/performance-delphi.md +103 -15
- python_delphi_lsp-3.2.1/docs/release-3.2.0.md +79 -0
- python_delphi_lsp-3.2.1/docs/release-3.2.1.md +77 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/pyproject.toml +1 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1/python_delphi_lsp.egg-info}/PKG-INFO +18 -4
- python_delphi_lsp-3.2.1/python_delphi_lsp.egg-info/SOURCES.txt +379 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_fpc_corpus.py +810 -33
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/run_openrouter_github_e2e.py +6 -1
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +84 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +66 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +379 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +89 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +94 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +73 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +75 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +73 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +75 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +75 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +78 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +119 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +119 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +98 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +91 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +86 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +85 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +85 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +85 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +94 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +71 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +59 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +59 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +65 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +65 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +30 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +122 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +213 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +106 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +175 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +186 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +74 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +284 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +151 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +117 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +166 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +113 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +185 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +136 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +68 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +47 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +51 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +47 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +50 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +50 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +50 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +50 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +50 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +50 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +50 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/LICENSE.txt +202 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +597 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +427 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +108 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +1571 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +476 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +74 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +79 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +293 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +336 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +229 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +354 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +41 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +41 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +39 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +251 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +43 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +458 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +91 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +249 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +127 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +455 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +89 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +594 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +372 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +440 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +55 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +70 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +29 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +87 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +159 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +481 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +430 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +1557 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +171 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +424 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +369 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +448 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +36 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +159 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +116 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +143 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +126 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +34 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +133 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +185 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +259 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +344 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +115 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +133 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +108 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +120 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +105 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +43 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +452 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +112 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +637 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +936 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +174 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +286 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +1082 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +181 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +59 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +138 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +3572 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +365 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +227 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.inc +115 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +81 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +43 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +7 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +1536 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +246 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +516 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +377 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +98 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +427 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +7 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +119 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +113 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +176 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +279 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +279 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +96 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +141 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +302 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +65 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +33 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +269 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +196 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +48 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +92 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +131 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +130 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +88 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/mORMot2/LICENCE.md +81 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/mORMot2/src/mormot.defines.inc +1121 -0
- python_delphi_lsp-3.2.1/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +12508 -0
- python_delphi_lsp-3.2.1/tests/fpc_parse_quality.baseline.json +5430 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_cache.py +246 -16
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_cli_errors.py +73 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_codebase.py +3 -3
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_context.py +40 -4
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_cpg.py +2 -3
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_metrics.py +25 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_relations.py +160 -16
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_worker.py +2 -2
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_codebase_skill.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_opencode.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphiast_lexer.py +25 -0
- python_delphi_lsp-3.2.1/tests/test_delphiast_native_compatibility.py +1013 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphiast_parser.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphiast_semantic_compatibility.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_diagnostics.py +0 -1
- python_delphi_lsp-3.2.1/tests/test_fpc_performance_corpus.py +1069 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_language_feature_matrix.py +0 -1
- python_delphi_lsp-3.2.1/tests/test_legacy_snippets.py +55 -0
- python_delphi_lsp-3.2.1/tests/test_lsp_server.py +901 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_lsp_support.py +85 -6
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_metrics.py +51 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_opencode_config.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_opencode_probe.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_opencode_request_payloads.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_openrouter_github_e2e.py +28 -2
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_ornith_cache_prepare.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_package_metadata.py +13 -4
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_parallel_outline.py +6 -5
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_parser.py +32 -4
- python_delphi_lsp-3.2.1/tests/test_parser_backends.py +368 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_preprocessor.py +149 -11
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_progress.py +1 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_project_discovery.py +62 -7
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_release_evidence.py +1 -10
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_semantic.py +35 -1
- python_delphi_lsp-3.2.1/tests/test_throughput_scaling.py +360 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_vllm_start_script.py +0 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_workspace.py +1 -2
- python_delphi_lsp-3.1.2/delphi_lsp/_version.py +0 -1
- python_delphi_lsp-3.1.2/python_delphi_lsp.egg-info/SOURCES.txt +0 -199
- python_delphi_lsp-3.1.2/tests/fpc_parse_quality.baseline.json +0 -10266
- python_delphi_lsp-3.1.2/tests/test_delphiast_native_compatibility.py +0 -364
- python_delphi_lsp-3.1.2/tests/test_fpc_performance_corpus.py +0 -521
- python_delphi_lsp-3.1.2/tests/test_legacy_snippets.py +0 -34
- python_delphi_lsp-3.1.2/tests/test_lsp_server.py +0 -309
- python_delphi_lsp-3.1.2/tests/test_parser_backends.py +0 -135
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/.github/workflows/ci.yml +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/LICENSE +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/consts.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_tokens.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/parser_backend.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/py.typed +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/source_reader.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/writer.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/performance-fpc.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-2.3.0.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-2.3.3.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.0.0.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.1.0.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.1.1.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.1.2.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/opencode.json +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/requires.txt +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/top_level.txt +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/audit_delphi_language_features.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_cpg.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_github_corpus.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_parallel_cache.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/build_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/check_ornith_cache.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/generate_progress_pdf.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/generate_release_evidence.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/prepare_delphi_corpus.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/prepare_fpc_corpus.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/prepare_ornith_cache.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/run_opencode_lsp_probe.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/start_ornith_vllm.sh +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/summarize_opencode_request_payloads.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/setup.cfg +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/corpora.performance.lock.json +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/constset.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/properties.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/library_demo.dpr +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/package_demo.dpk +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/program_demo.dpr +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_advanced.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_attributes.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_basic.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_consumer.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_generics.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_inheritance.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_math.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_properties.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_sections.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_statements.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_types.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_unresolved.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_with.pas +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_protocol.py +1 -1
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_wiki.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_workspace.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphi_performance_corpus.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_github_performance_corpus.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_lsp_features.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_navigation_cache.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_project_config.py +0 -0
- {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_project_indexer.py +0 -0
|
@@ -31,3 +31,8 @@ include tests/test_delphi_performance_corpus.py
|
|
|
31
31
|
include docs/performance-delphi.md
|
|
32
32
|
recursive-include docs *.md
|
|
33
33
|
recursive-include tests *.py *.pas *.inc *.dpr *.dpk
|
|
34
|
+
include test_projects/github_repos/DUnitX/LICENSE.txt
|
|
35
|
+
recursive-include test_projects/github_repos/DUnitX *.dpk *.dpr *.inc *.pas
|
|
36
|
+
include test_projects/github_repos/mORMot2/LICENCE.md
|
|
37
|
+
include test_projects/github_repos/mORMot2/src/mormot.defines.inc
|
|
38
|
+
include test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-delphi-lsp
|
|
3
|
-
Version: 3.1
|
|
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.1
|
|
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.1
|
|
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
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
from ._version import __version__
|
|
2
2
|
from .binary import BinarySerializer, dumps, loads
|
|
3
|
+
from .comment_builder import build_comment_nodes
|
|
3
4
|
from .consts import AttributeName, SyntaxNodeType
|
|
5
|
+
from .grammar import GRAMMAR_RULES, build_grammar
|
|
6
|
+
from .lark_tokens import (
|
|
7
|
+
BASE_TERMINALS,
|
|
8
|
+
KEYWORD_TERMINALS,
|
|
9
|
+
KEYWORDS,
|
|
10
|
+
build_grammar_snippet,
|
|
11
|
+
)
|
|
12
|
+
from .lsp_server import LspWorkspaceState, create_server
|
|
13
|
+
from .metrics import (
|
|
14
|
+
CyclomaticMetrics,
|
|
15
|
+
HalsteadMetrics,
|
|
16
|
+
LineMetrics,
|
|
17
|
+
MetricProblem,
|
|
18
|
+
ProjectMetrics,
|
|
19
|
+
RoutineComplexity,
|
|
20
|
+
UnitMetrics,
|
|
21
|
+
analyze_project,
|
|
22
|
+
analyze_unit,
|
|
23
|
+
)
|
|
4
24
|
from .nodes import (
|
|
5
25
|
CommentNode,
|
|
6
26
|
CompoundSyntaxNode,
|
|
@@ -9,12 +29,31 @@ from .nodes import (
|
|
|
9
29
|
SyntaxTreeException,
|
|
10
30
|
ValuedSyntaxNode,
|
|
11
31
|
)
|
|
12
|
-
from .
|
|
13
|
-
from .preprocessor import
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
32
|
+
from .parser import DelphiParseError, DelphiParser, ParseResult, StringTransform, parse
|
|
33
|
+
from .preprocessor import (
|
|
34
|
+
CommentInfo,
|
|
35
|
+
IncludeLoader,
|
|
36
|
+
PreprocessedSource,
|
|
37
|
+
Preprocessor,
|
|
38
|
+
PreprocessorOptions,
|
|
39
|
+
)
|
|
40
|
+
from .progress import ProgressCallback, ProgressEvent
|
|
41
|
+
from .project_discovery import (
|
|
42
|
+
DelphiProjectDiscovery,
|
|
43
|
+
DiscoveryProblem,
|
|
44
|
+
discover_delphi_project,
|
|
45
|
+
)
|
|
46
|
+
from .project_indexer import (
|
|
47
|
+
GetUnitSyntaxHook,
|
|
48
|
+
IncludeFileInfo,
|
|
49
|
+
ProjectIndexer,
|
|
50
|
+
ProjectIndexResult,
|
|
51
|
+
ProjectProblem,
|
|
52
|
+
ProjectProblemType,
|
|
53
|
+
UnitErrorInfo,
|
|
54
|
+
UnitInfo,
|
|
55
|
+
UnitParsedHook,
|
|
56
|
+
)
|
|
18
57
|
from .semantic import (
|
|
19
58
|
ArrayTypeRef,
|
|
20
59
|
ClassOfTypeRef,
|
|
@@ -27,136 +66,113 @@ from .semantic import (
|
|
|
27
66
|
NamedTypeRef,
|
|
28
67
|
PointerTypeRef,
|
|
29
68
|
ProcTypeRef,
|
|
69
|
+
RecordTypeRef,
|
|
30
70
|
ReferenceKind,
|
|
31
71
|
ReferenceTypeRef,
|
|
32
|
-
RecordTypeRef,
|
|
33
72
|
Scope,
|
|
34
73
|
ScopeKind,
|
|
74
|
+
SetTypeRef,
|
|
35
75
|
SourceRange,
|
|
36
76
|
SubrangeTypeRef,
|
|
37
|
-
SetTypeRef,
|
|
38
77
|
Symbol,
|
|
39
78
|
SymbolIndex,
|
|
40
79
|
SymbolKind,
|
|
41
80
|
SymbolReference,
|
|
42
|
-
TypeRef,
|
|
43
81
|
TypeParameterRef,
|
|
82
|
+
TypeRef,
|
|
44
83
|
UnknownTypeRef,
|
|
45
84
|
Visibility,
|
|
46
85
|
)
|
|
47
86
|
from .semantic_builder import SemanticBuilder, SemanticModel, SemanticProblem
|
|
48
87
|
from .workspace import WorkspaceSemanticResult, build_workspace_semantics
|
|
49
|
-
from .
|
|
50
|
-
from .project_discovery import DelphiProjectDiscovery, DiscoveryProblem, discover_delphi_project
|
|
51
|
-
from .progress import ProgressCallback, ProgressEvent
|
|
52
|
-
from .project_indexer import (
|
|
53
|
-
GetUnitSyntaxHook,
|
|
54
|
-
IncludeFileInfo,
|
|
55
|
-
ProjectIndexer,
|
|
56
|
-
ProjectIndexResult,
|
|
57
|
-
ProjectProblem,
|
|
58
|
-
ProjectProblemType,
|
|
59
|
-
UnitErrorInfo,
|
|
60
|
-
UnitInfo,
|
|
61
|
-
UnitParsedHook,
|
|
62
|
-
)
|
|
63
|
-
from .metrics import (
|
|
64
|
-
CyclomaticMetrics,
|
|
65
|
-
HalsteadMetrics,
|
|
66
|
-
LineMetrics,
|
|
67
|
-
MetricProblem,
|
|
68
|
-
ProjectMetrics,
|
|
69
|
-
RoutineComplexity,
|
|
70
|
-
UnitMetrics,
|
|
71
|
-
analyze_project,
|
|
72
|
-
analyze_unit,
|
|
73
|
-
)
|
|
88
|
+
from .writer import SyntaxTreeWriter
|
|
74
89
|
|
|
75
90
|
__all__ = [
|
|
76
|
-
'__version__',
|
|
77
|
-
'AttributeName',
|
|
78
|
-
'BinarySerializer',
|
|
79
|
-
'CommentNode',
|
|
80
|
-
'CompoundSyntaxNode',
|
|
81
|
-
'ParserException',
|
|
82
|
-
'SyntaxNode',
|
|
83
|
-
'SyntaxNodeType',
|
|
84
|
-
'SyntaxTreeException',
|
|
85
|
-
'SyntaxTreeWriter',
|
|
86
|
-
'ValuedSyntaxNode',
|
|
87
|
-
'PreprocessedSource',
|
|
88
|
-
'Preprocessor',
|
|
89
|
-
'PreprocessorOptions',
|
|
90
|
-
'IncludeLoader',
|
|
91
|
-
'CommentInfo',
|
|
92
|
-
'KEYWORDS',
|
|
93
|
-
'KEYWORD_TERMINALS',
|
|
94
91
|
'BASE_TERMINALS',
|
|
95
|
-
'build_grammar_snippet',
|
|
96
|
-
'build_grammar',
|
|
97
92
|
'GRAMMAR_RULES',
|
|
98
|
-
'
|
|
99
|
-
'
|
|
100
|
-
'ParseResult',
|
|
101
|
-
'StringTransform',
|
|
102
|
-
'parse',
|
|
103
|
-
'Modifier',
|
|
93
|
+
'KEYWORDS',
|
|
94
|
+
'KEYWORD_TERMINALS',
|
|
104
95
|
'ArrayTypeRef',
|
|
96
|
+
'AttributeName',
|
|
97
|
+
'BinarySerializer',
|
|
105
98
|
'ClassOfTypeRef',
|
|
106
99
|
'ClassTypeRef',
|
|
100
|
+
'CommentInfo',
|
|
101
|
+
'CommentNode',
|
|
102
|
+
'CompoundSyntaxNode',
|
|
103
|
+
'CyclomaticMetrics',
|
|
104
|
+
'DelphiParseError',
|
|
105
|
+
'DelphiParser',
|
|
106
|
+
'DelphiProjectDiscovery',
|
|
107
|
+
'DiscoveryProblem',
|
|
107
108
|
'EnumTypeRef',
|
|
108
109
|
'FileTypeRef',
|
|
109
110
|
'GenericInstanceTypeRef',
|
|
111
|
+
'GetUnitSyntaxHook',
|
|
112
|
+
'HalsteadMetrics',
|
|
113
|
+
'IncludeFileInfo',
|
|
114
|
+
'IncludeLoader',
|
|
110
115
|
'InterfaceTypeRef',
|
|
116
|
+
'LineMetrics',
|
|
117
|
+
'LspWorkspaceState',
|
|
118
|
+
'MetricProblem',
|
|
119
|
+
'Modifier',
|
|
111
120
|
'NamedTypeRef',
|
|
121
|
+
'ParseResult',
|
|
122
|
+
'ParserException',
|
|
112
123
|
'PointerTypeRef',
|
|
124
|
+
'PreprocessedSource',
|
|
125
|
+
'Preprocessor',
|
|
126
|
+
'PreprocessorOptions',
|
|
113
127
|
'ProcTypeRef',
|
|
128
|
+
'ProgressCallback',
|
|
129
|
+
'ProgressEvent',
|
|
130
|
+
'ProjectIndexResult',
|
|
131
|
+
'ProjectIndexer',
|
|
132
|
+
'ProjectMetrics',
|
|
133
|
+
'ProjectProblem',
|
|
134
|
+
'ProjectProblemType',
|
|
135
|
+
'RecordTypeRef',
|
|
114
136
|
'ReferenceKind',
|
|
115
137
|
'ReferenceTypeRef',
|
|
116
|
-
'
|
|
138
|
+
'RoutineComplexity',
|
|
117
139
|
'Scope',
|
|
118
140
|
'ScopeKind',
|
|
141
|
+
'SemanticBuilder',
|
|
142
|
+
'SemanticModel',
|
|
143
|
+
'SemanticProblem',
|
|
144
|
+
'SetTypeRef',
|
|
119
145
|
'SourceRange',
|
|
146
|
+
'StringTransform',
|
|
120
147
|
'SubrangeTypeRef',
|
|
121
|
-
'SetTypeRef',
|
|
122
148
|
'Symbol',
|
|
123
149
|
'SymbolIndex',
|
|
124
150
|
'SymbolKind',
|
|
125
151
|
'SymbolReference',
|
|
126
|
-
'
|
|
152
|
+
'SyntaxNode',
|
|
153
|
+
'SyntaxNodeType',
|
|
154
|
+
'SyntaxTreeException',
|
|
155
|
+
'SyntaxTreeWriter',
|
|
127
156
|
'TypeParameterRef',
|
|
157
|
+
'TypeRef',
|
|
158
|
+
'UnitErrorInfo',
|
|
159
|
+
'UnitInfo',
|
|
160
|
+
'UnitMetrics',
|
|
161
|
+
'UnitParsedHook',
|
|
128
162
|
'UnknownTypeRef',
|
|
163
|
+
'ValuedSyntaxNode',
|
|
129
164
|
'Visibility',
|
|
130
|
-
'SemanticBuilder',
|
|
131
|
-
'SemanticModel',
|
|
132
|
-
'SemanticProblem',
|
|
133
165
|
'WorkspaceSemanticResult',
|
|
166
|
+
'__version__',
|
|
167
|
+
'analyze_project',
|
|
168
|
+
'analyze_unit',
|
|
169
|
+
'build_comment_nodes',
|
|
170
|
+
'build_grammar',
|
|
171
|
+
'build_grammar_snippet',
|
|
134
172
|
'build_workspace_semantics',
|
|
135
|
-
'LspWorkspaceState',
|
|
136
173
|
'create_server',
|
|
137
|
-
'DelphiProjectDiscovery',
|
|
138
|
-
'DiscoveryProblem',
|
|
139
174
|
'discover_delphi_project',
|
|
140
|
-
'ProgressCallback',
|
|
141
|
-
'ProgressEvent',
|
|
142
|
-
'ProjectIndexer',
|
|
143
|
-
'ProjectIndexResult',
|
|
144
|
-
'ProjectProblemType',
|
|
145
|
-
'ProjectProblem',
|
|
146
|
-
'UnitInfo',
|
|
147
|
-
'UnitErrorInfo',
|
|
148
|
-
'IncludeFileInfo',
|
|
149
|
-
'GetUnitSyntaxHook',
|
|
150
|
-
'UnitParsedHook',
|
|
151
|
-
'MetricProblem',
|
|
152
|
-
'LineMetrics',
|
|
153
|
-
'HalsteadMetrics',
|
|
154
|
-
'RoutineComplexity',
|
|
155
|
-
'CyclomaticMetrics',
|
|
156
|
-
'UnitMetrics',
|
|
157
|
-
'ProjectMetrics',
|
|
158
|
-
'analyze_unit',
|
|
159
|
-
'analyze_project',
|
|
160
175
|
'dumps',
|
|
161
176
|
'loads',
|
|
177
|
+
'parse',
|
|
162
178
|
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.2.1"
|
|
@@ -18,6 +18,7 @@ import time
|
|
|
18
18
|
from collections.abc import Callable, Collection, Mapping
|
|
19
19
|
from concurrent.futures import ThreadPoolExecutor
|
|
20
20
|
from dataclasses import dataclass, fields, is_dataclass, replace
|
|
21
|
+
from functools import lru_cache
|
|
21
22
|
from pathlib import Path
|
|
22
23
|
from types import ModuleType
|
|
23
24
|
|
|
@@ -40,6 +41,8 @@ _CONNECTION_TIMEOUT = 2.0
|
|
|
40
41
|
_PREAUTH_CONNECTION_TIMEOUT = 0.25
|
|
41
42
|
_CONNECTION_WORKERS = 8
|
|
42
43
|
_CLIENT_RESPONSE_TIMEOUT = 120.0
|
|
44
|
+
_MAX_CLIENT_RESPONSE_TIMEOUT = 600.0
|
|
45
|
+
_CLIENT_SECONDS_PER_SOURCE = 0.25
|
|
43
46
|
_MEMORY_SIZE = re.compile(r"^(?P<count>[1-9][0-9]*)(?P<suffix>[KMG]?)$", re.IGNORECASE)
|
|
44
47
|
_STARTUP_DIAGNOSTIC_BYTES = 16 * 1024
|
|
45
48
|
_STARTUP_TOKEN_RE = re.compile(r"(?i)(token\b[^\n\r]*?:?\s*['\"]?[A-Za-z0-9_-]+['\"]?|\b[a-zA-Z0-9_-]{32,})")
|
|
@@ -623,7 +626,7 @@ def _process_start_lock(root: str | Path):
|
|
|
623
626
|
def _client_exchange(metadata: CacheMetadata, request: dict[str, object]) -> CacheClientResponse:
|
|
624
627
|
try:
|
|
625
628
|
with socket.create_connection(("127.0.0.1", metadata.port), timeout=2) as connection:
|
|
626
|
-
connection.settimeout(
|
|
629
|
+
connection.settimeout(_client_response_timeout(metadata, request))
|
|
627
630
|
request_without_token = {key: value for key, value in request.items() if key != "token"}
|
|
628
631
|
connection.sendall(json.dumps({"token": metadata.token, **request_without_token}, separators=(",", ":")).encode("utf-8") + b"\n")
|
|
629
632
|
response = _read_line(connection)
|
|
@@ -646,6 +649,43 @@ def _client_exchange(metadata: CacheMetadata, request: dict[str, object]) -> Cac
|
|
|
646
649
|
return CacheClientResponse(payload, str(decoded.get("warning", "")))
|
|
647
650
|
|
|
648
651
|
|
|
652
|
+
def _client_response_timeout(
|
|
653
|
+
metadata: CacheMetadata,
|
|
654
|
+
request: Mapping[str, object],
|
|
655
|
+
) -> float:
|
|
656
|
+
if request.get("action") in {"status", "stop"}:
|
|
657
|
+
return _CLIENT_RESPONSE_TIMEOUT
|
|
658
|
+
return min(
|
|
659
|
+
_MAX_CLIENT_RESPONSE_TIMEOUT,
|
|
660
|
+
_CLIENT_RESPONSE_TIMEOUT
|
|
661
|
+
+ _workspace_source_count(metadata.root) * _CLIENT_SECONDS_PER_SOURCE,
|
|
662
|
+
)
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
@lru_cache(maxsize=64)
|
|
666
|
+
def _workspace_source_count(root: str) -> int:
|
|
667
|
+
count = 0
|
|
668
|
+
source_suffixes = {".pas", ".pp", ".inc", ".dpr", ".dpk"}
|
|
669
|
+
maximum_relevant_count = int(
|
|
670
|
+
(_MAX_CLIENT_RESPONSE_TIMEOUT - _CLIENT_RESPONSE_TIMEOUT)
|
|
671
|
+
/ _CLIENT_SECONDS_PER_SOURCE
|
|
672
|
+
)
|
|
673
|
+
for _current, directories, files in os.walk(Path(root).expanduser().resolve()):
|
|
674
|
+
directories[:] = [
|
|
675
|
+
directory
|
|
676
|
+
for directory in directories
|
|
677
|
+
if directory not in SKIP_DIRS
|
|
678
|
+
]
|
|
679
|
+
count += sum(
|
|
680
|
+
1
|
|
681
|
+
for file_name in files
|
|
682
|
+
if Path(file_name).suffix.casefold() in source_suffixes
|
|
683
|
+
)
|
|
684
|
+
if count >= maximum_relevant_count:
|
|
685
|
+
return maximum_relevant_count
|
|
686
|
+
return count
|
|
687
|
+
|
|
688
|
+
|
|
649
689
|
def _read_line(connection: socket.socket) -> bytes:
|
|
650
690
|
chunks = bytearray()
|
|
651
691
|
while len(chunks) <= _MAX_MESSAGE_BYTES:
|
|
@@ -768,14 +808,7 @@ class _CacheService:
|
|
|
768
808
|
if error.code != "project_required":
|
|
769
809
|
raise
|
|
770
810
|
self.cache_state = "ready"
|
|
771
|
-
self.
|
|
772
|
-
measure=self._measure_retained_bytes,
|
|
773
|
-
evict_auxiliary=self.context.evict_auxiliary_caches,
|
|
774
|
-
evict_navigation=self.context.evict_navigation_caches,
|
|
775
|
-
)
|
|
776
|
-
if self.last_budget.compacted:
|
|
777
|
-
self.stats.evictions += 1
|
|
778
|
-
self.cache_state = "compact"
|
|
811
|
+
self._enforce_budget()
|
|
779
812
|
self.prewarm_seconds = time.monotonic() - started
|
|
780
813
|
self.stats.parallel_fallbacks = context.parallel_stats.fallbacks
|
|
781
814
|
|
|
@@ -835,13 +868,16 @@ class _CacheService:
|
|
|
835
868
|
before = self.last_revision
|
|
836
869
|
was_warm = self.context.navigation_cache_is_warm
|
|
837
870
|
try:
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
871
|
+
try:
|
|
872
|
+
response = self.context.handle(request).to_mapping()
|
|
873
|
+
except AgentProtocolError as error:
|
|
874
|
+
raise CacheClientError(error.code, error.message) from None
|
|
875
|
+
except (OSError, UnicodeError):
|
|
876
|
+
raise CacheClientError("source_unavailable", "Source is unavailable.") from None
|
|
877
|
+
except Exception:
|
|
878
|
+
raise CacheClientError("internal_error", "Internal cache error.") from None
|
|
879
|
+
finally:
|
|
880
|
+
self._enforce_budget()
|
|
845
881
|
after = str(response["workspace_revision"])
|
|
846
882
|
self.last_revision = after
|
|
847
883
|
self.stats.requests += 1
|
|
@@ -852,18 +888,24 @@ class _CacheService:
|
|
|
852
888
|
self.stats.parallel_fallbacks += self.context.parallel_stats.fallbacks
|
|
853
889
|
if before != after:
|
|
854
890
|
self.stats.invalidations += 1
|
|
855
|
-
self.last_budget = self.budget.enforce(
|
|
856
|
-
measure=self._measure_retained_bytes,
|
|
857
|
-
evict_auxiliary=self.context.evict_auxiliary_caches,
|
|
858
|
-
evict_navigation=self.context.evict_navigation_caches,
|
|
859
|
-
)
|
|
860
|
-
if self.last_budget.compacted:
|
|
861
|
-
self.stats.evictions += 1
|
|
862
|
-
self.cache_state = "compact"
|
|
863
|
-
else:
|
|
864
|
-
self.cache_state = "warm" if self.context.navigation_cache_is_warm else "ready"
|
|
865
891
|
return CacheClientResponse(response, self._consume_warning())
|
|
866
892
|
|
|
893
|
+
def _enforce_budget(self) -> None:
|
|
894
|
+
self.last_budget = self.budget.enforce(
|
|
895
|
+
measure=self._measure_retained_bytes,
|
|
896
|
+
evict_auxiliary=self.context.evict_auxiliary_caches,
|
|
897
|
+
evict_navigation=self.context.evict_navigation_caches,
|
|
898
|
+
)
|
|
899
|
+
if self.last_budget.compacted:
|
|
900
|
+
self.stats.evictions += 1
|
|
901
|
+
self.cache_state = "compact"
|
|
902
|
+
else:
|
|
903
|
+
self.cache_state = (
|
|
904
|
+
"warm"
|
|
905
|
+
if self.context.navigation_cache_is_warm
|
|
906
|
+
else "ready"
|
|
907
|
+
)
|
|
908
|
+
|
|
867
909
|
def _consume_warning(self) -> str:
|
|
868
910
|
warning = cache_warning(self.last_budget, self.budget.max_bytes)
|
|
869
911
|
if self.last_budget.warning_triggered and not self.last_budget.warning_active:
|
|
@@ -874,6 +916,17 @@ class _CacheService:
|
|
|
874
916
|
now = time.monotonic()
|
|
875
917
|
idle = max(0.0, now - self.last_activity)
|
|
876
918
|
context = self._context
|
|
919
|
+
live_rss = current_process_rss_bytes()
|
|
920
|
+
current_bytes = (
|
|
921
|
+
live_rss
|
|
922
|
+
if live_rss > 0
|
|
923
|
+
else self.last_budget.retained_bytes
|
|
924
|
+
)
|
|
925
|
+
current_utilization = current_bytes * 100.0 / self.budget.max_bytes
|
|
926
|
+
peak_utilization = max(
|
|
927
|
+
self.last_budget.peak_utilization_percent,
|
|
928
|
+
current_utilization,
|
|
929
|
+
)
|
|
877
930
|
parallel_stats = (
|
|
878
931
|
context.parallel_stats
|
|
879
932
|
if context is not None
|
|
@@ -883,10 +936,11 @@ class _CacheService:
|
|
|
883
936
|
"pid": self.metadata.pid, "root": self.metadata.root, "project_file": self.metadata.project_file,
|
|
884
937
|
"version": self.metadata.version, "uptime": now - self.started, "idle_seconds": idle,
|
|
885
938
|
"last_activity_at": time.time() - idle,
|
|
886
|
-
"max_memory_bytes": self.budget.max_bytes, "current_bytes":
|
|
887
|
-
"current_utilization_percent":
|
|
888
|
-
"peak_utilization_percent":
|
|
889
|
-
"warning_active": self.
|
|
939
|
+
"max_memory_bytes": self.budget.max_bytes, "current_bytes": current_bytes,
|
|
940
|
+
"current_utilization_percent": current_utilization,
|
|
941
|
+
"peak_utilization_percent": peak_utilization,
|
|
942
|
+
"warning_active": current_utilization >= self.budget.warning_percent,
|
|
943
|
+
"warning_threshold_percent": WARNING_THRESHOLD_PERCENT,
|
|
890
944
|
"cache_state": self.cache_state, "requests": self.stats.requests, "warm_hits": self.stats.warm_hits,
|
|
891
945
|
"rebuilds": self.stats.rebuilds, "invalidations": self.stats.invalidations, "evictions": self.stats.evictions,
|
|
892
946
|
"workers_configured": "auto" if self.metadata.workers == 0 else self.metadata.workers,
|
|
@@ -1073,7 +1127,7 @@ def run_cache_daemon(
|
|
|
1073
1127
|
):
|
|
1074
1128
|
try:
|
|
1075
1129
|
connection, _ = listener.accept()
|
|
1076
|
-
except
|
|
1130
|
+
except TimeoutError:
|
|
1077
1131
|
continue
|
|
1078
1132
|
if not connection_slots.acquire(blocking=False):
|
|
1079
1133
|
connection.close()
|
|
@@ -1240,17 +1294,16 @@ def start_cache(
|
|
|
1240
1294
|
):
|
|
1241
1295
|
raise ValueError("max_disk_cache_bytes must be non-negative.")
|
|
1242
1296
|
load_project_path_config(root)
|
|
1243
|
-
with _process_start_lock(root):
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
)
|
|
1297
|
+
with _process_start_lock(root), _start_lock(root, startup_timeout):
|
|
1298
|
+
return _start_cache_unlocked(
|
|
1299
|
+
root,
|
|
1300
|
+
project_file=project_file,
|
|
1301
|
+
max_memory_bytes=max_memory_bytes,
|
|
1302
|
+
workers=workers,
|
|
1303
|
+
idle_timeout=idle_timeout,
|
|
1304
|
+
startup_timeout=startup_timeout,
|
|
1305
|
+
max_disk_cache_bytes=max_disk_cache_bytes,
|
|
1306
|
+
)
|
|
1254
1307
|
|
|
1255
1308
|
|
|
1256
1309
|
def query_cache(root: str | Path, request: dict[str, object]) -> CacheClientResponse:
|