brighterscript 1.0.0-alpha.5 → 1.0.0-alpha.50

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 (715) hide show
  1. package/README.md +76 -138
  2. package/bsconfig.schema.json +121 -5
  3. package/dist/ActionPipeline.d.ts +10 -0
  4. package/dist/ActionPipeline.js +40 -0
  5. package/dist/ActionPipeline.js.map +1 -0
  6. package/dist/AstValidationSegmenter.d.ts +45 -0
  7. package/dist/AstValidationSegmenter.js +322 -0
  8. package/dist/AstValidationSegmenter.js.map +1 -0
  9. package/dist/BsConfig.d.ts +72 -39
  10. package/dist/BusyStatusTracker.d.ts +61 -0
  11. package/dist/BusyStatusTracker.js +148 -0
  12. package/dist/BusyStatusTracker.js.map +1 -0
  13. package/dist/Cache.d.ts +3 -8
  14. package/dist/Cache.js +9 -14
  15. package/dist/Cache.js.map +1 -1
  16. package/dist/CacheVerifier.d.ts +7 -0
  17. package/dist/CacheVerifier.js +20 -0
  18. package/dist/CacheVerifier.js.map +1 -0
  19. package/dist/CodeActionUtil.d.ts +12 -4
  20. package/dist/CodeActionUtil.js +22 -5
  21. package/dist/CodeActionUtil.js.map +1 -1
  22. package/dist/CommentFlagProcessor.d.ts +7 -6
  23. package/dist/CommentFlagProcessor.js +11 -8
  24. package/dist/CommentFlagProcessor.js.map +1 -1
  25. package/dist/CrossScopeValidator.d.ts +68 -0
  26. package/dist/CrossScopeValidator.js +642 -0
  27. package/dist/CrossScopeValidator.js.map +1 -0
  28. package/dist/DependencyGraph.d.ts +8 -3
  29. package/dist/DependencyGraph.js +49 -16
  30. package/dist/DependencyGraph.js.map +1 -1
  31. package/dist/DiagnosticCollection.d.ts +21 -5
  32. package/dist/DiagnosticCollection.js +77 -24
  33. package/dist/DiagnosticCollection.js.map +1 -1
  34. package/dist/DiagnosticFilterer.d.ts +27 -6
  35. package/dist/DiagnosticFilterer.js +273 -60
  36. package/dist/DiagnosticFilterer.js.map +1 -1
  37. package/dist/DiagnosticManager.d.ts +82 -0
  38. package/dist/DiagnosticManager.js +406 -0
  39. package/dist/DiagnosticManager.js.map +1 -0
  40. package/dist/DiagnosticMessages.d.ts +558 -196
  41. package/dist/DiagnosticMessages.js +870 -340
  42. package/dist/DiagnosticMessages.js.map +1 -1
  43. package/dist/DiagnosticSeverityAdjuster.d.ts +7 -0
  44. package/dist/DiagnosticSeverityAdjuster.js +45 -0
  45. package/dist/DiagnosticSeverityAdjuster.js.map +1 -0
  46. package/dist/FunctionScope.d.ts +28 -0
  47. package/dist/FunctionScope.js +52 -0
  48. package/dist/FunctionScope.js.map +1 -0
  49. package/dist/KeyedThrottler.d.ts +3 -3
  50. package/dist/KeyedThrottler.js +3 -3
  51. package/dist/KeyedThrottler.js.map +1 -1
  52. package/dist/LanguageServer.d.ts +100 -105
  53. package/dist/LanguageServer.js +444 -745
  54. package/dist/LanguageServer.js.map +1 -1
  55. package/dist/Logger.d.ts +17 -13
  56. package/dist/Logger.js +64 -34
  57. package/dist/Logger.js.map +1 -1
  58. package/dist/PluginInterface.d.ts +32 -10
  59. package/dist/PluginInterface.js +117 -7
  60. package/dist/PluginInterface.js.map +1 -1
  61. package/dist/Program.d.ts +241 -98
  62. package/dist/Program.js +1432 -717
  63. package/dist/Program.js.map +1 -1
  64. package/dist/ProgramBuilder.d.ts +47 -23
  65. package/dist/ProgramBuilder.js +224 -178
  66. package/dist/ProgramBuilder.js.map +1 -1
  67. package/dist/Scope.d.ts +149 -109
  68. package/dist/Scope.js +557 -550
  69. package/dist/Scope.js.map +1 -1
  70. package/dist/SemanticTokenUtils.js +5 -1
  71. package/dist/SemanticTokenUtils.js.map +1 -1
  72. package/dist/Stopwatch.d.ts +4 -0
  73. package/dist/Stopwatch.js +8 -1
  74. package/dist/Stopwatch.js.map +1 -1
  75. package/dist/SymbolTable.d.ts +136 -24
  76. package/dist/SymbolTable.js +565 -64
  77. package/dist/SymbolTable.js.map +1 -1
  78. package/dist/SymbolTypeFlag.d.ts +9 -0
  79. package/dist/SymbolTypeFlag.js +14 -0
  80. package/dist/SymbolTypeFlag.js.map +1 -0
  81. package/dist/Throttler.d.ts +12 -0
  82. package/dist/Throttler.js +39 -0
  83. package/dist/Throttler.js.map +1 -1
  84. package/dist/Watcher.d.ts +0 -3
  85. package/dist/Watcher.js +0 -3
  86. package/dist/Watcher.js.map +1 -1
  87. package/dist/XmlScope.d.ts +5 -15
  88. package/dist/XmlScope.js +34 -90
  89. package/dist/XmlScope.js.map +1 -1
  90. package/dist/astUtils/CachedLookups.d.ts +50 -0
  91. package/dist/astUtils/CachedLookups.js +334 -0
  92. package/dist/astUtils/CachedLookups.js.map +1 -0
  93. package/dist/astUtils/CachedLookups.spec.js +39 -0
  94. package/dist/astUtils/CachedLookups.spec.js.map +1 -0
  95. package/dist/astUtils/Editor.d.ts +69 -0
  96. package/dist/astUtils/Editor.js +245 -0
  97. package/dist/astUtils/Editor.js.map +1 -0
  98. package/dist/astUtils/Editor.spec.js +258 -0
  99. package/dist/astUtils/Editor.spec.js.map +1 -0
  100. package/dist/astUtils/creators.d.ts +54 -19
  101. package/dist/astUtils/creators.js +242 -42
  102. package/dist/astUtils/creators.js.map +1 -1
  103. package/dist/astUtils/creators.spec.js +5 -5
  104. package/dist/astUtils/creators.spec.js.map +1 -1
  105. package/dist/astUtils/reflection.d.ts +196 -85
  106. package/dist/astUtils/reflection.js +497 -144
  107. package/dist/astUtils/reflection.js.map +1 -1
  108. package/dist/astUtils/reflection.spec.js +267 -167
  109. package/dist/astUtils/reflection.spec.js.map +1 -1
  110. package/dist/astUtils/stackedVisitor.js.map +1 -1
  111. package/dist/astUtils/stackedVisitor.spec.js +14 -14
  112. package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
  113. package/dist/astUtils/visitors.d.ts +116 -53
  114. package/dist/astUtils/visitors.js +95 -15
  115. package/dist/astUtils/visitors.js.map +1 -1
  116. package/dist/astUtils/visitors.spec.js +629 -51
  117. package/dist/astUtils/visitors.spec.js.map +1 -1
  118. package/dist/astUtils/xml.d.ts +9 -8
  119. package/dist/astUtils/xml.js +12 -7
  120. package/dist/astUtils/xml.js.map +1 -1
  121. package/dist/bscPlugin/BscPlugin.d.ts +24 -4
  122. package/dist/bscPlugin/BscPlugin.js +88 -4
  123. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  124. package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
  125. package/dist/bscPlugin/CallExpressionInfo.js +143 -0
  126. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -0
  127. package/dist/bscPlugin/FileWriter.d.ts +6 -0
  128. package/dist/bscPlugin/FileWriter.js +24 -0
  129. package/dist/bscPlugin/FileWriter.js.map +1 -0
  130. package/dist/bscPlugin/SignatureHelpUtil.d.ts +10 -0
  131. package/dist/bscPlugin/SignatureHelpUtil.js +137 -0
  132. package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
  133. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +6 -5
  134. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +173 -27
  135. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  136. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +138 -21
  137. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  138. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +65 -0
  139. package/dist/bscPlugin/completions/CompletionsProcessor.js +633 -0
  140. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
  141. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +2512 -0
  142. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
  143. package/dist/bscPlugin/definition/DefinitionProvider.d.ts +13 -0
  144. package/dist/bscPlugin/definition/DefinitionProvider.js +212 -0
  145. package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
  146. package/dist/bscPlugin/definition/DefinitionProvider.spec.js +87 -0
  147. package/dist/bscPlugin/definition/DefinitionProvider.spec.js.map +1 -0
  148. package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
  149. package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
  150. package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
  151. package/dist/bscPlugin/hover/HoverProcessor.d.ts +18 -0
  152. package/dist/bscPlugin/hover/HoverProcessor.js +230 -0
  153. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
  154. package/dist/bscPlugin/hover/HoverProcessor.spec.js +991 -0
  155. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
  156. package/dist/bscPlugin/references/ReferencesProvider.d.ts +12 -0
  157. package/dist/bscPlugin/references/ReferencesProvider.js +57 -0
  158. package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -0
  159. package/dist/bscPlugin/references/ReferencesProvider.spec.d.ts +1 -0
  160. package/dist/bscPlugin/references/ReferencesProvider.spec.js +51 -0
  161. package/dist/bscPlugin/references/ReferencesProvider.spec.js.map +1 -0
  162. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +14 -0
  163. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +164 -0
  164. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  165. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
  166. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +564 -0
  167. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  168. package/dist/bscPlugin/serialize/BslibInjector.spec.d.ts +1 -0
  169. package/dist/bscPlugin/serialize/BslibInjector.spec.js +33 -0
  170. package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
  171. package/dist/bscPlugin/serialize/BslibManager.d.ts +12 -0
  172. package/dist/bscPlugin/serialize/BslibManager.js +46 -0
  173. package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
  174. package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
  175. package/dist/bscPlugin/serialize/FileSerializer.js +75 -0
  176. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
  177. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.d.ts +7 -0
  178. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js +22 -0
  179. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js.map +1 -0
  180. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.d.ts +1 -0
  181. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js +291 -0
  182. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js.map +1 -0
  183. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.d.ts +7 -0
  184. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js +26 -0
  185. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js.map +1 -0
  186. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.d.ts +1 -0
  187. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js +245 -0
  188. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js.map +1 -0
  189. package/dist/bscPlugin/symbols/symbolUtils.d.ts +5 -0
  190. package/dist/bscPlugin/symbols/symbolUtils.js +141 -0
  191. package/dist/bscPlugin/symbols/symbolUtils.js.map +1 -0
  192. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +27 -0
  193. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +418 -0
  194. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
  195. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +1 -0
  196. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +75 -0
  197. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
  198. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
  199. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
  200. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  201. package/dist/bscPlugin/validation/BrsFileAfterValidator.d.ts +7 -0
  202. package/dist/bscPlugin/validation/BrsFileAfterValidator.js +18 -0
  203. package/dist/bscPlugin/validation/BrsFileAfterValidator.js.map +1 -0
  204. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +37 -0
  205. package/dist/bscPlugin/validation/BrsFileValidator.js +638 -0
  206. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  207. package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +1 -0
  208. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +1517 -0
  209. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -0
  210. package/dist/bscPlugin/validation/ProgramValidator.d.ts +11 -0
  211. package/dist/bscPlugin/validation/ProgramValidator.js +33 -0
  212. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
  213. package/dist/bscPlugin/validation/ScopeValidator.d.ts +141 -0
  214. package/dist/bscPlugin/validation/ScopeValidator.js +1323 -0
  215. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  216. package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
  217. package/dist/bscPlugin/validation/ScopeValidator.spec.js +6135 -0
  218. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
  219. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
  220. package/dist/bscPlugin/validation/XmlFileValidator.js +36 -0
  221. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
  222. package/dist/cli.js +126 -27
  223. package/dist/cli.js.map +1 -1
  224. package/dist/common/Sequencer.d.ts +53 -0
  225. package/dist/common/Sequencer.js +233 -0
  226. package/dist/common/Sequencer.js.map +1 -0
  227. package/dist/common/Sequencer.spec.d.ts +1 -0
  228. package/dist/common/Sequencer.spec.js +75 -0
  229. package/dist/common/Sequencer.spec.js.map +1 -0
  230. package/dist/deferred.d.ts +5 -3
  231. package/dist/deferred.js +10 -0
  232. package/dist/deferred.js.map +1 -1
  233. package/dist/diagnosticUtils.d.ts +10 -3
  234. package/dist/diagnosticUtils.js +64 -25
  235. package/dist/diagnosticUtils.js.map +1 -1
  236. package/dist/examples/plugins/removePrint.d.ts +2 -2
  237. package/dist/examples/plugins/removePrint.js +8 -12
  238. package/dist/examples/plugins/removePrint.js.map +1 -1
  239. package/dist/files/AssetFile.d.ts +24 -0
  240. package/dist/files/AssetFile.js +25 -0
  241. package/dist/files/AssetFile.js.map +1 -0
  242. package/dist/files/BrsFile.Class.spec.js +1213 -259
  243. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  244. package/dist/files/BrsFile.d.ts +145 -87
  245. package/dist/files/BrsFile.js +836 -934
  246. package/dist/files/BrsFile.js.map +1 -1
  247. package/dist/files/BrsFile.spec.js +4226 -902
  248. package/dist/files/BrsFile.spec.js.map +1 -1
  249. package/dist/files/BscFile.d.ts +102 -0
  250. package/dist/files/BscFile.js +15 -0
  251. package/dist/files/BscFile.js.map +1 -0
  252. package/dist/files/Factory.d.ts +25 -0
  253. package/dist/files/Factory.js +22 -0
  254. package/dist/files/Factory.js.map +1 -0
  255. package/dist/files/LazyFileData.d.ts +21 -0
  256. package/dist/files/LazyFileData.js +54 -0
  257. package/dist/files/LazyFileData.js.map +1 -0
  258. package/dist/files/LazyFileData.spec.d.ts +1 -0
  259. package/dist/files/LazyFileData.spec.js +27 -0
  260. package/dist/files/LazyFileData.spec.js.map +1 -0
  261. package/dist/files/XmlFile.d.ts +80 -41
  262. package/dist/files/XmlFile.js +161 -137
  263. package/dist/files/XmlFile.js.map +1 -1
  264. package/dist/files/XmlFile.spec.js +444 -336
  265. package/dist/files/XmlFile.spec.js.map +1 -1
  266. package/dist/files/tests/imports.spec.js +62 -52
  267. package/dist/files/tests/imports.spec.js.map +1 -1
  268. package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
  269. package/dist/files/tests/optionalChaning.spec.js +152 -0
  270. package/dist/files/tests/optionalChaning.spec.js.map +1 -0
  271. package/dist/globalCallables.d.ts +3 -1
  272. package/dist/globalCallables.js +424 -184
  273. package/dist/globalCallables.js.map +1 -1
  274. package/dist/index.d.ts +32 -4
  275. package/dist/index.js +54 -7
  276. package/dist/index.js.map +1 -1
  277. package/dist/interfaces.d.ts +942 -125
  278. package/dist/interfaces.js +21 -0
  279. package/dist/interfaces.js.map +1 -1
  280. package/dist/lexer/Character.spec.js +5 -5
  281. package/dist/lexer/Character.spec.js.map +1 -1
  282. package/dist/lexer/Lexer.d.ts +51 -12
  283. package/dist/lexer/Lexer.js +215 -65
  284. package/dist/lexer/Lexer.js.map +1 -1
  285. package/dist/lexer/Lexer.spec.js +812 -568
  286. package/dist/lexer/Lexer.spec.js.map +1 -1
  287. package/dist/lexer/Token.d.ts +27 -11
  288. package/dist/lexer/Token.js +10 -2
  289. package/dist/lexer/Token.js.map +1 -1
  290. package/dist/lexer/TokenKind.d.ts +40 -2
  291. package/dist/lexer/TokenKind.js +147 -10
  292. package/dist/lexer/TokenKind.js.map +1 -1
  293. package/dist/logging.d.ts +14 -0
  294. package/dist/logging.js +29 -0
  295. package/dist/logging.js.map +1 -0
  296. package/dist/lsp/ActionQueue.d.ts +35 -0
  297. package/dist/lsp/ActionQueue.js +115 -0
  298. package/dist/lsp/ActionQueue.js.map +1 -0
  299. package/dist/lsp/ActionQueue.spec.d.ts +1 -0
  300. package/dist/lsp/ActionQueue.spec.js +80 -0
  301. package/dist/lsp/ActionQueue.spec.js.map +1 -0
  302. package/dist/lsp/DocumentManager.d.ts +63 -0
  303. package/dist/lsp/DocumentManager.js +122 -0
  304. package/dist/lsp/DocumentManager.js.map +1 -0
  305. package/dist/lsp/DocumentManager.spec.d.ts +1 -0
  306. package/dist/lsp/DocumentManager.spec.js +103 -0
  307. package/dist/lsp/DocumentManager.spec.js.map +1 -0
  308. package/dist/lsp/LspProject.d.ts +239 -0
  309. package/dist/lsp/LspProject.js +3 -0
  310. package/dist/lsp/LspProject.js.map +1 -0
  311. package/dist/lsp/PathFilterer.d.ts +75 -0
  312. package/dist/lsp/PathFilterer.js +196 -0
  313. package/dist/lsp/PathFilterer.js.map +1 -0
  314. package/dist/lsp/PathFilterer.spec.d.ts +1 -0
  315. package/dist/lsp/PathFilterer.spec.js +182 -0
  316. package/dist/lsp/PathFilterer.spec.js.map +1 -0
  317. package/dist/lsp/Project.d.ts +168 -0
  318. package/dist/lsp/Project.js +437 -0
  319. package/dist/lsp/Project.js.map +1 -0
  320. package/dist/lsp/Project.spec.d.ts +1 -0
  321. package/dist/lsp/Project.spec.js +267 -0
  322. package/dist/lsp/Project.spec.js.map +1 -0
  323. package/dist/lsp/ProjectManager.d.ts +242 -0
  324. package/dist/lsp/ProjectManager.js +824 -0
  325. package/dist/lsp/ProjectManager.js.map +1 -0
  326. package/dist/lsp/ProjectManager.spec.d.ts +1 -0
  327. package/dist/lsp/ProjectManager.spec.js +913 -0
  328. package/dist/lsp/ProjectManager.spec.js.map +1 -0
  329. package/dist/lsp/ReaderWriterManager.d.ts +21 -0
  330. package/dist/lsp/ReaderWriterManager.js +60 -0
  331. package/dist/lsp/ReaderWriterManager.js.map +1 -0
  332. package/dist/lsp/worker/MessageHandler.d.ts +99 -0
  333. package/dist/lsp/worker/MessageHandler.js +138 -0
  334. package/dist/lsp/worker/MessageHandler.js.map +1 -0
  335. package/dist/lsp/worker/MessageHandler.spec.d.ts +1 -0
  336. package/dist/lsp/worker/MessageHandler.spec.js +64 -0
  337. package/dist/lsp/worker/MessageHandler.spec.js.map +1 -0
  338. package/dist/lsp/worker/WorkerPool.d.ts +38 -0
  339. package/dist/lsp/worker/WorkerPool.js +78 -0
  340. package/dist/lsp/worker/WorkerPool.js.map +1 -0
  341. package/dist/lsp/worker/WorkerPool.spec.d.ts +1 -0
  342. package/dist/lsp/worker/WorkerPool.spec.js +59 -0
  343. package/dist/lsp/worker/WorkerPool.spec.js.map +1 -0
  344. package/dist/lsp/worker/WorkerThreadProject.d.ts +143 -0
  345. package/dist/lsp/worker/WorkerThreadProject.js +189 -0
  346. package/dist/lsp/worker/WorkerThreadProject.js.map +1 -0
  347. package/dist/lsp/worker/WorkerThreadProject.spec.d.ts +2 -0
  348. package/dist/lsp/worker/WorkerThreadProject.spec.js +71 -0
  349. package/dist/lsp/worker/WorkerThreadProject.spec.js.map +1 -0
  350. package/dist/lsp/worker/WorkerThreadProjectRunner.d.ts +15 -0
  351. package/dist/lsp/worker/WorkerThreadProjectRunner.js +58 -0
  352. package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -0
  353. package/dist/lsp/worker/run.d.ts +1 -0
  354. package/dist/lsp/worker/run.js +14 -0
  355. package/dist/lsp/worker/run.js.map +1 -0
  356. package/dist/parser/AstNode.d.ts +203 -0
  357. package/dist/parser/AstNode.js +303 -0
  358. package/dist/parser/AstNode.js.map +1 -0
  359. package/dist/parser/AstNode.spec.d.ts +1 -0
  360. package/dist/parser/AstNode.spec.js +1455 -0
  361. package/dist/parser/AstNode.spec.js.map +1 -0
  362. package/dist/parser/BrightScriptDocParser.d.ts +56 -0
  363. package/dist/parser/BrightScriptDocParser.js +294 -0
  364. package/dist/parser/BrightScriptDocParser.js.map +1 -0
  365. package/dist/parser/BrightScriptDocParser.spec.d.ts +1 -0
  366. package/dist/parser/BrightScriptDocParser.spec.js +310 -0
  367. package/dist/parser/BrightScriptDocParser.spec.js.map +1 -0
  368. package/dist/parser/BrsTranspileState.d.ts +22 -3
  369. package/dist/parser/BrsTranspileState.js +19 -0
  370. package/dist/parser/BrsTranspileState.js.map +1 -1
  371. package/dist/parser/Expression.d.ts +553 -221
  372. package/dist/parser/Expression.js +1414 -505
  373. package/dist/parser/Expression.js.map +1 -1
  374. package/dist/parser/Expression.spec.d.ts +1 -0
  375. package/dist/parser/Expression.spec.js +40 -0
  376. package/dist/parser/Expression.spec.js.map +1 -0
  377. package/dist/parser/Parser.Class.spec.js +255 -125
  378. package/dist/parser/Parser.Class.spec.js.map +1 -1
  379. package/dist/parser/Parser.d.ts +117 -124
  380. package/dist/parser/Parser.js +1669 -982
  381. package/dist/parser/Parser.js.map +1 -1
  382. package/dist/parser/Parser.spec.d.ts +3 -1
  383. package/dist/parser/Parser.spec.js +2111 -525
  384. package/dist/parser/Parser.spec.js.map +1 -1
  385. package/dist/parser/SGParser.d.ts +29 -13
  386. package/dist/parser/SGParser.js +85 -56
  387. package/dist/parser/SGParser.js.map +1 -1
  388. package/dist/parser/SGParser.spec.js +30 -45
  389. package/dist/parser/SGParser.spec.js.map +1 -1
  390. package/dist/parser/SGTypes.d.ts +134 -46
  391. package/dist/parser/SGTypes.js +206 -115
  392. package/dist/parser/SGTypes.js.map +1 -1
  393. package/dist/parser/Statement.d.ts +849 -267
  394. package/dist/parser/Statement.js +2412 -625
  395. package/dist/parser/Statement.js.map +1 -1
  396. package/dist/parser/Statement.spec.js +133 -36
  397. package/dist/parser/Statement.spec.js.map +1 -1
  398. package/dist/parser/TranspileState.d.ts +26 -12
  399. package/dist/parser/TranspileState.js +115 -24
  400. package/dist/parser/TranspileState.js.map +1 -1
  401. package/dist/parser/tests/Parser.spec.d.ts +3 -9
  402. package/dist/parser/tests/Parser.spec.js +7 -13
  403. package/dist/parser/tests/Parser.spec.js.map +1 -1
  404. package/dist/parser/tests/controlFlow/For.spec.js +83 -75
  405. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  406. package/dist/parser/tests/controlFlow/ForEach.spec.js +85 -51
  407. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  408. package/dist/parser/tests/controlFlow/If.spec.js +382 -239
  409. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  410. package/dist/parser/tests/controlFlow/While.spec.js +52 -45
  411. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  412. package/dist/parser/tests/expression/Additive.spec.js +51 -43
  413. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  414. package/dist/parser/tests/expression/ArrayLiterals.spec.js +192 -142
  415. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  416. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +236 -160
  417. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  418. package/dist/parser/tests/expression/Boolean.spec.js +41 -34
  419. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  420. package/dist/parser/tests/expression/Call.spec.js +173 -55
  421. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  422. package/dist/parser/tests/expression/Exponential.spec.js +20 -20
  423. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  424. package/dist/parser/tests/expression/Function.spec.js +291 -282
  425. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  426. package/dist/parser/tests/expression/Indexing.spec.js +193 -110
  427. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  428. package/dist/parser/tests/expression/Multiplicative.spec.js +42 -42
  429. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  430. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +260 -115
  431. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  432. package/dist/parser/tests/expression/PrefixUnary.spec.js +58 -52
  433. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  434. package/dist/parser/tests/expression/Primary.spec.js +76 -60
  435. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  436. package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
  437. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
  438. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
  439. package/dist/parser/tests/expression/Relational.spec.js +50 -50
  440. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  441. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +31 -31
  442. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  443. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +281 -94
  444. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  445. package/dist/parser/tests/expression/TernaryExpression.spec.js +747 -192
  446. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  447. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
  448. package/dist/parser/tests/expression/TypeExpression.spec.js +126 -0
  449. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
  450. package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +1 -0
  451. package/dist/parser/tests/expression/UnaryExpression.spec.js +52 -0
  452. package/dist/parser/tests/expression/UnaryExpression.spec.js.map +1 -0
  453. package/dist/parser/tests/statement/AssignmentOperators.spec.js +44 -44
  454. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  455. package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
  456. package/dist/parser/tests/statement/ConstStatement.spec.js +500 -0
  457. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
  458. package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
  459. package/dist/parser/tests/statement/Continue.spec.js +119 -0
  460. package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
  461. package/dist/parser/tests/statement/Declaration.spec.js +61 -55
  462. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  463. package/dist/parser/tests/statement/Dim.spec.js +29 -22
  464. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  465. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  466. package/dist/parser/tests/statement/Enum.spec.js +744 -0
  467. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  468. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  469. package/dist/parser/tests/statement/For.spec.js +45 -0
  470. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  471. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  472. package/dist/parser/tests/statement/ForEach.spec.js +36 -0
  473. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  474. package/dist/parser/tests/statement/Function.spec.js +226 -215
  475. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  476. package/dist/parser/tests/statement/Goto.spec.js +16 -15
  477. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  478. package/dist/parser/tests/statement/Increment.spec.js +64 -61
  479. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  480. package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
  481. package/dist/parser/tests/statement/InterfaceStatement.spec.js +110 -0
  482. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
  483. package/dist/parser/tests/statement/LibraryStatement.spec.js +22 -22
  484. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  485. package/dist/parser/tests/statement/Misc.spec.js +127 -168
  486. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  487. package/dist/parser/tests/statement/PrintStatement.spec.js +133 -114
  488. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  489. package/dist/parser/tests/statement/ReturnStatement.spec.js +57 -54
  490. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  491. package/dist/parser/tests/statement/Set.spec.js +131 -117
  492. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  493. package/dist/parser/tests/statement/Stop.spec.js +14 -13
  494. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  495. package/dist/parser/tests/statement/Throw.spec.js +11 -8
  496. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  497. package/dist/parser/tests/statement/TryCatch.spec.js +26 -15
  498. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  499. package/dist/preprocessor/Manifest.d.ts +6 -6
  500. package/dist/preprocessor/Manifest.js +17 -38
  501. package/dist/preprocessor/Manifest.js.map +1 -1
  502. package/dist/preprocessor/Manifest.spec.d.ts +1 -0
  503. package/dist/preprocessor/Manifest.spec.js +78 -103
  504. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  505. package/dist/roku-types/data.json +20347 -0
  506. package/dist/roku-types/index.d.ts +5726 -0
  507. package/dist/roku-types/index.js +11 -0
  508. package/dist/roku-types/index.js.map +1 -0
  509. package/dist/types/ArrayType.d.ts +12 -5
  510. package/dist/types/ArrayType.js +89 -24
  511. package/dist/types/ArrayType.js.map +1 -1
  512. package/dist/types/ArrayType.spec.js +39 -11
  513. package/dist/types/ArrayType.spec.js.map +1 -1
  514. package/dist/types/AssociativeArrayType.d.ts +15 -0
  515. package/dist/types/AssociativeArrayType.js +64 -0
  516. package/dist/types/AssociativeArrayType.js.map +1 -0
  517. package/dist/types/BaseFunctionType.d.ts +10 -0
  518. package/dist/types/BaseFunctionType.js +26 -0
  519. package/dist/types/BaseFunctionType.js.map +1 -0
  520. package/dist/types/BooleanType.d.ts +9 -5
  521. package/dist/types/BooleanType.js +19 -8
  522. package/dist/types/BooleanType.js.map +1 -1
  523. package/dist/types/BooleanType.spec.js +10 -4
  524. package/dist/types/BooleanType.spec.js.map +1 -1
  525. package/dist/types/BscType.d.ts +41 -3
  526. package/dist/types/BscType.js +152 -0
  527. package/dist/types/BscType.js.map +1 -1
  528. package/dist/types/BscTypeKind.d.ts +28 -0
  529. package/dist/types/BscTypeKind.js +33 -0
  530. package/dist/types/BscTypeKind.js.map +1 -0
  531. package/dist/types/BuiltInInterfaceAdder.d.ts +28 -0
  532. package/dist/types/BuiltInInterfaceAdder.js +212 -0
  533. package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
  534. package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
  535. package/dist/types/BuiltInInterfaceAdder.spec.js +115 -0
  536. package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
  537. package/dist/types/CallFuncableType.d.ts +24 -0
  538. package/dist/types/CallFuncableType.js +91 -0
  539. package/dist/types/CallFuncableType.js.map +1 -0
  540. package/dist/types/ClassType.d.ts +17 -0
  541. package/dist/types/ClassType.js +60 -0
  542. package/dist/types/ClassType.js.map +1 -0
  543. package/dist/types/ClassType.spec.d.ts +1 -0
  544. package/dist/types/ClassType.spec.js +76 -0
  545. package/dist/types/ClassType.spec.js.map +1 -0
  546. package/dist/types/ComponentType.d.ts +22 -0
  547. package/dist/types/ComponentType.js +107 -0
  548. package/dist/types/ComponentType.js.map +1 -0
  549. package/dist/types/DoubleType.d.ts +10 -5
  550. package/dist/types/DoubleType.js +21 -17
  551. package/dist/types/DoubleType.js.map +1 -1
  552. package/dist/types/DoubleType.spec.js +12 -4
  553. package/dist/types/DoubleType.spec.js.map +1 -1
  554. package/dist/types/DynamicType.d.ts +13 -5
  555. package/dist/types/DynamicType.js +26 -5
  556. package/dist/types/DynamicType.js.map +1 -1
  557. package/dist/types/DynamicType.spec.js +16 -5
  558. package/dist/types/DynamicType.spec.js.map +1 -1
  559. package/dist/types/EnumType.d.ts +42 -0
  560. package/dist/types/EnumType.js +98 -0
  561. package/dist/types/EnumType.js.map +1 -0
  562. package/dist/types/EnumType.spec.d.ts +1 -0
  563. package/dist/types/EnumType.spec.js +33 -0
  564. package/dist/types/EnumType.spec.js.map +1 -0
  565. package/dist/types/FloatType.d.ts +10 -5
  566. package/dist/types/FloatType.js +21 -17
  567. package/dist/types/FloatType.js.map +1 -1
  568. package/dist/types/FloatType.spec.js +4 -4
  569. package/dist/types/FloatType.spec.js.map +1 -1
  570. package/dist/types/FunctionType.d.ts +8 -22
  571. package/dist/types/FunctionType.js +25 -63
  572. package/dist/types/FunctionType.js.map +1 -1
  573. package/dist/types/InheritableType.d.ts +29 -0
  574. package/dist/types/InheritableType.js +173 -0
  575. package/dist/types/InheritableType.js.map +1 -0
  576. package/dist/types/InlineInterfaceType.d.ts +5 -0
  577. package/dist/types/InlineInterfaceType.js +17 -0
  578. package/dist/types/InlineInterfaceType.js.map +1 -0
  579. package/dist/types/IntegerType.d.ts +10 -5
  580. package/dist/types/IntegerType.js +21 -17
  581. package/dist/types/IntegerType.js.map +1 -1
  582. package/dist/types/IntegerType.spec.js +8 -4
  583. package/dist/types/IntegerType.spec.js.map +1 -1
  584. package/dist/types/InterfaceType.d.ts +14 -6
  585. package/dist/types/InterfaceType.js +30 -15
  586. package/dist/types/InterfaceType.js.map +1 -1
  587. package/dist/types/InterfaceType.spec.d.ts +1 -0
  588. package/dist/types/InterfaceType.spec.js +227 -0
  589. package/dist/types/InterfaceType.spec.js.map +1 -0
  590. package/dist/types/IntersectionType.d.ts +29 -0
  591. package/dist/types/IntersectionType.js +253 -0
  592. package/dist/types/IntersectionType.js.map +1 -0
  593. package/dist/types/IntersectionType.spec.d.ts +1 -0
  594. package/dist/types/IntersectionType.spec.js +150 -0
  595. package/dist/types/IntersectionType.spec.js.map +1 -0
  596. package/dist/types/InvalidType.d.ts +10 -5
  597. package/dist/types/InvalidType.js +21 -9
  598. package/dist/types/InvalidType.js.map +1 -1
  599. package/dist/types/InvalidType.spec.js +8 -4
  600. package/dist/types/InvalidType.spec.js.map +1 -1
  601. package/dist/types/LongIntegerType.d.ts +10 -5
  602. package/dist/types/LongIntegerType.js +21 -17
  603. package/dist/types/LongIntegerType.js.map +1 -1
  604. package/dist/types/LongIntegerType.spec.js +10 -4
  605. package/dist/types/LongIntegerType.spec.js.map +1 -1
  606. package/dist/types/NamespaceType.d.ts +12 -0
  607. package/dist/types/NamespaceType.js +28 -0
  608. package/dist/types/NamespaceType.js.map +1 -0
  609. package/dist/types/ObjectType.d.ts +12 -5
  610. package/dist/types/ObjectType.js +25 -8
  611. package/dist/types/ObjectType.js.map +1 -1
  612. package/dist/types/ObjectType.spec.js +3 -3
  613. package/dist/types/ObjectType.spec.js.map +1 -1
  614. package/dist/types/ReferenceType.d.ts +123 -0
  615. package/dist/types/ReferenceType.js +720 -0
  616. package/dist/types/ReferenceType.js.map +1 -0
  617. package/dist/types/ReferenceType.spec.d.ts +1 -0
  618. package/dist/types/ReferenceType.spec.js +151 -0
  619. package/dist/types/ReferenceType.spec.js.map +1 -0
  620. package/dist/types/StringType.d.ts +12 -5
  621. package/dist/types/StringType.js +23 -8
  622. package/dist/types/StringType.js.map +1 -1
  623. package/dist/types/StringType.spec.js +3 -3
  624. package/dist/types/StringType.spec.js.map +1 -1
  625. package/dist/types/TypeStatementType.d.ts +18 -0
  626. package/dist/types/TypeStatementType.js +45 -0
  627. package/dist/types/TypeStatementType.js.map +1 -0
  628. package/dist/types/TypedFunctionType.d.ts +34 -0
  629. package/dist/types/TypedFunctionType.js +147 -0
  630. package/dist/types/TypedFunctionType.js.map +1 -0
  631. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  632. package/dist/types/TypedFunctionType.spec.js +122 -0
  633. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  634. package/dist/types/UninitializedType.d.ts +11 -6
  635. package/dist/types/UninitializedType.js +20 -11
  636. package/dist/types/UninitializedType.js.map +1 -1
  637. package/dist/types/UnionType.d.ts +27 -0
  638. package/dist/types/UnionType.js +193 -0
  639. package/dist/types/UnionType.js.map +1 -0
  640. package/dist/types/UnionType.spec.d.ts +1 -0
  641. package/dist/types/UnionType.spec.js +205 -0
  642. package/dist/types/UnionType.spec.js.map +1 -0
  643. package/dist/types/VoidType.d.ts +11 -5
  644. package/dist/types/VoidType.js +22 -8
  645. package/dist/types/VoidType.js.map +1 -1
  646. package/dist/types/VoidType.spec.js +3 -3
  647. package/dist/types/VoidType.spec.js.map +1 -1
  648. package/dist/types/helper.spec.d.ts +1 -0
  649. package/dist/types/helper.spec.js +174 -0
  650. package/dist/types/helper.spec.js.map +1 -0
  651. package/dist/types/helpers.d.ts +51 -0
  652. package/dist/types/helpers.js +323 -0
  653. package/dist/types/helpers.js.map +1 -0
  654. package/dist/types/index.d.ts +22 -0
  655. package/dist/types/index.js +39 -0
  656. package/dist/types/index.js.map +1 -0
  657. package/dist/types/roFunctionType.d.ts +11 -0
  658. package/dist/types/roFunctionType.js +37 -0
  659. package/dist/types/roFunctionType.js.map +1 -0
  660. package/dist/types/roFunctionType.spec.d.ts +1 -0
  661. package/dist/types/roFunctionType.spec.js +20 -0
  662. package/dist/types/roFunctionType.spec.js.map +1 -0
  663. package/dist/util.d.ts +288 -187
  664. package/dist/util.js +2018 -575
  665. package/dist/util.js.map +1 -1
  666. package/dist/validators/ClassValidator.d.ts +9 -15
  667. package/dist/validators/ClassValidator.js +93 -138
  668. package/dist/validators/ClassValidator.js.map +1 -1
  669. package/package.json +185 -138
  670. package/CHANGELOG.md +0 -1188
  671. package/dist/astUtils/index.d.ts +0 -7
  672. package/dist/astUtils/index.js +0 -26
  673. package/dist/astUtils/index.js.map +0 -1
  674. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
  675. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
  676. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
  677. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js +0 -45
  678. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
  679. package/dist/lexer/index.d.ts +0 -3
  680. package/dist/lexer/index.js +0 -17
  681. package/dist/lexer/index.js.map +0 -1
  682. package/dist/parser/SGTypes.spec.js +0 -351
  683. package/dist/parser/SGTypes.spec.js.map +0 -1
  684. package/dist/parser/index.d.ts +0 -3
  685. package/dist/parser/index.js +0 -16
  686. package/dist/parser/index.js.map +0 -1
  687. package/dist/preprocessor/Chunk.d.ts +0 -82
  688. package/dist/preprocessor/Chunk.js +0 -77
  689. package/dist/preprocessor/Chunk.js.map +0 -1
  690. package/dist/preprocessor/Preprocessor.d.ts +0 -60
  691. package/dist/preprocessor/Preprocessor.js +0 -156
  692. package/dist/preprocessor/Preprocessor.js.map +0 -1
  693. package/dist/preprocessor/Preprocessor.spec.js +0 -152
  694. package/dist/preprocessor/Preprocessor.spec.js.map +0 -1
  695. package/dist/preprocessor/PreprocessorParser.d.ts +0 -61
  696. package/dist/preprocessor/PreprocessorParser.js +0 -194
  697. package/dist/preprocessor/PreprocessorParser.js.map +0 -1
  698. package/dist/preprocessor/PreprocessorParser.spec.js +0 -116
  699. package/dist/preprocessor/PreprocessorParser.spec.js.map +0 -1
  700. package/dist/preprocessor/index.d.ts +0 -3
  701. package/dist/preprocessor/index.js +0 -16
  702. package/dist/preprocessor/index.js.map +0 -1
  703. package/dist/types/CustomType.d.ts +0 -10
  704. package/dist/types/CustomType.js +0 -35
  705. package/dist/types/CustomType.js.map +0 -1
  706. package/dist/types/FunctionType.spec.js +0 -29
  707. package/dist/types/FunctionType.spec.js.map +0 -1
  708. package/dist/types/LazyType.d.ts +0 -15
  709. package/dist/types/LazyType.js +0 -32
  710. package/dist/types/LazyType.js.map +0 -1
  711. /package/dist/{bscPlugin/semanticTokens/SemanticTokensProcessor.spec.d.ts → astUtils/CachedLookups.spec.d.ts} +0 -0
  712. /package/dist/{parser/SGTypes.spec.d.ts → astUtils/Editor.spec.d.ts} +0 -0
  713. /package/dist/{preprocessor/Preprocessor.spec.d.ts → bscPlugin/completions/CompletionsProcessor.spec.d.ts} +0 -0
  714. /package/dist/{preprocessor/PreprocessorParser.spec.d.ts → bscPlugin/definition/DefinitionProvider.spec.d.ts} +0 -0
  715. /package/dist/{types/FunctionType.spec.d.ts → bscPlugin/hover/HoverProcessor.spec.d.ts} +0 -0
