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
@@ -1,6 +1,57 @@
1
- import type { ProvideCompletionsEvent } from '../../interfaces';
1
+ import type { FileReference, ProvideCompletionsEvent } from '../../interfaces';
2
+ import type { Scope } from '../../Scope';
3
+ import type { CompletionItem, Position } from 'vscode-languageserver';
4
+ import type { XmlFile } from '../../files/XmlFile';
5
+ import type { Program } from '../../Program';
6
+ import type { BrsFile } from '../../files/BrsFile';
7
+ import type { FunctionStatement } from '../../parser/Statement';
2
8
  export declare class CompletionsProcessor {
3
9
  private event;
4
10
  constructor(event: ProvideCompletionsEvent);
5
11
  process(): void;
12
+ /**
13
+ * Get all available completions for the specified position
14
+ * @param position the position to get completions
15
+ */
16
+ getXmlFileCompletions(position: Position, file: XmlFile): CompletionItem[];
17
+ /**
18
+ * Get a list of all script imports, relative to the specified pkgPath
19
+ * @param program - reference to the program
20
+ * @param sourcePkgPath - the pkgPath of the source that wants to resolve script imports
21
+ * @param scriptImport - example script import
22
+ */
23
+ getScriptImportCompletions(program: Program, sourcePkgPath: string, scriptImport: FileReference): CompletionItem[];
24
+ /**
25
+ * Get completions available at the given cursor. This aggregates all values from this file and the current scope.
26
+ */
27
+ getBrsFileCompletions(position: Position, file: BrsFile): CompletionItem[];
28
+ private getScopeSymbolCompletions;
29
+ private getSymbolsCompletion;
30
+ private getDocumentation;
31
+ private getCompletionKindFromSymbol;
32
+ private isNamespaceTypeWithMemberType;
33
+ private isMemberAccessible;
34
+ private getLabelCompletion;
35
+ createCompletionFromFunctionStatement(statement: FunctionStatement): CompletionItem;
36
+ private getStringLiteralCompletions;
37
+ /**
38
+ * Scan all files for property names, and return them as completions
39
+ */
40
+ getPropertyNameCompletions(scope: Scope): CompletionItem[];
41
+ getAllClassMemberCompletions(scope: Scope): Map<string, CompletionItem>;
42
+ /**
43
+ * Scan all xmlScopes for call funcs
44
+ */
45
+ getCallFuncNameCompletions(scope: Scope): CompletionItem[];
46
+ private getGlobalValues;
6
47
  }
48
+ /**
49
+ * List of completions for all valid keywords/reserved words.
50
+ * Build this list once because it won't change for the lifetime of this process
51
+ */
52
+ export declare const KeywordCompletions: CompletionItem[];
53
+ /**
54
+ * List of completions for all valid intrinsic types.
55
+ * Build this list once because it won't change for the lifetime of this process
56
+ */
57
+ export declare const NativeTypeCompletions: CompletionItem[];
@@ -1,43 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CompletionsProcessor = void 0;
3
+ exports.NativeTypeCompletions = exports.KeywordCompletions = exports.CompletionsProcessor = void 0;
4
4
  const reflection_1 = require("../../astUtils/reflection");
5
5
  const TokenKind_1 = require("../../lexer/TokenKind");
6
6
  const util_1 = require("../../util");
