brighterscript 1.0.0-alpha.3 → 1.0.0-alpha.31

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