brighterscript 1.0.0-alpha.13 → 1.0.0-alpha.16

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 (229) hide show
  1. package/CHANGELOG.md +87 -2
  2. package/dist/Cache.d.ts +3 -8
  3. package/dist/Cache.js +9 -14
  4. package/dist/Cache.js.map +1 -1
  5. package/dist/DependencyGraph.js +5 -4
  6. package/dist/DependencyGraph.js.map +1 -1
  7. package/dist/DiagnosticMessages.d.ts +21 -1
  8. package/dist/DiagnosticMessages.js +21 -1
  9. package/dist/DiagnosticMessages.js.map +1 -1
  10. package/dist/LanguageServer.d.ts +1 -6
  11. package/dist/LanguageServer.js +0 -9
  12. package/dist/LanguageServer.js.map +1 -1
  13. package/dist/PluginInterface.d.ts +3 -3
  14. package/dist/PluginInterface.js +3 -0
  15. package/dist/PluginInterface.js.map +1 -1
  16. package/dist/Program.d.ts +30 -16
  17. package/dist/Program.js +108 -43
  18. package/dist/Program.js.map +1 -1
  19. package/dist/ProgramBuilder.js +3 -3
  20. package/dist/ProgramBuilder.js.map +1 -1
  21. package/dist/Scope.d.ts +29 -15
  22. package/dist/Scope.js +68 -28
  23. package/dist/Scope.js.map +1 -1
  24. package/dist/SymbolTable.d.ts +1 -1
  25. package/dist/XmlScope.d.ts +3 -3
  26. package/dist/astUtils/AstEditor.d.ts +6 -0
  27. package/dist/astUtils/AstEditor.js +10 -0
  28. package/dist/astUtils/AstEditor.js.map +1 -1
  29. package/dist/astUtils/AstEditor.spec.js +37 -0
  30. package/dist/astUtils/AstEditor.spec.js.map +1 -1
  31. package/dist/astUtils/creators.d.ts +8 -4
  32. package/dist/astUtils/creators.js +87 -6
  33. package/dist/astUtils/creators.js.map +1 -1
  34. package/dist/astUtils/reflection.d.ts +5 -1
  35. package/dist/astUtils/reflection.js +15 -3
  36. package/dist/astUtils/reflection.js.map +1 -1
  37. package/dist/astUtils/reflection.spec.js +11 -10
  38. package/dist/astUtils/reflection.spec.js.map +1 -1
  39. package/dist/astUtils/visitors.d.ts +3 -1
  40. package/dist/astUtils/visitors.js.map +1 -1
  41. package/dist/astUtils/visitors.spec.js +8 -8
  42. package/dist/astUtils/visitors.spec.js.map +1 -1
  43. package/dist/bscPlugin/BscPlugin.d.ts +4 -1
  44. package/dist/bscPlugin/BscPlugin.js +21 -2
  45. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  46. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +3 -3
  47. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  48. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  49. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
  50. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
  51. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  52. package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.d.ts → BrsFileSemanticTokensProcessor.spec.d.ts} +0 -0
  53. package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.js → BrsFileSemanticTokensProcessor.spec.js} +30 -2
  54. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  55. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  56. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +36 -0
  57. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  58. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  59. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  60. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  61. package/dist/bscPlugin/validation/ScopeValidator.d.ts +11 -0
  62. package/dist/bscPlugin/validation/ScopeValidator.js +94 -0
  63. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  64. package/dist/diagnosticUtils.js +3 -3
  65. package/dist/diagnosticUtils.js.map +1 -1
  66. package/dist/files/BrsFile.Class.spec.js +382 -232
  67. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  68. package/dist/files/BrsFile.d.ts +26 -12
  69. package/dist/files/BrsFile.js +268 -119
  70. package/dist/files/BrsFile.js.map +1 -1
  71. package/dist/files/BrsFile.spec.js +570 -168
  72. package/dist/files/BrsFile.spec.js.map +1 -1
  73. package/dist/files/XmlFile.d.ts +11 -10
  74. package/dist/files/XmlFile.js +16 -11
  75. package/dist/files/XmlFile.js.map +1 -1
  76. package/dist/files/XmlFile.spec.js +60 -58
  77. package/dist/files/XmlFile.spec.js.map +1 -1
  78. package/dist/files/tests/imports.spec.js +8 -6
  79. package/dist/files/tests/imports.spec.js.map +1 -1
  80. package/dist/index.d.ts +12 -3
  81. package/dist/index.js +21 -4
  82. package/dist/index.js.map +1 -1
  83. package/dist/interfaces.d.ts +63 -35
  84. package/dist/lexer/Lexer.js +1 -2
  85. package/dist/lexer/Lexer.js.map +1 -1
  86. package/dist/lexer/Lexer.spec.js +470 -462
  87. package/dist/lexer/Lexer.spec.js.map +1 -1
  88. package/dist/lexer/TokenKind.d.ts +2 -0
  89. package/dist/lexer/TokenKind.js +5 -0
  90. package/dist/lexer/TokenKind.js.map +1 -1
  91. package/dist/parser/Expression.d.ts +18 -16
  92. package/dist/parser/Expression.js +57 -48
  93. package/dist/parser/Expression.js.map +1 -1
  94. package/dist/parser/Parser.Class.spec.js +33 -32
  95. package/dist/parser/Parser.Class.spec.js.map +1 -1
  96. package/dist/parser/Parser.d.ts +28 -7
  97. package/dist/parser/Parser.js +508 -296
  98. package/dist/parser/Parser.js.map +1 -1
  99. package/dist/parser/Parser.spec.js +157 -35
  100. package/dist/parser/Parser.spec.js.map +1 -1
  101. package/dist/parser/SGTypes.spec.js +9 -9
  102. package/dist/parser/SGTypes.spec.js.map +1 -1
  103. package/dist/parser/Statement.d.ts +80 -20
  104. package/dist/parser/Statement.js +257 -92
  105. package/dist/parser/Statement.js.map +1 -1
  106. package/dist/parser/tests/Parser.spec.d.ts +3 -3
  107. package/dist/parser/tests/Parser.spec.js +4 -4
  108. package/dist/parser/tests/Parser.spec.js.map +1 -1
  109. package/dist/parser/tests/controlFlow/For.spec.js +40 -40
  110. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  111. package/dist/parser/tests/controlFlow/ForEach.spec.js +22 -21
  112. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  113. package/dist/parser/tests/controlFlow/If.spec.js +100 -99
  114. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  115. package/dist/parser/tests/controlFlow/While.spec.js +25 -25
  116. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  117. package/dist/parser/tests/expression/Additive.spec.js +21 -21
  118. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  119. package/dist/parser/tests/expression/ArrayLiterals.spec.js +91 -91
  120. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  121. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +102 -102
  122. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  123. package/dist/parser/tests/expression/Boolean.spec.js +15 -15
  124. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  125. package/dist/parser/tests/expression/Call.spec.js +22 -21
  126. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  127. package/dist/parser/tests/expression/Exponential.spec.js +11 -11
  128. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  129. package/dist/parser/tests/expression/Function.spec.js +171 -171
  130. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  131. package/dist/parser/tests/expression/Indexing.spec.js +50 -50
  132. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  133. package/dist/parser/tests/expression/Multiplicative.spec.js +25 -25
  134. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  135. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +16 -16
  136. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  137. package/dist/parser/tests/expression/PrefixUnary.spec.js +26 -26
  138. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  139. package/dist/parser/tests/expression/Primary.spec.js +27 -27
  140. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  141. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +3 -2
  142. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  143. package/dist/parser/tests/expression/Relational.spec.js +25 -25
  144. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  145. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +7 -7
  146. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  147. package/dist/parser/tests/expression/TernaryExpression.spec.js +6 -6
  148. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  149. package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
  150. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  151. package/dist/parser/tests/statement/Declaration.spec.js +20 -20
  152. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  153. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  154. package/dist/parser/tests/statement/Enum.spec.js +774 -0
  155. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  156. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  157. package/dist/parser/tests/statement/For.spec.js +46 -0
  158. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  159. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  160. package/dist/parser/tests/statement/ForEach.spec.js +37 -0
  161. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  162. package/dist/parser/tests/statement/Function.spec.js +121 -120
  163. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  164. package/dist/parser/tests/statement/Goto.spec.js +9 -8
  165. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  166. package/dist/parser/tests/statement/Increment.spec.js +22 -22
  167. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  168. package/dist/parser/tests/statement/InterfaceStatement.spec.js +12 -0
  169. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  170. package/dist/parser/tests/statement/LibraryStatement.spec.js +7 -7
  171. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  172. package/dist/parser/tests/statement/Misc.spec.js +71 -70
  173. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  174. package/dist/parser/tests/statement/PrintStatement.spec.js +17 -17
  175. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  176. package/dist/parser/tests/statement/ReturnStatement.spec.js +33 -33
  177. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  178. package/dist/parser/tests/statement/Set.spec.js +53 -53
  179. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  180. package/dist/parser/tests/statement/Stop.spec.js +7 -6
  181. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  182. package/dist/preprocessor/Chunk.d.ts +1 -1
  183. package/dist/preprocessor/Preprocessor.d.ts +1 -1
  184. package/dist/preprocessor/Preprocessor.js +7 -7
  185. package/dist/preprocessor/Preprocessor.js.map +1 -1
  186. package/dist/types/ArrayType.d.ts +8 -5
  187. package/dist/types/ArrayType.js +45 -9
  188. package/dist/types/ArrayType.js.map +1 -1
  189. package/dist/types/ArrayType.spec.js +62 -3
  190. package/dist/types/ArrayType.spec.js.map +1 -1
  191. package/dist/types/BscType.d.ts +1 -1
  192. package/dist/types/CustomType.d.ts +1 -1
  193. package/dist/types/CustomType.js +4 -2
  194. package/dist/types/CustomType.js.map +1 -1
  195. package/dist/types/FunctionType.d.ts +7 -6
  196. package/dist/types/FunctionType.js +21 -18
  197. package/dist/types/FunctionType.js.map +1 -1
  198. package/dist/types/FunctionType.spec.js +6 -0
  199. package/dist/types/FunctionType.spec.js.map +1 -1
  200. package/dist/types/LazyType.d.ts +1 -2
  201. package/dist/types/LazyType.js +1 -5
  202. package/dist/types/LazyType.js.map +1 -1
  203. package/dist/types/UniversalFunctionType.d.ts +9 -0
  204. package/dist/types/UniversalFunctionType.js +25 -0
  205. package/dist/types/UniversalFunctionType.js.map +1 -0
  206. package/dist/types/helpers.js +1 -1
  207. package/dist/types/helpers.js.map +1 -1
  208. package/dist/util.d.ts +26 -10
  209. package/dist/util.js +145 -61
  210. package/dist/util.js.map +1 -1
  211. package/dist/validators/ClassValidator.js +17 -24
  212. package/dist/validators/ClassValidator.js.map +1 -1
  213. package/package.json +3 -3
  214. package/dist/astUtils/index.d.ts +0 -7
  215. package/dist/astUtils/index.js +0 -26
  216. package/dist/astUtils/index.js.map +0 -1
  217. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
  218. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
  219. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
  220. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
  221. package/dist/lexer/index.d.ts +0 -3
  222. package/dist/lexer/index.js +0 -18
  223. package/dist/lexer/index.js.map +0 -1
  224. package/dist/parser/index.d.ts +0 -3
  225. package/dist/parser/index.js +0 -16
  226. package/dist/parser/index.js.map +0 -1
  227. package/dist/preprocessor/index.d.ts +0 -3
  228. package/dist/preprocessor/index.js +0 -16
  229. package/dist/preprocessor/index.js.map +0 -1