7
+ const Parser_1 = require("../../parser/Parser");
8
+ const vscode_languageserver_1 = require("vscode-languageserver");
9
+ const SymbolTable_1 = require("../../SymbolTable");
10
+ const types_1 = require("../../types");
11
+ const creators_1 = require("../../astUtils/creators");
7
12
  class CompletionsProcessor {
8
13
  constructor(event) {
9
14
  this.event = event;
10
15
  }
11
16
  process() {
12
- let completionsArray = [];
13
- if ((0, reflection_1.isBrsFile)(this.event.file) && this.event.file.parser.isPositionNextToTokenKind(this.event.position, TokenKind_1.TokenKind.Callfunc)) {
14
- const xmlScopes = this.event.program.getScopes().filter((s) => (0, reflection_1.isXmlScope)(s));
15
- // is next to a @. callfunc invocation - must be an interface method.
16
- //TODO refactor this to utilize the actual variable's component type (when available)
17
- for (const scope of xmlScopes) {
18
- let fileLinks = this.event.program.getStatementsForXmlFile(scope);
19
- for (let fileLink of fileLinks) {
20
- let pushItem = scope.createCompletionFromFunctionStatement(fileLink.item);
21
- if (!completionsArray.includes(pushItem.label)) {
22
- completionsArray.push(pushItem.label);
23
- this.event.completions.push(pushItem);
24
- }
25
- }
26
- }
27
- //no other result is possible in this case
28
- return;
29
- }
17
+ let file = this.event.file;
30
18
  //find the scopes for this file
31
- let scopesForFile = this.event.program.getScopesForFile(this.event.file);
19
+ let scopesForFile = this.event.program.getScopesForFile(file);
32
20
  //if there are no scopes, include the global scope so we at least get the built-in functions
33
21
  scopesForFile = scopesForFile.length > 0 ? scopesForFile : [this.event.program.globalScope];
34
22
  //get the completions from all scopes for this file
35
- let allCompletions = util_1.util.flatMap(scopesForFile.map(scope => {
36
- scope.linkSymbolTable();
37
- const completions = this.event.file.getCompletions(this.event.position, scope);
38
- scope.unlinkSymbolTable();
39
- return completions;
40
- }), c => c);
23
+ let completionResults = [];
24
+ if ((0, reflection_1.isXmlFile)(file)) {
25
+ completionResults = this.getXmlFileCompletions(this.event.position, file);
26
+ }
27
+ else if ((0, reflection_1.isBrsFile)(file)) {
28
+ //handle script import completions
29
+ let scriptImport = util_1.util.getScriptImportAtPosition(file.ownScriptImports, this.event.position);
30
+ if (scriptImport) {
31
+ this.event.completions.push(...this.getScriptImportCompletions(file.program, file.pkgPath, scriptImport));
32
+ return;
33
+ }
34
+ completionResults = this.getBrsFileCompletions(this.event.position, file);
35
+ }
36
+ let allCompletions = completionResults.flat();
41
37
  //only keep completions common to every scope for this file
42
38
  let keyCounts = new Map();
43
39
  for (let completion of allCompletions) {
@@ -48,6 +44,501 @@ class CompletionsProcessor {
48
44
  }
49
45
  }
50
46
  }
47
+ /**
48
+ * Get all available completions for the specified position
49
+ * @param position the position to get completions
50
+ */
51
+ getXmlFileCompletions(position, file) {
52
+ let scriptImport = util_1.util.getScriptImportAtPosition(file.scriptTagImports, position);
53
+ if (scriptImport) {
54
+ return this.getScriptImportCompletions(file.program, file.pkgPath, scriptImport);
55
+ }
56
+ else {
57
+ return [];
58
+ }
59
+ }
60
+ /**
61
+ * Get a list of all script imports, relative to the specified pkgPath
62
+ * @param program - reference to the program
63
+ * @param sourcePkgPath - the pkgPath of the source that wants to resolve script imports
64
+ * @param scriptImport - example script import
65
+ */
66
+ getScriptImportCompletions(program, sourcePkgPath, scriptImport) {
67
+ let lowerSourcePkgPath = sourcePkgPath.toLowerCase();
68
+ let result = [];
69
+ /**
70
+ * hashtable to prevent duplicate results
71
+ */
72
+ let resultPkgPaths = {};
73
+ //restrict to only .brs files
74
+ for (let key in program.files) {
75
+ let file = program.files[key];
76
+ const ext = util_1.util.getExtension(file.srcPath);
77
+ if (
78
+ //is a BrightScript or BrighterScript file
79
+ (ext === '.bs' || ext === '.brs') &&
80
+ //this file is not the current file
81
+ lowerSourcePkgPath !== file.pkgPath.toLowerCase()) {
82
+ //add the relative path
83
+ let relativePath = util_1.util.getRelativePath(sourcePkgPath, file.destPath).replace(/\\/g, '/');
84
+ let pkgPathStandardized = file.pkgPath.replace(/\\/g, '/');
85
+ let filePkgPath = `pkg:/${pkgPathStandardized}`;
86
+ let lowerFilePkgPath = filePkgPath.toLowerCase();
87
+ if (!resultPkgPaths[lowerFilePkgPath]) {
88
+ resultPkgPaths[lowerFilePkgPath] = true;
89
+ result.push({
90
+ label: relativePath,
91
+ detail: file.srcPath,
92
+ kind: vscode_languageserver_1.CompletionItemKind.File,
93
+ textEdit: {
94
+ newText: relativePath,
95
+ range: scriptImport.filePathRange
96
+ }
97
+ });
98
+ //add the absolute path
99
+ result.push({
100
+ label: filePkgPath,
101
+ detail: file.srcPath,
102
+ kind: vscode_languageserver_1.CompletionItemKind.File,
103
+ textEdit: {
104
+ newText: filePkgPath,
105
+ range: scriptImport.filePathRange
106
+ }
107
+ });
108
+ }
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+ /**
114
+ * Get completions available at the given cursor. This aggregates all values from this file and the current scope.
115
+ */
116
+ getBrsFileCompletions(position, file) {
117
+ var _a, _b, _c, _d, _e, _f, _g;
118
+ let result = [];
119
+ const currentToken = (_a = file.getTokenAt(position)) !== null && _a !== void 0 ? _a : file.getTokenAt((_b = file.getClosestExpression(position)) === null || _b === void 0 ? void 0 : _b.range.start);
120
+ if (!currentToken) {
121
+ return [];
122
+ }
123
+ //if cursor is within a comment, disable completions
124
+ const tokenKind = currentToken === null || currentToken === void 0 ? void 0 : currentToken.kind;
125
+ if (tokenKind === TokenKind_1.TokenKind.Comment) {
126
+ return [];
127
+ }
128
+ let expression;
129
+ let shouldLookForMembers = false;
130
+ let shouldLookForCallFuncMembers = false;
131
+ let symbolTableLookupFlag = SymbolTable_1.SymbolTypeFlag.runtime;
132
+ let beforeDotToken;
133
+ if (file.tokenFollows(currentToken, TokenKind_1.TokenKind.Goto)) {
134
+ let functionScope = file.getFunctionScopeAtPosition(position);
135
+ return this.getLabelCompletion(functionScope);
136
+ }
137
+ if (((_c = file.getPreviousToken(currentToken)) === null || _c === void 0 ? void 0 : _c.kind) === TokenKind_1.TokenKind.Dot || file.isTokenNextToTokenKind(currentToken, TokenKind_1.TokenKind.Dot)) {
138
+ const dotToken = currentToken.kind === TokenKind_1.TokenKind.Dot ? currentToken : file.getTokenBefore(currentToken, TokenKind_1.TokenKind.Dot);
139
+ beforeDotToken = file.getTokenBefore(dotToken);
140
+ expression = file.getClosestExpression(beforeDotToken === null || beforeDotToken === void 0 ? void 0 : beforeDotToken.range.end);
141
+ shouldLookForMembers = true;
142
+ }
143
+ else if (((_d = file.getPreviousToken(currentToken)) === null || _d === void 0 ? void 0 : _d.kind) === TokenKind_1.TokenKind.Callfunc || file.isTokenNextToTokenKind(currentToken, TokenKind_1.TokenKind.Callfunc)) {
144
+ const dotToken = currentToken.kind === TokenKind_1.TokenKind.Callfunc ? currentToken : file.getTokenBefore(currentToken, TokenKind_1.TokenKind.Callfunc);
145
+ beforeDotToken = file.getTokenBefore(dotToken);
146
+ expression = file.getClosestExpression(beforeDotToken === null || beforeDotToken === void 0 ? void 0 : beforeDotToken.range.end);
147
+ shouldLookForCallFuncMembers = true;
148
+ }
149
+ else if (((_e = file.getPreviousToken(currentToken)) === null || _e === void 0 ? void 0 : _e.kind) === TokenKind_1.TokenKind.As || file.isTokenNextToTokenKind(currentToken, TokenKind_1.TokenKind.As)) {
150
+ if (file.parseMode === Parser_1.ParseMode.BrightScript) {
151
+ return exports.NativeTypeCompletions;
152
+ }
153
+ expression = file.getClosestExpression(this.event.position);
154
+ symbolTableLookupFlag = SymbolTable_1.SymbolTypeFlag.typetime;
155
+ }
156
+ else {
157
+ expression = file.getClosestExpression(this.event.position);
158
+ }
159
+ if (!expression) {
160
+ return [];
161
+ }
162
+ if ((0, reflection_1.isFunctionExpression)(expression)) {
163
+ // if completion is the last character of the function, use the completions of the body of the function
164
+ expression = expression.body;
165
+ }
166
+ const tokenBefore = file.getTokenBefore(file.getClosestToken(expression.range.start));
167
+ // helper to check get correct symbol tables for look ups
168
+ function getSymbolTableForLookups() {
169
+ if (shouldLookForMembers) {
170
+ let type = expression.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
171
+ if ((0, reflection_1.isEnumType)(type) && !(0, reflection_1.isEnumType)(expression.getType({ flags: SymbolTable_1.SymbolTypeFlag.typetime }))) {
172
+ // enum members are registered in the symbol table as enum type
173
+ // an enum type should ONLY use the enum type's members when called directly
174
+ // since this is not a typetime enum, the actual type is actually an enum member!
175
+ type = type.defaultMemberType;
176
+ }
177
+ // Make sure built in interfaces are added.
178
+ if (type.isResolvable()) {
179
+ type.addBuiltInInterfaces();
180
+ }
181
+ return type === null || type === void 0 ? void 0 : type.getMemberTable();
182
+ }
183
+ else if (shouldLookForCallFuncMembers) {
184
+ let type = expression.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
185
+ if ((0, reflection_1.isComponentType)(type)) {
186
+ // it's a component and you're doing a callFunc - only let it do functions from that table
187
+ return type.getCallFuncTable();
188
+ }
189
+ // this is not a component type - there should be no callfunc members
190
+ return undefined;
191
+ }
192
+ const symbolTableToUse = expression.getSymbolTable();
193
+ return symbolTableToUse;
194
+ }
195
+ let gotSymbolsFromThisFile = false;
196
+ let gotSymbolsFromGlobal = false;
197
+ const shouldLookInNamespace = !(shouldLookForMembers || shouldLookForCallFuncMembers) && expression.findAncestor(reflection_1.isNamespaceStatement);
198
+ const containingClassStmt = expression.findAncestor(reflection_1.isClassStatement);
199
+ const containingNamespace = expression.findAncestor(reflection_1.isNamespaceStatement);
200
+ const containingNamespaceName = containingNamespace === null || containingNamespace === void 0 ? void 0 : containingNamespace.getName(Parser_1.ParseMode.BrighterScript);
201
+ for (const scope of this.event.scopes) {
202
+ if (tokenKind === TokenKind_1.TokenKind.StringLiteral || tokenKind === TokenKind_1.TokenKind.TemplateStringQuasi) {
203
+ result.push(...this.getStringLiteralCompletions(scope, currentToken));
204
+ continue;
205
+ }
206
+ scope.linkSymbolTable();
207
+ const symbolTable = getSymbolTableForLookups();
208
+ let currentSymbols = [];
209
+ if (shouldLookForMembers || shouldLookForCallFuncMembers) {
210
+ currentSymbols = (_f = symbolTable === null || symbolTable === void 0 ? void 0 : symbolTable.getAllSymbols(symbolTableLookupFlag)) !== null && _f !== void 0 ? _f : [];
211
+ const tokenType = expression.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
212
+ if ((0, reflection_1.isClassType)(tokenType)) {
213
+ currentSymbols = currentSymbols.filter((symbol) => {
214
+ if (symbol.name === 'new') {
215
+ // don't return the constructor as a property
216
+ return false;
217
+ }
218
+ return this.isMemberAccessible(scope, symbol, containingClassStmt, containingNamespaceName);
219
+ });
220
+ }
221
+ }
222
+ else {
223
+ // get symbols directly from current symbol table and scope
224
+ if (!gotSymbolsFromThisFile) {
225
+ currentSymbols = (_g = symbolTable === null || symbolTable === void 0 ? void 0 : symbolTable.getOwnSymbols(symbolTableLookupFlag)) !== null && _g !== void 0 ? _g : [];
226
+ if ((0, reflection_1.isBlock)(expression) && (0, reflection_1.isFunctionExpression)(expression.parent)) {
227
+ currentSymbols.push(...expression.parent.getSymbolTable().getOwnSymbols(symbolTableLookupFlag));
228
+ }
229
+ gotSymbolsFromThisFile = true;
230
+ }
231
+ if (shouldLookInNamespace) {
232
+ const nsNameParts = shouldLookInNamespace.getNameParts();
233
+ let nameSpaceTypeSofar;
234
+ let nsNameLookupTable = scope.symbolTable;
235
+ for (const namePart of nsNameParts) {
236
+ nameSpaceTypeSofar = nsNameLookupTable === null || nsNameLookupTable === void 0 ? void 0 : nsNameLookupTable.getSymbolType(namePart.text, { flags: symbolTableLookupFlag });
237
+ if ((0, reflection_1.isNamespaceType)(nameSpaceTypeSofar)) {
238
+ nsNameLookupTable = nameSpaceTypeSofar.getMemberTable();
239
+ }
240
+ else {
241
+ break;
242
+ }
243
+ }
244
+ if ((0, reflection_1.isNamespaceType)(nameSpaceTypeSofar)) {
245
+ currentSymbols.push(...nameSpaceTypeSofar.getMemberTable().getAllSymbols(symbolTableLookupFlag));
246
+ }
247
+ }
248
+ currentSymbols.push(...this.getScopeSymbolCompletions(file, scope, symbolTableLookupFlag));
249
+ // get global symbols
250
+ if (!gotSymbolsFromGlobal) {
251
+ currentSymbols.push(...this.event.program.globalScope.symbolTable.getOwnSymbols(symbolTableLookupFlag));
252
+ if (symbolTableLookupFlag === SymbolTable_1.SymbolTypeFlag.runtime) {
253
+ currentSymbols.push(...this.getGlobalValues());
254
+ }
255
+ gotSymbolsFromGlobal = true;
256
+ }
257
+ }
258
+ let ignoreAllPropertyNames = false;
259
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
260
+ switch (tokenBefore.kind) {
261
+ case TokenKind_1.TokenKind.New:
262
+ //we are after a new keyword; so we can only be namespaces that have a class or classes at this point
263
+ currentSymbols = currentSymbols.filter(symbol => (0, reflection_1.isClassType)(symbol.type) || this.isNamespaceTypeWithMemberType(symbol.type, reflection_1.isClassType));
264
+ ignoreAllPropertyNames = true;
265
+ break;
266
+ }
267
+ result.push(...this.getSymbolsCompletion(currentSymbols, shouldLookForMembers || shouldLookForCallFuncMembers));
268
+ if (shouldLookForMembers && currentSymbols.length === 0 && !ignoreAllPropertyNames) {
269
+ // could not find members of actual known types.. just try everything
270
+ result.push(...this.getPropertyNameCompletions(scope), ...this.getAllClassMemberCompletions(scope).values());
271
+ }
272
+ else if (shouldLookForCallFuncMembers && currentSymbols.length === 0) {
273
+ // could not find members of actual known types.. just try everything
274
+ result.push(...this.getCallFuncNameCompletions(scope));
275
+ }
276
+ scope.unlinkSymbolTable();
277
+ }
278
+ return result;
279
+ }
280
+ getScopeSymbolCompletions(file, scope, symbolTableLookupFlag) {
281
+ // get all scope available symbols
282
+ const scopeAvailableSymbols = scope.symbolTable.getOwnSymbols(symbolTableLookupFlag).filter(sym => {
283
+ if (file.parseMode === Parser_1.ParseMode.BrighterScript) {
284
+ // eslint-disable-next-line no-bitwise
285
+ if (sym.flags & SymbolTable_1.SymbolTypeFlag.postTranspile) {
286
+ // underscored symbols should not be available in Brighterscript files
287
+ return false;
288
+ }
289
+ }
290
+ else if (file.parseMode === Parser_1.ParseMode.BrightScript) {
291
+ if ((0, reflection_1.isNamespaceType)(sym.type)) {
292
+ return false;
293
+ }
294
+ }
295
+ return true;
296
+ });
297
+ return scopeAvailableSymbols;
298
+ }
299
+ getSymbolsCompletion(symbols, areMembers = false) {
300
+ return symbols.map(symbol => {
301
+ var _a, _b, _c;
302
+ // if this is low priority, sort it at the end of the list
303
+ const sortText = ((_a = symbol.data) === null || _a === void 0 ? void 0 : _a.completionPriority) ? 'z'.repeat((_b = symbol.data) === null || _b === void 0 ? void 0 : _b.completionPriority) + symbol.name : undefined;
304
+ return {
305
+ label: symbol.name,
306
+ kind: this.getCompletionKindFromSymbol(symbol, areMembers),
307
+ detail: (_c = symbol === null || symbol === void 0 ? void 0 : symbol.type) === null || _c === void 0 ? void 0 : _c.toString(),
308
+ documentation: this.getDocumentation(symbol),
309
+ sortText: sortText
310
+ };
311
+ });
312
+ }
313
+ getDocumentation(symbol) {
314
+ var _a, _b, _c;
315
+ if ((_a = symbol.data) === null || _a === void 0 ? void 0 : _a.description) {
316
+ return (_b = symbol.data) === null || _b === void 0 ? void 0 : _b.description;
317
+ }
318
+ return util_1.util.getNodeDocumentation((_c = symbol.data) === null || _c === void 0 ? void 0 : _c.definingNode);
319
+ }
320
+ getCompletionKindFromSymbol(symbol, areMembers = false) {
321
+ const type = symbol === null || symbol === void 0 ? void 0 : symbol.type;
322
+ const extraData = symbol === null || symbol === void 0 ? void 0 : symbol.data;
323
+ if ((0, reflection_1.isConstStatement)(extraData === null || extraData === void 0 ? void 0 : extraData.definingNode)) {
324
+ return vscode_languageserver_1.CompletionItemKind.Constant;
325
+ }
326
+ else if ((0, reflection_1.isClassType)(type)) {
327
+ return vscode_languageserver_1.CompletionItemKind.Class;
328
+ }
329
+ else if ((0, reflection_1.isCallableType)(type)) {
330
+ return areMembers ? vscode_languageserver_1.CompletionItemKind.Method : vscode_languageserver_1.CompletionItemKind.Function;
331
+ }
332
+ else if ((0, reflection_1.isInterfaceType)(type)) {
333
+ return vscode_languageserver_1.CompletionItemKind.Interface;
334
+ }
335
+ else if ((0, reflection_1.isEnumType)(type)) {
336
+ return vscode_languageserver_1.CompletionItemKind.Enum;
337
+ }
338
+ else if ((0, reflection_1.isEnumMemberType)(type)) {
339
+ return vscode_languageserver_1.CompletionItemKind.EnumMember;
340
+ }
341
+ else if ((0, reflection_1.isNamespaceType)(type)) {
342
+ return vscode_languageserver_1.CompletionItemKind.Module;
343
+ }
344
+ else if ((0, reflection_1.isComponentType)(type)) {
345
+ return vscode_languageserver_1.CompletionItemKind.Interface;
346
+ }
347
+ if (areMembers) {
348
+ return vscode_languageserver_1.CompletionItemKind.Field;
349
+ }
350
+ const lowerSymbolName = symbol.name.toLowerCase();
351
+ if (lowerSymbolName === 'true' ||
352
+ lowerSymbolName === 'false' ||
353
+ lowerSymbolName === 'invalid') {
354
+ return vscode_languageserver_1.CompletionItemKind.Value;
355
+ }
356
+ const tokenIdentifier = util_1.util.tokenToBscType((0, creators_1.createIdentifier)(symbol.name));
357
+ if ((0, reflection_1.isNativeType)(tokenIdentifier)) {
358
+ return vscode_languageserver_1.CompletionItemKind.Keyword;
359
+ }
360
+ return vscode_languageserver_1.CompletionItemKind.Variable;
361
+ }
362
+ isNamespaceTypeWithMemberType(nsType, predicate) {
363
+ if (!(0, reflection_1.isNamespaceType)(nsType)) {
364
+ return false;
365
+ }
366
+ const members = nsType.memberTable.getAllSymbols(SymbolTable_1.SymbolTypeFlag.runtime);
367
+ for (const member of members) {
368
+ if (predicate(member.type)) {
369
+ return true;
370
+ }
371
+ else if ((0, reflection_1.isNamespaceType)(member.type)) {
372
+ if (this.isNamespaceTypeWithMemberType(member.type, predicate)) {
373
+ return true;
374
+ }
375
+ }
376
+ }
377
+ return false;
378
+ }
379
+ isMemberAccessible(scope, member, containingClassStmt, containingNamespaceName) {
380
+ var _a, _b;
381
+ // eslint-disable-next-line no-bitwise
382
+ const isPrivate = member.flags & SymbolTable_1.SymbolTypeFlag.private;
383
+ // eslint-disable-next-line no-bitwise
384
+ const isProtected = member.flags & SymbolTable_1.SymbolTypeFlag.protected;
385
+ if (!containingClassStmt || !(isPrivate || isProtected)) {
386
+ // not in a class - no private or protected members allowed
387
+ return !(isPrivate || isProtected);
388
+ }
389
+ const containingClassName = containingClassStmt.getName(Parser_1.ParseMode.BrighterScript);
390
+ const classStmtThatDefinedMember = (_b = (_a = member.data) === null || _a === void 0 ? void 0 : _a.definingNode) === null || _b === void 0 ? void 0 : _b.findAncestor(reflection_1.isClassStatement);
391
+ if (isPrivate) {
392
+ return containingClassStmt === classStmtThatDefinedMember;
393
+ }
394
+ else if (isProtected) {
395
+ const ancestorClasses = scope.getClassHierarchy(containingClassName, containingNamespaceName).map(link => link.item);
396
+ return ancestorClasses.includes(classStmtThatDefinedMember);
397
+ }
398
+ return true;
399
+ }
400
+ getLabelCompletion(functionScope) {
401
+ return functionScope.labelStatements.map(label => ({
402
+ label: label.name,
403
+ kind: vscode_languageserver_1.CompletionItemKind.Reference
404
+ }));
405
+ }
406
+ createCompletionFromFunctionStatement(statement) {
407
+ const funcType = statement.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
408
+ return {
409
+ label: statement.getName(Parser_1.ParseMode.BrighterScript),
410
+ kind: vscode_languageserver_1.CompletionItemKind.Function,
411
+ detail: funcType.toString(),
412
+ documentation: util_1.util.getNodeDocumentation(statement)
413
+ };
414
+ }
415
+ getStringLiteralCompletions(scope, currentToken) {
416
+ const match = /^("?)(pkg|libpkg):/.exec(currentToken.text);
417
+ let result = [];
418
+ if (match) {
419
+ // Get file path locations
420
+ const [, openingQuote, fileProtocol] = match;
421
+ //include every absolute file path from this scope
422
+ for (const file of scope.getAllFiles()) {
423
+ const pkgPath = `${fileProtocol}:/${file.pkgPath.replace(/\\/g, '/')}`;
424
+ result.push({
425
+ label: pkgPath,
426
+ textEdit: vscode_languageserver_1.TextEdit.replace(util_1.util.createRange(currentToken.range.start.line,
427
+ //+1 to step past the opening quote
428
+ currentToken.range.start.character + (openingQuote ? 1 : 0), currentToken.range.end.line,
429
+ //-1 to exclude the closing quotemark (or the end character if there is no closing quotemark)
430
+ currentToken.range.end.character + (currentToken.text.endsWith('"') ? -1 : 0)), pkgPath),
431
+ kind: vscode_languageserver_1.CompletionItemKind.File
432
+ });
433
+ }
434
+ return result;
435
+ }
436
+ else {
437
+ //do nothing. we don't want to show completions inside of strings...
438
+ return [];
439
+ }
440
+ }
441
+ /**
442
+ * Scan all files for property names, and return them as completions
443
+ */
444
+ getPropertyNameCompletions(scope) {
445
+ let results = [];
446
+ scope.enumerateBrsFiles((file) => {
447
+ results.push(...file.propertyNameCompletions);
448
+ });
449
+ return results;
450
+ }
451
+ getAllClassMemberCompletions(scope) {
452
+ let results = new Map();
453
+ let filesSearched = new Set();
454
+ for (const file of scope.getAllFiles()) {
455
+ if ((0, reflection_1.isBrsFile)(file) && !filesSearched.has(file)) {
456
+ // eslint-disable-next-line @typescript-eslint/dot-notation
457
+ for (let cs of file['_cachedLookups'].classStatements) {
458
+ for (let s of [...cs.methods, ...cs.fields]) {
459
+ if (!results.has(s.name.text) && s.name.text.toLowerCase() !== 'new') {
460
+ results.set(s.name.text, {
461
+ label: s.name.text,
462
+ kind: (0, reflection_1.isMethodStatement)(s) ? vscode_languageserver_1.CompletionItemKind.Method : vscode_languageserver_1.CompletionItemKind.Field
463
+ });
464
+ }
465
+ }
466
+ }
467
+ }
468
+ filesSearched.add(file);
469
+ }
470
+ return results;
471
+ }
472
+ /**
473
+ * Scan all xmlScopes for call funcs
474
+ */
475
+ getCallFuncNameCompletions(scope) {
476
+ let completionsArray = [];
477
+ let completetionsLabels = [];
478
+ const xmlScopes = this.event.program.getScopes().filter((s) => (0, reflection_1.isXmlScope)(s));
479
+ // is next to a @. callfunc invocation - must be an component interface method.
480
+ //TODO refactor this to utilize the actual variable's component type (when available)
481
+ for (const scope of xmlScopes) {
482
+ let fileLinks = this.event.program.getStatementsForXmlFile(scope);
483
+ for (let fileLink of fileLinks) {
484
+ let pushItem = this.createCompletionFromFunctionStatement(fileLink.item);
485
+ if (!completetionsLabels.includes(pushItem.label)) {
486
+ completetionsLabels.push(pushItem.label);
487
+ completionsArray.push(pushItem);
488
+ }
489
+ }
490
+ }
491
+ //no other result is possible in this case
492
+ return completionsArray;
493
+ }
494
+ getGlobalValues() {
495
+ return [
496
+ {
497
+ name: 'true',
498
+ type: types_1.BooleanType.instance,
499
+ flags: SymbolTable_1.SymbolTypeFlag.runtime,
500
+ data: {}
501
+ },
502
+ {
503
+ name: 'false',
504
+ type: types_1.BooleanType.instance,
505
+ flags: SymbolTable_1.SymbolTypeFlag.runtime,
506
+ data: {}
507
+ },
508
+ {
509
+ name: 'invalid',
510
+ type: types_1.InvalidType.instance,
511
+ flags: SymbolTable_1.SymbolTypeFlag.runtime,
512
+ data: {}
513
+ }
514
+ ];
515
+ }
51
516
  }
52
517
  exports.CompletionsProcessor = CompletionsProcessor;
518
+ /**
519
+ * List of completions for all valid keywords/reserved words.
520
+ * Build this list once because it won't change for the lifetime of this process
521
+ */
522
+ exports.KeywordCompletions = Object.keys(TokenKind_1.Keywords)
523
+ //remove any keywords with whitespace
524
+ .filter(x => !x.includes(' '))
525
+ //create completions
526
+ .map(x => {
527
+ return {
528
+ label: x,
529
+ kind: vscode_languageserver_1.CompletionItemKind.Keyword
530
+ };
531
+ });
532
+ /**
533
+ * List of completions for all valid intrinsic types.
534
+ * Build this list once because it won't change for the lifetime of this process
535
+ */
536
+ exports.NativeTypeCompletions = TokenKind_1.DeclarableTypes
537
+ //create completions
538
+ .map(x => {
539
+ return {
540
+ label: x.toLowerCase(),
541
+ kind: vscode_languageserver_1.CompletionItemKind.Keyword
542
+ };
543
+ });
53
544
  //# sourceMappingURL=CompletionsProcessor.js.map