brighterscript 0.66.0-alpha.0 → 0.66.0-alpha.10

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 (383) hide show
  1. package/CHANGELOG.md +223 -10
  2. package/README.md +13 -3
  3. package/bsconfig.schema.json +15 -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 +150 -0
  9. package/dist/AstValidationSegmenter.js.map +1 -0
  10. package/dist/BsConfig.d.ts +13 -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 +0 -1
  17. package/dist/CodeActionUtil.d.ts +2 -2
  18. package/dist/CommentFlagProcessor.d.ts +4 -3
  19. package/dist/CommentFlagProcessor.js.map +1 -1
  20. package/dist/DiagnosticCollection.js +8 -5
  21. package/dist/DiagnosticCollection.js.map +1 -1
  22. package/dist/DiagnosticMessages.d.ts +34 -4
  23. package/dist/DiagnosticMessages.js +59 -4
  24. package/dist/DiagnosticMessages.js.map +1 -1
  25. package/dist/FunctionScope.d.ts +1 -1
  26. package/dist/LanguageServer.d.ts +23 -1
  27. package/dist/LanguageServer.js +139 -57
  28. package/dist/LanguageServer.js.map +1 -1
  29. package/dist/Logger.d.ts +3 -2
  30. package/dist/Logger.js +10 -2
  31. package/dist/Logger.js.map +1 -1
  32. package/dist/PluginInterface.d.ts +11 -2
  33. package/dist/PluginInterface.js +69 -10
  34. package/dist/PluginInterface.js.map +1 -1
  35. package/dist/Program.d.ts +138 -49
  36. package/dist/Program.js +656 -340
  37. package/dist/Program.js.map +1 -1
  38. package/dist/ProgramBuilder.d.ts +10 -4
  39. package/dist/ProgramBuilder.js +83 -66
  40. package/dist/ProgramBuilder.js.map +1 -1
  41. package/dist/Scope.d.ts +52 -49
  42. package/dist/Scope.js +312 -247
  43. package/dist/Scope.js.map +1 -1
  44. package/dist/SymbolTable.d.ts +35 -14
  45. package/dist/SymbolTable.js +89 -26
  46. package/dist/SymbolTable.js.map +1 -1
  47. package/dist/Throttler.d.ts +12 -0
  48. package/dist/Throttler.js +39 -0
  49. package/dist/Throttler.js.map +1 -1
  50. package/dist/XmlScope.d.ts +7 -4
  51. package/dist/XmlScope.js +52 -12
  52. package/dist/XmlScope.js.map +1 -1
  53. package/dist/astUtils/{AstEditor.d.ts → Editor.d.ts} +6 -1
  54. package/dist/astUtils/{AstEditor.js → Editor.js} +9 -3
  55. package/dist/astUtils/Editor.js.map +1 -0
  56. package/dist/astUtils/{AstEditor.spec.js → Editor.spec.js} +10 -6
  57. package/dist/astUtils/Editor.spec.js.map +1 -0
  58. package/dist/astUtils/creators.d.ts +3 -1
  59. package/dist/astUtils/creators.js +14 -4
  60. package/dist/astUtils/creators.js.map +1 -1
  61. package/dist/astUtils/reflection.d.ts +37 -9
  62. package/dist/astUtils/reflection.js +83 -14
  63. package/dist/astUtils/reflection.js.map +1 -1
  64. package/dist/astUtils/reflection.spec.js +87 -5
  65. package/dist/astUtils/reflection.spec.js.map +1 -1
  66. package/dist/astUtils/visitors.d.ts +14 -3
  67. package/dist/astUtils/visitors.js +22 -2
  68. package/dist/astUtils/visitors.js.map +1 -1
  69. package/dist/astUtils/visitors.spec.js +58 -7
  70. package/dist/astUtils/visitors.spec.js.map +1 -1
  71. package/dist/bscPlugin/BscPlugin.d.ts +11 -4
  72. package/dist/bscPlugin/BscPlugin.js +26 -6
  73. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  74. package/dist/bscPlugin/CallExpressionInfo.d.ts +3 -3
  75. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
  76. package/dist/bscPlugin/FileWriter.d.ts +6 -0
  77. package/dist/bscPlugin/FileWriter.js +24 -0
  78. package/dist/bscPlugin/FileWriter.js.map +1 -0
  79. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +8 -8
  80. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  81. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +4 -4
  82. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  83. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +50 -1
  84. package/dist/bscPlugin/completions/CompletionsProcessor.js +442 -23
  85. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  86. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +1737 -0
  87. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
  88. package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
  89. package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
  90. package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
  91. package/dist/bscPlugin/hover/HoverProcessor.d.ts +7 -3
  92. package/dist/bscPlugin/hover/HoverProcessor.js +133 -103
  93. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  94. package/dist/bscPlugin/hover/HoverProcessor.spec.js +241 -29
  95. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  96. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +1 -0
  97. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +43 -0
  98. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  99. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +22 -0
  100. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  101. package/dist/bscPlugin/serialize/BslibInjector.spec.js +19 -0
  102. package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
  103. package/dist/bscPlugin/serialize/BslibManager.d.ts +9 -0
  104. package/dist/bscPlugin/serialize/BslibManager.js +40 -0
  105. package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
  106. package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
  107. package/dist/bscPlugin/serialize/FileSerializer.js +72 -0
  108. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
  109. package/dist/bscPlugin/transpile/{BrsFilePreTranspileProcessor.d.ts → BrsFileTranspileProcessor.d.ts} +4 -2
  110. package/dist/bscPlugin/transpile/{BrsFilePreTranspileProcessor.js → BrsFileTranspileProcessor.js} +29 -5
  111. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
  112. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +1 -0
  113. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +41 -0
  114. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
  115. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +2 -2
  116. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -1
  117. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +0 -4
  118. package/dist/bscPlugin/validation/BrsFileValidator.js +35 -65
  119. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  120. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +1 -1
  121. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -1
  122. package/dist/bscPlugin/validation/ProgramValidator.d.ts +3 -3
  123. package/dist/bscPlugin/validation/ProgramValidator.js +6 -6
  124. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -1
  125. package/dist/bscPlugin/validation/ScopeValidator.d.ts +28 -7
  126. package/dist/bscPlugin/validation/ScopeValidator.js +393 -205
  127. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  128. package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
  129. package/dist/bscPlugin/validation/ScopeValidator.spec.js +2038 -0
  130. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
  131. package/dist/bscPlugin/validation/XmlFileValidator.js +2 -2
  132. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
  133. package/dist/cli.js +104 -13
  134. package/dist/cli.js.map +1 -1
  135. package/dist/deferred.d.ts +3 -3
  136. package/dist/deferred.js.map +1 -1
  137. package/dist/diagnosticUtils.d.ts +8 -2
  138. package/dist/diagnosticUtils.js +45 -16
  139. package/dist/diagnosticUtils.js.map +1 -1
  140. package/dist/examples/plugins/removePrint.js +1 -1
  141. package/dist/examples/plugins/removePrint.js.map +1 -1
  142. package/dist/files/AssetFile.d.ts +26 -0
  143. package/dist/files/AssetFile.js +26 -0
  144. package/dist/files/AssetFile.js.map +1 -0
  145. package/dist/files/BrsFile.Class.spec.js +383 -56
  146. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  147. package/dist/files/BrsFile.d.ts +73 -46
  148. package/dist/files/BrsFile.js +370 -534
  149. package/dist/files/BrsFile.js.map +1 -1
  150. package/dist/files/BrsFile.spec.js +1139 -682
  151. package/dist/files/BrsFile.spec.js.map +1 -1
  152. package/dist/files/Factory.d.ts +25 -0
  153. package/dist/files/Factory.js +22 -0
  154. package/dist/files/Factory.js.map +1 -0
  155. package/dist/files/File.d.ts +106 -0
  156. package/dist/files/File.js +16 -0
  157. package/dist/files/File.js.map +1 -0
  158. package/dist/files/LazyFileData.d.ts +20 -0
  159. package/dist/files/LazyFileData.js +54 -0
  160. package/dist/files/LazyFileData.js.map +1 -0
  161. package/dist/files/LazyFileData.spec.d.ts +1 -0
  162. package/dist/files/LazyFileData.spec.js +27 -0
  163. package/dist/files/LazyFileData.spec.js.map +1 -0
  164. package/dist/files/XmlFile.d.ts +56 -23
  165. package/dist/files/XmlFile.js +88 -60
  166. package/dist/files/XmlFile.js.map +1 -1
  167. package/dist/files/XmlFile.spec.js +63 -91
  168. package/dist/files/XmlFile.spec.js.map +1 -1
  169. package/dist/files/tests/imports.spec.js +21 -8
  170. package/dist/files/tests/imports.spec.js.map +1 -1
  171. package/dist/files/tests/optionalChaning.spec.js +14 -14
  172. package/dist/files/tests/optionalChaning.spec.js.map +1 -1
  173. package/dist/globalCallables.js +88 -84
  174. package/dist/globalCallables.js.map +1 -1
  175. package/dist/index.d.ts +9 -1
  176. package/dist/index.js +9 -1
  177. package/dist/index.js.map +1 -1
  178. package/dist/interfaces.d.ts +436 -81
  179. package/dist/interfaces.js +13 -2
  180. package/dist/interfaces.js.map +1 -1
  181. package/dist/lexer/Lexer.d.ts +12 -0
  182. package/dist/lexer/Lexer.js +28 -8
  183. package/dist/lexer/Lexer.js.map +1 -1
  184. package/dist/lexer/Lexer.spec.js +40 -0
  185. package/dist/lexer/Lexer.spec.js.map +1 -1
  186. package/dist/lexer/Token.d.ts +4 -0
  187. package/dist/lexer/Token.js.map +1 -1
  188. package/dist/lexer/TokenKind.d.ts +5 -0
  189. package/dist/lexer/TokenKind.js +14 -2
  190. package/dist/lexer/TokenKind.js.map +1 -1
  191. package/dist/parser/AstNode.d.ts +9 -2
  192. package/dist/parser/AstNode.js +16 -0
  193. package/dist/parser/AstNode.js.map +1 -1
  194. package/dist/parser/BrsTranspileState.d.ts +3 -2
  195. package/dist/parser/BrsTranspileState.js +3 -2
  196. package/dist/parser/BrsTranspileState.js.map +1 -1
  197. package/dist/parser/Expression.d.ts +21 -5
  198. package/dist/parser/Expression.js +128 -35
  199. package/dist/parser/Expression.js.map +1 -1
  200. package/dist/parser/Parser.Class.spec.js +103 -1
  201. package/dist/parser/Parser.Class.spec.js.map +1 -1
  202. package/dist/parser/Parser.d.ts +7 -0
  203. package/dist/parser/Parser.js +117 -21
  204. package/dist/parser/Parser.js.map +1 -1
  205. package/dist/parser/Parser.spec.js +557 -5
  206. package/dist/parser/Parser.spec.js.map +1 -1
  207. package/dist/parser/SGParser.d.ts +4 -4
  208. package/dist/parser/SGParser.js +3 -3
  209. package/dist/parser/SGParser.js.map +1 -1
  210. package/dist/parser/SGParser.spec.js +2 -2
  211. package/dist/parser/SGParser.spec.js.map +1 -1
  212. package/dist/parser/SGTypes.d.ts +2 -2
  213. package/dist/parser/Statement.d.ts +37 -12
  214. package/dist/parser/Statement.js +153 -46
  215. package/dist/parser/Statement.js.map +1 -1
  216. package/dist/parser/tests/Parser.spec.js +2 -1
  217. package/dist/parser/tests/Parser.spec.js.map +1 -1
  218. package/dist/parser/tests/controlFlow/For.spec.js +16 -8
  219. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  220. package/dist/parser/tests/controlFlow/ForEach.spec.js +12 -6
  221. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  222. package/dist/parser/tests/controlFlow/While.spec.js +8 -4
  223. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  224. package/dist/parser/tests/expression/Call.spec.js +4 -4
  225. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  226. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +29 -29
  227. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  228. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +10 -10
  229. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  230. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +24 -24
  231. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  232. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +75 -36
  233. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  234. package/dist/parser/tests/expression/TernaryExpression.spec.js +36 -36
  235. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  236. package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +1 -0
  237. package/dist/parser/tests/expression/UnaryExpression.spec.js +52 -0
  238. package/dist/parser/tests/expression/UnaryExpression.spec.js.map +1 -0
  239. package/dist/parser/tests/statement/ConstStatement.spec.js +71 -22
  240. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -1
  241. package/dist/parser/tests/statement/Continue.spec.js +2 -2
  242. package/dist/parser/tests/statement/Continue.spec.js.map +1 -1
  243. package/dist/parser/tests/statement/Enum.spec.js +38 -285
  244. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  245. package/dist/parser/tests/statement/For.spec.js +6 -6
  246. package/dist/parser/tests/statement/For.spec.js.map +1 -1
  247. package/dist/parser/tests/statement/ForEach.spec.js +4 -4
  248. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -1
  249. package/dist/parser/tests/statement/InterfaceStatement.spec.js +26 -10
  250. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  251. package/dist/parser/tests/statement/PrintStatement.spec.js +16 -13
  252. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  253. package/dist/parser/tests/statement/ReturnStatement.spec.js +5 -3
  254. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  255. package/dist/parser/tests/statement/Set.spec.js +26 -13
  256. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  257. package/dist/preprocessor/Manifest.d.ts +1 -1
  258. package/dist/preprocessor/Manifest.js +2 -2
  259. package/dist/preprocessor/Manifest.js.map +1 -1
  260. package/dist/roku-types/data.json +243 -293
  261. package/dist/roku-types/index.d.ts +17 -38
  262. package/dist/types/ArrayType.d.ts +4 -1
  263. package/dist/types/ArrayType.js +46 -6
  264. package/dist/types/ArrayType.js.map +1 -1
  265. package/dist/types/ArrayType.spec.js +32 -3
  266. package/dist/types/ArrayType.spec.js.map +1 -1
  267. package/dist/types/AssociativeArrayType.d.ts +11 -0
  268. package/dist/types/AssociativeArrayType.js +52 -0
  269. package/dist/types/AssociativeArrayType.js.map +1 -0
  270. package/dist/types/BaseFunctionType.d.ts +9 -0
  271. package/dist/types/BaseFunctionType.js +25 -0
  272. package/dist/types/BaseFunctionType.js.map +1 -0
  273. package/dist/types/BooleanType.d.ts +2 -1
  274. package/dist/types/BooleanType.js +8 -2
  275. package/dist/types/BooleanType.js.map +1 -1
  276. package/dist/types/BscType.d.ts +10 -6
  277. package/dist/types/BscType.js +69 -16
  278. package/dist/types/BscType.js.map +1 -1
  279. package/dist/types/BscTypeKind.d.ts +3 -0
  280. package/dist/types/BscTypeKind.js +3 -0
  281. package/dist/types/BscTypeKind.js.map +1 -1
  282. package/dist/types/BuiltInInterfaceAdder.d.ts +23 -0
  283. package/dist/types/BuiltInInterfaceAdder.js +157 -0
  284. package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
  285. package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
  286. package/dist/types/BuiltInInterfaceAdder.spec.js +116 -0
  287. package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
  288. package/dist/types/ClassType.d.ts +10 -4
  289. package/dist/types/ClassType.js +32 -5
  290. package/dist/types/ClassType.js.map +1 -1
  291. package/dist/types/ClassType.spec.js +5 -3
  292. package/dist/types/ClassType.spec.js.map +1 -1
  293. package/dist/types/ComponentType.d.ts +26 -0
  294. package/dist/types/ComponentType.js +83 -0
  295. package/dist/types/ComponentType.js.map +1 -0
  296. package/dist/types/DoubleType.d.ts +2 -1
  297. package/dist/types/DoubleType.js +9 -2
  298. package/dist/types/DoubleType.js.map +1 -1
  299. package/dist/types/DynamicType.d.ts +2 -2
  300. package/dist/types/DynamicType.js +3 -1
  301. package/dist/types/DynamicType.js.map +1 -1
  302. package/dist/types/EnumType.d.ts +24 -6
  303. package/dist/types/EnumType.js +29 -7
  304. package/dist/types/EnumType.js.map +1 -1
  305. package/dist/types/FloatType.d.ts +2 -1
  306. package/dist/types/FloatType.js +9 -2
  307. package/dist/types/FloatType.js.map +1 -1
  308. package/dist/types/FunctionType.d.ts +8 -20
  309. package/dist/types/FunctionType.js +17 -45
  310. package/dist/types/FunctionType.js.map +1 -1
  311. package/dist/types/InheritableType.d.ts +7 -4
  312. package/dist/types/InheritableType.js +67 -3
  313. package/dist/types/InheritableType.js.map +1 -1
  314. package/dist/types/IntegerType.d.ts +2 -1
  315. package/dist/types/IntegerType.js +9 -2
  316. package/dist/types/IntegerType.js.map +1 -1
  317. package/dist/types/InterfaceType.d.ts +6 -4
  318. package/dist/types/InterfaceType.js +8 -11
  319. package/dist/types/InterfaceType.js.map +1 -1
  320. package/dist/types/InterfaceType.spec.js +30 -2
  321. package/dist/types/InterfaceType.spec.js.map +1 -1
  322. package/dist/types/InvalidType.d.ts +2 -1
  323. package/dist/types/InvalidType.js +7 -1
  324. package/dist/types/InvalidType.js.map +1 -1
  325. package/dist/types/LongIntegerType.d.ts +2 -1
  326. package/dist/types/LongIntegerType.js +9 -2
  327. package/dist/types/LongIntegerType.js.map +1 -1
  328. package/dist/types/NamespaceType.d.ts +2 -1
  329. package/dist/types/NamespaceType.js +3 -0
  330. package/dist/types/NamespaceType.js.map +1 -1
  331. package/dist/types/ObjectType.d.ts +2 -2
  332. package/dist/types/ObjectType.js +5 -10
  333. package/dist/types/ObjectType.js.map +1 -1
  334. package/dist/types/ReferenceType.d.ts +15 -3
  335. package/dist/types/ReferenceType.js +173 -24
  336. package/dist/types/ReferenceType.js.map +1 -1
  337. package/dist/types/ReferenceType.spec.js +21 -6
  338. package/dist/types/ReferenceType.spec.js.map +1 -1
  339. package/dist/types/StringType.d.ts +2 -1
  340. package/dist/types/StringType.js +9 -2
  341. package/dist/types/StringType.js.map +1 -1
  342. package/dist/types/TypedFunctionType.d.ts +33 -0
  343. package/dist/types/TypedFunctionType.js +106 -0
  344. package/dist/types/TypedFunctionType.js.map +1 -0
  345. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  346. package/dist/types/TypedFunctionType.spec.js +122 -0
  347. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  348. package/dist/types/UninitializedType.d.ts +2 -1
  349. package/dist/types/UninitializedType.js +1 -1
  350. package/dist/types/UninitializedType.js.map +1 -1
  351. package/dist/types/UnionType.d.ts +4 -2
  352. package/dist/types/UnionType.js +36 -4
  353. package/dist/types/UnionType.js.map +1 -1
  354. package/dist/types/UnionType.spec.js +46 -19
  355. package/dist/types/UnionType.spec.js.map +1 -1
  356. package/dist/types/VoidType.d.ts +2 -1
  357. package/dist/types/VoidType.js +7 -2
  358. package/dist/types/VoidType.js.map +1 -1
  359. package/dist/types/helper.spec.js +15 -0
  360. package/dist/types/helper.spec.js.map +1 -1
  361. package/dist/types/helpers.d.ts +5 -0
  362. package/dist/types/helpers.js +50 -3
  363. package/dist/types/helpers.js.map +1 -1
  364. package/dist/types/index.d.ts +1 -1
  365. package/dist/types/index.js +1 -1
  366. package/dist/types/index.js.map +1 -1
  367. package/dist/util.d.ts +71 -15
  368. package/dist/util.js +578 -150
  369. package/dist/util.js.map +1 -1
  370. package/dist/validators/ClassValidator.d.ts +0 -1
  371. package/dist/validators/ClassValidator.js +0 -22
  372. package/dist/validators/ClassValidator.js.map +1 -1
  373. package/package.json +3 -2
  374. package/dist/astUtils/AstEditor.js.map +0 -1
  375. package/dist/astUtils/AstEditor.spec.js.map +0 -1
  376. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +0 -1
  377. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +0 -31
  378. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +0 -1
  379. package/dist/types/FunctionType.spec.js +0 -23
  380. package/dist/types/FunctionType.spec.js.map +0 -1
  381. /package/dist/astUtils/{AstEditor.spec.d.ts → Editor.spec.d.ts} +0 -0
  382. /package/dist/bscPlugin/{transpile/BrsFilePreTranspileProcessor.spec.d.ts → completions/CompletionsProcessor.spec.d.ts} +0 -0
  383. /package/dist/{types/FunctionType.spec.d.ts → bscPlugin/serialize/BslibInjector.spec.d.ts} +0 -0