@@ -2,42 +2,43 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const chai_1 = require("chai");
4
4
  const Parser_1 = require("../../Parser");
5
- const lexer_1 = require("../../../lexer");
5
+ const TokenKind_1 = require("../../../lexer/TokenKind");
6
6
  const Parser_spec_1 = require("../Parser.spec");
7
- const __1 = require("../..");
8
7
  const vscode_languageserver_1 = require("vscode-languageserver");
8
+ const Statement_1 = require("../../Statement");
9
+ const Expression_1 = require("../../Expression");
9
10
  const testHelpers_spec_1 = require("../../../testHelpers.spec");
10
11
  describe('parser foreach loops', () => {
11
12
  it('requires a name and target', () => {
12
13
  let { statements, diagnostics } = Parser_1.Parser.parse([
13
- (0, Parser_spec_1.token)(lexer_1.TokenKind.ForEach, 'for each'),
14
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.ForEach, 'for each'),
14
15
  (0, Parser_spec_1.identifier)('word'),
15
16
  (0, Parser_spec_1.identifier)('in'),
16
17
  (0, Parser_spec_1.identifier)('lipsum'),
17
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
18
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
18
19
  // body would go here, but it's not necessary for this test
19
- (0, Parser_spec_1.token)(lexer_1.TokenKind.EndFor, 'end for'),
20
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
20
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.EndFor, 'end for'),
21
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
21
22
  Parser_spec_1.EOF
22
23
  ]);
23
24
  (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
24
25
  (0, chai_1.expect)(statements).to.exist;
25
26
  let forEach = statements[0];
26
- (0, chai_1.expect)(forEach).to.be.instanceof(__1.ForEachStatement);
27
+ (0, chai_1.expect)(forEach).to.be.instanceof(Statement_1.ForEachStatement);
27
28
  (0, chai_1.expect)(forEach.item.text).to.eql('word');
28
- (0, chai_1.expect)(forEach.target).to.be.instanceof(__1.VariableExpression);
29
+ (0, chai_1.expect)(forEach.target).to.be.instanceof(Expression_1.VariableExpression);
29
30
  (0, chai_1.expect)(forEach.target.name).to.deep.include((0, Parser_spec_1.identifier)('lipsum'));
30
31
  });
31
32
  it('allows \'next\' to terminate loop', () => {
32
33
  let { statements, diagnostics } = Parser_1.Parser.parse([
33
- (0, Parser_spec_1.token)(lexer_1.TokenKind.ForEach, 'for each'),
34
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.ForEach, 'for each'),
34
35
  (0, Parser_spec_1.identifier)('word'),
35
36
  (0, Parser_spec_1.identifier)('in'),
36
37
  (0, Parser_spec_1.identifier)('lipsum'),
37
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
38
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
38
39
  // body would go here, but it's not necessary for this test
39
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Next, 'next'),
40
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
40
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Next, 'next'),
41
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
41
42
  Parser_spec_1.EOF
42
43
  ]);