@@ -0,0 +1,913 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const ProjectManager_1 = require("./ProjectManager");
5
+ const testHelpers_spec_1 = require("../testHelpers.spec");
6
+ const fsExtra = require("fs-extra");
7
+ const util_1 = require("../util");
8
+ const sinon_1 = require("sinon");
9
+ const Project_1 = require("./Project");
10
+ const WorkerThreadProject_1 = require("./worker/WorkerThreadProject");
11
+ const WorkerThreadProject_spec_1 = require("./worker/WorkerThreadProject.spec");
12
+ const DiagnosticMessages_1 = require("../DiagnosticMessages");
13
+ const vscode_languageserver_protocol_1 = require("vscode-languageserver-protocol");
14
+ const PathFilterer_1 = require("./PathFilterer");
15
+ const deferred_1 = require("../deferred");
16
+ const net = require("net");
17
+ const getPort = require("get-port");
18
+ const sinon = (0, sinon_1.createSandbox)();
19
+ describe('ProjectManager', () => {
20
+ let manager;
21
+ let pathFilterer;
22
+ beforeEach(() => {
23
+ pathFilterer = new PathFilterer_1.PathFilterer();
24
+ manager = new ProjectManager_1.ProjectManager({
25
+ pathFilterer: pathFilterer
26
+ });
27
+ fsExtra.emptyDirSync(testHelpers_spec_1.tempDir);
28
+ sinon.restore();
29
+ diagnosticsListeners = [];
30
+ diagnosticsResponses = [];
31
+ manager.on('diagnostics', (event) => {
32
+ var _a;
33
+ if (diagnosticsListeners.length > 0) {
34
+ (_a = diagnosticsListeners.shift()) === null || _a === void 0 ? void 0 : _a(event.diagnostics);
35
+ }
36
+ else {
37
+ diagnosticsResponses.push(event.diagnostics);
38
+ }
39
+ });
40
+ });
41
+ afterEach(() => {
42
+ fsExtra.emptyDirSync(testHelpers_spec_1.tempDir);
43
+ sinon.restore();
44
+ manager.dispose();
45
+ });
46
+ let diagnosticsListeners = [];
47
+ let diagnosticsResponses = [];
48
+ /**
49
+ * Get a promise that resolves when the next diagnostics event is emitted (or pop the earliest unhandled diagnostics list if some are already here)
50
+ */
51
+ function onNextDiagnostics() {
52
+ if (diagnosticsResponses.length > 0) {
53
+ return Promise.resolve(diagnosticsResponses.shift());
54
+ }
55
+ else {
56
+ return new Promise((resolve) => {
57
+ diagnosticsListeners.push(resolve);
58
+ });
59
+ }
60
+ }
61
+ async function setFile(srcPath, contents) {
62
+ //set the namespace first
63
+ await manager.handleFileChanges([{
64
+ srcPath: srcPath,
65
+ type: vscode_languageserver_protocol_1.FileChangeType.Changed,
66
+ fileContents: contents,
67
+ allowStandaloneProject: false
68
+ }]);
69
+ }
70
+ describe('on', () => {
71
+ it('emits events', async () => {
72
+ const stub = sinon.stub();
73
+ const off = manager.on('diagnostics', stub);
74
+ await manager['emit']('diagnostics', { project: undefined, diagnostics: [] });
75
+ (0, chai_1.expect)(stub.callCount).to.eql(1);
76
+ await manager['emit']('diagnostics', { project: undefined, diagnostics: [] });
77
+ (0, chai_1.expect)(stub.callCount).to.eql(2);
78
+ off();
79
+ await manager['emit']('diagnostics', { project: undefined, diagnostics: [] });
80
+ (0, chai_1.expect)(stub.callCount).to.eql(2);
81
+ });
82
+ });
83
+ describe('validation tracking', () => {
84
+ it('tracks validation state', async () => {
85
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
86
+ const project = manager.projects[0];
87
+ //force validation to take a while
88
+ sinon.stub(project['builder'].program, 'validate').callsFake(async () => {
89
+ await util_1.default.sleep(100);
90
+ });
91
+ (0, chai_1.expect)(manager.busyStatusTracker.status).to.eql('idle');
92
+ //run several validations (which cancel the previous)
93
+ void project.validate();
94
+ await util_1.default.sleep(10);
95
+ void project.validate();
96
+ await util_1.default.sleep(10);
97
+ void project.validate();
98
+ await util_1.default.sleep(10);
99
+ //busy status should be active
100
+ (0, chai_1.expect)(manager.busyStatusTracker.status).to.eql('busy');
101
+ });
102
+ });
103
+ describe('getHover', () => {
104
+ it('dedupes identical hover contents', async () => {
105
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/main.brs`, `
106
+ sub main()
107
+ end sub
108
+ `);
109
+ await manager.syncProjects([{
110
+ languageServer: {
111
+ enableProjectDiscovery: false,
112
+ enableThreading: false
113
+ },
114
+ workspaceFolder: testHelpers_spec_1.rootDir
115
+ }]);
116
+ sinon.stub(manager.projects[0], 'getHover').returns(Promise.resolve([{
117
+ contents: ['one', 'two', 'three'],
118
+ range: util_1.default.createRange(1, 1, 1, 1)
119
+ }, {
120
+ contents: ['two', 'three', 'four'],
121
+ range: util_1.default.createRange(2, 2, 2, 2)
122
+ }]));
123
+ const hover = await manager.getHover({
124
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.brs`,
125
+ position: util_1.default.createPosition(1, 23)
126
+ });
127
+ (0, chai_1.expect)(hover).to.eql({
128
+ contents: ['one', 'two', 'three', 'four'],
129
+ range: util_1.default.createRange(1, 1, 2, 2)
130
+ });
131
+ });
132
+ });
133
+ describe('syncProjects', () => {
134
+ it('does not crash on zero projects', async () => {
135
+ await manager.syncProjects([]);
136
+ });
137
+ it('finds bsconfig in a folder', async () => {
138
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, '');
139
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
140
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
141
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/bsconfig.json`
142
+ ]);
143
+ });
144
+ it('finds bsconfig at root and also in subfolder', async () => {
145
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, '');
146
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir/bsconfig.json`, '');
147
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
148
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
149
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/bsconfig.json`,
150
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir/bsconfig.json`
151
+ ]);
152
+ });
153
+ it('skips excluded bsconfig bsconfig in a folder', async () => {
154
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, '');
155
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir/bsconfig.json`, '');
156
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { excludePatterns: ['**/subdir/**/*'] })]);
157
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey)).to.eql([
158
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/bsconfig.json`
159
+ ]);
160
+ });
161
+ it('uses rootDir when manifest found but no brightscript file', async () => {
162
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir/manifest`, '');
163
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
164
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey)).to.eql([
165
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}`
166
+ ]);
167
+ });
168
+ it('returns root folder when automatic discovery is disabled', async () => {
169
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/project1/bsconfig.json`, '');
170
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/project2/bsconfig.json`, '');
171
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { enableProjectDiscovery: false }) })]);
172
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey)).to.eql([
173
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}`
174
+ ]);
175
+ });
176
+ it('gets diagnostics from plugins added in afterValidateProgram', async () => {
177
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/plugin.js`, `
178
+ module.exports = function () {
179
+ return {
180
+ afterValidateProgram: function(event) {
181
+ var file = event.program.getFile('source/main.brs');
182
+ //add a diagnostic from a plugin
183
+ event.program.diagnostics.register({
184
+ message: 'Test diagnostic',
185
+ code: 'test-123',
186
+ location: {},
187
+ severity: 1
188
+ });
189
+ }
190
+ }
191
+ }
192
+ `);
193
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, {
194
+ plugins: [
195
+ './plugin.js'
196
+ ]
197
+ });
198
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/main.brs`, `
199
+ sub test()
200
+ print nameNotDefined
201
+ end sub
202
+ `);
203
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/manifest`, '');
204
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
205
+ (0, testHelpers_spec_1.expectDiagnostics)(await onNextDiagnostics(), [
206
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('nameNotDefined').message,
207
+ 'Test diagnostic (location unknown, added here for visibility)'
208
+ ]);
209
+ });
210
+ it('uses subdir when manifest and brightscript file found', async () => {
211
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir/manifest`, '');
212
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir/source/main.brs`, '');
213
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
214
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey)).to.eql([
215
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir`
216
+ ]);
217
+ });
218
+ it('removes stale projects', async () => {
219
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir1/bsconfig.json`, '');
220
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir2/bsconfig.json`, '');
221
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
222
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
223
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir1/bsconfig.json`,
224
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir2/bsconfig.json`
225
+ ]);
226
+ fsExtra.removeSync(`${testHelpers_spec_1.rootDir}/subdir1/bsconfig.json`);
227
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
228
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
229
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir2/bsconfig.json`
230
+ ]);
231
+ });
232
+ it('keeps existing projects on subsequent sync calls', async () => {
233
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir1/bsconfig.json`, '');
234
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/subdir2/bsconfig.json`, '');
235
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
236
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
237
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir1/bsconfig.json`,
238
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir2/bsconfig.json`
239
+ ]);
240
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
241
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
242
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir1/bsconfig.json`,
243
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/subdir2/bsconfig.json`
244
+ ]);
245
+ });
246
+ it('uses nonstandard json naming when specified in projects array', async () => {
247
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/project1/testBrighterScriptConfig.json`, '');
248
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/project1/bsconfig.json`, '');
249
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { projects: [
250
+ { path: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1/testBrighterScriptConfig.json` }
251
+ ] })]);
252
+ //we should NOT have found the `project1/bsconfig.json` file because it's not in the projects array
253
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey)).to.eql([
254
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1/testBrighterScriptConfig.json`
255
+ ]);
256
+ });
257
+ it('supports pointing to a folder AND a bsconfig.json in projects array', async () => {
258
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/project1/testBrighterScriptConfig.json`, '');
259
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { projects: [
260
+ { path: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1/testBrighterScriptConfig.json` },
261
+ { path: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1` }
262
+ ] })]);
263
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
264
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1`,
265
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1/testBrighterScriptConfig.json`
266
+ ]);
267
+ });
268
+ it('supports project with AND without bsconfig.json in same location in projects array', async () => {
269
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/project1/bsconfig.json`, '');
270
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { projects: [
271
+ { path: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1` },
272
+ { path: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1/bsconfig.json` }
273
+ ] })]);
274
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
275
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1`,
276
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1/bsconfig.json`
277
+ ]);
278
+ });
279
+ it('ignores empty projects array configuration', async () => {
280
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/project1/bsconfig.json`, '');
281
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { projects: [] })]);
282
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
283
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/project1/bsconfig.json`
284
+ ]);
285
+ });
286
+ });
287
+ describe('maxDepth configuration', () => {
288
+ function writeTestFiles(files) {
289
+ for (const [filePath, content] of Object.entries(files)) {
290
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/${filePath}`, content);
291
+ }
292
+ }
293
+ it('respects maxDepth of 1 when discovering projects', async () => {
294
+ // Create bsconfig.json files at different depths
295
+ writeTestFiles({
296
+ 'bsconfig.json': '',
297
+ 'level1/bsconfig.json': '',
298
+ 'level1/level2/bsconfig.json': '',
299
+ 'level1/level2/level3/bsconfig.json': ''
300
+ });
301
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { projectDiscoveryMaxDepth: 1 }) })]);
302
+ // maxDepth: 1 should find files at depth 0 only
303
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
304
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/bsconfig.json`
305
+ ]);
306
+ });
307
+ it('respects maxDepth of 5 when discovering projects', async () => {
308
+ // Create bsconfig.json files at different depths
309
+ writeTestFiles({
310
+ 'bsconfig.json': '',
311
+ 'level1/bsconfig.json': '',
312
+ 'level1/level2/bsconfig.json': '',
313
+ 'level1/level2/level3/bsconfig.json': '',
314
+ 'level1/level2/level3/level4/bsconfig.json': '',
315
+ 'level1/level2/level3/level4/level5/bsconfig.json': '',
316
+ 'level1/level2/level3/level4/level5/level6/bsconfig.json': ''
317
+ });
318
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { projectDiscoveryMaxDepth: 5 }) })]);
319
+ // maxDepth: 5 should find files at depths 0, 1, 2, 3, 4
320
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
321
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/bsconfig.json`,
322
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/bsconfig.json`,
323
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/bsconfig.json`,
324
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3/bsconfig.json`,
325
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3/level4/bsconfig.json`
326
+ ]);
327
+ });
328
+ it('respects maxDepth of 20 when discovering projects', async () => {
329
+ // Create bsconfig.json files at different depths, skipping some levels in between
330
+ // and proving it stops at level 20 by creating files at level 20 and 21
331
+ // Note: depth 20 means the file is in the 20th directory level from root
332
+ writeTestFiles({
333
+ 'bsconfig.json': '',
334
+ 'level1/bsconfig.json': '',
335
+ 'level1/level2/level3/level4/level5/bsconfig.json': '',
336
+ 'level1/level2/level3/level4/level5/level6/level7/level8/level9/level10/level11/level12/level13/level14/level15/level16/level17/level18/level19/bsconfig.json': '',
337
+ 'level1/level2/level3/level4/level5/level6/level7/level8/level9/level10/level11/level12/level13/level14/level15/level16/level17/level18/level19/level20/bsconfig.json': ''
338
+ });
339
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { projectDiscoveryMaxDepth: 20 }) })]);
340
+ // maxDepth: 20 should find file at level 19 (depth 20) but not at level 20 (depth 21)
341
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
342
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/bsconfig.json`,
343
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/bsconfig.json`,
344
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3/level4/level5/bsconfig.json`,
345
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3/level4/level5/level6/level7/level8/level9/level10/level11/level12/level13/level14/level15/level16/level17/level18/level19/bsconfig.json`
346
+ ]);
347
+ });
348
+ it('uses default maxDepth of 15 when no maxDepth is specified', async () => {
349
+ // Create bsconfig.json files at different depths, skipping some levels in between
350
+ // and proving it stops at level 15 by creating files at level 15 and 16
351
+ // Note: depth 15 means the file is in the 15th directory level from root
352
+ writeTestFiles({
353
+ 'bsconfig.json': '',
354
+ 'level1/bsconfig.json': '',
355
+ 'level1/level2/level3/level4/level5/bsconfig.json': '',
356
+ 'level1/level2/level3/level4/level5/level6/level7/level8/level9/level10/level11/level12/level13/level14/bsconfig.json': '',
357
+ 'level1/level2/level3/level4/level5/level6/level7/level8/level9/level10/level11/level12/level13/level14/level15/bsconfig.json': ''
358
+ });
359
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
360
+ // Default maxDepth: 15 should find file at level 14 (depth 15) but not at level 15 (depth 16)
361
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
362
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/bsconfig.json`,
363
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/bsconfig.json`,
364
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3/level4/level5/bsconfig.json`,
365
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3/level4/level5/level6/level7/level8/level9/level10/level11/level12/level13/level14/bsconfig.json`
366
+ ]);
367
+ });
368
+ it('respects maxDepth of 1 when discovering roku projects with manifest files', async () => {
369
+ // Create manifest files at different depths
370
+ writeTestFiles({
371
+ 'manifest': '',
372
+ 'source/main.brs': '',
373
+ 'level1/manifest': '',
374
+ 'level1/source/main.brs': '',
375
+ 'level1/level2/manifest': '',
376
+ 'level1/level2/source/main.brs': '',
377
+ 'level1/level2/level3/manifest': '',
378
+ 'level1/level2/level3/source/main.brs': ''
379
+ });
380
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { projectDiscoveryMaxDepth: 1 }) })]);
381
+ // maxDepth: 1 should find projects at depth 0 only
382
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
383
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}`
384
+ ]);
385
+ });
386
+ it('respects maxDepth of 5 when discovering roku projects with manifest files', async () => {
387
+ // Create manifest files at different depths
388
+ writeTestFiles({
389
+ 'manifest': '',
390
+ 'source/main.brs': '',
391
+ 'level1/manifest': '',
392
+ 'level1/source/main.brs': '',
393
+ 'level1/level2/manifest': '',
394
+ 'level1/level2/source/main.brs': '',
395
+ 'level1/level2/level3/manifest': '',
396
+ 'level1/level2/level3/source/main.brs': '',
397
+ 'level1/level2/level3/level4/manifest': '',
398
+ 'level1/level2/level3/level4/source/main.brs': '',
399
+ 'level1/level2/level3/level4/level5/manifest': '',
400
+ 'level1/level2/level3/level4/level5/source/main.brs': '',
401
+ 'level1/level2/level3/level4/level5/level6/manifest': '',
402
+ 'level1/level2/level3/level4/level5/level6/source/main.brs': ''
403
+ });
404
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { projectDiscoveryMaxDepth: 5 }) })]);
405
+ // maxDepth: 5 should find projects at depths 0, 1, 2, 3, 4
406
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey).sort()).to.eql([
407
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}`,
408
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1`,
409
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2`,
410
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3`,
411
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/level1/level2/level3/level4`
412
+ ]);
413
+ });
414
+ });
415
+ describe('getCompletions', () => {
416
+ it('works for quick file changes', async () => {
417
+ //set up the project
418
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
419
+ //add the namespace first
420
+ await setFile((0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/alpha.bs`, `
421
+ namespace alpha
422
+ enum Direction
423
+ up
424
+ end enum
425
+ end namespace
426
+ `);
427
+ //add the baseline file
428
+ await setFile((0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.bs`, `
429
+ sub test()
430
+ thing = alpha.Directio
431
+ end sub
432
+ `);
433
+ await manager.onIdle();
434
+ //now for the test. type a char, request completions, type a char, request completions (just like how vscode does it)
435
+ void setFile((0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.bs`, `
436
+ sub test()
437
+ thing = alpha.Direction
438
+ end sub
439
+ `);
440
+ // const completionsPromise1 = manager.getCompletions({
441
+ // srcPath: s`${rootDir}/source/main.bs`,
442
+ // position: util.createPosition(2, 43)
443
+ // });
444
+ //request completions
445
+ void setFile((0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.bs`, `
446
+ sub test()
447
+ thing = alpha.Direction.
448
+ end sub
449
+ `);
450
+ const completionsPromise2 = manager.getCompletions({
451
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.bs`,
452
+ position: util_1.default.createPosition(2, 44)
453
+ });
454
+ // //the first set of completions should only have the `alpha.Direction` enum
455
+ // expectCompletionsIncludes(await completionsPromise1, [{
456
+ // label: 'Direction'
457
+ // }]);
458
+ //the next set of completions should only have the alpha.Direction.up enum member
459
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(await completionsPromise2, [{
460
+ label: 'up'
461
+ }]);
462
+ });
463
+ });
464
+ describe('flushDocumentChanges', () => {
465
+ it('does not crash when getting undefined back from projects', async () => {
466
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/main.brs`, ``);
467
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/project1/bsconfig.json`, {
468
+ rootDir: testHelpers_spec_1.rootDir
469
+ });
470
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
471
+ sinon.stub(manager.projects[0], 'applyFileChanges').returns(Promise.resolve([
472
+ //return an undefined item, which used to cause a specific crash
473
+ undefined
474
+ ]));
475
+ await manager['flushDocumentChanges']({
476
+ actions: [{
477
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.brs`,
478
+ type: 'set',
479
+ fileContents: 'sub main():end sub',
480
+ allowStandaloneProject: true
481
+ }]
482
+ });
483
+ });
484
+ });
485
+ describe('handleFileChanges', () => {
486
+ it('only sends files to the project that match the include patterns for that project', async () => {
487
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/lib1/a.brs`, ``);
488
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/lib2/a.brs`, ``);
489
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/lib1/b.brs`, ``);
490
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/lib2/b.brs`, ``);
491
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/project1/bsconfig.json`, {
492
+ rootDir: testHelpers_spec_1.rootDir,
493
+ files: [
494
+ 'source/**/a.brs'
495
+ ]
496
+ });
497
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/project2/bsconfig.json`, {
498
+ rootDir: testHelpers_spec_1.rootDir,
499
+ files: [
500
+ 'source/**/b.brs'
501
+ ]
502
+ });
503
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
504
+ let deferred1 = new deferred_1.Deferred();
505
+ let deferred2 = new deferred_1.Deferred();
506
+ const project1 = manager.projects.find(x => x.bsconfigPath.includes('project1'));
507
+ const project2 = manager.projects.find(x => x.bsconfigPath.includes('project2'));
508
+ const project1Stub = sinon.stub(project1, 'applyFileChanges').callsFake(async (...args) => {
509
+ const result = await project1Stub.wrappedMethod.apply(project1, args);
510
+ deferred1.resolve();
511
+ return result;
512
+ });
513
+ const project2Stub = sinon.stub(project2, 'applyFileChanges').callsFake(async (...args) => {
514
+ const result = await project2Stub.wrappedMethod.apply(project1, args);
515
+ deferred2.resolve();
516
+ return result;
517
+ });
518
+ await manager.handleFileChanges([
519
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib1/a.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Changed },
520
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib2/a.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Changed },
521
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib1/b.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Changed },
522
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib2/b.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Changed }
523
+ ]);
524
+ //wait for the functions to finish being called
525
+ await Promise.all([
526
+ deferred1.promise,
527
+ deferred2.promise
528
+ ]);
529
+ //project1 should only receive a.brs files
530
+ (0, chai_1.expect)(project1Stub.getCall(0).args[0].map(x => x.srcPath)).to.eql([
531
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/lib1/a.brs`,
532
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/lib2/a.brs`
533
+ ]);
534
+ //project2 should only receive b.brs files
535
+ (0, chai_1.expect)(project2Stub.getCall(0).args[0].map(x => x.srcPath)).to.eql([
536
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/lib1/b.brs`,
537
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/lib2/b.brs`
538
+ ]);
539
+ });
540
+ it('excludes files based on global exclude patterns', async () => {
541
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/file1.md`, ``);
542
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/file2.brs`, ``);
543
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, {
544
+ files: [
545
+ 'source/**/*.brs'
546
+ ]
547
+ });
548
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
549
+ const stub = sinon.stub(manager, 'handleFileChange').callThrough();
550
+ //register an exclusion filter
551
+ pathFilterer.registerExcludeList(testHelpers_spec_1.rootDir, [
552
+ '**/*.md'
553
+ ]);
554
+ //make sure the .md file is ignored
555
+ await manager.handleFileChanges([
556
+ { srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file1.md`, type: vscode_languageserver_protocol_1.FileChangeType.Created },
557
+ { srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file2.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Created }
558
+ ]);
559
+ await manager.onIdle();
560
+ (0, chai_1.expect)(stub.getCalls().map(x => x.args[0]).map(x => x.srcPath)).to.eql([
561
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file2.brs`
562
+ ]);
563
+ stub.reset();
564
+ //remove all filters, make sure the markdown file is included
565
+ pathFilterer.clear();
566
+ await manager.handleFileChanges([
567
+ { srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file1.md`, type: vscode_languageserver_protocol_1.FileChangeType.Created },
568
+ { srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file2.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Created }
569
+ ]);
570
+ await manager.onIdle();
571
+ (0, chai_1.expect)(stub.getCalls().flatMap(x => x.args[0]).map(x => x.srcPath)).to.eql([
572
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file1.md`,
573
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file2.brs`
574
+ ]);
575
+ });
576
+ it('keeps files from bsconfig.json even if the path matches an exclude list', async () => {
577
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/file1.md`, ``);
578
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/file2.brs`, ``);
579
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, {
580
+ files: ['source/**/*']
581
+ });
582
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
583
+ const stub = sinon.stub(manager['projects'][0], 'applyFileChanges').callThrough();
584
+ //register an exclusion filter
585
+ pathFilterer.registerExcludeList(testHelpers_spec_1.rootDir, [
586
+ '**/*.md'
587
+ ]);
588
+ //make sure the .md file is included because of its project's files array
589
+ await manager.handleFileChanges([
590
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/file1.md`, type: vscode_languageserver_protocol_1.FileChangeType.Created },
591
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/file2.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Created }
592
+ ]);
593
+ await manager.onIdle();
594
+ (0, chai_1.expect)(stub.getCalls().flatMap(x => x.args[0]).map(x => x.srcPath)).to.eql([
595
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file1.md`,
596
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/file2.brs`
597
+ ]);
598
+ });
599
+ it('does not create a standalone project for files that exist in a known project', async () => {
600
+ fsExtra.outputFileSync((0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.brs`, `sub main() : end sub`);
601
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
602
+ await onNextDiagnostics();
603
+ await manager.handleFileChanges([
604
+ { srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Changed, fileContents: `'test`, allowStandaloneProject: true }
605
+ ]);
606
+ await onNextDiagnostics();
607
+ //there should NOT be a standalone project
608
+ (0, chai_1.expect)(manager['standaloneProjects'].size).to.eql(0);
609
+ });
610
+ it('converts a missing file to a delete', async () => {
611
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
612
+ await onNextDiagnostics();
613
+ let applyFileChangesDeferred = new deferred_1.Deferred();
614
+ const project1 = manager.projects[0];
615
+ const project1Stub = sinon.stub(project1, 'applyFileChanges').callsFake(async (...args) => {
616
+ const result = await project1Stub.wrappedMethod.apply(project1, args);
617
+ applyFileChangesDeferred.resolve(result);
618
+ return result;
619
+ });
620
+ //emit created and changed events for files that don't exist. These turn into delete events
621
+ await manager.handleFileChanges([
622
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/missing1.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Created },
623
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/missing2.brs`, type: vscode_languageserver_protocol_1.FileChangeType.Changed }
624
+ ]);
625
+ //wait for the next set of diagnostics to arrive (signifying the files have been applied)
626
+ const result = await applyFileChangesDeferred.promise;
627
+ //make sure the project has these files
628
+ (0, chai_1.expect)(result.map(x => {
629
+ return { type: x.type, srcPath: x.srcPath };
630
+ })).to.eql([{
631
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/missing1.brs`,
632
+ type: 'set'
633
+ }, {
634
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/missing2.brs`,
635
+ type: 'set'
636
+ }, {
637
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/missing1.brs`,
638
+ type: 'delete'
639
+ }, {
640
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/missing2.brs`,
641
+ type: 'delete'
642
+ }]);
643
+ });
644
+ it('properly syncs changes', async () => {
645
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/lib1.brs`, `sub test1():print "alpha":end sub`);
646
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/lib2.brs`, `sub test2():print "beta":end sub`);
647
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
648
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(await onNextDiagnostics());
649
+ await manager.handleFileChanges([
650
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib1.brs`, fileContents: `sub test1():print alpha:end sub`, type: vscode_languageserver_protocol_1.FileChangeType.Changed },
651
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib2.brs`, fileContents: `sub test2()::print beta:end sub`, type: vscode_languageserver_protocol_1.FileChangeType.Changed }
652
+ ]);
653
+ (0, testHelpers_spec_1.expectDiagnostics)(await onNextDiagnostics(), [
654
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('alpha').message,
655
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('beta').message
656
+ ]);
657
+ await manager.handleFileChanges([
658
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib1.brs`, fileContents: `sub test1():print "alpha":end sub`, type: vscode_languageserver_protocol_1.FileChangeType.Changed },
659
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/lib2.brs`, fileContents: `sub test2()::print "beta":end sub`, type: vscode_languageserver_protocol_1.FileChangeType.Changed }
660
+ ]);
661
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(await onNextDiagnostics());
662
+ });
663
+ it('adds all new files in a folder', async () => {
664
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/main.brs`, `sub main():print "main":end sub`);
665
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
666
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(await onNextDiagnostics());
667
+ //add a few files to a folder, then register that folder as an "add"
668
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/libs/alpha/beta.brs`, `sub beta(): print one: end sub`);
669
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/libs/alpha/charlie/delta.brs`, `sub delta():print two:end sub`);
670
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/libs/echo/foxtrot.brs`, `sub foxtrot():print three:end sub`);
671
+ await manager.handleFileChanges([
672
+ //register the entire folder as an "add"
673
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/libs`, type: vscode_languageserver_protocol_1.FileChangeType.Created }
674
+ ]);
675
+ (0, testHelpers_spec_1.expectDiagnostics)(await onNextDiagnostics(), [
676
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('one').message,
677
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('two').message,
678
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('three').message
679
+ ]);
680
+ });
681
+ it('removes all files in a folder', async () => {
682
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/main.brs`, `sub main():print "main":end sub`);
683
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/libs/alpha/beta.brs`, `sub beta(): print one: end sub`);
684
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/libs/alpha/charlie/delta.brs`, `sub delta():print two:end sub`);
685
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/libs/echo/foxtrot.brs`, `sub foxtrot():print three:end sub`);
686
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
687
+ (0, testHelpers_spec_1.expectDiagnostics)(await onNextDiagnostics(), [
688
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('one').message,
689
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('two').message,
690
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('three').message
691
+ ]);
692
+ await manager.handleFileChanges([
693
+ //register the entire folder as an "add"
694
+ { srcPath: `${testHelpers_spec_1.rootDir}/source/libs`, type: vscode_languageserver_protocol_1.FileChangeType.Deleted }
695
+ ]);
696
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(await onNextDiagnostics());
697
+ });
698
+ });
699
+ describe('threading', () => {
700
+ before(async function workerThreadWarmup() {
701
+ this.timeout(20000);
702
+ await (0, WorkerThreadProject_spec_1.getWakeWorkerThreadPromise)();
703
+ });
704
+ it('spawns a worker thread when threading is enabled', async () => {
705
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { enableThreading: true }) })]);
706
+ (0, chai_1.expect)(manager.projects[0]).instanceof(WorkerThreadProject_1.WorkerThreadProject);
707
+ });
708
+ });
709
+ describe('getProject', () => {
710
+ it('uses .projectKey if param is not a string', async () => {
711
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
712
+ (0, chai_1.expect)(manager['getProject']({
713
+ projectKey: testHelpers_spec_1.rootDir
714
+ }).projectKey).to.eql(testHelpers_spec_1.rootDir);
715
+ });
716
+ });
717
+ describe('createAndActivateProject', () => {
718
+ it('skips creating project if we already have it', async () => {
719
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
720
+ await manager['createAndActivateProject']({
721
+ projectKey: testHelpers_spec_1.rootDir,
722
+ projectDir: testHelpers_spec_1.rootDir,
723
+ workspaceFolder: testHelpers_spec_1.rootDir,
724
+ bsconfigPath: undefined
725
+ });
726
+ (0, chai_1.expect)(manager.projects.map(x => x.projectKey)).to.eql([
727
+ (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}`
728
+ ]);
729
+ });
730
+ it('uses given projectNumber', async () => {
731
+ await manager['createAndActivateProject']({
732
+ projectKey: testHelpers_spec_1.rootDir,
733
+ projectDir: testHelpers_spec_1.rootDir,
734
+ workspaceFolder: testHelpers_spec_1.rootDir,
735
+ bsconfigPath: undefined,
736
+ projectNumber: 3
737
+ });
738
+ (0, chai_1.expect)(manager.projects[0].projectNumber).to.eql(3);
739
+ });
740
+ it('properly tracks a failed run', async () => {
741
+ //force a total crash
742
+ sinon.stub(Project_1.Project.prototype, 'activate').returns(Promise.reject(new Error('Critical failure')));
743
+ let error;
744
+ try {
745
+ await manager['createAndActivateProject']({
746
+ projectKey: testHelpers_spec_1.rootDir,
747
+ projectDir: testHelpers_spec_1.rootDir,
748
+ workspaceFolder: testHelpers_spec_1.rootDir,
749
+ bsconfigPath: 'subdir1/brsconfig.json'
750
+ });
751
+ }
752
+ catch (e) {
753
+ error = e;
754
+ }
755
+ (0, chai_1.expect)(error).to.include({ message: 'Critical failure' });
756
+ });
757
+ });
758
+ describe('removeProject', () => {
759
+ it('handles undefined', async () => {
760
+ manager['removeProject'](undefined);
761
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
762
+ manager['removeProject'](undefined);
763
+ });
764
+ it('does not crash when removing project that is not there', () => {
765
+ manager['removeProject']({
766
+ projectPath: testHelpers_spec_1.rootDir,
767
+ dispose: () => { }
768
+ });
769
+ });
770
+ });
771
+ describe('getSemanticTokens', () => {
772
+ it('waits until the project is ready', () => {
773
+ });
774
+ });
775
+ describe('standalone projects', () => {
776
+ it('creates a standalone project for files not found in a project', async () => {
777
+ var _a;
778
+ await manager.syncProjects([]);
779
+ await manager.handleFileChanges([{
780
+ srcPath: `${testHelpers_spec_1.rootDir}/source/main.brs`,
781
+ type: vscode_languageserver_protocol_1.FileChangeType.Created,
782
+ fileContents: `sub main():print "main":end sub`,
783
+ allowStandaloneProject: true
784
+ }]);
785
+ await onNextDiagnostics();
786
+ (0, chai_1.expect)((_a = [...manager['standaloneProjects'].values()][0]) === null || _a === void 0 ? void 0 : _a.srcPath).to.eql((0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/source/main.brs`);
787
+ //it deletes the standalone project when the file is closed
788
+ await manager.handleFileClose({
789
+ srcPath: `${testHelpers_spec_1.rootDir}/source/main.brs`
790
+ });
791
+ (0, chai_1.expect)(manager['standaloneProjects'].size).to.eql(0);
792
+ });
793
+ });
794
+ it('completes promise when project is disposed in the middle of a flow', async function () {
795
+ this.timeout(20000);
796
+ //small plugin to communicate over a socket inside the worker thread.
797
+ //This transpiles from tsc use `require()` for all imports and don't reference external vars
798
+ class Plugin {
799
+ constructor(port, host) {
800
+ this.deferred = this.defer();
801
+ // eslint-disable-next-line
802
+ const net = require('net');
803
+ console.log('Starting server');
804
+ this.server = net.createServer((socket) => {
805
+ console.log('Client connected');
806
+ socket.on('data', (data) => {
807
+ let text = data.toString();
808
+ console.log('message received', JSON.stringify(text));
809
+ //when we get the event to resolve, do it
810
+ if (text === 'resolve') {
811
+ console.log('Resolving promise');
812
+ this.deferred.resolve();
813
+ this.server.close();
814
+ }
815
+ });
816
+ });
817
+ this.server.listen(port, host);
818
+ }
819
+ afterProvideProgram(program) {
820
+ // hijack the function to get workspace symbols, return a promise that resolves in the future
821
+ program.getWorkspaceSymbols = () => {
822
+ return this.deferred.promise;
823
+ };
824
+ }
825
+ defer() {
826
+ let resolve;
827
+ let reject;
828
+ let promise = new Promise((res, rej) => {
829
+ resolve = res;
830
+ reject = rej;
831
+ });
832
+ return {
833
+ resolve: resolve,
834
+ reject: reject,
835
+ promise: promise
836
+ };
837
+ }
838
+ }
839
+ const port = await getPort();
840
+ const host = '127.0.0.1';
841
+ //write a small brighterscript plugin to allow this test to communicate with the thread
842
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/pluginsocket.js`, `
843
+ ${Plugin.toString()};
844
+ exports.default = function() {
845
+ return new Plugin(${port}, "${host}");
846
+ };
847
+ `);
848
+ //write a bsconfig that will load this plugin
849
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, {
850
+ plugins: [
851
+ `${testHelpers_spec_1.rootDir}/pluginsocket.js`
852
+ ]
853
+ });
854
+ //wait for the projects to finish syncing/loading
855
+ await manager.syncProjects([Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings), { languageServer: Object.assign(Object.assign({}, testHelpers_spec_1.workspaceSettings.languageServer), { enableThreading: true }) })]);
856
+ //establish the connection with the plugin
857
+ const connection = net.createConnection({
858
+ host: host,
859
+ port: port
860
+ });
861
+ //do the request to fetch symbols (this will be stalled on purpose by our test plugin)
862
+ let managerGetWorkspaceSymbolPromise = manager.getWorkspaceSymbol();
863
+ //small sleep to let things settle
864
+ await util_1.default.sleep(20);
865
+ //now dispose the project (which should destroy all of the listeners)
866
+ manager['removeProject'](manager.projects[0]);
867
+ //settle again
868
+ await util_1.default.sleep(20);
869
+ console.log('Asking the client to resolve');
870
+ //resolve the request
871
+ connection.write('resolve');
872
+ //now wait to see if we ever get the response back
873
+ let result = await managerGetWorkspaceSymbolPromise;
874
+ //the result should be an empty array, since the only project was rejected in the middle of the request
875
+ (0, chai_1.expect)(result).to.eql([]);
876
+ //test passes if the promise resolves
877
+ });
878
+ it('properly handles reloading when bsconfig.json contents change', async () => {
879
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, {
880
+ files: [
881
+ 'one'
882
+ ]
883
+ });
884
+ //wait for the projects to finish syncing/loading
885
+ await manager.syncProjects([testHelpers_spec_1.workspaceSettings]);
886
+ const stub = sinon.stub(manager, 'reloadProject').callThrough();
887
+ //change the file to new contents
888
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, {
889
+ files: [
890
+ 'two'
891
+ ]
892
+ });
893
+ await manager.handleFileChanges([{
894
+ srcPath: `${testHelpers_spec_1.rootDir}/bsconfig.json`,
895
+ type: vscode_languageserver_protocol_1.FileChangeType.Changed
896
+ }]);
897
+ //the project was reloaded
898
+ (0, chai_1.expect)(stub.callCount).to.eql(1);
899
+ //change the file to the same contents
900
+ fsExtra.outputJsonSync(`${testHelpers_spec_1.rootDir}/bsconfig.json`, {
901
+ files: [
902
+ 'two'
903
+ ]
904
+ });
905
+ await manager.handleFileChanges([{
906
+ srcPath: `${testHelpers_spec_1.rootDir}/bsconfig.json`,
907
+ type: vscode_languageserver_protocol_1.FileChangeType.Changed
908
+ }]);
909
+ //the project was not reloaded this time
910
+ (0, chai_1.expect)(stub.callCount).to.eql(1);
911
+ });
912
+ });
913
+ //# sourceMappingURL=ProjectManager.spec.js.map