@@ -7,6 +7,7 @@ const util_1 = require("../util");
7
7
  const Parser_1 = require("./Parser");
8
8
  const visitors_1 = require("../astUtils/visitors");
9
9
  const reflection_1 = require("../astUtils/reflection");
10
+ const interfaces_1 = require("../interfaces");
10
11
  const SymbolTable_1 = require("../SymbolTable");
11
12
  const creators_1 = require("../astUtils/creators");
12
13
  const DynamicType_1 = require("../types/DynamicType");
@@ -18,7 +19,7 @@ const EnumType_1 = require("../types/EnumType");
18
19
  const NamespaceType_1 = require("../types/NamespaceType");
19
20
  const InterfaceType_1 = require("../types/InterfaceType");
20
21
  const VoidType_1 = require("../types/VoidType");
21
- const FunctionType_1 = require("../types/FunctionType");
22
+ const TypedFunctionType_1 = require("../types/TypedFunctionType");
22
23
  class EmptyStatement extends AstNode_2.Statement {
23
24
  constructor(
24
25
  /**
@@ -132,7 +133,12 @@ class AssignmentStatement extends AstNode_2.Statement {
132
133
  }
133
134
  }
134
135
  getType(options) {
135
- const rhs = this.value.getType(options);
136
+ // TODO: Do we still need this.typeExpression?
137
+ var _a;
138
+ // Note: compound assignments (eg. +=) are internally dealt with via the RHS being a BinaryExpression
139
+ // so this.value will be a BinaryExpression, and BinaryExpressions can figure out their own types
140
+ const rhs = this.value.getType(Object.assign(Object.assign({}, options), { typeChain: undefined }));
141
+ (_a = options.typeChain) === null || _a === void 0 ? void 0 : _a.push(new interfaces_1.TypeChainEntry(this.name.text, rhs, options.flags, this.name.range));
136
142
  return rhs;
137
143
  }
138
144
  }
@@ -287,6 +293,9 @@ class FunctionStatement extends AstNode_2.Statement {
287
293
  return this.name.text;
288
294
  }
289
295
  }
296
+ getLeadingTrivia() {
297
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
298
+ }
290
299
  transpile(state) {
291
300
  //create a fake token using the full transpiled name
292
301
  let nameToken = Object.assign(Object.assign({}, this.name), { text: this.getName(Parser_1.ParseMode.BrightScript) });
@@ -307,8 +316,9 @@ class FunctionStatement extends AstNode_2.Statement {
307
316
  }
308
317
  }
309
318
  getType(options) {
319
+ var _a;
310
320
  const funcExprType = this.func.getType(options);
311
- funcExprType.setName(this.name.text);
321
+ funcExprType.setName((_a = this.name) === null || _a === void 0 ? void 0 : _a.text);
312
322
  return funcExprType;
313
323
  }
314
324
  }
@@ -528,6 +538,9 @@ class LabelStatement extends AstNode_2.Statement {
528
538
  this.kind = AstNode_1.AstNodeKind.LabelStatement;
529
539
  this.range = util_1.util.createBoundingRange(tokens.identifier, tokens.colon);
530
540
  }
541
+ getLeadingTrivia() {
542
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.identifier.leadingTrivia);
543
+ }
531
544
  transpile(state) {
532
545
  return [
533
546
  state.transpileToken(this.tokens.identifier),
@@ -830,9 +843,7 @@ class LibraryStatement extends AstNode_2.Statement {
830
843
  }
831
844
  exports.LibraryStatement = LibraryStatement;
832
845
  class NamespaceStatement extends AstNode_2.Statement {
833
- constructor(keyword,
834
- // this should technically only be a VariableExpression or DottedGetExpression, but that can be enforced elsewhere
835
- nameExpression, body, endKeyword) {
846
+ constructor(keyword, nameExpression, body, endKeyword) {
836
847
  super();
837
848
  this.keyword = keyword;
838
849
  this.nameExpression = nameExpression;
@@ -853,14 +864,25 @@ class NamespaceStatement extends AstNode_2.Statement {
853
864
  return this._range;
854
865
  }
855
866
  getName(parseMode) {
856
- const parentNamespace = this.findAncestor(reflection_1.isNamespaceStatement);
867
+ var _a, _b;
857
868
  const sep = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
858
869
  let name = util_1.util.getAllDottedGetPartsAsString(this.nameExpression, parseMode);
859
- if (parentNamespace) {
860
- name = parentNamespace.getName(parseMode) + sep + name;
870
+ if (((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.kind) === AstNode_1.AstNodeKind.NamespaceStatement) {
871
+ name = this.parent.parent.getName(parseMode) + sep + name;
861
872
  }
862
873
  return name;
863
874
  }
875
+ getLeadingTrivia() {
876
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.keyword.leadingTrivia);
877
+ }
878
+ getNameParts() {
879
+ var _a, _b;
880
+ let parts = util_1.util.getAllDottedGetParts(this.nameExpression);
881
+ if (((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.kind) === AstNode_1.AstNodeKind.NamespaceStatement) {
882
+ parts = this.parent.parent.getNameParts().concat(parts);
883
+ }
884
+ return parts;
885
+ }
864
886
  transpile(state) {
865
887
  //namespaces don't actually have any real content, so just transpile their bodies
866
888
  return this.body.transpile(state);
@@ -887,7 +909,6 @@ class NamespaceStatement extends AstNode_2.Statement {
887
909
  }
888
910
  getType(options) {
889
911
  const resultType = new NamespaceType_1.NamespaceType(this.name);
890
- resultType.pushMemberProvider(() => this.body.getSymbolTable());
891
912
  return resultType;
892
913
  }
893
914
  }
@@ -954,6 +975,9 @@ class InterfaceStatement extends AstNode_2.Statement {
954
975
  hasParentInterface() {
955
976
  return !!this.parentInterfaceName;
956
977
  }
978
+ getLeadingTrivia() {
979
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.interface.leadingTrivia);
980
+ }
957
981
  /**
958
982
  * The name of the interface WITH its leading namespace (if applicable)
959
983
  */
@@ -1037,35 +1061,48 @@ class InterfaceStatement extends AstNode_2.Statement {
1037
1061
  }
1038
1062
  }
1039
1063
  getType(options) {
1040
- var _a, _b, _c;
1064
+ var _a, _b, _c, _d;
1041
1065
  const superIface = (_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getType(options);
1042
1066
  const resultType = new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), superIface);
1043
1067
  for (const statement of this.methods) {
1044
- resultType.addMember((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement === null || statement === void 0 ? void 0 : statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1068
+ const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
1069
+ const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
1070
+ resultType.addMember((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, { definingNode: statement }, memberType, flag);
1045
1071
  }
1046
1072
  for (const statement of this.fields) {
1047
- resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1073
+ const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
1074
+ const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
1075
+ resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, memberType, flag);
1048
1076
  }
1077
+ (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry(this.getName(Parser_1.ParseMode.BrighterScript), resultType, options.flags, this.range));
1049
1078
  return resultType;
1050
1079
  }
1051
1080
  }
1052
1081
  exports.InterfaceStatement = InterfaceStatement;
1053
1082
  class InterfaceFieldStatement extends AstNode_2.Statement {
1054
- constructor(nameToken, asToken, typeExpression) {
1083
+ constructor(nameToken, asToken, typeExpression, optionalToken) {
1055
1084
  super();
1056
1085
  this.typeExpression = typeExpression;
1057
1086
  this.kind = AstNode_1.AstNodeKind.InterfaceFieldStatement;
1058
1087
  this.tokens = {};
1088
+ this.tokens.optional = optionalToken;
1059
1089
  this.tokens.name = nameToken;
1060
1090
  this.tokens.as = asToken;
1061
- this.range = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.typeExpression);
1091
+ this.range = util_1.util.createBoundingRange(this.tokens.optional, this.tokens.name, this.tokens.as, this.typeExpression);
1062
1092
  }
1063
1093
  transpile(state) {
1064
1094
  throw new Error('Method not implemented.');
1065
1095
  }
1096
+ getLeadingTrivia() {
1097
+ var _a, _b;
1098
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_b = (_a = this.tokens.optional) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : this.tokens.name.leadingTrivia);
1099
+ }
1066
1100
  get name() {
1067
1101
  return this.tokens.name.text;
1068
1102
  }
1103
+ get isOptional() {
1104
+ return !!this.tokens.optional;
1105
+ }
1069
1106
  walk(visitor, options) {
1070
1107
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1071
1108
  (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
@@ -1077,6 +1114,9 @@ class InterfaceFieldStatement extends AstNode_2.Statement {
1077
1114
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1078
1115
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1079
1116
  }
1117
+ if (this.isOptional) {
1118
+ result.push(this.tokens.optional.text, ' ');
1119
+ }
1080
1120
  result.push(this.tokens.name.text);
1081
1121
  if (this.typeExpression) {
1082
1122
  result.push(' as ', ...this.typeExpression.getTypedef(state));
@@ -1092,12 +1132,13 @@ exports.InterfaceFieldStatement = InterfaceFieldStatement;
1092
1132
  //TODO: there is much that is similar with this and FunctionExpression.
1093
1133
  //It would be nice to refactor this so there is less duplicated code
1094
1134
  class InterfaceMethodStatement extends AstNode_2.Statement {
1095
- constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeExpression) {
1135
+ constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeExpression, optionalToken) {
1096
1136
  super();
1097
1137
  this.params = params;
1098
1138
  this.returnTypeExpression = returnTypeExpression;
1099
1139
  this.kind = AstNode_1.AstNodeKind.InterfaceMethodStatement;
1100
1140
  this.tokens = {};
1141
+ this.tokens.optional = optionalToken;
1101
1142
  this.tokens.functionType = functionTypeToken;
1102
1143
  this.tokens.name = nameToken;
1103
1144
  this.tokens.leftParen = leftParen;
@@ -1109,7 +1150,20 @@ class InterfaceMethodStatement extends AstNode_2.Statement {
1109
1150
  }
1110
1151
  get range() {
1111
1152
  var _a;
1112
- return util_1.util.createBoundingRange(this.tokens.functionType, this.tokens.name, this.tokens.leftParen, ...((_a = this.params) !== null && _a !== void 0 ? _a : []), this.tokens.rightParen, this.tokens.as, this.returnTypeExpression);
1153
+ return util_1.util.createBoundingRange(this.tokens.optional, this.tokens.functionType, this.tokens.name, this.tokens.leftParen, ...((_a = this.params) !== null && _a !== void 0 ? _a : []), this.tokens.rightParen, this.tokens.as, this.returnTypeExpression);
1154
+ }
1155
+ /**
1156
+ * Get the name of this method.
1157
+ */
1158
+ getName(parseMode) {
1159
+ return this.tokens.name.text;
1160
+ }
1161
+ get isOptional() {
1162
+ return !!this.tokens.optional;
1163
+ }
1164
+ getLeadingTrivia() {
1165
+ var _a, _b;
1166
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_b = (_a = this.tokens.optional) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : this.tokens.functionType.leadingTrivia);
1113
1167
  }
1114
1168
  walk(visitor, options) {
1115
1169
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
@@ -1122,6 +1176,9 @@ class InterfaceMethodStatement extends AstNode_2.Statement {
1122
1176
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1123
1177
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1124
1178
  }
1179
+ if (this.isOptional) {
1180
+ result.push(this.tokens.optional.text, ' ');
1181
+ }
1125
1182
  result.push(this.tokens.functionType.text, ' ', this.tokens.name.text, '(');
1126
1183
  const params = (_b = this.params) !== null && _b !== void 0 ? _b : [];
1127
1184
  for (let i = 0; i < params.length; i++) {
@@ -1141,7 +1198,7 @@ class InterfaceMethodStatement extends AstNode_2.Statement {
1141
1198
  return result;
1142
1199
  }
1143
1200
  getType(options) {
1144
- var _a;
1201
+ var _a, _b, _c;
1145
1202
  //if there's a defined return type, use that
1146
1203
  let returnType = (_a = this.returnTypeExpression) === null || _a === void 0 ? void 0 : _a.getType(options);
1147
1204
  const isSub = this.tokens.functionType.kind === TokenKind_1.TokenKind.Sub;
@@ -1149,11 +1206,18 @@ class InterfaceMethodStatement extends AstNode_2.Statement {
1149
1206
  if (!returnType) {
1150
1207
  returnType = isSub ? VoidType_1.VoidType.instance : DynamicType_1.DynamicType.instance;
1151
1208
  }
1152
- const resultType = new FunctionType_1.FunctionType(returnType);
1209
+ const resultType = new TypedFunctionType_1.TypedFunctionType(returnType);
1153
1210
  resultType.isSub = isSub;
1154
1211
  for (let param of this.params) {
1155
1212
  resultType.addParameter(param.name.text, param.getType(options), !!param.defaultValue);
1156
1213
  }
1214
+ if (options.typeChain) {
1215
+ // need Interface type for type chain
1216
+ (_b = this.parent) === null || _b === void 0 ? void 0 : _b.getType(options);
1217
+ }
1218
+ let funcName = this.getName(Parser_1.ParseMode.BrighterScript);
1219
+ resultType.setName(funcName);
1220
+ (_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.flags, this.range));
1157
1221
  return resultType;
1158
1222
  }
1159
1223
  }
@@ -1164,7 +1228,7 @@ class ClassStatement extends AstNode_2.Statement {
1164
1228
  * The name of the class (without namespace prefix)
1165
1229
  */
1166
1230
  name, body, end, extendsKeyword, parentClassName) {
1167
- var _a, _b, _c;
1231
+ var _a, _b, _c, _d;
1168
1232
  super();
1169
1233
  this.classKeyword = classKeyword;
1170
1234
  this.name = name;
@@ -1177,14 +1241,15 @@ class ClassStatement extends AstNode_2.Statement {
1177
1241
  this.methods = [];
1178
1242
  this.fields = [];
1179
1243
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1244
+ this.symbolTable = new SymbolTable_2.SymbolTable(`ClassStatement: '${(_b = this.name) === null || _b === void 0 ? void 0 : _b.text}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
1180
1245
  for (let statement of this.body) {
1181
1246
  if ((0, reflection_1.isMethodStatement)(statement)) {
1182
1247
  this.methods.push(statement);
1183
- this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
1248
+ this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
1184
1249
  }
1185
1250
  else if ((0, reflection_1.isFieldStatement)(statement)) {
1186
1251
  this.fields.push(statement);
1187
- this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
1252
+ this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
1188
1253
  }
1189
1254
  }
1190
1255
  this.range = util_1.util.createBoundingRange(classKeyword, name, extendsKeyword, parentClassName, ...(body !== null && body !== void 0 ? body : []), end);
@@ -1208,6 +1273,9 @@ class ClassStatement extends AstNode_2.Statement {
1208
1273
  return undefined;
1209
1274
  }
1210
1275
  }
1276
+ getLeadingTrivia() {
1277
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.classKeyword.leadingTrivia);
1278
+ }
1211
1279
  transpile(state) {
1212
1280
  let result = [];
1213
1281
  //make the builder
@@ -1309,6 +1377,12 @@ class ClassStatement extends AstNode_2.Statement {
1309
1377
  }
1310
1378
  return `__${name}_builder`;
1311
1379
  }
1380
+ getConstructorType() {
1381
+ var _a, _b;
1382
+ const constructorType = (_b = (_a = this.getConstructorFunction()) === null || _a === void 0 ? void 0 : _a.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime })) !== null && _b !== void 0 ? _b : new TypedFunctionType_1.TypedFunctionType(null);
1383
+ constructorType.returnType = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
1384
+ return constructorType;
1385
+ }
1312
1386
  /**
1313
1387
  * Get the constructor function for this class (if exists), or undefined if not exist
1314
1388
  */
@@ -1446,16 +1520,20 @@ class ClassStatement extends AstNode_2.Statement {
1446
1520
  }
1447
1521
  }
1448
1522
  getType(options) {
1449
- var _a, _b, _c;
1523
+ var _a, _b, _c, _d;
1450
1524
  const superClass = (_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getType(options);
1451
1525
  const resultType = new ClassType_1.ClassType(this.getName(Parser_1.ParseMode.BrighterScript), superClass);
1452
1526
  for (const statement of this.methods) {
1453
- const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getType(options);
1454
- resultType.addMember((_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType, SymbolTable_1.SymbolTypeFlag.runtime);
1527
+ const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
1528
+ const flag = SymbolTable_1.SymbolTypeFlag.runtime;
1529
+ resultType.addMember((_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text, { definingNode: statement }, funcType, flag);
1455
1530
  }
1456
1531
  for (const statement of this.fields) {
1457
- resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1532
+ const fieldType = statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
1533
+ const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
1534
+ resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, fieldType, flag);
1458
1535
  }
1536
+ (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.flags, this.range));
1459
1537
  return resultType;
1460
1538
  }
1461
1539
  }
@@ -1490,6 +1568,9 @@ class MethodStatement extends FunctionStatement {
1490
1568
  getName(parseMode) {
1491
1569
  return this.name.text;
1492
1570
  }
1571
+ getLeadingTrivia() {
1572
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
1573
+ }
1493
1574
  transpile(state) {
1494
1575
  if (this.name.text.toLowerCase() === 'new') {
1495
1576
  this.ensureSuperConstructorCall(state);
@@ -1562,19 +1643,22 @@ class MethodStatement extends FunctionStatement {
1562
1643
  text: 'super',
1563
1644
  isReserved: false,
1564
1645
  range: state.classStatement.name.range,
1565
- leadingWhitespace: ''
1646
+ leadingWhitespace: '',
1647
+ leadingTrivia: []
1566
1648
  }), {
1567
1649
  kind: TokenKind_1.TokenKind.LeftParen,
1568
1650
  text: '(',
1569
1651
  isReserved: false,
1570
1652
  range: state.classStatement.name.range,
1571
- leadingWhitespace: ''
1653
+ leadingWhitespace: '',
1654
+ leadingTrivia: []
1572
1655
  }, {
1573
1656
  kind: TokenKind_1.TokenKind.RightParen,
1574
1657
  text: ')',
1575
1658
  isReserved: false,
1576
1659
  range: state.classStatement.name.range,
1577
- leadingWhitespace: ''
1660
+ leadingWhitespace: '',
1661
+ leadingTrivia: []
1578
1662
  }, []));
1579
1663
  state.editor.arrayUnshift(this.func.body.statements, superCall);
1580
1664
  }
@@ -1588,13 +1672,14 @@ class MethodStatement extends FunctionStatement {
1588
1672
  for (let field of state.classStatement.fields) {
1589
1673
  let thisQualifiedName = Object.assign({}, field.name);
1590
1674
  thisQualifiedName.text = 'm.' + field.name.text;
1591
- if (field.initialValue) {
1592
- newStatements.push(new AssignmentStatement(field.equal, thisQualifiedName, field.initialValue));
1593
- }
1594
- else {
1675
+ const fieldAssignment = field.initialValue
1676
+ ? new AssignmentStatement(field.equal, thisQualifiedName, field.initialValue)
1677
+ : new AssignmentStatement((0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), thisQualifiedName,
1595
1678
  //if there is no initial value, set the initial value to `invalid`
1596
- newStatements.push(new AssignmentStatement((0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), thisQualifiedName, (0, creators_1.createInvalidLiteral)('invalid', field.name.range)));
1597
- }
1679
+ (0, creators_1.createInvalidLiteral)('invalid', field.name.range));
1680
+ // Add parent so namespace lookups work
1681
+ fieldAssignment.parent = state.classStatement;
1682
+ newStatements.push(fieldAssignment);
1598
1683
  }
1599
1684
  state.editor.arraySplice(this.func.body.statements, startingIndex, 0, ...newStatements);
1600
1685
  }
@@ -1606,7 +1691,7 @@ class MethodStatement extends FunctionStatement {
1606
1691
  }
1607
1692
  exports.MethodStatement = MethodStatement;
1608
1693
  class FieldStatement extends AstNode_2.Statement {
1609
- constructor(accessModifier, name, as, typeExpression, equal, initialValue) {
1694
+ constructor(accessModifier, name, as, typeExpression, equal, initialValue, optional) {
1610
1695
  super();
1611
1696
  this.accessModifier = accessModifier;
1612
1697
  this.name = name;
@@ -1614,8 +1699,9 @@ class FieldStatement extends AstNode_2.Statement {
1614
1699
  this.typeExpression = typeExpression;
1615
1700
  this.equal = equal;
1616
1701
  this.initialValue = initialValue;
1702
+ this.optional = optional;
1617
1703
  this.kind = AstNode_1.AstNodeKind.FieldStatement;
1618
- this.range = util_1.util.createBoundingRange(accessModifier, name, as, typeExpression, equal, initialValue);
1704
+ this.range = util_1.util.createBoundingRange(accessModifier, optional, name, as, typeExpression, equal, initialValue);
1619
1705
  }
1620
1706
  /**
1621
1707
  * Derive a ValueKind from the type token, or the initial value.
@@ -1625,6 +1711,13 @@ class FieldStatement extends AstNode_2.Statement {
1625
1711
  var _a, _b, _c, _d;
1626
1712
  return (_d = (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.typetime }))) !== null && _b !== void 0 ? _b : (_c = this.initialValue) === null || _c === void 0 ? void 0 : _c.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.runtime }))) !== null && _d !== void 0 ? _d : DynamicType_1.DynamicType.instance;
1627
1713
  }
1714
+ getLeadingTrivia() {
1715
+ var _a, _b, _c, _d, _e, _f;
1716
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_f = (_d = (_b = (_a = this.accessModifier) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : (_c = this.optional) === null || _c === void 0 ? void 0 : _c.leadingTrivia) !== null && _d !== void 0 ? _d : (_e = this.name) === null || _e === void 0 ? void 0 : _e.leadingTrivia) !== null && _f !== void 0 ? _f : []);
1717
+ }
1718
+ get isOptional() {
1719
+ return !!this.optional;
1720
+ }
1628
1721
  transpile(state) {
1629
1722
  throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
1630
1723
  }
@@ -1639,7 +1732,11 @@ class FieldStatement extends AstNode_2.Statement {
1639
1732
  if ((0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1640
1733
  type = new DynamicType_1.DynamicType();
1641
1734
  }
1642
- result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ', (_d = this.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
1735
+ result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ');
1736
+ if (this.isOptional) {
1737
+ result.push(this.optional.text, ' ');
1738
+ }
1739
+ result.push((_d = this.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
1643
1740
  }
1644
1741
  return result;
1645
1742
  }
@@ -1758,6 +1855,9 @@ class EnumStatement extends AstNode_2.Statement {
1758
1855
  }
1759
1856
  return result;
1760
1857
  }
1858
+ getLeadingTrivia() {
1859
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.enum.leadingTrivia);
1860
+ }
1761
1861
  /**
1762
1862
  * Get a map of member names and their values.
1763
1863
  * All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
@@ -1852,12 +1952,13 @@ class EnumStatement extends AstNode_2.Statement {
1852
1952
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1853
1953
  }
1854
1954
  }
1855
- getType() {
1856
- var _a, _b;
1857
- const resultType = new EnumType_1.EnumType(this.fullName);
1955
+ getType(options) {
1956
+ var _a, _b, _c;
1957
+ const members = this.getMembers();
1958
+ const resultType = new EnumType_1.EnumType(this.fullName, (_a = members[0]) === null || _a === void 0 ? void 0 : _a.getType(options).underlyingType);
1858
1959
  resultType.pushMemberProvider(() => this.getSymbolTable());
1859
- for (const statement of this.getMembers()) {
1860
- resultType.addMember((_b = (_a = statement === null || statement === void 0 ? void 0 : statement.tokens) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType(), SymbolTable_1.SymbolTypeFlag.runtime);
1960
+ for (const statement of members) {
1961
+ resultType.addMember((_c = (_b = statement === null || statement === void 0 ? void 0 : statement.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1861
1962
  }
1862
1963
  return resultType;
1863
1964
  }
@@ -1879,6 +1980,9 @@ class EnumMemberStatement extends AstNode_2.Statement {
1879
1980
  get name() {
1880
1981
  return this.tokens.name.text;
1881
1982
  }
1983
+ getLeadingTrivia() {
1984
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.name.leadingTrivia);
1985
+ }
1882
1986
  transpile(state) {
1883
1987
  return [];
1884
1988
  }
@@ -1899,9 +2003,9 @@ class EnumMemberStatement extends AstNode_2.Statement {
1899
2003
  (0, visitors_1.walk)(this, 'value', visitor, options);
1900
2004
  }
1901
2005
  }
1902
- getType() {
1903
- var _a, _b, _c;
1904
- return new EnumType_1.EnumMemberType((_a = this.parent) === null || _a === void 0 ? void 0 : _a.fullName, (_c = (_b = this.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text);
2006
+ getType(options) {
2007
+ var _a, _b, _c, _d;
2008
+ return new EnumType_1.EnumMemberType((_a = this.parent) === null || _a === void 0 ? void 0 : _a.fullName, (_c = (_b = this.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, (_d = this.value) === null || _d === void 0 ? void 0 : _d.getType(options));
1905
2009
  }
1906
2010
  }
1907
2011
  exports.EnumMemberStatement = EnumMemberStatement;
@@ -1916,6 +2020,9 @@ class ConstStatement extends AstNode_2.Statement {
1916
2020
  get name() {
1917
2021
  return this.tokens.name.text;
1918
2022
  }
2023
+ getLeadingTrivia() {
2024
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.const.leadingTrivia);
2025
+ }
1919
2026
  /**
1920
2027
  * The name of the statement WITH its leading namespace (if applicable)
1921
2028
  */