brighterscript 1.0.0-alpha.24 → 1.0.0-alpha.25

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