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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/MANIFEST.in +12 -0
  2. {python_delphi_lsp-3.1.1/python_delphi_lsp.egg-info → python_delphi_lsp-3.2.0}/PKG-INFO +8 -2
  3. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/README.md +7 -1
  4. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/__init__.py +105 -89
  5. python_delphi_lsp-3.2.0/delphi_lsp/_version.py +1 -0
  6. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_cache.py +95 -42
  7. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_cli.py +26 -6
  8. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_context.py +47 -18
  9. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_cpg.py +3 -4
  10. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_cpg_builder.py +0 -1
  11. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_layers.py +11 -7
  12. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_metrics.py +2 -4
  13. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_protocol.py +2 -3
  14. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_relations.py +52 -8
  15. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_templates.py +1 -2
  16. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_wiki.py +6 -6
  17. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/agent_workspace.py +9 -5
  18. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/binary.py +5 -5
  19. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/comment_builder.py +1 -2
  20. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/delphiast_lexer.py +3 -5
  21. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/delphiast_parser.py +384 -52
  22. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/grammar.py +0 -1
  23. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/lark_builder.py +5 -10
  24. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/lark_tokens.py +0 -1
  25. python_delphi_lsp-3.2.0/delphi_lsp/lexical_scanner.py +30 -0
  26. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/lsp_server.py +542 -101
  27. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/metrics.py +50 -15
  28. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/navigation_cache.py +3 -4
  29. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/nodes.py +19 -19
  30. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/parallel_outline.py +3 -4
  31. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/parser.py +101 -17
  32. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/preprocessor.py +238 -25
  33. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/progress.py +1 -1
  34. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/project_config.py +2 -1
  35. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/project_discovery.py +3 -4
  36. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/project_indexer.py +18 -18
  37. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/semantic.py +28 -17
  38. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/semantic_builder.py +29 -20
  39. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/workspace.py +1 -1
  40. python_delphi_lsp-3.2.0/docs/performance-delphi.md +161 -0
  41. python_delphi_lsp-3.2.0/docs/performance-fpc.md +239 -0
  42. python_delphi_lsp-3.2.0/docs/release-3.1.2.md +39 -0
  43. python_delphi_lsp-3.2.0/docs/release-3.2.0.md +77 -0
  44. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/pyproject.toml +5 -2
  45. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0/python_delphi_lsp.egg-info}/PKG-INFO +8 -2
  46. python_delphi_lsp-3.2.0/python_delphi_lsp.egg-info/SOURCES.txt +377 -0
  47. python_delphi_lsp-3.2.0/scripts/benchmark_fpc_corpus.py +2741 -0
  48. python_delphi_lsp-3.2.0/scripts/prepare_delphi_corpus.py +213 -0
  49. python_delphi_lsp-3.2.0/scripts/prepare_fpc_corpus.py +171 -0
  50. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/run_openrouter_github_e2e.py +6 -1
  51. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +84 -0
  52. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +66 -0
  53. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +379 -0
  54. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +89 -0
  55. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +94 -0
  56. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +73 -0
  57. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +75 -0
  58. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +73 -0
  59. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +75 -0
  60. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +75 -0
  61. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +78 -0
  62. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +119 -0
  63. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +119 -0
  64. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +98 -0
  65. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +91 -0
  66. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +86 -0
  67. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +85 -0
  68. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +85 -0
  69. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +85 -0
  70. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +94 -0
  71. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +71 -0
  72. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +30 -0
  73. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +30 -0
  74. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +30 -0
  75. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +30 -0
  76. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +30 -0
  77. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +30 -0
  78. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +30 -0
  79. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +59 -0
  80. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +59 -0
  81. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +65 -0
  82. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +65 -0
  83. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +30 -0
  84. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +122 -0
  85. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +213 -0
  86. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +106 -0
  87. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +175 -0
  88. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +186 -0
  89. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +74 -0
  90. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +284 -0
  91. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +151 -0
  92. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +117 -0
  93. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +166 -0
  94. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +113 -0
  95. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +185 -0
  96. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +136 -0
  97. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +68 -0
  98. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +47 -0
  99. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +51 -0
  100. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +51 -0
  101. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +51 -0
  102. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +51 -0
  103. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +51 -0
  104. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +51 -0
  105. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +51 -0
  106. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +51 -0
  107. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +47 -0
  108. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +50 -0
  109. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +50 -0
  110. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +50 -0
  111. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +50 -0
  112. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +50 -0
  113. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +50 -0
  114. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +50 -0
  115. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/LICENSE.txt +202 -0
  116. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +597 -0
  117. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +427 -0
  118. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +108 -0
  119. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +1571 -0
  120. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +476 -0
  121. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +74 -0
  122. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +79 -0
  123. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +293 -0
  124. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +336 -0
  125. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +229 -0
  126. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +354 -0
  127. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +41 -0
  128. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +41 -0
  129. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +39 -0
  130. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +251 -0
  131. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +43 -0
  132. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +458 -0
  133. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +91 -0
  134. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +249 -0
  135. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +127 -0
  136. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +455 -0
  137. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +89 -0
  138. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +594 -0
  139. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +372 -0
  140. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +440 -0
  141. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +55 -0
  142. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +70 -0
  143. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +29 -0
  144. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +87 -0
  145. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +159 -0
  146. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +481 -0
  147. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +430 -0
  148. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +1557 -0
  149. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +171 -0
  150. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +424 -0
  151. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +369 -0
  152. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +448 -0
  153. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +36 -0
  154. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +159 -0
  155. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +116 -0
  156. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +143 -0
  157. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +126 -0
  158. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +34 -0
  159. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +133 -0
  160. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +185 -0
  161. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +259 -0
  162. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +344 -0
  163. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +115 -0
  164. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +133 -0
  165. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +108 -0
  166. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +120 -0
  167. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +105 -0
  168. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +43 -0
  169. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +452 -0
  170. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +112 -0
  171. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +637 -0
  172. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +936 -0
  173. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +174 -0
  174. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +286 -0
  175. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +1082 -0
  176. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +181 -0
  177. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +59 -0
  178. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +138 -0
  179. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +3572 -0
  180. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +365 -0
  181. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +227 -0
  182. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Source/DUnitX.inc +115 -0
  183. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +81 -0
  184. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +43 -0
  185. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +7 -0
  186. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +1536 -0
  187. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +246 -0
  188. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +516 -0
  189. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +377 -0
  190. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +98 -0
  191. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +427 -0
  192. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +7 -0
  193. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +119 -0
  194. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +113 -0
  195. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +176 -0
  196. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +279 -0
  197. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +279 -0
  198. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +96 -0
  199. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +141 -0
  200. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +302 -0
  201. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +65 -0
  202. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +33 -0
  203. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +269 -0
  204. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +196 -0
  205. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +48 -0
  206. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +92 -0
  207. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +131 -0
  208. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +130 -0
  209. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +88 -0
  210. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +88 -0
  211. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +88 -0
  212. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +88 -0
  213. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +88 -0
  214. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +88 -0
  215. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +88 -0
  216. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +88 -0
  217. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +88 -0
  218. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +88 -0
  219. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +88 -0
  220. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +88 -0
  221. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +88 -0
  222. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +88 -0
  223. python_delphi_lsp-3.2.0/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +88 -0
  224. python_delphi_lsp-3.2.0/test_projects/github_repos/mORMot2/LICENCE.md +81 -0
  225. python_delphi_lsp-3.2.0/test_projects/github_repos/mORMot2/src/mormot.defines.inc +1121 -0
  226. python_delphi_lsp-3.2.0/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +12508 -0
  227. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/corpora.performance.lock.json +6 -1
  228. python_delphi_lsp-3.2.0/tests/fpc_parse_quality.baseline.json +1713 -0
  229. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_cache.py +246 -16
  230. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_cli_errors.py +73 -0
  231. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_codebase.py +3 -3
  232. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_context.py +40 -4
  233. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_cpg.py +2 -3
  234. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_metrics.py +25 -1
  235. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_relations.py +160 -16
  236. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_worker.py +2 -2
  237. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_bootstrap_vllm_codebase_skill.py +0 -1
  238. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_bootstrap_vllm_opencode.py +0 -1
  239. python_delphi_lsp-3.2.0/tests/test_delphi_performance_corpus.py +210 -0
  240. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_delphiast_lexer.py +25 -0
  241. python_delphi_lsp-3.2.0/tests/test_delphiast_native_compatibility.py +1013 -0
  242. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_delphiast_parser.py +0 -1
  243. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_delphiast_semantic_compatibility.py +0 -1
  244. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_diagnostics.py +0 -1
  245. python_delphi_lsp-3.2.0/tests/test_fpc_performance_corpus.py +970 -0
  246. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_github_performance_corpus.py +1 -1
  247. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_language_feature_matrix.py +0 -1
  248. python_delphi_lsp-3.2.0/tests/test_legacy_snippets.py +55 -0
  249. python_delphi_lsp-3.2.0/tests/test_lsp_server.py +845 -0
  250. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_lsp_support.py +83 -4
  251. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_metrics.py +51 -0
  252. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_opencode_config.py +0 -1
  253. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_opencode_probe.py +0 -1
  254. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_opencode_request_payloads.py +0 -1
  255. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_openrouter_github_e2e.py +28 -2
  256. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_ornith_cache_prepare.py +0 -1
  257. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_package_metadata.py +23 -4
  258. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_parallel_outline.py +6 -5
  259. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_parser.py +32 -4
  260. python_delphi_lsp-3.2.0/tests/test_parser_backends.py +368 -0
  261. python_delphi_lsp-3.2.0/tests/test_preprocessor.py +522 -0
  262. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_progress.py +1 -1
  263. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_project_discovery.py +7 -7
  264. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_release_evidence.py +1 -10
  265. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_semantic.py +35 -1
  266. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_vllm_start_script.py +0 -1
  267. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_workspace.py +1 -2
  268. python_delphi_lsp-3.1.1/delphi_lsp/_version.py +0 -1
  269. python_delphi_lsp-3.1.1/python_delphi_lsp.egg-info/SOURCES.txt +0 -190
  270. python_delphi_lsp-3.1.1/tests/test_delphiast_native_compatibility.py +0 -364
  271. python_delphi_lsp-3.1.1/tests/test_legacy_snippets.py +0 -34
  272. python_delphi_lsp-3.1.1/tests/test_lsp_server.py +0 -309
  273. python_delphi_lsp-3.1.1/tests/test_parser_backends.py +0 -135
  274. python_delphi_lsp-3.1.1/tests/test_preprocessor.py +0 -245
  275. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/.github/workflows/ci.yml +0 -0
  276. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/LICENSE +0 -0
  277. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/consts.py +0 -0
  278. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/delphiast_tokens.py +0 -0
  279. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/parser_backend.py +0 -0
  280. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/py.typed +0 -0
  281. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/source_reader.py +0 -0
  282. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/delphi_lsp/writer.py +0 -0
  283. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/release-2.3.0.md +0 -0
  284. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/release-2.3.3.md +0 -0
  285. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/release-3.0.0.md +0 -0
  286. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/release-3.1.0.md +0 -0
  287. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/release-3.1.1.md +0 -0
  288. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
  289. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
  290. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
  291. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
  292. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-23-bounded-cli-cache-daemon.md +0 -0
  293. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
  294. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
  295. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
  296. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
  297. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
  298. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
  299. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
  300. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
  301. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-17-large-codebase-performance-design.md +0 -0
  302. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-22-conditional-outline-ranges-design.md +0 -0
  303. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-23-2.3-performance-design.md +0 -0
  304. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-23-bounded-cli-cache-daemon-design.md +0 -0
  305. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-23-delphiast-python-backend-design.md +0 -0
  306. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-23-parallel-cache-prewarming-design.md +0 -0
  307. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
  308. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-24-repository-default-navigation-design.md +0 -0
  309. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-27-okf-memory-progress-design.md +0 -0
  310. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-27-okf-wiki-export-design.md +0 -0
  311. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/docs/superpowers/specs/2026-07-27-project-path-configuration-design.md +0 -0
  312. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/opencode.json +0 -0
  313. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  314. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  315. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/python_delphi_lsp.egg-info/requires.txt +0 -0
  316. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  317. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/audit_delphi_language_features.py +0 -0
  318. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/benchmark_cpg.py +0 -0
  319. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/benchmark_github_corpus.py +0 -0
  320. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/benchmark_parallel_cache.py +0 -0
  321. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  322. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  323. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  324. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  325. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/build_github_performance_corpus.py +0 -0
  326. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/check_ornith_cache.py +0 -0
  327. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/generate_progress_pdf.py +0 -0
  328. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/generate_release_evidence.py +0 -0
  329. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  330. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/prepare_ornith_cache.py +0 -0
  331. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/run_opencode_lsp_probe.py +0 -0
  332. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/start_ornith_vllm.sh +0 -0
  333. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/scripts/summarize_opencode_request_payloads.py +0 -0
  334. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/setup.cfg +0 -0
  335. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  336. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  337. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  338. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  339. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  340. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  341. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  342. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  343. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  344. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  345. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  346. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  347. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  348. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  349. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  350. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  351. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  352. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  353. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  354. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  355. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  356. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  357. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  358. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  359. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  360. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  361. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  362. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  363. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  364. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/library_demo.dpr +0 -0
  365. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/package_demo.dpk +0 -0
  366. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/program_demo.dpr +0 -0
  367. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_advanced.pas +0 -0
  368. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_attributes.pas +0 -0
  369. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_basic.pas +0 -0
  370. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_consumer.pas +0 -0
  371. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_generics.pas +0 -0
  372. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_inheritance.pas +0 -0
  373. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_math.pas +0 -0
  374. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_properties.pas +0 -0
  375. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_sections.pas +0 -0
  376. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_statements.pas +0 -0
  377. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_types.pas +0 -0
  378. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_unresolved.pas +0 -0
  379. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/fixtures/unit_with.pas +0 -0
  380. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_protocol.py +1 -1
  381. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_wiki.py +0 -0
  382. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_agent_workspace.py +0 -0
  383. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_lsp_features.py +0 -0
  384. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_navigation_cache.py +0 -0
  385. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_project_config.py +0 -0
  386. {python_delphi_lsp-3.1.1 → python_delphi_lsp-3.2.0}/tests/test_project_indexer.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,14 @@ 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
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.1
3
+ Version: 3.2.0
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.1 is authored by Dark Light and supports Windows, macOS, and Linux.
48
+ Version 3.2.0 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.1 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 3.2.0 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
@@ -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 .writer import SyntaxTreeWriter
13
- from .preprocessor import CommentInfo, IncludeLoader, PreprocessedSource, Preprocessor, PreprocessorOptions
14
- from .lark_tokens import KEYWORDS, KEYWORD_TERMINALS, BASE_TERMINALS, build_grammar_snippet
15
- from .grammar import build_grammar, GRAMMAR_RULES
16
- from .comment_builder import build_comment_nodes
17
- from .parser import DelphiParser, ParseResult, StringTransform, parse
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 .lsp_server import LspWorkspaceState, create_server
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
- 'build_comment_nodes',
99
- 'DelphiParser',
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
- 'RecordTypeRef',
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
- 'TypeRef',
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.0"
@@ -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(_CLIENT_RESPONSE_TIMEOUT)
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.last_budget = self.budget.enforce(
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
- response = self.context.handle(request).to_mapping()
839
- except AgentProtocolError as error:
840
- raise CacheClientError(error.code, error.message) from None
841
- except (OSError, UnicodeError):
842
- raise CacheClientError("source_unavailable", "Source is unavailable.") from None
843
- except Exception:
844
- raise CacheClientError("internal_error", "Internal cache error.") from None
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": self.last_budget.retained_bytes,
887
- "current_utilization_percent": self.last_budget.utilization_percent,
888
- "peak_utilization_percent": self.last_budget.peak_utilization_percent,
889
- "warning_active": self.last_budget.warning_active, "warning_threshold_percent": WARNING_THRESHOLD_PERCENT,
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 socket.timeout:
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
- with _start_lock(root, startup_timeout):
1245
- return _start_cache_unlocked(
1246
- root,
1247
- project_file=project_file,
1248
- max_memory_bytes=max_memory_bytes,
1249
- workers=workers,
1250
- idle_timeout=idle_timeout,
1251
- startup_timeout=startup_timeout,
1252
- max_disk_cache_bytes=max_disk_cache_bytes,
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:
@@ -10,37 +10,36 @@ import threading
10
10
  from pathlib import Path
11
11
  from typing import BinaryIO, TextIO
12
12
 
13
- from .agent_context import AgentContext
14
13
  from .agent_cache import (
15
- CacheClientError,
16
14
  DEFAULT_IDLE_TIMEOUT,
17
15
  DEFAULT_MAX_DISK_CACHE_BYTES,
18
16
  DEFAULT_MAX_MEMORY_BYTES,
19
17
  DEFAULT_STARTUP_TIMEOUT,
20
- parse_memory_size,
18
+ CacheClientError,
21
19
  navigation_cache_path,
20
+ parse_memory_size,
22
21
  query_cache,
23
22
  run_cache_daemon,
24
23
  start_cache,
25
24
  stop_cache,
26
25
  watch_workspace_changes,
27
26
  )
27
+ from .agent_context import AgentContext
28
28
  from .agent_layers import build_codebase_index, layer_payload, render_layer
29
29
  from .agent_protocol import (
30
30
  SCHEMA_VERSION,
31
- AgentProtocolError,
32
31
  SUPPORTED_ACTIONS,
33
32
  SUPPORTED_DETAILS,
34
33
  SUPPORTED_DIRECTIONS,
35
34
  SUPPORTED_GRAPHS,
36
35
  SUPPORTED_RELATIONS,
36
+ AgentProtocolError,
37
37
  )
38
38
  from .agent_templates import install_opencode_support, install_skill
39
39
  from .agent_wiki import WikiExportError, WikiProgressEvent, export_okf_wiki
40
40
  from .parallel_outline import ParallelOutlineError, parse_worker_setting
41
41
  from .project_config import ProjectConfigError
42
42
 
43
-
44
43
  _MAX_WORKER_RECORD_BYTES = 1024 * 1024
45
44
  _INVALID_JSON_MESSAGE = "Invalid JSON request."
46
45
  _INVALID_ENCODING_MESSAGE = "Invalid UTF-8 request."
@@ -312,10 +311,11 @@ def _discard_broken_stdout() -> None:
312
311
 
313
312
  def _view(args: argparse.Namespace) -> None:
314
313
  args.root = _workspace_root(args.root)
314
+ args.project_file = _project_file(args.root, args.project_file)
315
315
  index = build_codebase_index(
316
316
  args.root,
317
317
  project_file=args.project_file,
318
- index_projects=args.deep_projects,
318
+ index_projects=args.deep_projects or args.layer == "problems",
319
319
  workers=args.workers,
320
320
  )
321
321
  sys.stdout.write(render_layer(index, args.layer, query=args.query, output_format=args.format))
@@ -323,6 +323,7 @@ def _view(args: argparse.Namespace) -> None:
323
323
 
324
324
  def _index(args: argparse.Namespace) -> None:
325
325
  args.root = _workspace_root(args.root)
326
+ args.project_file = _project_file(args.root, args.project_file)
326
327
  output = _resolve_output_path(args.root, args.out)
327
328
  index = build_codebase_index(
328
329
  args.root,
@@ -342,6 +343,7 @@ def _index(args: argparse.Namespace) -> None:
342
343
 
343
344
  def _wiki_export(args: argparse.Namespace) -> None:
344
345
  args.root = _workspace_root(args.root)
346
+ args.project_file = _project_file(args.root, args.project_file)
345
347
  output = _resolve_output_path(args.root, args.out)
346
348
  renderer = None if args.quiet else _WikiProgressRenderer(sys.stderr)
347
349
  try:
@@ -449,6 +451,7 @@ def _require_install_directory(target: str | Path) -> None:
449
451
 
450
452
  def _worker(args: argparse.Namespace) -> None:
451
453
  args.root = _workspace_root(args.root)
454
+ args.project_file = _project_file(args.root, args.project_file)
452
455
  context = _open_worker_context(args.root, args.project_file, args.workers)
453
456
  watcher_stop = threading.Event()
454
457
  watcher = threading.Thread(
@@ -509,6 +512,7 @@ def _cache_error(error: CacheClientError) -> int:
509
512
 
510
513
  def _cache_start(args: argparse.Namespace) -> int:
511
514
  args.root = _workspace_root(args.root)
515
+ args.project_file = _project_file(args.root, args.project_file)
512
516
  try:
513
517
  start_cache(
514
518
  args.root,
@@ -583,6 +587,7 @@ def _cache_clear(args: argparse.Namespace) -> int:
583
587
 
584
588
  def _cache_serve(args: argparse.Namespace) -> int:
585
589
  args.root = _workspace_root(args.root)
590
+ args.project_file = _project_file(args.root, args.project_file)
586
591
  run_cache_daemon(
587
592
  args.root,
588
593
  project_file=str(args.project_file or ""),
@@ -658,6 +663,21 @@ def _workspace_root(value: str | Path) -> Path:
658
663
  return root.resolve()
659
664
 
660
665
 
666
+ def _project_file(root: Path, value: Path | None) -> Path | None:
667
+ if value is None:
668
+ return None
669
+ project = value.expanduser()
670
+ if not project.is_absolute():
671
+ project = root / project
672
+ project = project.resolve()
673
+ if not project.is_file():
674
+ raise _CliError(
675
+ "project_file_not_found",
676
+ f"Explicit project file does not exist: {project}",
677
+ )
678
+ return project
679
+
680
+
661
681
  def _resolve_output_path(root: Path, output: Path) -> Path:
662
682
  return output if output.is_absolute() else root / output
663
683