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.
Files changed (389) hide show
  1. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/MANIFEST.in +5 -0
  2. {python_delphi_lsp-3.1.2/python_delphi_lsp.egg-info → python_delphi_lsp-3.2.1}/PKG-INFO +18 -4
  3. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/README.md +17 -3
  4. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/__init__.py +105 -89
  5. python_delphi_lsp-3.2.1/delphi_lsp/_version.py +1 -0
  6. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cache.py +95 -42
  7. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cli.py +33 -7
  8. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_context.py +47 -18
  9. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg.py +3 -4
  10. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_cpg_builder.py +0 -1
  11. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_layers.py +17 -8
  12. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_metrics.py +2 -4
  13. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_protocol.py +2 -3
  14. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_relations.py +52 -8
  15. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_templates.py +1 -2
  16. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_wiki.py +6 -6
  17. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/agent_workspace.py +9 -5
  18. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/binary.py +5 -5
  19. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/comment_builder.py +1 -2
  20. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_lexer.py +3 -5
  21. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_parser.py +384 -52
  22. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/grammar.py +0 -1
  23. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_builder.py +5 -10
  24. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/lark_tokens.py +0 -1
  25. python_delphi_lsp-3.2.1/delphi_lsp/lexical_scanner.py +30 -0
  26. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/lsp_server.py +603 -110
  27. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/metrics.py +50 -15
  28. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/navigation_cache.py +3 -4
  29. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/nodes.py +19 -19
  30. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/parallel_outline.py +3 -4
  31. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/parser.py +101 -17
  32. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/preprocessor.py +232 -25
  33. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/progress.py +1 -1
  34. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/project_config.py +2 -1
  35. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/project_discovery.py +38 -21
  36. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/project_indexer.py +18 -18
  37. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic.py +28 -17
  38. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/semantic_builder.py +29 -20
  39. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/workspace.py +1 -1
  40. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/performance-delphi.md +103 -15
  41. python_delphi_lsp-3.2.1/docs/release-3.2.0.md +79 -0
  42. python_delphi_lsp-3.2.1/docs/release-3.2.1.md +77 -0
  43. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/pyproject.toml +1 -1
  44. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1/python_delphi_lsp.egg-info}/PKG-INFO +18 -4
  45. python_delphi_lsp-3.2.1/python_delphi_lsp.egg-info/SOURCES.txt +379 -0
  46. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_fpc_corpus.py +810 -33
  47. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/run_openrouter_github_e2e.py +6 -1
  48. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.AssertFailureCompare.pas +84 -0
  49. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.EqualityAsserts.pas +66 -0
  50. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.General.pas +379 -0
  51. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitX.Examples.UITest.pas +89 -0
  52. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_2010.dpr +94 -0
  53. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Berlin.dpr +73 -0
  54. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Rio.dpr +75 -0
  55. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Seattle.dpr +73 -0
  56. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Sydney.dpr +75 -0
  57. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D10Tokyo.dpr +75 -0
  58. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D11Alexandria.dpr +78 -0
  59. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D12Athens.dpr +119 -0
  60. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_D13.dpr +119 -0
  61. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE.dpr +98 -0
  62. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE2.dpr +91 -0
  63. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE3.dpr +86 -0
  64. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE4.dpr +85 -0
  65. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE5.dpr +85 -0
  66. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE6.dpr +85 -0
  67. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE7.dpr +94 -0
  68. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXExamples_XE8.dpr +71 -0
  69. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Berlin.dpr +30 -0
  70. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Seattle.dpr +30 -0
  71. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_D10Tokyo.dpr +30 -0
  72. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE5.dpr +30 -0
  73. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE6.dpr +30 -0
  74. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE7.dpr +30 -0
  75. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXFiremonkeyGUI_XE8.dpr +30 -0
  76. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Berlin.dpr +59 -0
  77. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_D10Seattle.dpr +59 -0
  78. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE.dpr +65 -0
  79. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/DUnitXVCLGUI_XE7.dpr +65 -0
  80. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/NonNamespacedExample.pas +30 -0
  81. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Examples/ProviderExample.pas +122 -0
  82. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewProject.pas +213 -0
  83. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestProject.pas +106 -0
  84. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewTestUnit.pas +175 -0
  85. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.NewUnit.pas +186 -0
  86. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.SourceFile.pas +74 -0
  87. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.CodeGen.Templates.pas +284 -0
  88. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewProjectWizard.pas +151 -0
  89. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Forms.NewUnitWizard.pas +117 -0
  90. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizard.pas +166 -0
  91. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.NewUnitWizardEx.pas +113 -0
  92. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizard.pas +185 -0
  93. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.ProjectWizardEx.pas +136 -0
  94. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX.Expert.Registration.pas +68 -0
  95. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_2010.dpk +47 -0
  96. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Berlin.dpk +51 -0
  97. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Rio.dpk +51 -0
  98. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Seattle.dpk +51 -0
  99. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D10Tokyo.dpk +51 -0
  100. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D11Alexandria.dpk +51 -0
  101. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D12Athens.dpk +51 -0
  102. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_D13Florence.dpk +51 -0
  103. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_Sydney.dpk +51 -0
  104. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE.dpk +47 -0
  105. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE2.dpk +50 -0
  106. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE3.dpk +50 -0
  107. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE4.dpk +50 -0
  108. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE5.dpk +50 -0
  109. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE6.dpk +50 -0
  110. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE7.dpk +50 -0
  111. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Expert/DUnitX_IDE_Expert_XE8.dpk +50 -0
  112. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/LICENSE.txt +202 -0
  113. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.GUIX.pas +597 -0
  114. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUNitX.Loggers.MobileGUI.pas +427 -0
  115. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.Ex.pas +108 -0
  116. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Assert.pas +1571 -0
  117. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Attributes.pas +476 -0
  118. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.AutoDetect.Console.pas +74 -0
  119. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Banner.pas +79 -0
  120. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CategoryExpression.pas +293 -0
  121. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.OptionDef.pas +336 -0
  122. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Options.pas +229 -0
  123. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.CommandLine.Parser.pas +354 -0
  124. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Csv.pas +41 -0
  125. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.Xml.pas +41 -0
  126. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ComparableFormat.pas +39 -0
  127. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ConsoleWriter.Base.pas +251 -0
  128. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Constants.pas +43 -0
  129. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.DUnitCompatibility.pas +458 -0
  130. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Exceptions.pas +91 -0
  131. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Extensibility.pas +249 -0
  132. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FilterBuilder.pas +127 -0
  133. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Filters.pas +455 -0
  134. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureBuilder.pas +89 -0
  135. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureProvider.pas +594 -0
  136. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.FixtureResult.pas +372 -0
  137. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Generics.pas +440 -0
  138. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Helpers.pas +55 -0
  139. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Init.pas +70 -0
  140. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.InternalDataProvider.pas +29 -0
  141. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.InternalInterfaces.pas +87 -0
  142. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Linux.Console.pas +159 -0
  143. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Console.pas +481 -0
  144. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.RichEdit.pas +430 -0
  145. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.GUI.VCL.pas +1557 -0
  146. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Null.pas +171 -0
  147. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.Text.pas +424 -0
  148. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.JUnit.pas +369 -0
  149. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.NUnit.pas +448 -0
  150. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Loggers.XML.xUnit.pas +36 -0
  151. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MacOS.Console.pas +159 -0
  152. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.Default.pas +116 -0
  153. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM4.pas +143 -0
  154. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeakMonitor.FastMM5.pas +126 -0
  155. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.MemoryLeaks.inc +34 -0
  156. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.OptionsDefinition.pas +133 -0
  157. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ResStrs.pas +185 -0
  158. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.RunResults.pas +259 -0
  159. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.ServiceLocator.pas +344 -0
  160. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.EurekaLog7.pas +115 -0
  161. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.JCL.pas +133 -0
  162. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept3.pas +108 -0
  163. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept4.pas +120 -0
  164. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.StackTrace.MadExcept5.pas +105 -0
  165. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Stacktrace.inc +43 -0
  166. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Test.pas +452 -0
  167. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestDataProvider.pas +112 -0
  168. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestFixture.pas +637 -0
  169. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestFramework.pas +936 -0
  170. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestNameParser.pas +174 -0
  171. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestResult.pas +286 -0
  172. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.TestRunner.pas +1082 -0
  173. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Timeout.pas +181 -0
  174. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Types.pas +59 -0
  175. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.XML.pas +138 -0
  176. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Utils.pas +3572 -0
  177. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.WeakReference.pas +365 -0
  178. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.Windows.Console.pas +227 -0
  179. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Source/DUnitX.inc +115 -0
  180. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Options.pas +81 -0
  181. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.SingleNameSpace.pas +43 -0
  182. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Stacktrace.inc +7 -0
  183. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Assert.pas +1536 -0
  184. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CategoryParser.pas +246 -0
  185. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.CommandLineParser.pas +516 -0
  186. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.ConsoleWriter.Base.pas +377 -0
  187. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.DUnitCompatibility.pas +98 -0
  188. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Example.pas +427 -0
  189. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Framework.pas +7 -0
  190. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IgnoreFixture.pas +119 -0
  191. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Inheritance.pas +113 -0
  192. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.IoC.pas +176 -0
  193. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.JUnit.pas +279 -0
  194. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Loggers.XML.NUnit.pas +279 -0
  195. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.MemoryLeaks.pas +96 -0
  196. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestDataProvider.pas +141 -0
  197. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestFixture.pas +302 -0
  198. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.TestNameParser.pas +65 -0
  199. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.XML.pas +33 -0
  200. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.Utils.pas +269 -0
  201. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitX.Tests.WeakReference.pas +196 -0
  202. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXGuiTest.dpr +48 -0
  203. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXTestProject.dpr +92 -0
  204. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXTest_D2010.dpr +131 -0
  205. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/Tests/DUnitXTest_XE.dpr +130 -0
  206. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.0/VSoft.DUnitXWinR.dpk +88 -0
  207. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.1/VSoft.DUnitXWinR.dpk +88 -0
  208. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.2/VSoft.DUnitXWinR.dpk +88 -0
  209. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.3/VSoft.DUnitXWinR.dpk +88 -0
  210. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 10.4/VSoft.DUnitXWinR.dpk +88 -0
  211. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 11.0/VSoft.DUnitXWinR.dpk +88 -0
  212. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 12.0/VSoft.DUnitXWinR.dpk +88 -0
  213. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio 13.0/VSoft.DUnitXWinR.dpk +88 -0
  214. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE2/VSoft.DUnitXWinR.dpk +88 -0
  215. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE3/VSoft.DUnitXWinR.dpk +88 -0
  216. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE4/VSoft.DUnitXWinR.dpk +88 -0
  217. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE5/VSoft.DUnitXWinR.dpk +88 -0
  218. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE6/VSoft.DUnitXWinR.dpk +88 -0
  219. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE7/VSoft.DUnitXWinR.dpk +88 -0
  220. python_delphi_lsp-3.2.1/test_projects/github_repos/DUnitX/packages/RAD Studio XE8/VSoft.DUnitXWinR.dpk +88 -0
  221. python_delphi_lsp-3.2.1/test_projects/github_repos/mORMot2/LICENCE.md +81 -0
  222. python_delphi_lsp-3.2.1/test_projects/github_repos/mORMot2/src/mormot.defines.inc +1121 -0
  223. python_delphi_lsp-3.2.1/test_projects/github_repos/mORMot2/src/ui/mormot.ui.pdf.pas +12508 -0
  224. python_delphi_lsp-3.2.1/tests/fpc_parse_quality.baseline.json +5430 -0
  225. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_cache.py +246 -16
  226. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_cli_errors.py +73 -0
  227. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_codebase.py +3 -3
  228. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_context.py +40 -4
  229. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_cpg.py +2 -3
  230. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_metrics.py +25 -1
  231. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_relations.py +160 -16
  232. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_worker.py +2 -2
  233. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_codebase_skill.py +0 -1
  234. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_bootstrap_vllm_opencode.py +0 -1
  235. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphiast_lexer.py +25 -0
  236. python_delphi_lsp-3.2.1/tests/test_delphiast_native_compatibility.py +1013 -0
  237. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphiast_parser.py +0 -1
  238. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphiast_semantic_compatibility.py +0 -1
  239. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_diagnostics.py +0 -1
  240. python_delphi_lsp-3.2.1/tests/test_fpc_performance_corpus.py +1069 -0
  241. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_language_feature_matrix.py +0 -1
  242. python_delphi_lsp-3.2.1/tests/test_legacy_snippets.py +55 -0
  243. python_delphi_lsp-3.2.1/tests/test_lsp_server.py +901 -0
  244. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_lsp_support.py +85 -6
  245. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_metrics.py +51 -0
  246. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_opencode_config.py +0 -1
  247. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_opencode_probe.py +0 -1
  248. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_opencode_request_payloads.py +0 -1
  249. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_openrouter_github_e2e.py +28 -2
  250. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_ornith_cache_prepare.py +0 -1
  251. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_package_metadata.py +13 -4
  252. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_parallel_outline.py +6 -5
  253. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_parser.py +32 -4
  254. python_delphi_lsp-3.2.1/tests/test_parser_backends.py +368 -0
  255. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_preprocessor.py +149 -11
  256. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_progress.py +1 -1
  257. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_project_discovery.py +62 -7
  258. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_release_evidence.py +1 -10
  259. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_semantic.py +35 -1
  260. python_delphi_lsp-3.2.1/tests/test_throughput_scaling.py +360 -0
  261. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_vllm_start_script.py +0 -1
  262. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_workspace.py +1 -2
  263. python_delphi_lsp-3.1.2/delphi_lsp/_version.py +0 -1
  264. python_delphi_lsp-3.1.2/python_delphi_lsp.egg-info/SOURCES.txt +0 -199
  265. python_delphi_lsp-3.1.2/tests/fpc_parse_quality.baseline.json +0 -10266
  266. python_delphi_lsp-3.1.2/tests/test_delphiast_native_compatibility.py +0 -364
  267. python_delphi_lsp-3.1.2/tests/test_fpc_performance_corpus.py +0 -521
  268. python_delphi_lsp-3.1.2/tests/test_legacy_snippets.py +0 -34
  269. python_delphi_lsp-3.1.2/tests/test_lsp_server.py +0 -309
  270. python_delphi_lsp-3.1.2/tests/test_parser_backends.py +0 -135
  271. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/.github/workflows/ci.yml +0 -0
  272. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/LICENSE +0 -0
  273. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/consts.py +0 -0
  274. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/delphiast_tokens.py +0 -0
  275. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/parser_backend.py +0 -0
  276. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/py.typed +0 -0
  277. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/source_reader.py +0 -0
  278. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/delphi_lsp/writer.py +0 -0
  279. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/performance-fpc.md +0 -0
  280. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-2.3.0.md +0 -0
  281. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-2.3.3.md +0 -0
  282. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.0.0.md +0 -0
  283. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.1.0.md +0 -0
  284. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.1.1.md +0 -0
  285. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/release-3.1.2.md +0 -0
  286. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-16-architecture-metrics-implementation.md +0 -0
  287. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-17-large-codebase-performance.md +0 -0
  288. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-22-conditional-outline-ranges.md +0 -0
  289. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-2.3-performance.md +0 -0
  290. {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
  291. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-delphiast-python-backend.md +0 -0
  292. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-23-parallel-cache-prewarming.md +0 -0
  293. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-hybrid-cpg.md +0 -0
  294. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-24-repository-default-navigation.md +0 -0
  295. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-memory-progress.md +0 -0
  296. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-okf-wiki-export.md +0 -0
  297. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/plans/2026-07-27-project-path-configuration.md +0 -0
  298. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-16-architecture-metrics-design.md +0 -0
  299. {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
  300. {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
  301. {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
  302. {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
  303. {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
  304. {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
  305. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/docs/superpowers/specs/2026-07-24-hybrid-cpg-design.md +0 -0
  306. {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
  307. {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
  308. {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
  309. {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
  310. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/opencode.json +0 -0
  311. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/dependency_links.txt +0 -0
  312. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/entry_points.txt +0 -0
  313. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/requires.txt +0 -0
  314. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/python_delphi_lsp.egg-info/top_level.txt +0 -0
  315. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/audit_delphi_language_features.py +0 -0
  316. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_cpg.py +0 -0
  317. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_github_corpus.py +0 -0
  318. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/benchmark_parallel_cache.py +0 -0
  319. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_codebase_skill_test.py +0 -0
  320. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.ps1 +0 -0
  321. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.py +0 -0
  322. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/bootstrap_vllm_opencode_test.sh +0 -0
  323. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/build_github_performance_corpus.py +0 -0
  324. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/check_ornith_cache.py +0 -0
  325. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/generate_progress_pdf.py +0 -0
  326. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/generate_release_evidence.py +0 -0
  327. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/ollama/ornith-lspctx.Modelfile +0 -0
  328. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/prepare_delphi_corpus.py +0 -0
  329. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/prepare_fpc_corpus.py +0 -0
  330. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/prepare_ornith_cache.py +0 -0
  331. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/run_opencode_lsp_probe.py +0 -0
  332. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/start_ornith_vllm.sh +0 -0
  333. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/scripts/summarize_opencode_request_payloads.py +0 -0
  334. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/setup.cfg +0 -0
  335. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/corpora.performance.lock.json +0 -0
  336. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/DeprecatedOnConst.pas +0 -0
  337. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/VariantRecordFieldAttributes.pas +0 -0
  338. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/alignedrecords.pas +0 -0
  339. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/constset.pas +0 -0
  340. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/deprecatedtype.pas +0 -0
  341. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/dottedtypes.pas +0 -0
  342. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/endtoken.pas +0 -0
  343. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/experimentals.pas +0 -0
  344. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/externalfunction.pas +0 -0
  345. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/finalizationinitializationexports.pas +0 -0
  346. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardoverloaded.pas +0 -0
  347. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/forwardwithoutsemicolon.pas +0 -0
  348. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericconstraints.pas +0 -0
  349. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/genericinterfacemethoddelegation.pas +0 -0
  350. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/implementsgenerictype.pas +0 -0
  351. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/include file2.inc +0 -0
  352. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.inc +0 -0
  353. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/includefile.pas +0 -0
  354. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/managedrecords.pas +0 -0
  355. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/messagemethod.pas +0 -0
  356. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/multiline.pas +0 -0
  357. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/nonalignedrecords.pas +0 -0
  358. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/numbers.pas +0 -0
  359. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/pointerchars.pas +0 -0
  360. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/properties.pas +0 -0
  361. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/strictvisibility.pas +0 -0
  362. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/tryexcept.pas +0 -0
  363. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/umlauts.pas +0 -0
  364. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/legacy_snippets/whitespacearoundifdefcondition.pas +0 -0
  365. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/library_demo.dpr +0 -0
  366. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/package_demo.dpk +0 -0
  367. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/program_demo.dpr +0 -0
  368. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_advanced.pas +0 -0
  369. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_attributes.pas +0 -0
  370. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_basic.pas +0 -0
  371. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_consumer.pas +0 -0
  372. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_generics.pas +0 -0
  373. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_inheritance.pas +0 -0
  374. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_math.pas +0 -0
  375. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_properties.pas +0 -0
  376. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_sections.pas +0 -0
  377. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_statements.pas +0 -0
  378. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_types.pas +0 -0
  379. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_unresolved.pas +0 -0
  380. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/fixtures/unit_with.pas +0 -0
  381. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_protocol.py +1 -1
  382. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_wiki.py +0 -0
  383. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_agent_workspace.py +0 -0
  384. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_delphi_performance_corpus.py +0 -0
  385. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_github_performance_corpus.py +0 -0
  386. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_lsp_features.py +0 -0
  387. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_navigation_cache.py +0 -0
  388. {python_delphi_lsp-3.1.2 → python_delphi_lsp-3.2.1}/tests/test_project_config.py +0 -0
  389. {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.2
3
+ Version: 3.2.1
4
4
  Summary: Python Delphi/Object Pascal parser, semantic indexer, and language server.
5
5
  Author: Dark Light
6
6
  License-Expression: MPL-2.0
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
 
46
46
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
47
47
  indexes, serves LSP, and provides bounded codebase navigation for agents.
48
- Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
48
+ Version 3.2.1 is authored by Dark Light and supports Windows, macOS, and Linux.
49
49
 
50
50
  ## Install and quick start
51
51
 
@@ -148,7 +148,10 @@ The root `opencode.json` starts the installed package portably:
148
148
  "delphi": {
149
149
  "command": ["delphi-lsp"],
150
150
  "extensions": [".pas", ".dpr", ".dpk", ".inc"],
151
- "initialization": {"autoDiscoverPaths": true}
151
+ "initialization": {
152
+ "autoDiscoverPaths": true,
153
+ "semanticCacheSize": 512
154
+ }
152
155
  }
153
156
  }
154
157
  }
@@ -158,6 +161,10 @@ The root `opencode.json` starts the installed package portably:
158
161
  environment section; LSP remains available for normal editor and OpenCode use,
159
162
  including large sources.
160
163
 
164
+ `semanticCacheSize` limits retained per-file outline models while keeping
165
+ source text available. Its default is 512; set it to zero to disable retained
166
+ snapshot models. The value is preserved when workspace folders change.
167
+
161
168
  The LSP builds its structural index through the same optimized outline path for
162
169
  every source, with no file-size threshold. Definition, hover, references,
163
170
  rename, completion, document symbols, workspace symbols, and diagnostics remain
@@ -203,7 +210,7 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
203
210
  [--query TEXT] [--format markdown|json] [--deep-projects]
204
211
  [--workers auto|N]
205
212
  delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
206
- [--workers auto|N]
213
+ [--workers auto|N] [--deep-projects]
207
214
  delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
208
215
  [--workers auto|N] [--force] [--quiet]
209
216
  delphi-lsp-agent query --root PATH ACTION [VALUE]
@@ -218,6 +225,13 @@ delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
218
225
  delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
219
226
  ```
220
227
 
228
+ `--deep-projects` opts into per-project dependency parsing for the `projects`
229
+ layer. It is off by default because it dominates run time on real repositories:
230
+ on a 60-project corpus it cost 36.9 s against 1.0 s for the same index, and it
231
+ adds nothing to the unit model set. Without it the `projects` and `problems`
232
+ layers report `deep_indexed: false`, and `index` records `deep_projects` at the
233
+ top level of its JSON, so a shallow index is never mistaken for a complete one.
234
+
221
235
  The `cache` commands manage one daemon per canonical root. Use these:
222
236
 
223
237
  ```bash
@@ -2,7 +2,7 @@
2
2
 
3
3
  `python-delphi-lsp` parses Delphi/Object Pascal, builds semantic and project
4
4
  indexes, serves LSP, and provides bounded codebase navigation for agents.
5
- Version 3.1.2 is authored by Dark Light and supports Windows, macOS, and Linux.
5
+ Version 3.2.1 is authored by Dark Light and supports Windows, macOS, and Linux.
6
6
 
7
7
  ## Install and quick start
8
8
 
@@ -105,7 +105,10 @@ The root `opencode.json` starts the installed package portably:
105
105
  "delphi": {
106
106
  "command": ["delphi-lsp"],
107
107
  "extensions": [".pas", ".dpr", ".dpk", ".inc"],
108
- "initialization": {"autoDiscoverPaths": true}
108
+ "initialization": {
109
+ "autoDiscoverPaths": true,
110
+ "semanticCacheSize": 512
111
+ }
109
112
  }
110
113
  }
111
114
  }
@@ -115,6 +118,10 @@ The root `opencode.json` starts the installed package portably:
115
118
  environment section; LSP remains available for normal editor and OpenCode use,
116
119
  including large sources.
117
120
 
121
+ `semanticCacheSize` limits retained per-file outline models while keeping
122
+ source text available. Its default is 512; set it to zero to disable retained
123
+ snapshot models. The value is preserved when workspace folders change.
124
+
118
125
  The LSP builds its structural index through the same optimized outline path for
119
126
  every source, with no file-size threshold. Definition, hover, references,
120
127
  rename, completion, document symbols, workspace symbols, and diagnostics remain
@@ -160,7 +167,7 @@ delphi-lsp-agent view --root PATH [--project-file FILE] --layer LAYER
160
167
  [--query TEXT] [--format markdown|json] [--deep-projects]
161
168
  [--workers auto|N]
162
169
  delphi-lsp-agent index --root PATH [--project-file FILE] [--out FILE]
163
- [--workers auto|N]
170
+ [--workers auto|N] [--deep-projects]
164
171
  delphi-lsp-agent wiki export --root PATH [--project-file FILE] [--out DIRECTORY]
165
172
  [--workers auto|N] [--force] [--quiet]
166
173
  delphi-lsp-agent query --root PATH ACTION [VALUE]
@@ -175,6 +182,13 @@ delphi-lsp-agent opencode install [--target PATH] [--python PYTHON]
175
182
  delphi-lsp-agent worker --root PATH [--project-file FILE] [--workers auto|N]
176
183
  ```
177
184
 
185
+ `--deep-projects` opts into per-project dependency parsing for the `projects`
186
+ layer. It is off by default because it dominates run time on real repositories:
187
+ on a 60-project corpus it cost 36.9 s against 1.0 s for the same index, and it
188
+ adds nothing to the unit model set. Without it the `projects` and `problems`
189
+ layers report `deep_indexed: false`, and `index` records `deep_projects` at the
190
+ top level of its JSON, so a shallow index is never mistaken for a complete one.
191
+
178
192
  The `cache` commands manage one daemon per canonical root. Use these:
179
193
 
180
194
  ```bash
@@ -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.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(_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: