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,2512 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_config_spec_1 = require("../../chai-config.spec");
4
+ const Program_1 = require("../../Program");
5
+ const util_1 = require("../../util");
6
+ const vscode_languageserver_1 = require("vscode-languageserver");
7
+ const sinon_1 = require("sinon");
8
+ const testHelpers_spec_1 = require("../../testHelpers.spec");
9
+ const XmlFile_1 = require("../../files/XmlFile");
10
+ const TokenKind_1 = require("../../lexer/TokenKind");
11
+ const CompletionsProcessor_1 = require("./CompletionsProcessor");
12
+ const pick = require("object.pick");
13
+ const BrsFile_1 = require("../../files/BrsFile");
14
+ const fsExtra = require("fs-extra");
15
+ const reflection_1 = require("../../astUtils/reflection");
16
+ describe('CompletionsProcessor', () => {
17
+ let program;
18
+ let sinon = (0, sinon_1.createSandbox)();
19
+ beforeEach(() => {
20
+ fsExtra.emptyDirSync(testHelpers_spec_1.tempDir);
21
+ fsExtra.ensureDirSync(testHelpers_spec_1.rootDir);
22
+ fsExtra.ensureDirSync(testHelpers_spec_1.outDir);
23
+ program = new Program_1.Program({ rootDir: testHelpers_spec_1.rootDir });
24
+ });
25
+ afterEach(() => {
26
+ sinon.restore();
27
+ program.dispose();
28
+ });
29
+ describe('getCompletions - Program.spec', () => {
30
+ it('includes `for each` variable', () => {
31
+ program.setFile('source/main.brs', `
32
+ sub main()
33
+ items = [1, 2, 3]
34
+ for each thing in items
35
+ t =
36
+ end for
37
+ end sub
38
+ `);
39
+ program.validate();
40
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(4, 28)).map(x => x.label);
41
+ (0, chai_config_spec_1.expect)(completions).to.include('thing');
42
+ });
43
+ it('finds enum member after dot', () => {
44
+ program.setFile('source/main.bs', `
45
+ sub test()
46
+ thing = alpha.Direction.
47
+ end sub
48
+ namespace alpha
49
+ enum Direction
50
+ up
51
+ end enum
52
+ end namespace
53
+ `);
54
+ program.validate();
55
+ const completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 44));
56
+ (0, chai_config_spec_1.expect)(completions.map(x => ({ kind: x.kind, label: x.label }))).to.eql([{
57
+ label: 'up',
58
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
59
+ }]);
60
+ });
61
+ it('finds enum member after dot in if statement', () => {
62
+ program.setFile('source/main.bs', `
63
+ sub test()
64
+ if alpha.beta. then
65
+ end if
66
+ end sub
67
+ namespace alpha.beta
68
+ const isEnabled = true
69
+ end namespace
70
+ `);
71
+ program.validate();
72
+ const completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 34));
73
+ (0, chai_config_spec_1.expect)(completions.map(x => ({ kind: x.kind, label: x.label }))).to.eql([{
74
+ label: 'isEnabled',
75
+ kind: vscode_languageserver_1.CompletionItemKind.Constant
76
+ }]);
77
+ });
78
+ it('includes `for` variable', () => {
79
+ program.setFile('source/main.brs', `
80
+ sub main()
81
+ for i = 0 to 10
82
+ t =
83
+ end for
84
+ end sub
85
+ `);
86
+ program.validate();
87
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 28)).map(x => x.label);
88
+ (0, chai_config_spec_1.expect)(completions).to.include('i');
89
+ });
90
+ it('should include first-level namespace names for brighterscript files', () => {
91
+ program.setFile('source/main.bs', `
92
+ namespace NameA.NameB.NameC
93
+ sub DoSomething()
94
+ end sub
95
+ end namespace
96
+ sub main()
97
+ print
98
+ end sub
99
+ `);
100
+ program.validate();
101
+ // print |
102
+ const completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(6, 25));
103
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
104
+ label: 'NameA',
105
+ kind: vscode_languageserver_1.CompletionItemKind.Module
106
+ }]);
107
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
108
+ label: 'NameB',
109
+ kind: vscode_languageserver_1.CompletionItemKind.Module
110
+ }, {
111
+ label: 'NameA.NameB',
112
+ kind: vscode_languageserver_1.CompletionItemKind.Module
113
+ }, {
114
+ label: 'NameA.NameB.NameC',
115
+ kind: vscode_languageserver_1.CompletionItemKind.Module
116
+ }, {
117
+ label: 'NameA.NameB.NameC.DoSomething',
118
+ kind: vscode_languageserver_1.CompletionItemKind.Module
119
+ }]);
120
+ });
121
+ it('resolves completions for namespaces with next namespace part for brighterscript file', () => {
122
+ program.setFile('source/main.bs', `
123
+ namespace NameA.NameB.NameC
124
+ sub DoSomething()
125
+ end sub
126
+ end namespace
127
+ sub main()
128
+ NameA.
129
+ end sub
130
+ `);
131
+ program.validate();
132
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(6, 26)).map(x => x.label);
133
+ (0, chai_config_spec_1.expect)(completions).to.include('NameB');
134
+ (0, chai_config_spec_1.expect)(completions).not.to.include('NameA');
135
+ (0, chai_config_spec_1.expect)(completions).not.to.include('NameA.NameB');
136
+ (0, chai_config_spec_1.expect)(completions).not.to.include('NameA.NameB.NameC');
137
+ (0, chai_config_spec_1.expect)(completions).not.to.include('NameA.NameB.NameC.DoSomething');
138
+ });
139
+ it('finds namespace members for brighterscript file', () => {
140
+ program.setFile('source/main.bs', `
141
+ sub main()
142
+ NameA.
143
+ NameA.NameB.
144
+ NameA.NameB.NameC.
145
+ end sub
146
+ namespace NameA
147
+ sub alertA()
148
+ end sub
149
+ end namespace
150
+ namespace NameA
151
+ sub info()
152
+ end sub
153
+ end namespace
154
+ namespace NameA.NameB
155
+ sub alertB()
156
+ end sub
157
+ end namespace
158
+ namespace NameA.NameB.NameC
159
+ sub alertC()
160
+ end sub
161
+ end namespace
162
+ `);
163
+ program.validate();
164
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 26)).map(x => x.label).sort()).to.eql(['NameB', 'alertA', 'info']);
165
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 32)).map(x => x.label).sort()).to.eql(['NameC', 'alertB']);
166
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 38)).map(x => x.label).sort()).to.eql(['alertC']);
167
+ });
168
+ it('finds namespace members for classes', () => {
169
+ program.setFile('source/main.bs', `
170
+ sub main()
171
+ NameA.
172
+ NameA.NameB.
173
+ NameA.NameB.NameC.
174
+ end sub
175
+ namespace NameA
176
+ sub alertA()
177
+ end sub
178
+ end namespace
179
+ namespace NameA
180
+ sub info()
181
+ end sub
182
+ class MyClassA
183
+ end class
184
+ end namespace
185
+ namespace NameA.NameB
186
+ sub alertB()
187
+ end sub
188
+ class MyClassB
189
+ end class
190
+ end namespace
191
+ namespace NameA.NameB.NameC
192
+ sub alertC()
193
+ end sub
194
+ end namespace
195
+ `);
196
+ program.validate();
197
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 26)).map(x => x.label).sort()).to.eql(['MyClassA', 'NameB', 'alertA', 'info']);
198
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 32)).map(x => x.label).sort()).to.eql(['MyClassB', 'NameC', 'alertB']);
199
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 38)).map(x => x.label).sort()).to.eql(['alertC']);
200
+ });
201
+ it('finds only namespaces that have classes, when new keyword is used', () => {
202
+ program.setFile('source/main.bs', `
203
+ sub main()
204
+ a = new NameA.
205
+ b = new NameA.NameB.
206
+ c = new NameA.NameB.NameC.
207
+ end sub
208
+ namespace NameA
209
+ sub alertA()
210
+ end sub
211
+ end namespace
212
+ namespace NameA
213
+ sub info()
214
+ end sub
215
+ class MyClassA
216
+ end class
217
+ end namespace
218
+ namespace NameA.NoClassA
219
+ end namespace
220
+ namespace NameA.NoClassB
221
+ end namespace
222
+ namespace NameA.NameB
223
+ sub alertB()
224
+ end sub
225
+ class MyClassB
226
+ end class
227
+ end namespace
228
+ namespace NameA.NameB.NoClass
229
+ end namespace
230
+ namespace NameA.NameB.NameC
231
+ sub alertC()
232
+ end sub
233
+ end namespace
234
+ `);
235
+ program.validate();
236
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 34)).map(x => x.label).sort()).to.eql(['MyClassA', 'NameB']);
237
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 40)).map(x => x.label).sort()).to.eql(['MyClassB']);
238
+ (0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 46)).map(x => x.label).sort()).to.be.empty;
239
+ });
240
+ it('should include translated namespace function names for brightscript files', () => {
241
+ program.setFile('source/main.bs', `
242
+ namespace NameA.NameB.NameC
243
+ sub DoSomething()
244
+ end sub
245
+ end namespace
246
+ `);
247
+ program.setFile('source/lib.brs', `
248
+ sub test()
249
+
250
+ end sub
251
+ `);
252
+ program.validate();
253
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/lib.brs`, vscode_languageserver_1.Position.create(2, 23));
254
+ (0, chai_config_spec_1.expect)(completions.map(x => x.label)).to.include('NameA_NameB_NameC_DoSomething');
255
+ });
256
+ it('includes global completions for file with no scope', () => {
257
+ program.setFile('source/main.brs', `
258
+ function Main()
259
+ age = 1
260
+ end function
261
+ `);
262
+ program.validate();
263
+ let completions = program.getCompletions('source/main.brs', vscode_languageserver_1.Position.create(2, 21));
264
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label.toLowerCase() === 'abs')).to.be.lengthOf(1);
265
+ });
266
+ it('filters out text results for top-level function statements', () => {
267
+ program.setFile('source/main.brs', `
268
+ function Main()
269
+ age = 1
270
+ end function
271
+ `);
272
+ program.validate();
273
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 21));
274
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'Main')).to.be.lengthOf(1);
275
+ });
276
+ it('does not filter text results for object properties used in conditional statements', () => {
277
+ program.setFile('source/main.brs', `
278
+ sub Main()
279
+ p.
280
+ end sub
281
+ sub SayHello()
282
+ person = {}
283
+ if person.isAlive then
284
+ print "Hello"
285
+ end if
286
+ end sub
287
+ `);
288
+ program.validate();
289
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 22));
290
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'isAlive')).to.be.lengthOf(1);
291
+ });
292
+ it('does not filter text results for object properties used in assignments', () => {
293
+ program.setFile('source/main.brs', `
294
+ sub Main()
295
+ p.
296
+ end sub
297
+ sub SayHello()
298
+ person = {}
299
+ localVar = person.name
300
+ end sub
301
+ `);
302
+ program.validate();
303
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 22));
304
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'name')).to.be.lengthOf(1);
305
+ });
306
+ it('does not filter text results for object properties', () => {
307
+ program.setFile('source/main.brs', `
308
+ sub Main()
309
+ p.
310
+ end sub
311
+ sub SayHello()
312
+ person = {}
313
+ person.name = "bob"
314
+ end sub
315
+ `);
316
+ program.validate();
317
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 22));
318
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'name')).to.be.lengthOf(1);
319
+ });
320
+ it('filters out text results for local vars used in conditional statements', () => {
321
+ program.setFile('source/main.brs', `
322
+ sub Main()
323
+
324
+ end sub
325
+ sub SayHello()
326
+ isTrue = true
327
+ if isTrue then
328
+ print "is true"
329
+ end if
330
+ end sub
331
+ `);
332
+ program.validate();
333
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
334
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'isTrue')).to.be.lengthOf(0);
335
+ });
336
+ it('filters out text results for local variable assignments', () => {
337
+ program.setFile('source/main.brs', `
338
+ sub Main()
339
+
340
+ end sub
341
+ sub SayHello()
342
+ message = "Hello"
343
+ end sub
344
+ `);
345
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
346
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'message')).to.be.lengthOf(0);
347
+ });
348
+ it('filters out text results for local variables used in assignments', () => {
349
+ program.setFile('source/main.brs', `
350
+ sub Main()
351
+
352
+ end sub
353
+ sub SayHello()
354
+ message = "Hello"
355
+ otherVar = message
356
+ end sub
357
+ `);
358
+ program.validate();
359
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
360
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'message')).to.be.lengthOf(0);
361
+ });
362
+ it('does not suggest local variables when initiated to the right of a period', () => {
363
+ program.setFile('source/main.brs', `
364
+ function Main()
365
+ helloMessage = "jack"
366
+ person.hello
367
+ end function
368
+ `);
369
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 32));
370
+ (0, chai_config_spec_1.expect)(completions.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Variable).map(x => x.label)).not.to.contain('helloMessage');
371
+ });
372
+ it('finds all file paths when initiated on xml uri', () => {
373
+ let xmlPath = (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/components/component1.xml`;
374
+ program.setFile('components/component1.xml', (0, testHelpers_spec_1.trim) `
375
+ <?xml version="1.0" encoding="utf-8" ?>
376
+ <component name="HeroScene" extends="Scene">
377
+ <script type="text/brightscript" uri="" />
378
+ </component>
379
+ `);
380
+ program.setFile('components/component1.brs', '');
381
+ program.validate();
382
+ let completions = program.getCompletions(xmlPath, vscode_languageserver_1.Position.create(2, 42));
383
+ (0, chai_config_spec_1.expect)(completions[0]).to.include({
384
+ kind: vscode_languageserver_1.CompletionItemKind.File,
385
+ label: 'component1.brs'
386
+ });
387
+ (0, chai_config_spec_1.expect)(completions[1]).to.include({
388
+ kind: vscode_languageserver_1.CompletionItemKind.File,
389
+ label: 'pkg:/components/component1.brs'
390
+ });
391
+ //it should NOT include the global methods
392
+ (0, chai_config_spec_1.expect)(completions).to.be.lengthOf(2);
393
+ });
394
+ it('get all functions and properties in scope when doing any dotted get on non m', () => {
395
+ program.setFile('source/main.bs', `
396
+ sub main()
397
+ thing.anonPropA = "foo"
398
+ thing.anonPropB = "bar"
399
+ thing.person
400
+ end sub
401
+ class MyClassA
402
+ personName = "rafa"
403
+ personAName = "rafaA"
404
+ function personAMethodA()
405
+ end function
406
+ function personAMethodB()
407
+ end function
408
+ end class
409
+ namespace NameA
410
+ sub alertA()
411
+ end sub
412
+ end namespace
413
+ namespace NameA.NameB
414
+ sub alertB()
415
+ end sub
416
+ class MyClassB
417
+ personName = "roger"
418
+ personBName = "rogerB"
419
+ function personAMethodC()
420
+ end function
421
+ function personBMethodA()
422
+ end function
423
+ function personBMethodB()
424
+ end function
425
+ end class
426
+ end namespace
427
+ namespace NameA.NameB.NameC
428
+ sub alertC()
429
+ end sub
430
+ end namespace
431
+ `);
432
+ program.validate();
433
+ //note - we let the vscode extension do the filtering, so we still return everything; otherwise it exhibits strange behaviour in the IDE
434
+ (0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 32))).map(x => x.label).sort()).to.eql(['NameB', 'NameC', 'anonPropA', 'anonPropB', 'person', 'personAMethodA', 'personAMethodB', 'personAMethodC', 'personAName', 'personBMethodA', 'personBMethodB', 'personBName', 'personName']);
435
+ });
436
+ it('get all functions and properties relevant for m ', () => {
437
+ program.setFile('source/main.bs', `
438
+ class MyClassA
439
+ function new()
440
+ m.
441
+ end function
442
+ personName = "rafa"
443
+ personAName = "rafaA"
444
+ function personAMethodA()
445
+ end function
446
+ function personAMethodB()
447
+ end function
448
+ end class
449
+ class MyClassB
450
+ personName = "roger"
451
+ personBName = "rogerB"
452
+ function personAMethodC()
453
+ end function
454
+ function personBMethodA()
455
+ end function
456
+ function personBMethodB()
457
+ end function
458
+ end class
459
+ class MyClassC extends MyClassA
460
+ function new()
461
+ m.
462
+ end function
463
+ personCName = "rogerC"
464
+ function personCMethodC()
465
+ end function
466
+ function personCMethodA()
467
+ end function
468
+ function personCMethodB()
469
+ end function
470
+ end class
471
+ sub alertC()
472
+ end sub
473
+ `);
474
+ program.validate();
475
+ const myClassACompletions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 26));
476
+ // remove completions with sortText (they are built in methods), then sort the remaining labels
477
+ const myClassACompletionsSorted = myClassACompletions.filter(x => !x.sortText).map(x => x.label).sort();
478
+ (0, chai_config_spec_1.expect)(myClassACompletionsSorted).to.eql(['personAMethodA', 'personAMethodB', 'personAName', 'personName']);
479
+ const myClassCCompletions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(24, 26));
480
+ // remove completions with sortText (they are built in methods), then sort the remaining labels
481
+ const myClassCCompletionsSorted = myClassCCompletions.filter(x => !x.sortText).map(x => x.label).sort();
482
+ (0, chai_config_spec_1.expect)(myClassCCompletionsSorted).to.eql(['personAMethodA', 'personAMethodB', 'personAName', 'personCMethodA', 'personCMethodB', 'personCMethodC', 'personCName', 'personName']);
483
+ });
484
+ it.skip('include non-namespaced classes in the list of general output', () => {
485
+ program.setFile('source/main.bs', `
486
+ function regularFunc()
487
+ MyClass
488
+ end function
489
+ sub alertC()
490
+ end sub
491
+ class MyClassA
492
+ end class
493
+ class MyClassB
494
+ end class
495
+ class MyClassC extends MyClassA
496
+ end class
497
+ `);
498
+ (0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 26))).map(x => x.label).sort()).to.include.members(['MyClassA', 'MyClassB', 'MyClassC']);
499
+ });
500
+ it('only include classes when using new keyword', () => {
501
+ program.setFile('source/main.bs', `
502
+ class MyClassA
503
+ end class
504
+ class MyClassB
505
+ end class
506
+ class MyClassC extends MyClassA
507
+ end class
508
+ function regularFunc()
509
+ new MyClass
510
+ end function
511
+ sub alertC()
512
+ end sub
513
+ `);
514
+ program.validate();
515
+ (0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 29))).map(x => x.label).sort()).to.eql(['MyClassA', 'MyClassB', 'MyClassC']);
516
+ });
517
+ it('gets completions when using callfunc invocation', () => {
518
+ program.setFile('source/main.bs', `
519
+ function doStuff(myNode)
520
+ myNode@.sayHello(1, 2)
521
+ end function
522
+ `);
523
+ program.setFile('components/MyNode.bs', `
524
+ function sayHello(text, text2)
525
+ end function
526
+ `);
527
+ program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
528
+ <component name="Component1" extends="Scene">
529
+ <script type="text/brightscript" uri="pkg:/components/MyNode.bs" />
530
+ <interface>
531
+ <function name="sayHello"/>
532
+ </interface>
533
+ </component>`);
534
+ program.validate();
535
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
536
+ (0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 30))).map(x => x.label).sort()).to.eql(['sayHello']);
537
+ });
538
+ it('gets completions for callfunc invocation with multiple nodes', () => {
539
+ program.setFile('source/main.bs', `
540
+ function main()
541
+ myNode@.sayHello(arg1)
542
+ end function
543
+ `);
544
+ program.setFile('components/MyNode.bs', `
545
+ function sayHello(text, text2)
546
+ end function
547
+ function sayHello2(text, text2)
548
+ end function
549
+ `);
550
+ program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
551
+ <component name="Component1" extends="Scene">
552
+ <script type="text/brightscript" uri="pkg:/components/MyNode.bs" />
553
+ <interface>
554
+ <function name="sayHello"/>
555
+ <function name="sayHello2"/>
556
+ </interface>
557
+ </component>`);
558
+ program.setFile('components/MyNode2.bs', `
559
+ function sayHello3(text, text2)
560
+ end function
561
+ function sayHello4(text, text2)
562
+ end function
563
+ `);
564
+ program.setFile('components/MyNode2.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
565
+ <component name="Component2" extends="Scene">
566
+ <script type="text/brightscript" uri="pkg:/components/MyNode2.bs" />
567
+ <interface>
568
+ <function name="sayHello3"/>
569
+ <function name="sayHello4"/>
570
+ </interface>
571
+ </component>`);
572
+ program.validate();
573
+ (0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 30))).map(x => x.label).sort()).to.eql(['sayHello', 'sayHello2', 'sayHello3', 'sayHello4']);
574
+ });
575
+ it('gets completions for callfunc invocation with multiple nodes and validates single code completion results', () => {
576
+ program.setFile('source/main.bs', `
577
+ function main()
578
+ ParentNode@.sayHello(arg1)
579
+ end function
580
+ `);
581
+ program.setFile('components/ParentNode.bs', `
582
+ function sayHello(text, text2)
583
+ end function
584
+ `);
585
+ program.setFile('components/ParentNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
586
+ <component name="ParentNode" extends="Scene">
587
+ <script type="text/brightscript" uri="pkg:/components/ParentNode.bs" />
588
+ <interface>
589
+ <function name="sayHello"/>
590
+ </interface>
591
+ </component>`);
592
+ program.setFile('components/ChildNode.bs', `
593
+ function sayHello(text, text2)
594
+ end function
595
+ `);
596
+ program.setFile('components/ChildNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
597
+ <component name="ChildNode" extends="ParentNode">
598
+ <script type="text/brightscript" uri="pkg:/components/ChildNode.bs" />
599
+ </component>`);
600
+ program.validate();
601
+ (0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 31))).map(x => x.label).sort()).to.eql(['sayHello']);
602
+ });
603
+ it('gets completions for extended nodes with callfunc invocation - ensure overridden methods included', () => {
604
+ program.setFile('source/main.bs', `
605
+ function main()
606
+ myNode@.sayHello(arg1)
607
+ end function
608
+ `);
609
+ program.setFile('components/MyNode.bs', `
610
+ function sayHello(text, text2)
611
+ end function
612
+ function sayHello2(text, text2)
613
+ end function
614
+ `);
615
+ program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
616
+ <component name="Component1" extends="Scene">
617
+ <script type="text/brightscript" uri="pkg:/components/MyNode.bs" />
618
+ <interface>
619
+ <function name="sayHello"/>
620
+ <function name="sayHello2"/>
621
+ </interface>
622
+ </component>`);
623
+ program.setFile('components/MyNode2.bs', `
624
+ function sayHello3(text, text2)
625
+ end function
626
+ function sayHello2(text, text2)
627
+ end function
628
+ function sayHello4(text, text2)
629
+ end function
630
+ `);
631
+ program.setFile('components/MyNode2.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
632
+ <component name="Component2" extends="Component1">
633
+ <script type="text/brightscript" uri="pkg:/components/MyNode2.bs" />
634
+ <interface>
635
+ <function name="sayHello3"/>
636
+ <function name="sayHello4"/>
637
+ </interface>
638
+ </component>`);
639
+ program.validate();
640
+ (0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 30))).map(x => x.label).sort()).to.eql(['sayHello', 'sayHello2', 'sayHello3', 'sayHello4']);
641
+ });
642
+ describe('getBrsFileCompletions', () => {
643
+ it('does not crash on expression with missing range', () => {
644
+ const file = program.setFile('source/main.brs', `
645
+ sub main()
646
+ message = alpha
647
+ end sub
648
+ `);
649
+ const assignment = file.ast.findChild(reflection_1.isAssignmentStatement);
650
+ // destroy the `range` for this value
651
+ delete assignment.value.range;
652
+ const processor = new CompletionsProcessor_1.CompletionsProcessor({ scopes: [] });
653
+ (0, chai_config_spec_1.expect)(
654
+ // message = alpha|
655
+ processor['getBrsFileCompletions'](util_1.default.createPosition(2, 39), file, [])).to.eql({ global: [], scoped: [] });
656
+ });
657
+ it('does not crash when functionExpression.body is undefined (somehow...)', () => {
658
+ const file = program.setFile('source/main.brs', `
659
+ sub main()
660
+ message = alpha
661
+ end sub
662
+ `);
663
+ const func = file.ast.findChild(reflection_1.isFunctionExpression);
664
+ // destroy the `body` for this value
665
+ delete func.body;
666
+ const processor = new CompletionsProcessor_1.CompletionsProcessor({});
667
+ (0, chai_config_spec_1.expect)(
668
+ // message = alpha|
669
+ processor['getBrsFileCompletions'](util_1.default.createPosition(2, 39), file, program.getScopesForFile(file))).to.eql({ global: [], scoped: [] });
670
+ });
671
+ });
672
+ describe('getCompletions', () => {
673
+ it('returns all functions in scope', () => {
674
+ program.setFile('source/main.brs', `
675
+ sub Main()
676
+
677
+ end sub
678
+
679
+ sub ActionA()
680
+ end sub
681
+ `);
682
+ program.setFile('source/lib.brs', `
683
+ sub ActionB()
684
+ end sub
685
+ `);
686
+ program.validate();
687
+ let completions = program
688
+ //get completions
689
+ .getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, util_1.default.createPosition(2, 10))
690
+ //only keep the label property for this test
691
+ .map(x => pick(x, 'label'));
692
+ (0, chai_config_spec_1.expect)(completions).to.deep.include({ label: 'Main' });
693
+ (0, chai_config_spec_1.expect)(completions).to.deep.include({ label: 'ActionA' });
694
+ (0, chai_config_spec_1.expect)(completions).to.deep.include({ label: 'ActionB' });
695
+ });
696
+ it('returns all variables in scope', () => {
697
+ program.setFile('source/main.brs', `
698
+ sub Main()
699
+ name = "bob"
700
+ age = 20
701
+ shoeSize = 12.5
702
+ end sub
703
+ sub ActionA()
704
+ end sub
705
+ `);
706
+ program.setFile('source/lib.brs', `
707
+ sub ActionB()
708
+ end sub
709
+ `);
710
+ program.validate();
711
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, util_1.default.createPosition(2, 24));
712
+ let labels = completions.map(x => pick(x, 'label'));
713
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'Main' });
714
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'ActionA' });
715
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'ActionB' });
716
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'name' });
717
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'age' });
718
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'shoeSize' });
719
+ });
720
+ it('returns empty set when out of range', () => {
721
+ const position = util_1.default.createPosition(99, 99);
722
+ const mainFile = program.setFile('source/main.brs', '');
723
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, position);
724
+ const completionProcessor = new CompletionsProcessor_1.CompletionsProcessor({
725
+ program: program,
726
+ file: mainFile,
727
+ position: position,
728
+ scopes: [],
729
+ completions: []
730
+ });
731
+ program.validate();
732
+ //get the name of all global completions
733
+ const globalCompletions = program.globalScope.getAllFiles().flatMap((x) => {
734
+ return completionProcessor.getBrsFileCompletions(position, x, program.getScopesForFile(x)).global;
735
+ }).map(x => x.label);
736
+ //filter out completions from global scope
737
+ completions = completions.filter(x => !globalCompletions.includes(x.label));
738
+ (0, chai_config_spec_1.expect)(completions).to.be.empty;
739
+ });
740
+ it('finds parameters', () => {
741
+ program.setFile('source/main.brs', `
742
+ sub Main(count = 1)
743
+ firstName = "bob"
744
+ age = 21
745
+ shoeSize = 10
746
+ end sub
747
+ `);
748
+ program.validate();
749
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
750
+ let labels = completions.map(x => pick(x, 'label'));
751
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'count' });
752
+ });
753
+ it('finds parameters when file is in multiple scopes', () => {
754
+ program.setFile('source/main.bs', `
755
+ sub Main(count = 1)
756
+ firstName = "bob"
757
+ age = 21
758
+ shoeSize = 10
759
+ end sub
760
+ `);
761
+ program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
762
+ <component name="Component2" extends="Component1">
763
+ <script type="text/brightscript" uri="pkg:/source/main.bs" />
764
+ <interface>
765
+ <function name="sayHello3"/>
766
+ <function name="sayHello4"/>
767
+ </interface>
768
+ </component>`);
769
+ program.validate();
770
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 10));
771
+ let labels = completions.map(x => pick(x, 'label'));
772
+ (0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'count' });
773
+ });
774
+ });
775
+ });
776
+ describe('getCompletions - BrsFile.spec', () => {
777
+ it('does not crash for callfunc on a function call', () => {
778
+ const file = program.setFile('source/main.brs', `
779
+ sub main()
780
+ getManager()@.
781
+ end sub
782
+ `);
783
+ program.validate();
784
+ (0, chai_config_spec_1.expect)(() => {
785
+ program.getCompletions(file.srcPath, util_1.default.createPosition(2, 34));
786
+ }).not.to.throw;
787
+ });
788
+ it('suggests pkg paths in strings that match that criteria', () => {
789
+ program.setFile('source/main.brs', `
790
+ sub main()
791
+ print "pkg:"
792
+ end sub
793
+ `);
794
+ program.validate();
795
+ const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
796
+ const names = result.map(x => x.label);
797
+ (0, chai_config_spec_1.expect)(names.sort()).to.eql([
798
+ 'pkg:/source/main.brs'
799
+ ]);
800
+ });
801
+ it('suggests libpkg paths in strings that match that criteria', () => {
802
+ program.setFile('source/main.brs', `
803
+ sub main()
804
+ print "libpkg:"
805
+ end sub
806
+ `);
807
+ program.validate();
808
+ const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
809
+ const names = result.map(x => x.label);
810
+ (0, chai_config_spec_1.expect)(names.sort()).to.eql([
811
+ 'libpkg:/source/main.brs'
812
+ ]);
813
+ });
814
+ it('suggests pkg paths in template strings', () => {
815
+ program.setFile('source/main.brs', `
816
+ sub main()
817
+ print \`pkg:\`
818
+ end sub
819
+ `);
820
+ program.validate();
821
+ const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
822
+ const names = result.map(x => x.label);
823
+ (0, chai_config_spec_1.expect)(names.sort()).to.eql([
824
+ 'pkg:/source/main.brs'
825
+ ]);
826
+ });
827
+ it('waits for the file to be processed before collecting completions', () => {
828
+ //eslint-disable-next-line @typescript-eslint/no-floating-promises
829
+ program.setFile('source/main.brs', `
830
+ sub Main()
831
+ print "hello"
832
+ Say
833
+ end sub
834
+
835
+ sub SayHello()
836
+ end sub
837
+ `);
838
+ program.validate();
839
+ let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
840
+ let names = result.map(x => x.label);
841
+ (0, chai_config_spec_1.expect)(names).to.includes('Main');
842
+ (0, chai_config_spec_1.expect)(names).to.includes('SayHello');
843
+ });
844
+ it('includes every type of item at base level', () => {
845
+ program.setFile('source/main.bs', `
846
+ sub main()
847
+ print
848
+ end sub
849
+ sub speak()
850
+ end sub
851
+ namespace stuff
852
+ end namespace
853
+ class Person
854
+ end class
855
+ enum Direction
856
+ end enum
857
+ `);
858
+ program.validate();
859
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 26)), [{
860
+ label: 'main',
861
+ kind: vscode_languageserver_1.CompletionItemKind.Function
862
+ }, {
863
+ label: 'speak',
864
+ kind: vscode_languageserver_1.CompletionItemKind.Function
865
+ }, {
866
+ label: 'stuff',
867
+ kind: vscode_languageserver_1.CompletionItemKind.Module
868
+ }, {
869
+ label: 'Person',
870
+ kind: vscode_languageserver_1.CompletionItemKind.Class
871
+ }, {
872
+ label: 'Direction',
873
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
874
+ }]);
875
+ });
876
+ describe('namespaces', () => {
877
+ it('gets full namespace completions at any point through the leading identifier', () => {
878
+ program.setFile('source/main.bs', `
879
+ sub main()
880
+ foo.bar
881
+ end sub
882
+
883
+ namespace foo.bar
884
+ end namespace
885
+
886
+ class Person
887
+ end class
888
+ `);
889
+ program.validate();
890
+ const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 24)).map(x => x.label);
891
+ (0, chai_config_spec_1.expect)(result).includes('main');
892
+ (0, chai_config_spec_1.expect)(result).includes('foo');
893
+ (0, chai_config_spec_1.expect)(result).includes('Person');
894
+ });
895
+ it('gets namespace completions', () => {
896
+ program.setFile('source/main.bs', `
897
+ namespace foo.bar
898
+ function sayHello()
899
+ end function
900
+ end namespace
901
+
902
+ sub Main()
903
+ print "hello"
904
+ foo.ba
905
+ foo.bar.
906
+ end sub
907
+ `);
908
+ program.validate();
909
+ let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 30));
910
+ let names = result.map(x => x.label);
911
+ (0, chai_config_spec_1.expect)(names).to.includes('bar');
912
+ result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(9, 32));
913
+ names = result.map(x => x.label);
914
+ (0, chai_config_spec_1.expect)(names).to.includes('sayHello');
915
+ });
916
+ });
917
+ it('always includes `m`', () => {
918
+ program.setFile('source/main.brs', `
919
+ sub Main()
920
+
921
+ end sub
922
+ `);
923
+ program.validate();
924
+ let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
925
+ let names = result.map(x => x.label);
926
+ (0, chai_config_spec_1.expect)(names).to.contain('m');
927
+ });
928
+ it('does not fail for missing previousToken', () => {
929
+ //add a single character to the file, and get completions after it
930
+ program.setFile('source/main.brs', `i`);
931
+ program.validate();
932
+ (0, chai_config_spec_1.expect)(() => {
933
+ program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(0, 1)).map(x => x.label);
934
+ }).not.to.throw;
935
+ });
936
+ it.skip('includes all keywords`', () => {
937
+ program.setFile('source/main.brs', `
938
+ sub Main()
939
+
940
+ end sub
941
+ `);
942
+ program.validate();
943
+ let keywords = Object.keys(TokenKind_1.Keywords).filter(x => !x.includes(' '));
944
+ //inside the function
945
+ let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
946
+ let names = result.map(x => x.label);
947
+ for (let keyword of keywords) {
948
+ (0, chai_config_spec_1.expect)(names).to.include(keyword);
949
+ }
950
+ //outside the function
951
+ result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(4, 8));
952
+ names = result.map(x => x.label);
953
+ for (let keyword of keywords) {
954
+ (0, chai_config_spec_1.expect)(names).to.include(keyword);
955
+ }
956
+ });
957
+ it('does not provide completions within a comment', () => {
958
+ program.setFile('source/main.brs', `
959
+ sub Main()
960
+ 'some comment
961
+ end sub
962
+ `);
963
+ program.validate();
964
+ //inside the function
965
+ let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 33));
966
+ (0, chai_config_spec_1.expect)(result).to.be.lengthOf(0);
967
+ });
968
+ it('does not provide duplicate entries for variables', () => {
969
+ program.setFile('source/main.brs', `
970
+ sub Main()
971
+ name = "bob"
972
+ age = 12
973
+ name = "john"
974
+ end sub
975
+ `);
976
+ program.validate();
977
+ let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
978
+ let count = result.reduce((total, x) => {
979
+ return x.label === 'name' ? total + 1 : total;
980
+ }, 0);
981
+ (0, chai_config_spec_1.expect)(count).to.equal(1);
982
+ });
983
+ it('does not include `as` and `string` text options when used in function params', () => {
984
+ program.setFile('source/main.brs', `
985
+ sub Main(name as string)
986
+
987
+ end sub
988
+ `);
989
+ program.validate();
990
+ let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
991
+ (0, chai_config_spec_1.expect)(result.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Text)).not.to.contain('as');
992
+ (0, chai_config_spec_1.expect)(result.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Text)).not.to.contain('string');
993
+ });
994
+ it('does not provide intellisense results when inside a comment', () => {
995
+ program.setFile('source/main.brs', `
996
+ sub Main(name as string)
997
+ 'this is a comment
998
+ end sub
999
+ `);
1000
+ program.validate();
1001
+ let results = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 30));
1002
+ (0, chai_config_spec_1.expect)(results).to.be.empty;
1003
+ });
1004
+ it('does provide intellisence for labels only after a goto keyword', () => {
1005
+ var _a;
1006
+ program.setFile('source/main.brs', `
1007
+ sub Main(name as string)
1008
+ something:
1009
+ goto \nend sub
1010
+ `);
1011
+ program.validate();
1012
+ let results = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 25));
1013
+ (0, chai_config_spec_1.expect)(results.length).to.equal(1);
1014
+ (0, chai_config_spec_1.expect)((_a = results[0]) === null || _a === void 0 ? void 0 : _a.label).to.equal('something');
1015
+ });
1016
+ it('includes function parameters at the end of the function', () => {
1017
+ program.setFile('source/main.brs', `
1018
+ sub main(myFuncParam as string)
1019
+ myValue = 234
1020
+ print
1021
+ end sub
1022
+ `);
1023
+ program.validate();
1024
+ // print |
1025
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 28));
1026
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1027
+ label: 'myFuncParam',
1028
+ kind: vscode_languageserver_1.CompletionItemKind.Variable
1029
+ }, {
1030
+ label: 'myValue',
1031
+ kind: vscode_languageserver_1.CompletionItemKind.Variable
1032
+ }]);
1033
+ });
1034
+ it('includes function parameters at the end of the function in namespace', () => {
1035
+ program.setFile('source/main.bs', `
1036
+ namespace alpha
1037
+ function main(param)
1038
+ print
1039
+ myValue = 234
1040
+ end function
1041
+ end namespace
1042
+ `);
1043
+ program.validate();
1044
+ // print |
1045
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 33));
1046
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1047
+ label: 'param',
1048
+ kind: vscode_languageserver_1.CompletionItemKind.Variable
1049
+ }]);
1050
+ });
1051
+ it('treats class name as a function', () => {
1052
+ program.setFile('source/main.bs', `
1053
+ class SomeKlass
1054
+ name as string
1055
+ end class
1056
+
1057
+ sub test()
1058
+ print SomeKlass.
1059
+ end sub
1060
+ `);
1061
+ program.validate();
1062
+ // print SomeKlass.|
1063
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(6, 36));
1064
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1065
+ label: 'ifFunction',
1066
+ kind: vscode_languageserver_1.CompletionItemKind.Interface
1067
+ }]);
1068
+ });
1069
+ it('treats namespaced class name as a function', () => {
1070
+ program.setFile('source/main.bs', `
1071
+ namespace alpha
1072
+ class SomeKlass
1073
+ name as string
1074
+ end class
1075
+ end namespace
1076
+
1077
+ sub test()
1078
+ print alpha.SomeKlass.toStr()
1079
+ end sub
1080
+ `);
1081
+ program.validate();
1082
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1083
+ // print alpha.SomeKlass.|
1084
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 42));
1085
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1086
+ label: 'ifFunction',
1087
+ kind: vscode_languageserver_1.CompletionItemKind.Interface
1088
+ }]);
1089
+ });
1090
+ });
1091
+ describe('getCompletions - XmlFile.spec', () => {
1092
+ it('formats completion paths with proper slashes', () => {
1093
+ let scriptPath = (0, util_1.standardizePath) `C:/app/components/component1/component1.brs`;
1094
+ program.files[scriptPath] = new BrsFile_1.BrsFile({ srcPath: scriptPath, destPath: (0, util_1.standardizePath) `components/component1/component1.brs`, program: program });
1095
+ let xmlFile = new XmlFile_1.XmlFile({
1096
+ srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/components/component1/component1.xml`,
1097
+ destPath: (0, util_1.standardizePath) `components/component1/component1.xml`,
1098
+ program: program
1099
+ });
1100
+ xmlFile.parser.references.scriptTagImports.push({
1101
+ destPath: (0, util_1.standardizePath) `components/component1/component1.brs`,
1102
+ text: 'component1.brs',
1103
+ filePathRange: vscode_languageserver_1.Range.create(1, 1, 1, 1)
1104
+ });
1105
+ const processesor = new CompletionsProcessor_1.CompletionsProcessor(null);
1106
+ const completions = processesor.getXmlFileCompletions(vscode_languageserver_1.Position.create(1, 1), xmlFile);
1107
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1108
+ label: 'component1.brs',
1109
+ kind: vscode_languageserver_1.CompletionItemKind.File
1110
+ }, {
1111
+ label: 'pkg:/components/component1/component1.brs',
1112
+ kind: vscode_languageserver_1.CompletionItemKind.File
1113
+ }]);
1114
+ });
1115
+ //TODO - refine this test once cdata scripts are supported
1116
+ it('prevents scope completions entirely', () => {
1117
+ program.setFile('components/component1.brs', ``);
1118
+ let xmlFile = program.setFile('components/component1.xml', (0, testHelpers_spec_1.trim) `
1119
+ <?xml version="1.0" encoding="utf-8" ?>
1120
+ <component name="ParentScene" extends="GrandparentScene">
1121
+ <script type="text/brightscript" uri="./Component1.brs" />
1122
+ </component>
1123
+ `);
1124
+ program.validate();
1125
+ (0, chai_config_spec_1.expect)(program.getCompletions(xmlFile.srcPath, vscode_languageserver_1.Position.create(1, 1))).to.be.empty;
1126
+ });
1127
+ });
1128
+ describe('documentation', () => {
1129
+ it('returns documentation when possible', () => {
1130
+ program.setFile('source/main.brs', `
1131
+ sub Main()
1132
+ print "hello"
1133
+ Say
1134
+ end sub
1135
+
1136
+ ' Says hello to the world
1137
+ sub SayHello()
1138
+ end sub
1139
+ `);
1140
+ program.validate();
1141
+ // Say|
1142
+ let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 22));
1143
+ //it should find the completions for the global scope
1144
+ (0, chai_config_spec_1.expect)(completions).to.be.length.greaterThan(0);
1145
+ //it should find documentation for completions
1146
+ (0, chai_config_spec_1.expect)(completions.filter(x => !!x.documentation)).to.have.length.greaterThan(0);
1147
+ });
1148
+ });
1149
+ describe('getPartialVariableName', () => {
1150
+ let entry = {
1151
+ src: `${testHelpers_spec_1.rootDir}/source/lib.brs`,
1152
+ dest: `source/lib.brs`
1153
+ };
1154
+ it('creates proper tokens', () => {
1155
+ const file = program.setFile(entry, `call(ModuleA.ModuleB.ModuleC.`);
1156
+ (0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[7])).to.equal('ModuleA.ModuleB.ModuleC.');
1157
+ (0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[6])).to.equal('ModuleA.ModuleB.ModuleC');
1158
+ (0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[5])).to.equal('ModuleA.ModuleB.');
1159
+ (0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[4])).to.equal('ModuleA.ModuleB');
1160
+ (0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[3])).to.equal('ModuleA.');
1161
+ (0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[2])).to.equal('ModuleA');
1162
+ });
1163
+ });
1164
+ describe('import completions', () => {
1165
+ it('should show import completions for a single scope', () => {
1166
+ program.setFile('source/common.bs', `
1167
+ import "
1168
+ `);
1169
+ program.setFile('source/common2.bs', `
1170
+ sub SayHello()
1171
+ end sub
1172
+ `);
1173
+ program.setFile('components/widget.xml', (0, testHelpers_spec_1.trim) `
1174
+ <?xml version="1.0" encoding="utf-8" ?>
1175
+ <component name="Widget" extends="Group">
1176
+ <script uri="widget.bs"/>
1177
+ </component>
1178
+ `);
1179
+ program.setFile('components/widget.bs', `
1180
+ import "pkg:/source/common.bs"
1181
+ `);
1182
+ program.validate();
1183
+ // import "|
1184
+ const completions = program.getCompletions('source/common.bs', util_1.default.createPosition(1, 25));
1185
+ (0, chai_config_spec_1.expect)(completions).to.exist;
1186
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('common2.bs');
1187
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('../components/widget.bs');
1188
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('pkg:/components/widget.bs');
1189
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('pkg:/source/common2.bs');
1190
+ });
1191
+ it('should show import completions with original extensions', () => {
1192
+ program.setFile('source/common.bs', `
1193
+ import "
1194
+ `);
1195
+ program.setFile('source/common2.brs', `
1196
+ sub SayHello()
1197
+ end sub
1198
+ `);
1199
+ program.setFile('components/widget.xml', (0, testHelpers_spec_1.trim) `
1200
+ <?xml version="1.0" encoding="utf-8" ?>
1201
+ <component name="Widget" extends="Group">
1202
+ <script uri="widget.bs"/>
1203
+ </component>
1204
+ `);
1205
+ program.setFile('components/widget.bs', `
1206
+ import "pkg:/source/common.bs"
1207
+ `);
1208
+ program.validate();
1209
+ // import "|
1210
+ const completions = program.getCompletions('source/common.bs', util_1.default.createPosition(1, 25));
1211
+ (0, chai_config_spec_1.expect)(completions).to.exist;
1212
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('common2.brs');
1213
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('../components/widget.bs');
1214
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('pkg:/components/widget.bs');
1215
+ (0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('pkg:/source/common2.brs');
1216
+ });
1217
+ });
1218
+ describe('const completions', () => {
1219
+ it('shows up in standard completions', () => {
1220
+ program.setFile('source/main.bs', `
1221
+ const API_KEY = "123"
1222
+ sub log(message)
1223
+ log()
1224
+ end sub
1225
+ `);
1226
+ program.validate();
1227
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 24));
1228
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(
1229
+ // log(|)
1230
+ completions, [{
1231
+ label: 'API_KEY',
1232
+ kind: vscode_languageserver_1.CompletionItemKind.Constant
1233
+ }]);
1234
+ });
1235
+ it('shows up in namespace completions', () => {
1236
+ program.setFile('source/main.bs', `
1237
+ namespace constants
1238
+ const API_KEY = "123"
1239
+ end namespace
1240
+ sub log(message)
1241
+ log(constants.)
1242
+ end sub
1243
+ `);
1244
+ program.validate();
1245
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(
1246
+ // log(|)
1247
+ program.getCompletions('source/main.bs', util_1.default.createPosition(5, 34)), [{
1248
+ label: 'API_KEY',
1249
+ kind: vscode_languageserver_1.CompletionItemKind.Constant
1250
+ }]);
1251
+ });
1252
+ });
1253
+ describe('enum completions', () => {
1254
+ it('does not crash when completing enum members with unsupported values', () => {
1255
+ program.setFile('source/main.bs', `
1256
+ sub Main()
1257
+ direction.obj
1258
+ end sub
1259
+ enum Direction
1260
+ up
1261
+ down
1262
+ obj = {}
1263
+ end enum
1264
+ `);
1265
+ program.validate();
1266
+ // direction.|obj
1267
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 30)), [{
1268
+ label: 'up',
1269
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1270
+ }, {
1271
+ label: 'down',
1272
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1273
+ }, {
1274
+ label: 'obj',
1275
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1276
+ }]);
1277
+ });
1278
+ it('gets enum statement completions from global enum', () => {
1279
+ program.setFile('source/main.bs', `
1280
+ sub Main()
1281
+ direction.down
1282
+ end sub
1283
+ enum Direction
1284
+ up
1285
+ down
1286
+ end enum
1287
+ `);
1288
+ program.validate();
1289
+ // |direction.down
1290
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 20)), [{
1291
+ label: 'Direction',
1292
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1293
+ }]);
1294
+ // dire|ction.down
1295
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 24)), [{
1296
+ label: 'Direction',
1297
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1298
+ }]);
1299
+ // direction|.down
1300
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 29)), [{
1301
+ label: 'Direction',
1302
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1303
+ }]);
1304
+ });
1305
+ it('gets enum member completions from global enum', () => {
1306
+ program.setFile('source/main.bs', `
1307
+ sub Main()
1308
+ direction.down
1309
+ end sub
1310
+ enum Direction
1311
+ up
1312
+ down
1313
+ end enum
1314
+ `);
1315
+ program.validate();
1316
+ // direction.|down
1317
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 30)), [{
1318
+ label: 'up',
1319
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1320
+ }, {
1321
+ label: 'down',
1322
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1323
+ }]);
1324
+ // direction.do|wn
1325
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32)), [{
1326
+ label: 'up',
1327
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1328
+ }, {
1329
+ label: 'down',
1330
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1331
+ }]);
1332
+ // direction.down|
1333
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 34)), [{
1334
+ label: 'up',
1335
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1336
+ }, {
1337
+ label: 'down',
1338
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1339
+ }]);
1340
+ });
1341
+ it('gets enum statement completions from namespaced enum', () => {
1342
+ program.setFile('source/main.bs', `
1343
+ sub Main()
1344
+ enums.direction.down
1345
+ end sub
1346
+ namespace enums
1347
+ enum Direction
1348
+ up
1349
+ down
1350
+ end enum
1351
+ end namespace
1352
+ `);
1353
+ program.validate();
1354
+ // enums.|direction.down
1355
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 26)), [{
1356
+ label: 'Direction',
1357
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1358
+ }]);
1359
+ // enums.dire|ction.down
1360
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 30)), [{
1361
+ label: 'Direction',
1362
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1363
+ }]);
1364
+ // enums.direction|.down
1365
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 35)), [{
1366
+ label: 'Direction',
1367
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1368
+ }]);
1369
+ });
1370
+ it('gets enum member completions from namespaced enum', () => {
1371
+ program.setFile('source/main.bs', `
1372
+ sub Main()
1373
+ enums.direction.down
1374
+ end sub
1375
+ namespace enums
1376
+ enum Direction
1377
+ up
1378
+ down
1379
+ end enum
1380
+ end namespace
1381
+ `);
1382
+ program.validate();
1383
+ // enums.direction.|down
1384
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 36)), [{
1385
+ label: 'up',
1386
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1387
+ }, {
1388
+ label: 'down',
1389
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1390
+ }]);
1391
+ // enums.direction.do|wn
1392
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 38)), [{
1393
+ label: 'up',
1394
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1395
+ }, {
1396
+ label: 'down',
1397
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1398
+ }]);
1399
+ // enums.direction.down|
1400
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 40)), [{
1401
+ label: 'up',
1402
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1403
+ }, {
1404
+ label: 'down',
1405
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1406
+ }]);
1407
+ });
1408
+ it('excludes enum member completions from namespace enum', () => {
1409
+ program.setFile('source/main.bs', `
1410
+ sub Main()
1411
+ direction.ba
1412
+ end sub
1413
+ namespace enums
1414
+ enum Direction
1415
+ up
1416
+ down
1417
+ end enum
1418
+ end namespace
1419
+ `);
1420
+ program.validate();
1421
+ //should NOT find Direction because it's not directly available at the top level (you need to go through `enums.` to get at it)
1422
+ // dire|ction.down
1423
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 24)), [{
1424
+ label: 'Direction',
1425
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1426
+ }]);
1427
+ });
1428
+ it('infers namespace for enum statement completions', () => {
1429
+ program.setFile('source/main.bs', `
1430
+ namespace enums
1431
+ sub Main()
1432
+ direction.down
1433
+ end sub
1434
+ enum Direction
1435
+ up
1436
+ down
1437
+ end enum
1438
+ end namespace
1439
+ enum Logic
1440
+ yes
1441
+ no
1442
+ end enum
1443
+ `);
1444
+ program.validate();
1445
+ // dire|ction.down
1446
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 33));
1447
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1448
+ label: 'Direction',
1449
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1450
+ }, {
1451
+ label: 'Logic',
1452
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1453
+ }]);
1454
+ });
1455
+ it('infers multilevel deep namespace for enum statement completions', () => {
1456
+ program.setFile('source/main.bs', `
1457
+ namespace enums
1458
+ namespace deep
1459
+ sub Main()
1460
+ direction.down
1461
+ end sub
1462
+ enum Direction
1463
+ up
1464
+ down
1465
+ end enum
1466
+ end namespace
1467
+ end namespace
1468
+ enum Logic
1469
+ yes
1470
+ no
1471
+ end enum
1472
+ `);
1473
+ program.validate();
1474
+ // dire|ction.down
1475
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 33));
1476
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1477
+ label: 'Direction',
1478
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1479
+ }, {
1480
+ label: 'Logic',
1481
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1482
+ }]);
1483
+ });
1484
+ it('infers deep namespace for enum statement completions', () => {
1485
+ program.setFile('source/main.bs', `
1486
+ namespace enums.deep.deeper
1487
+ sub Main()
1488
+ direction.down
1489
+ end sub
1490
+ enum Direction
1491
+ up
1492
+ down
1493
+ end enum
1494
+ end namespace
1495
+ enum Logic
1496
+ yes
1497
+ no
1498
+ end enum
1499
+ `);
1500
+ program.validate();
1501
+ // dire|ction.down
1502
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 33));
1503
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1504
+ label: 'Direction',
1505
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1506
+ }, {
1507
+ label: 'Logic',
1508
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1509
+ }]);
1510
+ });
1511
+ it('infers namespace for enum member completions', () => {
1512
+ program.setFile('source/main.bs', `
1513
+ namespace enums
1514
+ sub Main()
1515
+ direction.down
1516
+ end sub
1517
+ enum Direction
1518
+ up
1519
+ down
1520
+ end enum
1521
+ end namespace
1522
+ `);
1523
+ program.validate();
1524
+ // direction.do|wn
1525
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(3, 36)), [{
1526
+ label: 'up',
1527
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1528
+ }, {
1529
+ label: 'down',
1530
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1531
+ }]);
1532
+ });
1533
+ it('supports explicit namespace for enum statement completions', () => {
1534
+ program.setFile('source/main.bs', `
1535
+ namespace enums
1536
+ sub Main()
1537
+ enums.direction.down
1538
+ end sub
1539
+ enum Direction
1540
+ up
1541
+ down
1542
+ end enum
1543
+ end namespace
1544
+ `);
1545
+ program.validate();
1546
+ // enums.dire|ction.down
1547
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(3, 38)), [{
1548
+ label: 'Direction',
1549
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1550
+ }]);
1551
+ });
1552
+ it('supports explicit namespace for enum statement completions', () => {
1553
+ program.setFile('source/main.bs', `
1554
+ namespace logger
1555
+ sub log()
1556
+ enums.direction.down
1557
+ end sub
1558
+ end namespace
1559
+ namespace enums
1560
+ enum Direction
1561
+ up
1562
+ down
1563
+ end enum
1564
+ end namespace
1565
+ `);
1566
+ program.validate();
1567
+ // enums.dire|ction.down
1568
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(3, 38)), [{
1569
+ label: 'Direction',
1570
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
1571
+ }]);
1572
+ });
1573
+ it('gives completions for underlying types on enum members', () => {
1574
+ program.setFile('source/main.bs', `
1575
+ enum Direction
1576
+ up = "up"
1577
+ down = "down"
1578
+ end enum
1579
+
1580
+ sub goAway(dir as Direction)
1581
+ print dir.
1582
+ end sub
1583
+
1584
+ `);
1585
+ program.validate();
1586
+ // print dir.|
1587
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 31));
1588
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1589
+ label: 'Trim',
1590
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1591
+ }]);
1592
+ });
1593
+ it('gives completions for underlying types on enum members on future enum declaration', () => {
1594
+ program.setFile('source/main.bs', `
1595
+ sub goAway(dir as Direction)
1596
+ print dir.
1597
+ end sub
1598
+
1599
+ enum Direction
1600
+ up = "up"
1601
+ down = "down"
1602
+ end enum
1603
+ `);
1604
+ program.validate();
1605
+ // print dir.|
1606
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 31));
1607
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1608
+ label: 'Trim',
1609
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1610
+ }]);
1611
+ });
1612
+ it('does not give other members on enum member completion', () => {
1613
+ program.setFile('source/main.bs', `
1614
+ sub goAway(dir as Direction)
1615
+ print dir.
1616
+ end sub
1617
+
1618
+ enum Direction
1619
+ up = "up"
1620
+ down = "down"
1621
+ end enum
1622
+ `);
1623
+ program.validate();
1624
+ // print dir.|
1625
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 31));
1626
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
1627
+ label: 'down',
1628
+ kind: vscode_languageserver_1.CompletionItemKind.EnumMember
1629
+ }]);
1630
+ });
1631
+ });
1632
+ describe('built in type members', () => {
1633
+ it('finds built in members', () => {
1634
+ program.setFile('source/main.bs', `
1635
+ sub foo(name as string)
1636
+ print name.
1637
+ end sub
1638
+ `);
1639
+ program.validate();
1640
+ // print name|.
1641
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32)), [{
1642
+ label: 'Replace',
1643
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1644
+ }]);
1645
+ });
1646
+ });
1647
+ describe('global callables', () => {
1648
+ it('finds built in members', () => {
1649
+ program.setFile('source/main.bs', `
1650
+ sub foo(name as string)
1651
+ print
1652
+ end sub
1653
+ `);
1654
+ program.validate();
1655
+ // print |
1656
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 27));
1657
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1658
+ label: 'LCase',
1659
+ kind: vscode_languageserver_1.CompletionItemKind.Function
1660
+ }]);
1661
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1662
+ label: 'CreateObject',
1663
+ kind: vscode_languageserver_1.CompletionItemKind.Function
1664
+ }]);
1665
+ });
1666
+ });
1667
+ describe('callfunc completions', () => {
1668
+ it('finds callfunc members', () => {
1669
+ program.setFile('components/Widget.xml', (0, testHelpers_spec_1.trim) `
1670
+ <?xml version="1.0" encoding="utf-8" ?>
1671
+ <component name="Widget" extends="Group">
1672
+ <script uri="Widget.brs"/>
1673
+ <interface>
1674
+ <function name="someFunc" />
1675
+ </interface>
1676
+ </component>
1677
+ `);
1678
+ program.setFile('components/Widget.brs', `
1679
+ function someFunc(input as string) as float
1680
+ return input.toFloat()
1681
+ end function
1682
+ `);
1683
+ program.setFile('source/util.bs', `
1684
+ sub callWidgetSomeFunc(widget as roSGNodeWidget)
1685
+ print widget@.
1686
+ end sub
1687
+ `);
1688
+ program.validate();
1689
+ // print widget@.|
1690
+ let completions = program.getCompletions('source/util.bs', util_1.default.createPosition(2, 34));
1691
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(1);
1692
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1693
+ label: 'someFunc',
1694
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1695
+ }]);
1696
+ });
1697
+ it('includes documentation', () => {
1698
+ program.setFile('components/Widget.xml', (0, testHelpers_spec_1.trim) `
1699
+ <?xml version="1.0" encoding="utf-8" ?>
1700
+ <component name="Widget" extends="Group">
1701
+ <script uri="Widget.brs"/>
1702
+ <interface>
1703
+ <function name="someFunc" />
1704
+ </interface>
1705
+ </component>
1706
+ `);
1707
+ program.setFile('components/Widget.brs', `
1708
+ ' This is documentation
1709
+ function someFunc(input as string) as float
1710
+ return input.toFloat()
1711
+ end function
1712
+ `);
1713
+ program.setFile('source/util.bs', `
1714
+ sub callWidgetSomeFunc(widget as roSGNodeWidget)
1715
+ print widget@.
1716
+ end sub
1717
+ `);
1718
+ program.validate();
1719
+ // print widget@.|
1720
+ let completions = program.getCompletions('source/util.bs', util_1.default.createPosition(2, 34));
1721
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(1);
1722
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1723
+ label: 'someFunc',
1724
+ kind: vscode_languageserver_1.CompletionItemKind.Method,
1725
+ documentation: 'This is documentation'
1726
+ }]);
1727
+ });
1728
+ it('does not include callfunc members for other components', () => {
1729
+ program.setFile('components/Widget.xml', (0, testHelpers_spec_1.trim) `
1730
+ <?xml version="1.0" encoding="utf-8" ?>
1731
+ <component name="Widget" extends="Group">
1732
+ <script uri="Widget.bs"/>
1733
+ <interface>
1734
+ <function name="someFunc" />
1735
+ </interface>
1736
+ </component>
1737
+ `);
1738
+ program.setFile('components/Widget.bs', `
1739
+ function someFunc(input as string) as float
1740
+ return input.toFloat()
1741
+ end function
1742
+ `);
1743
+ program.setFile('components/Thing.xml', (0, testHelpers_spec_1.trim) `
1744
+ <?xml version="1.0" encoding="utf-8" ?>
1745
+ <component name="Thing" extends="Group">
1746
+ <script uri="Thing.bs"/>
1747
+ <interface>
1748
+ <function name="otherFunc" />
1749
+ </interface>
1750
+ </component>
1751
+ `);
1752
+ program.setFile('components/Thing.bs', `
1753
+ function otherFunc(input as string) as float
1754
+ return input.toFloat()
1755
+ end function
1756
+ `);
1757
+ program.setFile('source/util.bs', `
1758
+ sub callWidgetSomeFunc(widget as roSGNodeWidget)
1759
+ print widget@.
1760
+ end sub
1761
+ `);
1762
+ program.validate();
1763
+ // print widget@.|
1764
+ let completions = program.getCompletions('source/util.bs', util_1.default.createPosition(2, 34));
1765
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(1);
1766
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1767
+ label: 'someFunc',
1768
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1769
+ }]);
1770
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
1771
+ label: 'otherFunc',
1772
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1773
+ }]);
1774
+ });
1775
+ it('includes all possible callfuncs when used on a generic type', () => {
1776
+ program.setFile('components/Widget.xml', (0, testHelpers_spec_1.trim) `
1777
+ <?xml version="1.0" encoding="utf-8" ?>
1778
+ <component name="Widget" extends="Group">
1779
+ <script uri="Widget.bs"/>
1780
+ <interface>
1781
+ <function name="someFunc" />
1782
+ </interface>
1783
+ </component>
1784
+ `);
1785
+ program.setFile('components/Widget.bs', `
1786
+ function someFunc(input as string) as float
1787
+ return input.toFloat()
1788
+ end function
1789
+ `);
1790
+ program.setFile('components/Thing.xml', (0, testHelpers_spec_1.trim) `
1791
+ <?xml version="1.0" encoding="utf-8" ?>
1792
+ <component name="Thing" extends="Group">
1793
+ <script uri="Thing.bs"/>
1794
+ <interface>
1795
+ <function name="otherFunc" />
1796
+ </interface>
1797
+ </component>
1798
+ `);
1799
+ program.setFile('components/Thing.bs', `
1800
+ function otherFunc(input as string) as float
1801
+ return input.toFloat()
1802
+ end function
1803
+ `);
1804
+ program.setFile('source/util.bs', `
1805
+ sub useCallfunc(dyn as dynamic, obj as object, node as roSGNode)
1806
+ print dyn@.
1807
+ print obj@.
1808
+ print node@.
1809
+ end sub
1810
+ `);
1811
+ program.validate();
1812
+ // print dyn@.|
1813
+ let completions = program.getCompletions('source/util.bs', util_1.default.createPosition(2, 31));
1814
+ const expectedCompletions = [{
1815
+ label: 'someFunc',
1816
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1817
+ }, {
1818
+ label: 'otherFunc',
1819
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1820
+ }];
1821
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(expectedCompletions.length);
1822
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, expectedCompletions);
1823
+ // print obj@.|
1824
+ completions = program.getCompletions('source/util.bs', util_1.default.createPosition(3, 31));
1825
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(expectedCompletions.length);
1826
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, expectedCompletions);
1827
+ // print node@.|
1828
+ completions = program.getCompletions('source/util.bs', util_1.default.createPosition(3, 32));
1829
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(expectedCompletions.length);
1830
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, expectedCompletions);
1831
+ });
1832
+ });
1833
+ describe('type expressions', () => {
1834
+ it('finds built in types', () => {
1835
+ program.setFile('source/main.bs', `
1836
+ sub foo(thing as )
1837
+ print thing
1838
+ end sub
1839
+ `);
1840
+ program.validate();
1841
+ // sub foo(thing as | )
1842
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 34));
1843
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1844
+ label: 'integer',
1845
+ kind: vscode_languageserver_1.CompletionItemKind.Keyword
1846
+ }]);
1847
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1848
+ label: 'roSGNode',
1849
+ kind: vscode_languageserver_1.CompletionItemKind.Interface
1850
+ }]);
1851
+ });
1852
+ it('does not include global values (true, false, invalid)', () => {
1853
+ program.setFile('source/main.bs', `
1854
+ sub foo(thing as )
1855
+ print thing
1856
+ end sub
1857
+ `);
1858
+ program.validate();
1859
+ // sub foo(thing as | )
1860
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 34));
1861
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
1862
+ label: 'true',
1863
+ kind: vscode_languageserver_1.CompletionItemKind.Value
1864
+ }, {
1865
+ label: 'false',
1866
+ kind: vscode_languageserver_1.CompletionItemKind.Value
1867
+ }, {
1868
+ label: 'invalid',
1869
+ kind: vscode_languageserver_1.CompletionItemKind.Value
1870
+ }]);
1871
+ });
1872
+ it('finds custom types', () => {
1873
+ program.setFile('source/main.bs', `
1874
+ sub foo(thing as )
1875
+ print thing
1876
+ end sub
1877
+
1878
+ class SomeKlass
1879
+ end class
1880
+ `);
1881
+ program.validate();
1882
+ // sub foo(thing as | )
1883
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 34));
1884
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1885
+ label: 'SomeKlass',
1886
+ kind: vscode_languageserver_1.CompletionItemKind.Class
1887
+ }]);
1888
+ });
1889
+ it('finds custom node types', () => {
1890
+ program.setFile('source/main.bs', `
1891
+ sub foo(thing as )
1892
+ print thing
1893
+ end sub
1894
+ `);
1895
+ program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
1896
+ <component name="MyNode" extends="Group">
1897
+ <interface>
1898
+ <field id="text" type="string"/>
1899
+ </interface>
1900
+ </component>`);
1901
+ program.validate();
1902
+ // sub foo(thing as | )
1903
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 34));
1904
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1905
+ label: 'roSGNodeMyNode',
1906
+ kind: vscode_languageserver_1.CompletionItemKind.Interface
1907
+ }]);
1908
+ });
1909
+ it('only shows intrinsic/native types in brightscript', () => {
1910
+ program.setFile('source/main.brs', `
1911
+ sub foo(thing as )
1912
+ print thing
1913
+ end sub
1914
+ `);
1915
+ program.validate();
1916
+ // sub foo(thing as | )
1917
+ const completions = program.getCompletions('source/main.brs', util_1.default.createPosition(1, 34));
1918
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1919
+ label: 'integer',
1920
+ kind: vscode_languageserver_1.CompletionItemKind.Keyword
1921
+ }]);
1922
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1923
+ label: 'function',
1924
+ kind: vscode_languageserver_1.CompletionItemKind.Keyword
1925
+ }]);
1926
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
1927
+ label: 'roSGNode'
1928
+ }]);
1929
+ });
1930
+ });
1931
+ describe('interfaces', () => {
1932
+ it('finds members of interfaces', () => {
1933
+ program.setFile('source/main.bs', `
1934
+ sub foo(thing as SomeInterface )
1935
+ print thing.
1936
+ end sub
1937
+
1938
+
1939
+ interface SomeInterface
1940
+ name as string
1941
+ data
1942
+ function doStuff()
1943
+ end interface
1944
+ `);
1945
+ program.validate();
1946
+ // print thing.|
1947
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
1948
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1949
+ label: 'name',
1950
+ kind: vscode_languageserver_1.CompletionItemKind.Field
1951
+ }]);
1952
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1953
+ label: 'data',
1954
+ kind: vscode_languageserver_1.CompletionItemKind.Field
1955
+ }]);
1956
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1957
+ label: 'doStuff',
1958
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1959
+ }]);
1960
+ });
1961
+ it('finds optional members of interfaces', () => {
1962
+ program.setFile('source/main.bs', `
1963
+ sub foo(thing as SomeInterface )
1964
+ print thing.
1965
+ end sub
1966
+
1967
+
1968
+ interface SomeInterface
1969
+ optional name as string
1970
+ optional data
1971
+ optional function doStuff()
1972
+ end interface
1973
+ `);
1974
+ program.validate();
1975
+ // print thing.|
1976
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
1977
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1978
+ label: 'name',
1979
+ kind: vscode_languageserver_1.CompletionItemKind.Field
1980
+ }]);
1981
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1982
+ label: 'data',
1983
+ kind: vscode_languageserver_1.CompletionItemKind.Field
1984
+ }]);
1985
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
1986
+ label: 'doStuff',
1987
+ kind: vscode_languageserver_1.CompletionItemKind.Method
1988
+ }]);
1989
+ });
1990
+ });
1991
+ describe('typed variables', () => {
1992
+ it('shows variables of type interface as CompletionItemKind.Variable', () => {
1993
+ program.setFile('source/main.bs', `
1994
+ sub foo(thing as SomeInterface)
1995
+ print thi|
1996
+ end sub
1997
+
1998
+ interface SomeInterface
1999
+ optional name as string
2000
+ optional data
2001
+ optional function doStuff()
2002
+ end interface
2003
+ `);
2004
+ program.validate();
2005
+ // print thi|
2006
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
2007
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2008
+ label: 'thing',
2009
+ kind: vscode_languageserver_1.CompletionItemKind.Variable
2010
+ }]);
2011
+ });
2012
+ it('shows variables of type class as CompletionItemKind.Variable', () => {
2013
+ program.setFile('source/main.bs', `
2014
+ sub foo(thing as SomeKlass)
2015
+ print thi|
2016
+ end sub
2017
+
2018
+ class SomeKlass
2019
+ name as string
2020
+ data
2021
+ function doStuff()
2022
+ end function
2023
+ end class
2024
+ `);
2025
+ program.validate();
2026
+ // print thi|
2027
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
2028
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2029
+ label: 'thing',
2030
+ kind: vscode_languageserver_1.CompletionItemKind.Variable
2031
+ }]);
2032
+ });
2033
+ it('shows variables of type enum as CompletionItemKind.Variable', () => {
2034
+ program.setFile('source/main.bs', `
2035
+ sub foo(thing as SomeEnum)
2036
+ print thi|
2037
+ end sub
2038
+
2039
+ enum SomeEnum
2040
+ up
2041
+ down
2042
+ end end
2043
+ `);
2044
+ program.validate();
2045
+ // print thi|
2046
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
2047
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2048
+ label: 'thing',
2049
+ kind: vscode_languageserver_1.CompletionItemKind.Variable
2050
+ }]);
2051
+ });
2052
+ it('shows variables of type function as CompletionItemKind.Variable', () => {
2053
+ program.setFile('source/main.bs', `
2054
+ sub foo(thing as function)
2055
+ print thi|
2056
+ end sub
2057
+ `);
2058
+ program.validate();
2059
+ // print thi|
2060
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
2061
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2062
+ label: 'thing',
2063
+ kind: vscode_languageserver_1.CompletionItemKind.Variable
2064
+ }]);
2065
+ });
2066
+ });
2067
+ describe('brighterscript vs brightscript', () => {
2068
+ it('should not include transpiled versions of symbols in brighterscript code', () => {
2069
+ program.setFile('source/main.bs', `
2070
+ namespace Alpha
2071
+ sub beta()
2072
+ print "hello"
2073
+ end sub
2074
+
2075
+ sub gamma()
2076
+ ' completions here should NOT have Alpha_beta or Alpha_gamma
2077
+ end sub
2078
+ end namespace
2079
+ `);
2080
+ program.validate();
2081
+ // | ' completions here
2082
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(6, 25));
2083
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
2084
+ label: 'Alpha_beta',
2085
+ kind: vscode_languageserver_1.CompletionItemKind.Function
2086
+ }, {
2087
+ label: 'Alpha_gamma',
2088
+ kind: vscode_languageserver_1.CompletionItemKind.Function
2089
+ }]);
2090
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2091
+ label: 'Alpha',
2092
+ kind: vscode_languageserver_1.CompletionItemKind.Module
2093
+ }]);
2094
+ });
2095
+ it('should include transpiled versions of symbols in brightscript code', () => {
2096
+ program.setFile('source/main.bs', `
2097
+ namespace Alpha
2098
+ sub beta()
2099
+ print "hello"
2100
+ end sub
2101
+
2102
+ sub gamma()
2103
+ print "gamma"
2104
+ end sub
2105
+ end namespace
2106
+ `);
2107
+ program.setFile('source/other.brs', `
2108
+ sub inBrsFile()
2109
+ ' completions here should have Alpha_beta and Alpha_gamma
2110
+ end sub
2111
+ `);
2112
+ program.validate();
2113
+ // | ' completions here
2114
+ const completions = program.getCompletions('source/other.brs', util_1.default.createPosition(2, 21));
2115
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2116
+ label: 'Alpha_beta',
2117
+ kind: vscode_languageserver_1.CompletionItemKind.Function
2118
+ }, {
2119
+ label: 'Alpha_gamma',
2120
+ kind: vscode_languageserver_1.CompletionItemKind.Function
2121
+ }]);
2122
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
2123
+ label: 'Alpha',
2124
+ kind: vscode_languageserver_1.CompletionItemKind.Module
2125
+ }]);
2126
+ });
2127
+ it('should not include namespaces in brightscript code', () => {
2128
+ program.setFile('source/main.bs', `
2129
+ namespace Alpha
2130
+ end namespace
2131
+ `);
2132
+ program.setFile('source/other.brs', `
2133
+ sub inBrsFile()
2134
+ ' completions here should have Alpha_beta and Alpha_gamma
2135
+ end sub
2136
+ `);
2137
+ program.validate();
2138
+ // | ' completions here
2139
+ const completions = program.getCompletions('source/other.brs', util_1.default.createPosition(2, 21));
2140
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
2141
+ label: 'Alpha',
2142
+ kind: vscode_languageserver_1.CompletionItemKind.Module
2143
+ }]);
2144
+ });
2145
+ });
2146
+ describe('global values', () => {
2147
+ it('should include true, false', () => {
2148
+ program.setFile('source/main.bs', `
2149
+ sub foo()
2150
+ fooValue =
2151
+ end sub
2152
+ `);
2153
+ program.validate();
2154
+ // fooValue = |
2155
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32));
2156
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2157
+ label: 'true',
2158
+ kind: vscode_languageserver_1.CompletionItemKind.Value
2159
+ }]);
2160
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2161
+ label: 'false',
2162
+ kind: vscode_languageserver_1.CompletionItemKind.Value
2163
+ }]);
2164
+ });
2165
+ it('should include invalid', () => {
2166
+ program.setFile('source/main.bs', `
2167
+ sub foo()
2168
+ fooValue =
2169
+ end sub
2170
+ `);
2171
+ program.validate();
2172
+ // fooValue = |
2173
+ const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32));
2174
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2175
+ label: 'invalid',
2176
+ kind: vscode_languageserver_1.CompletionItemKind.Value
2177
+ }]);
2178
+ });
2179
+ });
2180
+ describe('accessibility values', () => {
2181
+ it('include appropriate accessible members', () => {
2182
+ program.setFile('source/main.bs', `
2183
+ class Accessibility
2184
+ private name
2185
+ protected age
2186
+ public id
2187
+
2188
+ sub someMethod()
2189
+ m. ' In class method
2190
+ end sub
2191
+ end class
2192
+
2193
+ sub foo(klass as Accessibility)
2194
+ klass. ' outside class method
2195
+ end sub
2196
+ `);
2197
+ program.validate();
2198
+ // m.| ' In class method
2199
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 26));
2200
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2201
+ label: 'name',
2202
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2203
+ }, {
2204
+ label: 'age',
2205
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2206
+ }, {
2207
+ label: 'id',
2208
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2209
+ }]);
2210
+ // klass.| ' outside class method
2211
+ completions = program.getCompletions('source/main.bs', util_1.default.createPosition(12, 26));
2212
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
2213
+ label: 'name',
2214
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2215
+ }, {
2216
+ label: 'age',
2217
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2218
+ }]);
2219
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2220
+ label: 'id',
2221
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2222
+ }]);
2223
+ });
2224
+ it('includes private members on non-m variables when appropriate', () => {
2225
+ program.setFile('source/main.bs', `
2226
+ class Accessibility
2227
+ private name
2228
+ protected age
2229
+ public id
2230
+
2231
+ sub foo(notM as Accessibility)
2232
+ notM. ' In class method
2233
+ end sub
2234
+ end class
2235
+ `);
2236
+ program.validate();
2237
+ // m.| ' In class method
2238
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 29));
2239
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2240
+ label: 'age',
2241
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2242
+ }, {
2243
+ label: 'id',
2244
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2245
+ }, {
2246
+ label: 'name',
2247
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2248
+ }]);
2249
+ });
2250
+ it('includes protected members on sub classes', () => {
2251
+ program.setFile('source/main.bs', `
2252
+ class Accessibility
2253
+ private name
2254
+ protected age
2255
+ public id
2256
+ end class
2257
+
2258
+ class AccessToo extends Accessibility
2259
+ sub foo()
2260
+ m. ' In class method
2261
+ end sub
2262
+ end class
2263
+ `);
2264
+ program.validate();
2265
+ // m.| ' In class method
2266
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(9, 26));
2267
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2268
+ label: 'age',
2269
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2270
+ }, {
2271
+ label: 'id',
2272
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2273
+ }]);
2274
+ (0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
2275
+ label: 'name',
2276
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2277
+ }]);
2278
+ });
2279
+ });
2280
+ describe('alias', () => {
2281
+ it('includes aliases', () => {
2282
+ program.setFile('source/main.bs', `
2283
+ alias APerson = Person
2284
+ alias APi = Pi
2285
+
2286
+ namespace alpha
2287
+ sub test()
2288
+ print
2289
+ end sub
2290
+
2291
+ sub pi()
2292
+ print "Magnum"
2293
+ end sub
2294
+
2295
+ enum Person
2296
+ tall
2297
+ short
2298
+ end enum
2299
+ end namespace
2300
+
2301
+ function Person()
2302
+ return "John Doe"
2303
+ end function
2304
+
2305
+ const PI = 3.14
2306
+ `);
2307
+ program.validate();
2308
+ // print |
2309
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(6, 31));
2310
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2311
+ label: 'APi',
2312
+ kind: vscode_languageserver_1.CompletionItemKind.Constant
2313
+ }, {
2314
+ label: 'APerson',
2315
+ kind: vscode_languageserver_1.CompletionItemKind.Function
2316
+ }]);
2317
+ });
2318
+ it('includes runtime and typetime symbols on RHS', () => {
2319
+ program.setFile('source/main.bs', `
2320
+ alias myAlias = a
2321
+
2322
+ function getPersonName()
2323
+ return "John Doe"
2324
+ end function
2325
+
2326
+ const PI = 3.14
2327
+
2328
+ interface SomeInterface
2329
+ name as string
2330
+ end interface
2331
+ `);
2332
+ program.validate();
2333
+ // alias myAlias = a|
2334
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 33));
2335
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2336
+ label: 'getPersonName',
2337
+ kind: vscode_languageserver_1.CompletionItemKind.Function
2338
+ }, {
2339
+ label: 'PI',
2340
+ kind: vscode_languageserver_1.CompletionItemKind.Constant
2341
+ }, {
2342
+ label: 'SomeInterface',
2343
+ kind: vscode_languageserver_1.CompletionItemKind.Interface
2344
+ }]);
2345
+ });
2346
+ });
2347
+ describe('type statement', () => {
2348
+ it('includes type members', () => {
2349
+ program.setFile('source/main.bs', `
2350
+ sub greet(p as Programmer)
2351
+ print p.
2352
+ end sub
2353
+
2354
+ interface Person
2355
+ name as string
2356
+ age as integer
2357
+ end interface
2358
+
2359
+ interface Employee
2360
+ name as string
2361
+ age as integer
2362
+ employeeId as integer
2363
+ end interface
2364
+
2365
+ type Programmer = Person or Employee
2366
+ `);
2367
+ program.validate();
2368
+ // print p.|
2369
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 29));
2370
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(2);
2371
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2372
+ label: 'name',
2373
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2374
+ }, {
2375
+ label: 'age',
2376
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2377
+ }]);
2378
+ });
2379
+ });
2380
+ describe('incomplete statements', () => {
2381
+ it('should complete after if', () => {
2382
+ program.setFile('source/main.bs', `
2383
+ interface Person
2384
+ name as string
2385
+ end interface
2386
+
2387
+ sub checkName(p as Person)
2388
+ if p.
2389
+ end sub
2390
+ `);
2391
+ program.validate();
2392
+ // if p.
2393
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(6, 26));
2394
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2395
+ label: 'name',
2396
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2397
+ }]);
2398
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(1);
2399
+ });
2400
+ });
2401
+ describe('compound types', () => {
2402
+ it('includes only common members of union types', () => {
2403
+ program.setFile('source/main.bs', `
2404
+ interface Person
2405
+ name as string
2406
+ age as integer
2407
+ end interface
2408
+
2409
+ interface Employee
2410
+ name as string
2411
+ employeeId as integer
2412
+ end interface
2413
+
2414
+ sub greet(p as Person or Employee)
2415
+ print p.
2416
+ end sub
2417
+ `);
2418
+ program.validate();
2419
+ // print p.|
2420
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(12, 29));
2421
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(1);
2422
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2423
+ label: 'name',
2424
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2425
+ }]);
2426
+ });
2427
+ it('includes all members of intersection types', () => {
2428
+ program.setFile('source/main.bs', `
2429
+ interface Person
2430
+ name as string
2431
+ age as integer
2432
+ end interface
2433
+
2434
+ interface Employee
2435
+ name as string
2436
+ employeeId as integer
2437
+ end interface
2438
+
2439
+ sub greet(p as Person and Employee)
2440
+ print p.
2441
+ end sub
2442
+ `);
2443
+ program.validate();
2444
+ // print p.|
2445
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(12, 29));
2446
+ (0, chai_config_spec_1.expect)(completions.length).to.eql(3);
2447
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2448
+ label: 'name',
2449
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2450
+ }, {
2451
+ label: 'age',
2452
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2453
+ }, {
2454
+ label: 'employeeId',
2455
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2456
+ }]);
2457
+ });
2458
+ it('includes AA members when it is an intersection with an AA', () => {
2459
+ program.setFile('source/main.bs', `
2460
+ interface Person
2461
+ name as string
2462
+ age as integer
2463
+ end interface
2464
+
2465
+ sub greet(p as Person and roAssociativeArray)
2466
+ print p.
2467
+ end sub
2468
+ `);
2469
+ program.validate();
2470
+ // print p.|
2471
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 29));
2472
+ (0, chai_config_spec_1.expect)(completions.length).to.at.least(4);
2473
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2474
+ label: 'name',
2475
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2476
+ }, {
2477
+ label: 'age',
2478
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2479
+ }, {
2480
+ label: 'Append',
2481
+ kind: vscode_languageserver_1.CompletionItemKind.Method
2482
+ }, {
2483
+ label: 'Count',
2484
+ kind: vscode_languageserver_1.CompletionItemKind.Method
2485
+ }]);
2486
+ });
2487
+ it('includes members from non-dynamic when it is an intersection with dynamic', () => {
2488
+ program.setFile('source/main.bs', `
2489
+ interface Person
2490
+ name as string
2491
+ age as integer
2492
+ end interface
2493
+
2494
+ sub greet(p as Person and dynamic)
2495
+ print p.
2496
+ end sub
2497
+ `);
2498
+ program.validate();
2499
+ // print p.|
2500
+ let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 29));
2501
+ (0, chai_config_spec_1.expect)(completions.length).to.at.least(2);
2502
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
2503
+ label: 'name',
2504
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2505
+ }, {
2506
+ label: 'age',
2507
+ kind: vscode_languageserver_1.CompletionItemKind.Field
2508
+ }]);
2509
+ });
2510
+ });
2511
+ });
2512
+ //# sourceMappingURL=CompletionsProcessor.spec.js.map