43
44
  (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
@@ -55,43 +56,43 @@ describe('parser foreach loops', () => {
55
56
  */
56
57
  let { statements, diagnostics } = Parser_1.Parser.parse([
57
58
  {
58
- kind: lexer_1.TokenKind.ForEach,
59
+ kind: TokenKind_1.TokenKind.ForEach,
59
60
  text: 'for each',
60
61
  isReserved: true,
61
62
  range: vscode_languageserver_1.Range.create(0, 0, 0, 8)
62
63
  },
63
64
  {
64
- kind: lexer_1.TokenKind.Identifier,
65
+ kind: TokenKind_1.TokenKind.Identifier,
65
66
  text: 'a',
66
67
  isReserved: false,
67
68
  range: vscode_languageserver_1.Range.create(0, 9, 0, 10)
68
69
  },
69
70
  {
70
- kind: lexer_1.TokenKind.Identifier,
71
+ kind: TokenKind_1.TokenKind.Identifier,
71
72
  text: 'in',
72
73
  isReserved: true,
73
74
  range: vscode_languageserver_1.Range.create(0, 11, 0, 13)
74
75
  },
75
76
  {
76
- kind: lexer_1.TokenKind.Identifier,
77
+ kind: TokenKind_1.TokenKind.Identifier,
77
78
  text: 'b',
78
79
  isReserved: false,
79
80
  range: vscode_languageserver_1.Range.create(0, 14, 0, 15)
80
81
  },
81
82
  {
82
- kind: lexer_1.TokenKind.Newline,
83
+ kind: TokenKind_1.TokenKind.Newline,
83
84
  text: '\n',
84
85
  isReserved: false,
85
86
  range: vscode_languageserver_1.Range.create(0, 15, 0, 16)
86
87
  },
87
88
  // loop body isn't significant for location tracking, so helper functions are safe
88
89
  (0, Parser_spec_1.identifier)('Rnd'),
89
- (0, Parser_spec_1.token)(lexer_1.TokenKind.LeftParen, '('),
90
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.LeftParen, '('),
90
91
  (0, Parser_spec_1.identifier)('a'),
91
- (0, Parser_spec_1.token)(lexer_1.TokenKind.RightParen, ')'),
92
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
92
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.RightParen, ')'),
93
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
93
94
  {
94
- kind: lexer_1.TokenKind.EndFor,
95
+ kind: TokenKind_1.TokenKind.EndFor,
95
96
  text: 'end for',
96
97
  isReserved: false,
97
98
  range: vscode_languageserver_1.Range.create(2, 0, 2, 7)
@@ -1 +1 @@
1
- {"version":3,"file":"ForEach.spec.js","sourceRoot":"","sources":["../../../../src/parser/tests/controlFlow/ForEach.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ForEach.spec.js","sourceRoot":"","sources":["../../../../src/parser/tests/controlFlow/ForEach.spec.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAE9B,yCAAsC;AACtC,wDAAqD;AACrD,gDAAwD;AACxD,iEAA8C;AAC9C,+CAAmD;AACnD,iDAAsD;AACtD,gEAAkE;AAElE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,eAAM,CAAC,KAAK,CAAC;YAC3C,IAAA,mBAAK,EAAC,qBAAS,CAAC,OAAO,EAAE,UAAU,CAAC;YACpC,IAAA,wBAAU,EAAC,MAAM,CAAC;YAClB,IAAA,wBAAU,EAAC,IAAI,CAAC;YAChB,IAAA,wBAAU,EAAC,QAAQ,CAAC;YACpB,IAAA,mBAAK,EAAC,qBAAS,CAAC,OAAO,EAAE,IAAI,CAAC;YAE9B,2DAA2D;YAC3D,IAAA,mBAAK,EAAC,qBAAS,CAAC,MAAM,EAAE,SAAS,CAAC;YAClC,IAAA,mBAAK,EAAC,qBAAS,CAAC,OAAO,EAAE,IAAI,CAAC;YAC9B,iBAAG;SACN,CAAC,CAAC;QAEH,IAAA,wCAAqB,EAAC,WAAW,CAAC,CAAC;QACnC,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAE5B,IAAI,OAAO,GAAG,UAAU,CAAC,CAAC,CAAQ,CAAC;QACnC,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,4BAAgB,CAAC,CAAC;QAEnD,IAAA,aAAM,EAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAA,aAAM,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,+BAAkB,CAAC,CAAC;QAC5D,IAAA,aAAM,EAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,eAAM,CAAC,KAAK,CAAC;YAC3C,IAAA,mBAAK,EAAC,qBAAS,CAAC,OAAO,EAAE,UAAU,CAAC;YACpC,IAAA,wBAAU,EAAC,MAAM,CAAC;YAClB,IAAA,wBAAU,EAAC,IAAI,CAAC;YAChB,IAAA,wBAAU,EAAC,QAAQ,CAAC;YACpB,IAAA,mBAAK,EAAC,qBAAS,CAAC,OAAO,EAAE,IAAI,CAAC;YAE9B,2DAA2D;YAC3D,IAAA,mBAAK,EAAC,qBAAS,CAAC,IAAI,EAAE,MAAM,CAAC;YAC7B,IAAA,mBAAK,EAAC,qBAAS,CAAC,OAAO,EAAE,IAAI,CAAC;YAC9B,iBAAG;SACN,CAAC,CAAC;QAEH,IAAA,wCAAqB,EAAC,WAAW,CAAC,CAAC;QACnC,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC5B,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACzB;;;;;;;WAOG;QACH,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,eAAM,CAAC,KAAK,CAAC;YAC3C;gBACI,IAAI,EAAE,qBAAS,CAAC,OAAO;gBACvB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,6BAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aAClC;YACD;gBACI,IAAI,EAAE,qBAAS,CAAC,UAAU;gBAC1B,IAAI,EAAE,GAAG;gBACT,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,6BAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;aACnC;YACD;gBACI,IAAI,EAAE,qBAAS,CAAC,UAAU;gBAC1B,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,6BAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;aACpC;YACD;gBACI,IAAI,EAAE,qBAAS,CAAC,UAAU;gBAC1B,IAAI,EAAE,GAAG;gBACT,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,6BAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;aACpC;YACD;gBACI,IAAI,EAAE,qBAAS,CAAC,OAAO;gBACvB,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,6BAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;aACpC;YACD,kFAAkF;YAClF,IAAA,wBAAU,EAAC,KAAK,CAAC;YACjB,IAAA,mBAAK,EAAC,qBAAS,CAAC,SAAS,EAAE,GAAG,CAAC;YAC/B,IAAA,wBAAU,EAAC,GAAG,CAAC;YACf,IAAA,mBAAK,EAAC,qBAAS,CAAC,UAAU,EAAE,GAAG,CAAC;YAChC,IAAA,mBAAK,EAAC,qBAAS,CAAC,OAAO,EAAE,IAAI,CAAC;YAC9B;gBACI,IAAI,EAAE,qBAAS,CAAC,MAAM;gBACtB,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,6BAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aAClC;YACD,iBAAG;SACN,CAAC,CAAC;QAEH,IAAA,wCAAqB,EAAC,WAAW,CAAC,CAAC;QACnC,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrC,IAAA,aAAM,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CACpC,6BAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC3B,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -3,13 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const chai_1 = require("chai");
4
4
  const assert = require("assert");
5
5
  const Parser_1 = require("../../Parser");
6
- const lexer_1 = require("../../../lexer");
6
+ const Lexer_1 = require("../../../lexer/Lexer");
7
+ const TokenKind_1 = require("../../../lexer/TokenKind");
7
8
  const Parser_spec_1 = require("../Parser.spec");
8
- const astUtils_1 = require("../../../astUtils");
9
+ const reflection_1 = require("../../../astUtils/reflection");
9
10
  describe('parser if statements', () => {
10
11
  it('allows empty if blocks', () => {
11
12
  var _a;
12
- let { tokens } = lexer_1.Lexer.scan(`
13
+ let { tokens } = Lexer_1.Lexer.scan(`
13
14
  if true then
14
15
 
15
16
  else if true then
@@ -24,7 +25,7 @@ describe('parser if statements', () => {
24
25
  });
25
26
  it('allows empty elseif blocks', () => {
26
27
  var _a;
27
- let { tokens } = lexer_1.Lexer.scan(`
28
+ let { tokens } = Lexer_1.Lexer.scan(`
28
29
  if true then
29
30
  stop
30
31
  else if true then
@@ -39,7 +40,7 @@ describe('parser if statements', () => {
39
40
  });
40
41
  it('allows empty else blocks', () => {
41
42
  var _a;
42
- let { tokens } = lexer_1.Lexer.scan(`
43
+ let { tokens } = Lexer_1.Lexer.scan(`
43
44
  if true then
44
45
  stop
45
46
  else if true then
@@ -54,7 +55,7 @@ describe('parser if statements', () => {
54
55
  });
55
56
  it('single-line if next to else or endif', () => {
56
57
  var _a;
57
- let { tokens } = lexer_1.Lexer.scan(`
58
+ let { tokens } = Lexer_1.Lexer.scan(`
58
59
  if type(component.TextAttrs.font) = "roString"
59
60
  font = m.fonts.Lookup(component.TextAttrs.font)
60
61
  if font = invalid then font = m.fonts.medium
@@ -68,17 +69,17 @@ describe('parser if statements', () => {
68
69
  (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
69
70
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
70
71
  let ifs = statements[0];
71
- if (!(0, astUtils_1.isIfStatement)(ifs) || !(0, astUtils_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[1])) {
72
+ if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[1])) {
72
73
  assert.fail('Missing single-line if inside if-then');
73
74
  }
74
- if (!(0, astUtils_1.isIfStatement)(ifs.elseBranch)) {
75
+ if (!(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
75
76
  assert.fail('Missing chained else-if statement');
76
77
  }
77
78
  (0, chai_1.expect)(ifs.elseBranch.elseBranch).to.exist;
78
79
  });
79
80
  it('single-line if inside multi-line if', () => {
80
81
  var _a;
81
- let { tokens } = lexer_1.Lexer.scan(`
82
+ let { tokens } = Lexer_1.Lexer.scan(`
82
83
  if true
83
84
  if true then t = 1
84
85
  else
@@ -89,16 +90,16 @@ describe('parser if statements', () => {
89
90
  (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
90
91
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
91
92
  let ifs = statements[0];
92
- if (!(0, astUtils_1.isIfStatement)(ifs) || !(0, astUtils_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[0])) {
93
+ if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[0])) {
93
94
  assert.fail('Missing single-line if inside if-then');
94
95
  }
95
96
  (0, chai_1.expect)(ifs.elseBranch).to.exist;
96
- if (!(0, astUtils_1.isBlock)(ifs.elseBranch) || !(0, astUtils_1.isCommentStatement)(ifs.elseBranch.statements[0])) {
97
+ if (!(0, reflection_1.isBlock)(ifs.elseBranch) || !(0, reflection_1.isCommentStatement)(ifs.elseBranch.statements[0])) {
97
98
  assert.fail('Missing comment inside else branch');
98
99
  }
99
100
  });
100
101
  it('dotted set in else block', () => {
101
- let { tokens } = lexer_1.Lexer.scan(`
102
+ let { tokens } = Lexer_1.Lexer.scan(`
102
103
  if true then m.top.visible = true else m.top.visible = false
103
104
  `);
104
105
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -111,15 +112,15 @@ describe('parser if statements', () => {
111
112
  describe('single-line if', () => {
112
113
  it('parses if only', () => {
113
114
  let { statements, diagnostics } = Parser_1.Parser.parse([
114
- (0, Parser_spec_1.token)(lexer_1.TokenKind.If, 'if'),
115
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '1'),
116
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Less, '<'),
117
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '2'),
118
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Then, 'then'),
115
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
116
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
117
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
118
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
119
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
119
120
  (0, Parser_spec_1.identifier)('foo'),
120
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
121
- (0, Parser_spec_1.token)(lexer_1.TokenKind.True, 'true'),
122
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
121
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
122
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
123
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
123
124
  Parser_spec_1.EOF
124
125
  ]);
125
126
  (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
@@ -127,19 +128,19 @@ describe('parser if statements', () => {
127
128
  });
128
129
  it('parses if-else', () => {
129
130
  let { statements, diagnostics } = Parser_1.Parser.parse([
130
- (0, Parser_spec_1.token)(lexer_1.TokenKind.If, 'if'),
131
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '1'),
132
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Less, '<'),
133
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '2'),
134
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Then, 'then'),
131
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
132
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
133
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
134
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
135
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
135
136
  (0, Parser_spec_1.identifier)('foo'),
136
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
137
- (0, Parser_spec_1.token)(lexer_1.TokenKind.True, 'true'),
138
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Else, 'else'),
137
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
138
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
139
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
139
140
  (0, Parser_spec_1.identifier)('foo'),
140
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
141
- (0, Parser_spec_1.token)(lexer_1.TokenKind.False, 'true'),
142
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
141
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
142
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.False, 'true'),
143
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
143
144
  Parser_spec_1.EOF
144
145
  ]);
145
146
  (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
@@ -147,28 +148,28 @@ describe('parser if statements', () => {
147
148
  });
148
149
  it('parses if-elseif-else', () => {
149
150
  let { statements, diagnostics } = Parser_1.Parser.parse([
150
- (0, Parser_spec_1.token)(lexer_1.TokenKind.If, 'if'),
151
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '1'),
152
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Less, '<'),
153
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '2'),
154
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Then, 'then'),
151
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
152
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
153
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
154
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
155
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
155
156
  (0, Parser_spec_1.identifier)('foo'),
156
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
157
- (0, Parser_spec_1.token)(lexer_1.TokenKind.True, 'true'),
158
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Else, 'else'),
159
- (0, Parser_spec_1.token)(lexer_1.TokenKind.If, 'if'),
160
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '1'),
161
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
162
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '2'),
163
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Then, 'then'),
157
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
158
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
159
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
160
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
161
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
162
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
163
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
164
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
164
165
  (0, Parser_spec_1.identifier)('same'),
165
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
166
- (0, Parser_spec_1.token)(lexer_1.TokenKind.True, 'true'),
167
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Else, 'else'),
166
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
167
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
168
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
168
169
  (0, Parser_spec_1.identifier)('foo'),
169
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
170
- (0, Parser_spec_1.token)(lexer_1.TokenKind.True, 'true'),
171
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
170
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
171
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
172
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
172
173
  Parser_spec_1.EOF
173
174
  ]);
174
175
  (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
@@ -177,26 +178,26 @@ describe('parser if statements', () => {
177
178
  it('allows \'then\' to be skipped', () => {
178
179
  // if 1 < 2 foo = true else if 1 = 2 same = true
179
180
  let { statements, diagnostics } = Parser_1.Parser.parse([
180
- (0, Parser_spec_1.token)(lexer_1.TokenKind.If, 'if'),
181
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '1'),
182
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Less, '<'),
183
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '2'),
181
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
182
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
183
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
184
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
184
185
  (0, Parser_spec_1.identifier)('foo'),
185
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
186
- (0, Parser_spec_1.token)(lexer_1.TokenKind.True, 'true'),
187
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Else, 'else'),
188
- (0, Parser_spec_1.token)(lexer_1.TokenKind.If, 'if'),
189
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '1'),
190
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
191
- (0, Parser_spec_1.token)(lexer_1.TokenKind.IntegerLiteral, '2'),
186
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
187
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
188
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
189
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
190
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
191
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
192
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
192
193
  (0, Parser_spec_1.identifier)('same'),
193
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
194
- (0, Parser_spec_1.token)(lexer_1.TokenKind.True, 'true'),
195
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Else, 'else'),
194
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
195
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
196
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
196
197
  (0, Parser_spec_1.identifier)('foo'),
197
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Equal, '='),
198
- (0, Parser_spec_1.token)(lexer_1.TokenKind.False, 'false'),
199
- (0, Parser_spec_1.token)(lexer_1.TokenKind.Newline, '\n'),
198
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
199
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.False, 'false'),
200
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
200
201
  Parser_spec_1.EOF
201
202
  ]);
202
203
  (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
@@ -219,7 +220,7 @@ describe('parser if statements', () => {
219
220
  describe('block if', () => {
220
221
  it('parses if only', () => {
221
222
  //because the parser depends on line numbers for certain if statements, this needs to be location-aware
222
- let { tokens } = lexer_1.Lexer.scan(`
223
+ let { tokens } = Lexer_1.Lexer.scan(`
223
224
  if 1 < 2 THEN
224
225
  foo = true
225
226
  bar = true
@@ -231,7 +232,7 @@ describe('parser if statements', () => {
231
232
  });
232
233
  it('parses if-else', () => {
233
234
  //this test requires token locations, so use the lexer
234
- let { tokens } = lexer_1.Lexer.scan(`
235
+ let { tokens } = Lexer_1.Lexer.scan(`
235
236
  if 1 < 2 then
236
237
  foo = true
237
238
  else
@@ -245,7 +246,7 @@ describe('parser if statements', () => {
245
246
  });
246
247
  it('parses if-elseif-else', () => {
247
248
  //this test requires token locations, so use the lexer
248
- let { tokens } = lexer_1.Lexer.scan(`
249
+ let { tokens } = Lexer_1.Lexer.scan(`
249
250
  if 1 < 2 then
250
251
  foo = true
251
252
  else if 1 > 2 then
@@ -261,7 +262,7 @@ describe('parser if statements', () => {
261
262
  });
262
263
  it('allows \'then\' to be skipped', () => {
263
264
  //this test requires token locations, so use the lexer
264
- let { tokens } = lexer_1.Lexer.scan(`
265
+ let { tokens } = Lexer_1.Lexer.scan(`
265
266
  if 1 < 2
266
267
  foo = true
267
268
  else if 1 > 2
@@ -277,7 +278,7 @@ describe('parser if statements', () => {
277
278
  });
278
279
  it('sets endif token properly', () => {
279
280
  //this test requires token locations, so use the lexer
280
- let { tokens } = lexer_1.Lexer.scan(`
281
+ let { tokens } = Lexer_1.Lexer.scan(`
281
282
  sub a()
282
283
  if true then
283
284
  print false
@@ -293,7 +294,7 @@ describe('parser if statements', () => {
293
294
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
294
295
  //the endif token should be set
295
296
  let ifs = statements[0].func.body.statements[0];
296
- if (!(0, astUtils_1.isIfStatement)(ifs) || !(0, astUtils_1.isIfStatement)(ifs.elseBranch)) {
297
+ if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
297
298
  assert.fail('Unexpected statement found');
298
299
  }
299
300
  (0, chai_1.expect)(ifs.tokens.endIf).to.not.exist;
@@ -301,7 +302,7 @@ describe('parser if statements', () => {
301
302
  });
302
303
  });
303
304
  it('supports trailing colons after conditional statements', () => {
304
- let { tokens } = lexer_1.Lexer.scan(`
305
+ let { tokens } = Lexer_1.Lexer.scan(`
305
306
  sub main()
306
307
  if 1 > 0:
307
308
  print "positive!"
@@ -317,7 +318,7 @@ describe('parser if statements', () => {
317
318
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
318
319
  });
319
320
  it('supports trailing colons for one-line if statements', () => {
320
- let { tokens } = lexer_1.Lexer.scan(`
321
+ let { tokens } = Lexer_1.Lexer.scan(`
321
322
  if 1 < 2: return true: end if
322
323
  `);
323
324
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -326,7 +327,7 @@ describe('parser if statements', () => {
326
327
  });
327
328
  it('catches one-line if statement missing first colon', () => {
328
329
  //missing colon after 2
329
- let { tokens } = lexer_1.Lexer.scan(`
330
+ let { tokens } = Lexer_1.Lexer.scan(`
330
331
  if 1 < 2 return true : end if
331
332
  `);
332
333
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -335,7 +336,7 @@ describe('parser if statements', () => {
335
336
  });
336
337
  it('catches one-line if statement with multiple statements missing first colon', () => {
337
338
  //missing colon after 2
338
- let { tokens } = lexer_1.Lexer.scan(`
339
+ let { tokens } = Lexer_1.Lexer.scan(`
339
340
  if 1 < 2 print "ok" : return true : end if
340
341
  `);
341
342
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -344,7 +345,7 @@ describe('parser if statements', () => {
344
345
  });
345
346
  it('catches one-line if statement missing second colon', () => {
346
347
  //missing colon after `2`
347
- let { tokens } = lexer_1.Lexer.scan(`
348
+ let { tokens } = Lexer_1.Lexer.scan(`
348
349
  if 1 < 2 : return true end if
349
350
  `);
350
351
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -353,7 +354,7 @@ describe('parser if statements', () => {
353
354
  });
354
355
  it('catches one-line if statement with else missing colons', () => {
355
356
  //missing colon after `2`
356
- let { tokens } = lexer_1.Lexer.scan(`
357
+ let { tokens } = Lexer_1.Lexer.scan(`
357
358
  if 1 < 2 : return true: else return false end if
358
359
  `);
359
360
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -362,7 +363,7 @@ describe('parser if statements', () => {
362
363
  });
363
364
  it('catches one-line if statement with colon and missing end if', () => {
364
365
  //missing colon after `2`
365
- let { tokens } = lexer_1.Lexer.scan(`
366
+ let { tokens } = Lexer_1.Lexer.scan(`
366
367
  if 1 < 2: return true
367
368
  `);
368
369
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -371,7 +372,7 @@ describe('parser if statements', () => {
371
372
  });
372
373
  it('catches one-line if multi-statement with colon and missing end if', () => {
373
374
  //missing colon after `2`
374
- let { tokens } = lexer_1.Lexer.scan(`
375
+ let { tokens } = Lexer_1.Lexer.scan(`
375
376
  if 1 < 2: print "ok": return true
376
377
  `);
377
378
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -380,7 +381,7 @@ describe('parser if statements', () => {
380
381
  });
381
382
  it('catches one-line if statement with colon and missing endif inside a function', () => {
382
383
  //missing 'end if'
383
- let { tokens } = lexer_1.Lexer.scan(`
384
+ let { tokens } = Lexer_1.Lexer.scan(`
384
385
  function missingendif()
385
386
  if true : return true
386
387
  end function
@@ -391,7 +392,7 @@ describe('parser if statements', () => {
391
392
  });
392
393
  it('catches extraneous colon at the end of one-line if-else', () => {
393
394
  //colon at the end not allowed
394
- let { tokens } = lexer_1.Lexer.scan(`
395
+ let { tokens } = Lexer_1.Lexer.scan(`
395
396
  if 1 < 2 then return true else return false:
396
397
  `);
397
398
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -400,7 +401,7 @@ describe('parser if statements', () => {
400
401
  });
401
402
  it('catches colon before if, unless there is `then` before', () => {
402
403
  //colon before if isn't allowed
403
- let { tokens } = lexer_1.Lexer.scan(`
404
+ let { tokens } = Lexer_1.Lexer.scan(`
404
405
  if 1 < 2 then: if 2<3: return false: end if
405
406
  : if 1 < 2: return true: end if
406
407
  end if
@@ -411,7 +412,7 @@ describe('parser if statements', () => {
411
412
  });
412
413
  it('catches extraneous colon+end if at the end of one-line if-else', () => {
413
414
  //expected newline + unexpected endif
414
- let { tokens } = lexer_1.Lexer.scan(`
415
+ let { tokens } = Lexer_1.Lexer.scan(`
415
416
  if 1 < 2 then return true else return false: end if
416
417
  `);
417
418
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -420,7 +421,7 @@ describe('parser if statements', () => {
420
421
  });
421
422
  it('recovers from extraneous endif at the end of one-line if-else', () => {
422
423
  //unexpected endif
423
- let { tokens } = lexer_1.Lexer.scan(`
424
+ let { tokens } = Lexer_1.Lexer.scan(`
424
425
  function test1()
425
426
  if 1 < 2: return true: else return false end if
426
427
  end function
@@ -431,7 +432,7 @@ describe('parser if statements', () => {
431
432
  });
432
433
  it('recovers from missing end-if', () => {
433
434
  //unexpected endif
434
- let { tokens } = lexer_1.Lexer.scan(`
435
+ let { tokens } = Lexer_1.Lexer.scan(`
435
436
  function test1()
436
437
  if 1 < 2 then if 1 < 3
437
438
  return true
@@ -446,7 +447,7 @@ describe('parser if statements', () => {
446
447
  });
447
448
  it('catches extraneous colon at the end of one-line if', () => {
448
449
  //colon at the end not allowed
449
- let { tokens } = lexer_1.Lexer.scan(`
450
+ let { tokens } = Lexer_1.Lexer.scan(`
450
451
  if 1 < 2 then return true:
451
452
  `);
452
453
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -455,7 +456,7 @@ describe('parser if statements', () => {
455
456
  });
456
457
  it('catches multi-line if inside a one-line if branch', () => {
457
458
  //second if should be inline
458
- let { tokens } = lexer_1.Lexer.scan(`
459
+ let { tokens } = Lexer_1.Lexer.scan(`
459
460
  if 1 < 2 then if 1 < 3
460
461
  return true
461
462
  end if
@@ -466,7 +467,7 @@ describe('parser if statements', () => {
466
467
  });
467
468
  it('supports multiple statements in one-line if statements', () => {
468
469
  //second if should be inline
469
- let { tokens } = lexer_1.Lexer.scan(`
470
+ let { tokens } = Lexer_1.Lexer.scan(`
470
471
  if 1 < 2 then ok = true : m.ok = true : print "ok" : ook() else if 1 < 3
471
472
  return true
472
473
  end if
@@ -477,7 +478,7 @@ describe('parser if statements', () => {
477
478
  });
478
479
  it('catches multi-line if inside a one-line if else branch', () => {
479
480
  //second if should be inline
480
- let { tokens } = lexer_1.Lexer.scan(`
481
+ let { tokens } = Lexer_1.Lexer.scan(`
481
482
  if 1 < 2 then return false else if 1 < 3
482
483
  return true
483
484
  end if
@@ -488,7 +489,7 @@ describe('parser if statements', () => {
488
489
  });
489
490
  it('catches else statement missing colon', () => {
490
491
  //missing colon before `end if`
491
- let { tokens } = lexer_1.Lexer.scan(`
492
+ let { tokens } = Lexer_1.Lexer.scan(`
492
493
  if 1 < 2
493
494
  return true
494
495
  else return false end if
@@ -498,7 +499,7 @@ describe('parser if statements', () => {
498
499
  (0, chai_1.expect)(statements).to.be.lengthOf(1);
499
500
  });
500
501
  it('supports if statement with condition and action on one line, but end if on separate line', () => {
501
- let { tokens } = lexer_1.Lexer.scan(`
502
+ let { tokens } = Lexer_1.Lexer.scan(`
502
503
  if 1 < 2: return true
503
504
  end if
504
505
  `);
@@ -507,7 +508,7 @@ describe('parser if statements', () => {
507
508
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
508
509
  });
509
510
  it('supports colon after return in single-line if statement', () => {
510
- let { tokens } = lexer_1.Lexer.scan(`
511
+ let { tokens } = Lexer_1.Lexer.scan(`
511
512
  if false : print "true" : end if
512
513
  `);
513
514
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -515,7 +516,7 @@ describe('parser if statements', () => {
515
516
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
516
517
  });
517
518
  it('supports if elseif endif single line', () => {
518
- let { tokens } = lexer_1.Lexer.scan(`
519
+ let { tokens } = Lexer_1.Lexer.scan(`
519
520
  if true: print "8 worked": else if true: print "not run": else: print "not run": end if
520
521
  `);
521
522
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -523,7 +524,7 @@ describe('parser if statements', () => {
523
524
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
524
525
  });
525
526
  it('supports comment at the end of one-line if', () => {
526
- let { tokens } = lexer_1.Lexer.scan(`
527
+ let { tokens } = Lexer_1.Lexer.scan(`
527
528
  if 1 > 2 then return true 'OK
528
529
  `);
529
530
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -531,7 +532,7 @@ describe('parser if statements', () => {
531
532
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
532
533
  });
533
534
  it('supports colon at the beginning of a line', () => {
534
- let { tokens } = lexer_1.Lexer.scan(`
535
+ let { tokens } = Lexer_1.Lexer.scan(`
535
536
  if 1 < 2 then: if 1 < 4 then return false
536
537
  : end if
537
538
  `);
@@ -540,7 +541,7 @@ describe('parser if statements', () => {
540
541
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
541
542
  });
542
543
  it('supports one-line functions inside of one-line if statement', () => {
543
- let { tokens } = lexer_1.Lexer.scan(`
544
+ let { tokens } = Lexer_1.Lexer.scan(`
544
545
  if true then : test = sub() : print "yes" : end sub : end if
545
546
  `);
546
547
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
@@ -548,7 +549,7 @@ describe('parser if statements', () => {
548
549
  (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
549
550
  });
550
551
  it('single-line if block statements have correct range', () => {
551
- let { tokens } = lexer_1.Lexer.scan(`
552
+ let { tokens } = Lexer_1.Lexer.scan(`
552
553
  if false then print "true"
553
554
  if false then print "true": a = 10
554
555
  if false then print "true" else print "false"