brighterscript 0.42.0 → 0.45.0

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 (201) hide show
  1. package/CHANGELOG.md +49 -0
  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/DiagnosticMessages.d.ts +21 -1
  6. package/dist/DiagnosticMessages.js +20 -0
  7. package/dist/DiagnosticMessages.js.map +1 -1
  8. package/dist/LanguageServer.d.ts +1 -6
  9. package/dist/LanguageServer.js +3 -12
  10. package/dist/LanguageServer.js.map +1 -1
  11. package/dist/PluginInterface.d.ts +3 -3
  12. package/dist/PluginInterface.js +3 -0
  13. package/dist/PluginInterface.js.map +1 -1
  14. package/dist/Program.d.ts +68 -25
  15. package/dist/Program.js +169 -76
  16. package/dist/Program.js.map +1 -1
  17. package/dist/ProgramBuilder.js +6 -6
  18. package/dist/ProgramBuilder.js.map +1 -1
  19. package/dist/Scope.d.ts +18 -11
  20. package/dist/Scope.js +41 -14
  21. package/dist/Scope.js.map +1 -1
  22. package/dist/XmlScope.d.ts +3 -3
  23. package/dist/astUtils/AstEditor.d.ts +6 -0
  24. package/dist/astUtils/AstEditor.js +10 -0
  25. package/dist/astUtils/AstEditor.js.map +1 -1
  26. package/dist/astUtils/AstEditor.spec.js +37 -0
  27. package/dist/astUtils/AstEditor.spec.js.map +1 -1
  28. package/dist/astUtils/reflection.d.ts +5 -2
  29. package/dist/astUtils/reflection.js +14 -2
  30. package/dist/astUtils/reflection.js.map +1 -1
  31. package/dist/astUtils/reflection.spec.js +6 -6
  32. package/dist/astUtils/reflection.spec.js.map +1 -1
  33. package/dist/astUtils/visitors.d.ts +3 -1
  34. package/dist/astUtils/visitors.js.map +1 -1
  35. package/dist/astUtils/visitors.spec.js +15 -18
  36. package/dist/astUtils/visitors.spec.js.map +1 -1
  37. package/dist/bscPlugin/BscPlugin.d.ts +4 -1
  38. package/dist/bscPlugin/BscPlugin.js +21 -2
  39. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  40. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +3 -3
  41. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  42. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +18 -16
  43. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  44. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
  45. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
  46. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  47. package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.d.ts → BrsFileSemanticTokensProcessor.spec.d.ts} +0 -0
  48. package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.js → BrsFileSemanticTokensProcessor.spec.js} +32 -4
  49. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  50. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  51. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +36 -0
  52. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  53. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  54. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  55. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  56. package/dist/bscPlugin/validation/ScopeValidator.d.ts +11 -0
  57. package/dist/bscPlugin/validation/ScopeValidator.js +94 -0
  58. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  59. package/dist/files/BrsFile.Class.spec.js +218 -114
  60. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  61. package/dist/files/BrsFile.d.ts +27 -8
  62. package/dist/files/BrsFile.js +216 -95
  63. package/dist/files/BrsFile.js.map +1 -1
  64. package/dist/files/BrsFile.spec.js +338 -190
  65. package/dist/files/BrsFile.spec.js.map +1 -1
  66. package/dist/files/XmlFile.d.ts +11 -5
  67. package/dist/files/XmlFile.js +15 -9
  68. package/dist/files/XmlFile.js.map +1 -1
  69. package/dist/files/XmlFile.spec.js +118 -114
  70. package/dist/files/XmlFile.spec.js.map +1 -1
  71. package/dist/files/tests/imports.spec.js +29 -27
  72. package/dist/files/tests/imports.spec.js.map +1 -1
  73. package/dist/index.d.ts +12 -3
  74. package/dist/index.js +21 -4
  75. package/dist/index.js.map +1 -1
  76. package/dist/interfaces.d.ts +50 -9
  77. package/dist/lexer/Lexer.js +1 -2
  78. package/dist/lexer/Lexer.js.map +1 -1
  79. package/dist/lexer/Lexer.spec.js +470 -462
  80. package/dist/lexer/Lexer.spec.js.map +1 -1
  81. package/dist/lexer/TokenKind.d.ts +2 -0
  82. package/dist/lexer/TokenKind.js +5 -0
  83. package/dist/lexer/TokenKind.js.map +1 -1
  84. package/dist/parser/Expression.d.ts +1 -1
  85. package/dist/parser/Expression.js +10 -10
  86. package/dist/parser/Expression.js.map +1 -1
  87. package/dist/parser/Parser.Class.spec.js +32 -31
  88. package/dist/parser/Parser.Class.spec.js.map +1 -1
  89. package/dist/parser/Parser.d.ts +23 -2
  90. package/dist/parser/Parser.js +445 -254
  91. package/dist/parser/Parser.js.map +1 -1
  92. package/dist/parser/Parser.spec.js +86 -24
  93. package/dist/parser/Parser.spec.js.map +1 -1
  94. package/dist/parser/SGParser.spec.js +1 -1
  95. package/dist/parser/SGParser.spec.js.map +1 -1
  96. package/dist/parser/Statement.d.ts +54 -2
  97. package/dist/parser/Statement.js +162 -9
  98. package/dist/parser/Statement.js.map +1 -1
  99. package/dist/parser/Statement.spec.js +5 -5
  100. package/dist/parser/Statement.spec.js.map +1 -1
  101. package/dist/parser/tests/Parser.spec.d.ts +3 -3
  102. package/dist/parser/tests/Parser.spec.js +4 -4
  103. package/dist/parser/tests/Parser.spec.js.map +1 -1
  104. package/dist/parser/tests/controlFlow/For.spec.js +40 -40
  105. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  106. package/dist/parser/tests/controlFlow/ForEach.spec.js +22 -21
  107. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  108. package/dist/parser/tests/controlFlow/If.spec.js +100 -99
  109. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  110. package/dist/parser/tests/controlFlow/While.spec.js +25 -25
  111. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  112. package/dist/parser/tests/expression/Additive.spec.js +21 -21
  113. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  114. package/dist/parser/tests/expression/ArrayLiterals.spec.js +91 -91
  115. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  116. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +102 -102
  117. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  118. package/dist/parser/tests/expression/Boolean.spec.js +15 -15
  119. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  120. package/dist/parser/tests/expression/Call.spec.js +22 -21
  121. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  122. package/dist/parser/tests/expression/Exponential.spec.js +11 -11
  123. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  124. package/dist/parser/tests/expression/Function.spec.js +171 -171
  125. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  126. package/dist/parser/tests/expression/Indexing.spec.js +50 -50
  127. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  128. package/dist/parser/tests/expression/Multiplicative.spec.js +25 -25
  129. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  130. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +17 -17
  131. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  132. package/dist/parser/tests/expression/PrefixUnary.spec.js +26 -26
  133. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  134. package/dist/parser/tests/expression/Primary.spec.js +27 -27
  135. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  136. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +4 -3
  137. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  138. package/dist/parser/tests/expression/Relational.spec.js +25 -25
  139. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  140. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +8 -8
  141. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  142. package/dist/parser/tests/expression/TernaryExpression.spec.js +7 -7
  143. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  144. package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
  145. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  146. package/dist/parser/tests/statement/Declaration.spec.js +20 -20
  147. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  148. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  149. package/dist/parser/tests/statement/Enum.spec.js +774 -0
  150. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  151. package/dist/parser/tests/statement/Function.spec.js +121 -120
  152. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  153. package/dist/parser/tests/statement/Goto.spec.js +9 -8
  154. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  155. package/dist/parser/tests/statement/Increment.spec.js +22 -22
  156. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  157. package/dist/parser/tests/statement/InterfaceStatement.spec.js +12 -0
  158. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  159. package/dist/parser/tests/statement/LibraryStatement.spec.js +7 -7
  160. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  161. package/dist/parser/tests/statement/Misc.spec.js +71 -70
  162. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  163. package/dist/parser/tests/statement/PrintStatement.spec.js +17 -17
  164. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  165. package/dist/parser/tests/statement/ReturnStatement.spec.js +33 -33
  166. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  167. package/dist/parser/tests/statement/Set.spec.js +53 -53
  168. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  169. package/dist/parser/tests/statement/Stop.spec.js +7 -6
  170. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  171. package/dist/preprocessor/Chunk.d.ts +1 -1
  172. package/dist/preprocessor/Preprocessor.d.ts +1 -1
  173. package/dist/preprocessor/Preprocessor.js +7 -7
  174. package/dist/preprocessor/Preprocessor.js.map +1 -1
  175. package/dist/types/FunctionType.d.ts +2 -2
  176. package/dist/types/FunctionType.js +3 -3
  177. package/dist/types/FunctionType.js.map +1 -1
  178. package/dist/types/FunctionType.spec.js +2 -2
  179. package/dist/types/FunctionType.spec.js.map +1 -1
  180. package/dist/util.d.ts +27 -1
  181. package/dist/util.js +96 -29
  182. package/dist/util.js.map +1 -1
  183. package/dist/validators/ClassValidator.js +20 -27
  184. package/dist/validators/ClassValidator.js.map +1 -1
  185. package/package.json +2 -1
  186. package/dist/astUtils/index.d.ts +0 -7
  187. package/dist/astUtils/index.js +0 -26
  188. package/dist/astUtils/index.js.map +0 -1
  189. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
  190. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
  191. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
  192. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
  193. package/dist/lexer/index.d.ts +0 -3
  194. package/dist/lexer/index.js +0 -18
  195. package/dist/lexer/index.js.map +0 -1
  196. package/dist/parser/index.d.ts +0 -3
  197. package/dist/parser/index.js +0 -16
  198. package/dist/parser/index.js.map +0 -1
  199. package/dist/preprocessor/index.d.ts +0 -3
  200. package/dist/preprocessor/index.js +0 -16
  201. package/dist/preprocessor/index.js.map +0 -1
@@ -13,6 +13,7 @@ const util_1 = require("../util");
13
13
  const testHelpers_spec_1 = require("../testHelpers.spec");
14
14
  const ProgramBuilder_1 = require("../ProgramBuilder");
15
15
  const Logger_1 = require("../Logger");
16
+ const reflection_1 = require("../astUtils/reflection");
16
17
  describe('XmlFile', () => {
17
18
  const tempDir = (0, util_1.standardizePath) `${process.cwd()}/.tmp`;
18
19
  const rootDir = (0, util_1.standardizePath) `${tempDir}/rootDir`;
@@ -36,17 +37,18 @@ describe('XmlFile', () => {
36
37
  describe('parse', () => {
37
38
  it('allows modifying the parsed XML model', () => {
38
39
  const expected = 'OtherName';
39
- file = new XmlFile_1.XmlFile('abs', 'rel', program);
40
40
  program.plugins.add({
41
41
  name: 'allows modifying the parsed XML model',
42
- afterFileParse: () => {
43
- file.parser.ast.root.attributes[0].value.text = expected;
42
+ afterFileParse: (file) => {
43
+ var _a, _b, _c;
44
+ if ((0, reflection_1.isXmlFile)(file) && ((_c = (_b = (_a = file.parser.ast.root) === null || _a === void 0 ? void 0 : _a.attributes) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.value)) {
45
+ file.parser.ast.root.attributes[0].value.text = expected;
46
+ }
44
47
  }
45
48
  });
46
- file.parse((0, testHelpers_spec_1.trim) `
49
+ file = program.setFile('components/ChildScene.xml', (0, testHelpers_spec_1.trim) `
47
50
  <?xml version="1.0" encoding="utf-8" ?>
48
51
  <component name="ChildScene" extends="Scene">
49
- <script type="text/brightscript" uri="ChildScene1.brs" /> <script type="text/brightscript" uri="ChildScene2.brs" /> <script type="text/brightscript" uri="ChildScene3.brs" />
50
52
  </component>
51
53
  `);
52
54
  (0, chai_1.expect)(file.componentName.text).to.equal(expected);
@@ -81,7 +83,7 @@ describe('XmlFile', () => {
81
83
  `);
82
84
  });
83
85
  it('supports importing BrighterScript files', () => {
84
- file = program.addOrReplaceFile({ src: `${rootDir}/components/custom.xml`, dest: 'components/custom.xml' }, (0, testHelpers_spec_1.trim) `
86
+ file = program.setFile({ src: `${rootDir}/components/custom.xml`, dest: 'components/custom.xml' }, (0, testHelpers_spec_1.trim) `
85
87
  <?xml version="1.0" encoding="utf-8" ?>
86
88
  <component name="ChildScene" extends="Scene">
87
89
  <script type="text/brightscript" uri="ChildScene.bs" />
@@ -91,7 +93,7 @@ describe('XmlFile', () => {
91
93
  });
92
94
  it('does not include commented-out script imports', () => {
93
95
  var _a, _b;
94
- file = program.addOrReplaceFile({ src: `${rootDir}/components/custom.xml`, dest: 'components/custom.xml' }, (0, testHelpers_spec_1.trim) `
96
+ file = program.setFile({ src: `${rootDir}/components/custom.xml`, dest: 'components/custom.xml' }, (0, testHelpers_spec_1.trim) `
95
97
  <?xml version="1.0" encoding="utf-8" ?>
96
98
  <component name="ChildScene" extends="Scene">
97
99
  <script type="text/brightscript" uri="ChildScene.brs" />
@@ -165,20 +167,21 @@ describe('XmlFile', () => {
165
167
  (0, chai_1.expect)(file.diagnostics[1]).to.deep.include(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.xmlUnexpectedTag('unexpectedToo')), { range: vscode_languageserver_1.Range.create(5, 5, 5, 18) }));
166
168
  });
167
169
  it('Adds error when no component is declared in xml', () => {
168
- file = new XmlFile_1.XmlFile('abs', 'rel', program);
169
- file.parse('<script type="text/brightscript" uri="ChildScene.brs" />');
170
- (0, chai_1.expect)(file.diagnostics).to.be.lengthOf(2);
171
- (0, chai_1.expect)(file.diagnostics[0]).to.deep.include(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.xmlUnexpectedTag('script')), { range: vscode_languageserver_1.Range.create(0, 1, 0, 7) }));
172
- (0, chai_1.expect)(file.diagnostics[1]).to.deep.include(DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingComponentDeclaration());
170
+ program.setFile('components/comp.xml', '<script type="text/brightscript" uri="ChildScene.brs" />');
171
+ program.validate();
172
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
173
+ Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.xmlUnexpectedTag('script')), { range: vscode_languageserver_1.Range.create(0, 1, 0, 7) }),
174
+ DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingComponentDeclaration()
175
+ ]);
173
176
  });
174
177
  it('adds error when component does not declare a name', () => {
175
- file = new XmlFile_1.XmlFile('abs', 'rel', program);
176
- file.parse((0, testHelpers_spec_1.trim) `
178
+ file = program.setFile('components/comp.xml', (0, testHelpers_spec_1.trim) `
177
179
  <?xml version="1.0" encoding="utf-8" ?>
178
180
  <component extends="ParentScene">
179
181
  <script type="text/brightscript" uri="ChildScene.brs" />
180
182
  </component>
181
183
  `);
184
+ program.validate();
182
185
  (0, chai_1.expect)(file.diagnostics).to.be.lengthOf(1);
183
186
  (0, chai_1.expect)(file.diagnostics[0]).to.deep.include({
184
187
  message: DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingNameAttribute().message,
@@ -186,12 +189,12 @@ describe('XmlFile', () => {
186
189
  });
187
190
  });
188
191
  it('catches xml parse errors', () => {
189
- file = new XmlFile_1.XmlFile('abs', 'rel', program);
190
- file.parse((0, testHelpers_spec_1.trim) `
192
+ file = program.setFile('components/comp.xml', (0, testHelpers_spec_1.trim) `
191
193
  <?xml version="1.0" encoding="utf-8" ?>
192
194
  <component 1extends="ParentScene">
193
195
  </component>
194
196
  `);
197
+ program.validate();
195
198
  (0, chai_1.expect)(file.diagnostics).to.be.lengthOf(2);
196
199
  (0, chai_1.expect)(file.diagnostics[0].code).to.equal(DiagnosticMessages_1.DiagnosticMessages.xmlGenericParseError('').code); //unexpected character '1'
197
200
  (0, chai_1.expect)(file.diagnostics[1]).to.deep.include({
@@ -227,7 +230,7 @@ describe('XmlFile', () => {
227
230
  }
228
231
  });
229
232
  it('resolves relative paths', () => {
230
- file = program.addOrReplaceFile({
233
+ file = program.setFile({
231
234
  src: `${rootDir}/components/comp1.xml`,
232
235
  dest: 'components/comp1.xml'
233
236
  }, (0, testHelpers_spec_1.trim) `
@@ -244,7 +247,7 @@ describe('XmlFile', () => {
244
247
  });
245
248
  it('finds correct position for empty uri in script tag', () => {
246
249
  var _a;
247
- file = program.addOrReplaceFile({
250
+ file = program.setFile({
248
251
  src: `${rootDir}/components/comp1.xml`,
249
252
  dest: 'components/comp1.xml'
250
253
  }, (0, testHelpers_spec_1.trim) `
@@ -259,7 +262,7 @@ describe('XmlFile', () => {
259
262
  });
260
263
  describe('doesReferenceFile', () => {
261
264
  it('compares case insensitive', () => {
262
- let xmlFile = program.addOrReplaceFile({
265
+ let xmlFile = program.setFile({
263
266
  src: `${rootDir}/components/comp1.xml`,
264
267
  dest: 'components/comp1.xml'
265
268
  }, (0, testHelpers_spec_1.trim) `
@@ -268,7 +271,7 @@ describe('XmlFile', () => {
268
271
  <script type="text/brightscript" uri="HeroGrid.brs" />
269
272
  </component>
270
273
  `);
271
- let brsFile = program.addOrReplaceFile({
274
+ let brsFile = program.setFile({
272
275
  src: `${rootDir}/components/HEROGRID.brs`,
273
276
  dest: `components/HEROGRID.brs`
274
277
  }, ``);
@@ -277,47 +280,49 @@ describe('XmlFile', () => {
277
280
  });
278
281
  describe('autoImportComponentScript', () => {
279
282
  it('is not enabled by default', () => {
280
- program.addOrReplaceFile({ src: `${rootDir}/components/comp1.xml`, dest: 'components/comp1.xml' }, (0, testHelpers_spec_1.trim) `
283
+ program.setFile({ src: `${rootDir}/components/comp1.xml`, dest: 'components/comp1.xml' }, (0, testHelpers_spec_1.trim) `
281
284
  <?xml version="1.0" encoding="utf-8" ?>
282
285
  <component name="ParentScene" extends="GrandparentScene">
283
286
  <script type="text/brightscript" uri="./lib.brs" />
284
287
  </component>
285
288
  `);
286
- program.addOrReplaceFile({ src: `${rootDir}/components/lib.brs`, dest: 'components/lib.brs' }, `
289
+ program.setFile({ src: `${rootDir}/components/lib.brs`, dest: 'components/lib.brs' }, `
287
290
  function libFunc()
288
291
  end function
289
292
  `);
290
- program.addOrReplaceFile({ src: `${rootDir}/components/comp1.bs`, dest: 'components/comp1.bs' }, `
293
+ program.setFile({ src: `${rootDir}/components/comp1.bs`, dest: 'components/comp1.bs' }, `
291
294
  function init()
292
295
  libFunc()
293
296
  end function
294
297
  `);
295
298
  program.validate();
296
- (0, chai_1.expect)(program.getDiagnostics().map(x => x.message)).to.include(DiagnosticMessages_1.DiagnosticMessages.fileNotReferencedByAnyOtherFile().message);
299
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
300
+ DiagnosticMessages_1.DiagnosticMessages.fileNotReferencedByAnyOtherFile()
301
+ ]);
297
302
  });
298
303
  it('is not enabled by default', () => {
299
304
  program = new Program_1.Program({
300
305
  rootDir: rootDir,
301
306
  autoImportComponentScript: true
302
307
  });
303
- program.addOrReplaceFile({ src: `${rootDir}/components/comp1.xml`, dest: 'components/comp1.xml' }, (0, testHelpers_spec_1.trim) `
308
+ program.setFile({ src: `${rootDir}/components/comp1.xml`, dest: 'components/comp1.xml' }, (0, testHelpers_spec_1.trim) `
304
309
  <?xml version="1.0" encoding="utf-8" ?>
305
310
  <component name="ParentScene" extends="GrandparentScene">
306
311
  <script type="text/brightscript" uri="./lib.brs" />
307
312
  </component>
308
313
  `);
309
- program.addOrReplaceFile({ src: `${rootDir}/components/lib.brs`, dest: 'components/lib.brs' }, `
314
+ program.setFile({ src: `${rootDir}/components/lib.brs`, dest: 'components/lib.brs' }, `
310
315
  function libFunc()
311
316
  end function
312
317
  `);
313
- program.addOrReplaceFile({ src: `${rootDir}/components/comp1.bs`, dest: 'components/comp1.bs' }, `
318
+ program.setFile({ src: `${rootDir}/components/comp1.bs`, dest: 'components/comp1.bs' }, `
314
319
  function init()
315
320
  libFunc()
316
321
  end function
317
322
  `);
318
323
  program.validate();
319
324
  //there should be no errors
320
- (0, chai_1.expect)(program.getDiagnostics().map(x => x.message)[0]).not.to.exist;
325
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
321
326
  });
322
327
  });
323
328
  describe('getCompletions', () => {
@@ -340,13 +345,13 @@ describe('XmlFile', () => {
340
345
  });
341
346
  });
342
347
  it('returns empty set when out of range', () => {
343
- program.addOrReplaceFile({ src: `${rootDir}/components/Component1.brs`, dest: 'components/component1.brs' }, ``);
348
+ program.setFile({ src: `${rootDir}/components/Component1.brs`, dest: 'components/component1.brs' }, ``);
344
349
  (0, chai_1.expect)(file.getCompletions(vscode_languageserver_1.Position.create(99, 99))).to.be.empty;
345
350
  });
346
351
  //TODO - refine this test once cdata scripts are supported
347
352
  it('prevents scope completions entirely', () => {
348
- program.addOrReplaceFile({ src: `${rootDir}/components/Component1.brs`, dest: 'components/component1.brs' }, ``);
349
- let xmlFile = program.addOrReplaceFile({ src: `${rootDir}/components/Component1.xml`, dest: 'components/component1.xml' }, (0, testHelpers_spec_1.trim) `
353
+ program.setFile({ src: `${rootDir}/components/Component1.brs`, dest: 'components/component1.brs' }, ``);
354
+ let xmlFile = program.setFile({ src: `${rootDir}/components/Component1.xml`, dest: 'components/component1.xml' }, (0, testHelpers_spec_1.trim) `
350
355
  <?xml version="1.0" encoding="utf-8" ?>
351
356
  <component name="ParentScene" extends="GrandparentScene">
352
357
  <script type="text/brightscript" uri="./Component1.brs" />
@@ -357,7 +362,7 @@ describe('XmlFile', () => {
357
362
  });
358
363
  describe('getAllDependencies', () => {
359
364
  it('returns own imports', () => {
360
- file = program.addOrReplaceFile('components/comp1.xml', (0, testHelpers_spec_1.trim) `
365
+ file = program.setFile('components/comp1.xml', (0, testHelpers_spec_1.trim) `
361
366
  <?xml version="1.0" encoding="utf-8" ?>
362
367
  <component name="ChildScene" extends="BaseScene">
363
368
  <script type="text/brightscript" uri="pkg:/source/lib.brs" />
@@ -370,7 +375,7 @@ describe('XmlFile', () => {
370
375
  });
371
376
  });
372
377
  it('invalidates dependent scopes on change', () => {
373
- let xmlFile = program.addOrReplaceFile({
378
+ let xmlFile = program.setFile({
374
379
  src: `${rootDir}/components/comp1.xml`,
375
380
  dest: `components/comp1.xml`
376
381
  }, (0, testHelpers_spec_1.trim) `
@@ -384,7 +389,7 @@ describe('XmlFile', () => {
384
389
  //scope should be validated
385
390
  (0, chai_1.expect)(scope.isValidated);
386
391
  //add lib1
387
- program.addOrReplaceFile({
392
+ program.setFile({
388
393
  src: `${rootDir}/source/lib.bs`,
389
394
  dest: `source/lib.bs`
390
395
  }, ``);
@@ -393,7 +398,7 @@ describe('XmlFile', () => {
393
398
  program.validate();
394
399
  (0, chai_1.expect)(scope.isValidated).to.be.true;
395
400
  //update lib1 to include an import
396
- program.addOrReplaceFile({
401
+ program.setFile({
397
402
  src: `${rootDir}/source/lib.bs`,
398
403
  dest: `source/lib.bs`
399
404
  }, `
@@ -404,7 +409,7 @@ describe('XmlFile', () => {
404
409
  program.validate();
405
410
  (0, chai_1.expect)(scope.isValidated).to.be.true;
406
411
  //add the lib2 imported from lib
407
- program.addOrReplaceFile({
412
+ program.setFile({
408
413
  src: `${rootDir}/source/lib2.bs`,
409
414
  dest: `source/lib2.bs`
410
415
  }, ``);
@@ -416,7 +421,7 @@ describe('XmlFile', () => {
416
421
  (0, chai_1.expect)(scope.isValidated).to.be.false;
417
422
  });
418
423
  it('does not invalidate unrelated scopes on change', () => {
419
- let xmlFile1 = program.addOrReplaceFile({
424
+ let xmlFile1 = program.setFile({
420
425
  src: `${rootDir}/components/comp1.xml`,
421
426
  dest: `components/comp1.xml`
422
427
  }, (0, testHelpers_spec_1.trim) `
@@ -425,7 +430,7 @@ describe('XmlFile', () => {
425
430
  <script type="text/brightscript" uri="pkg:/source/lib.brs" />
426
431
  </component>
427
432
  `);
428
- let xmlFile2 = program.addOrReplaceFile({
433
+ let xmlFile2 = program.setFile({
429
434
  src: `${rootDir}/components/comp2.xml`,
430
435
  dest: `components/comp2.xml`
431
436
  }, (0, testHelpers_spec_1.trim) `
@@ -438,7 +443,7 @@ describe('XmlFile', () => {
438
443
  (0, chai_1.expect)(program.getScopesForFile(xmlFile1)[0].isValidated).to.be.true;
439
444
  (0, chai_1.expect)(program.getScopesForFile(xmlFile2)[0].isValidated).to.be.true;
440
445
  //add the lib file
441
- program.addOrReplaceFile({
446
+ program.setFile({
442
447
  src: `${rootDir}/source/lib.brs`,
443
448
  dest: `source/lib.brs`
444
449
  }, ``);
@@ -452,12 +457,11 @@ describe('XmlFile', () => {
452
457
  range: undefined
453
458
  }];
454
459
  file.addDiagnostics(expected);
455
- const actual = file.getDiagnostics();
456
- (0, chai_1.expect)(actual).deep.equal(expected);
460
+ (0, testHelpers_spec_1.expectDiagnostics)(file, expected);
457
461
  });
458
462
  describe('component extends', () => {
459
463
  it('works for single-line', () => {
460
- file = program.addOrReplaceFile({
464
+ file = program.setFile({
461
465
  src: `${rootDir}/components/comp1.xml`,
462
466
  dest: `components/comp1.xml`
463
467
  }, (0, testHelpers_spec_1.trim) `
@@ -468,7 +472,7 @@ describe('XmlFile', () => {
468
472
  (0, chai_1.expect)(file.parentComponentName.range).to.eql(vscode_languageserver_1.Range.create(1, 38, 1, 47));
469
473
  });
470
474
  it('works for multi-line', () => {
471
- file = program.addOrReplaceFile({
475
+ file = program.setFile({
472
476
  src: `${rootDir}/components/comp1.xml`,
473
477
  dest: `components/comp1.xml`
474
478
  }, (0, testHelpers_spec_1.trim) `
@@ -480,7 +484,7 @@ describe('XmlFile', () => {
480
484
  (0, chai_1.expect)(file.parentComponentName.range).to.eql(vscode_languageserver_1.Range.create(2, 13, 2, 22));
481
485
  });
482
486
  it('does not throw when unable to find extends', () => {
483
- file = program.addOrReplaceFile({
487
+ file = program.setFile({
484
488
  src: `${rootDir}/components/comp1.xml`,
485
489
  dest: `components/comp1.xml`
486
490
  }, (0, testHelpers_spec_1.trim) `
@@ -491,7 +495,7 @@ describe('XmlFile', () => {
491
495
  (0, chai_1.expect)(file.parentComponentName).to.not.exist;
492
496
  });
493
497
  it('adds warning when no "extends" attribute is found', () => {
494
- file = program.addOrReplaceFile({
498
+ program.setFile({
495
499
  src: `${rootDir}/components/comp1.xml`,
496
500
  dest: `components/comp1.xml`
497
501
  }, (0, testHelpers_spec_1.trim) `
@@ -499,23 +503,22 @@ describe('XmlFile', () => {
499
503
  <component name="ChildScene">
500
504
  </component>
501
505
  `);
502
- (0, chai_1.expect)(file.getDiagnostics()[0]).to.include({
503
- severity: vscode_languageserver_1.DiagnosticSeverity.Warning,
504
- message: DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingExtendsAttribute().message
505
- });
506
+ program.validate();
507
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
508
+ DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingExtendsAttribute()
509
+ ]);
506
510
  });
507
511
  });
508
512
  it('detects when importing the codebehind file unnecessarily', () => {
509
- var _a;
510
513
  program = new Program_1.Program({
511
514
  autoImportComponentScript: true,
512
515
  rootDir: rootDir
513
516
  });
514
- program.addOrReplaceFile({
517
+ program.setFile({
515
518
  src: `${rootDir}/components/SimpleScene.bs`,
516
519
  dest: `components/SimpleScene.bs`
517
520
  }, '');
518
- program.addOrReplaceFile({
521
+ program.setFile({
519
522
  src: `${rootDir}/components/SimpleScene.xml`,
520
523
  dest: `components/SimpleScene.xml`
521
524
  }, (0, testHelpers_spec_1.trim) `
@@ -525,7 +528,9 @@ describe('XmlFile', () => {
525
528
  </component>
526
529
  `);
527
530
  program.validate();
528
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unnecessaryCodebehindScriptImport().message);
531
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
532
+ DiagnosticMessages_1.DiagnosticMessages.unnecessaryCodebehindScriptImport()
533
+ ]);
529
534
  });
530
535
  describe('transpile', () => {
531
536
  it('supports instantresume <customization> elements', async () => {
@@ -568,7 +573,7 @@ describe('XmlFile', () => {
568
573
  file.needsTranspiled = true;
569
574
  }
570
575
  });
571
- const file = program.addOrReplaceFile('components/file.xml', (0, testHelpers_spec_1.trim) `
576
+ const file = program.setFile('components/file.xml', (0, testHelpers_spec_1.trim) `
572
577
  <?xml version="1.0" encoding="utf-8" ?>
573
578
  <component name="Comp" extends="Group">
574
579
  </component>
@@ -601,8 +606,8 @@ describe('XmlFile', () => {
601
606
  `, 'none', 'components/child.xml');
602
607
  });
603
608
  it('does not include bslib script if already there from ropm', () => {
604
- program.addOrReplaceFile('source/roku_modules/bslib/bslib.brs', ``);
605
- program.addOrReplaceFile('source/lib.bs', ``);
609
+ program.setFile('source/roku_modules/bslib/bslib.brs', ``);
610
+ program.setFile('source/lib.bs', ``);
606
611
  //include a bs file to force transpile for the xml file
607
612
  testTranspile((0, testHelpers_spec_1.trim) `
608
613
  <?xml version="1.0" encoding="utf-8" ?>
@@ -619,7 +624,7 @@ describe('XmlFile', () => {
619
624
  `, 'none', 'components/child.xml');
620
625
  });
621
626
  it('does not transpile xml file when bslib script is already present', () => {
622
- const file = program.addOrReplaceFile('components/comp.xml', (0, testHelpers_spec_1.trim) `
627
+ const file = program.setFile('components/comp.xml', (0, testHelpers_spec_1.trim) `
623
628
  <?xml version="1.0" encoding="utf-8" ?>
624
629
  <component name="Comp" extends="Group">
625
630
  <script type="text/brightscript" uri="pkg:/source/bslib.brs" />
@@ -633,8 +638,8 @@ describe('XmlFile', () => {
633
638
  * There was a bug that would incorrectly replace one of the script paths on the second or third transpile, so this test verifies it doesn't do that anymore
634
639
  */
635
640
  it('does not mangle scripts on multiple transpile', async () => {
636
- program.addOrReplaceFile('components/SimpleScene.bs', ``);
637
- program.addOrReplaceFile(`components/SimpleScene.xml`, (0, testHelpers_spec_1.trim) `
641
+ program.setFile('components/SimpleScene.bs', ``);
642
+ program.setFile(`components/SimpleScene.xml`, (0, testHelpers_spec_1.trim) `
638
643
  <?xml version="1.0" encoding="utf-8" ?>
639
644
  <component name="SimpleScene" extends="Scene">
640
645
  <script type="text/brightscript" uri="SimpleScene.bs" />
@@ -655,7 +660,7 @@ describe('XmlFile', () => {
655
660
  (0, chai_1.expect)(fsExtra.readFileSync(`${stagingDir}/components/SimpleScene.xml`).toString()).to.eql(expected);
656
661
  });
657
662
  it('keeps all content of the XML', () => {
658
- program.addOrReplaceFile(`components/SimpleScene.bs`, `
663
+ program.setFile(`components/SimpleScene.bs`, `
659
664
  sub b()
660
665
  end sub
661
666
  `);
@@ -695,10 +700,10 @@ describe('XmlFile', () => {
695
700
  `, 'none', 'components/SimpleScene.xml');
696
701
  });
697
702
  it('changes file extensions from bs to brs', () => {
698
- program.addOrReplaceFile(`components/SimpleScene.bs`, `
703
+ program.setFile(`components/SimpleScene.bs`, `
699
704
  import "pkg:/source/lib.bs"
700
705
  `);
701
- program.addOrReplaceFile('source/lib.bs', ``);
706
+ program.setFile('source/lib.bs', ``);
702
707
  testTranspile((0, testHelpers_spec_1.trim) `
703
708
  <?xml version="1.0" encoding="utf-8" ?>
704
709
  <component name="SimpleScene" extends="Scene">
@@ -714,7 +719,7 @@ describe('XmlFile', () => {
714
719
  `, 'none', 'components/SimpleScene.xml');
715
720
  });
716
721
  it('does not fail on missing script type', () => {
717
- program.addOrReplaceFile('components/SimpleScene.brs', '');
722
+ program.setFile('components/SimpleScene.brs', '');
718
723
  testTranspile((0, testHelpers_spec_1.trim) `
719
724
  <?xml version="1.0" encoding="utf-8" ?>
720
725
  <component name="SimpleScene" extends="Scene">
@@ -729,7 +734,7 @@ describe('XmlFile', () => {
729
734
  `, null, 'components/comp.xml');
730
735
  });
731
736
  it('returns the XML unmodified if needsTranspiled is false', () => {
732
- let file = program.addOrReplaceFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
737
+ let file = program.setFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
733
738
  <?xml version="1.0" encoding="utf-8" ?>
734
739
  <!-- should stay as-is -->
735
740
  <component name="SimpleScene" extends="Scene" >
@@ -747,7 +752,7 @@ describe('XmlFile', () => {
747
752
  `);
748
753
  });
749
754
  it('needsTranspiled is false by default', () => {
750
- let file = program.addOrReplaceFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
755
+ let file = program.setFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
751
756
  <?xml version="1.0" encoding="utf-8" ?>
752
757
  <component name="SimpleScene" extends="Scene" >
753
758
  </component>
@@ -755,7 +760,7 @@ describe('XmlFile', () => {
755
760
  (0, chai_1.expect)(file.needsTranspiled).to.be.false;
756
761
  });
757
762
  it('needsTranspiled is true if an import is brighterscript', () => {
758
- let file = program.addOrReplaceFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
763
+ let file = program.setFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
759
764
  <?xml version="1.0" encoding="utf-8" ?>
760
765
  <component name="SimpleScene" extends="Scene" >
761
766
  <script type="text/brightscript" uri="SimpleScene.bs"/>
@@ -765,7 +770,7 @@ describe('XmlFile', () => {
765
770
  });
766
771
  it('simple source mapping includes sourcemap reference', () => {
767
772
  program.options.sourceMap = true;
768
- let file = program.addOrReplaceFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
773
+ let file = program.setFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
769
774
  <?xml version="1.0" encoding="utf-8" ?>
770
775
  <component name="SimpleScene" extends="Scene">
771
776
  </component>
@@ -777,7 +782,7 @@ describe('XmlFile', () => {
777
782
  });
778
783
  it('AST-based source mapping includes sourcemap reference', () => {
779
784
  program.options.sourceMap = true;
780
- let file = program.addOrReplaceFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
785
+ let file = program.setFile({ src: (0, util_1.standardizePath) `${rootDir}/components/SimpleScene.xml`, dest: 'components/SimpleScene.xml' }, (0, testHelpers_spec_1.trim) `
781
786
  <?xml version="1.0" encoding="utf-8" ?>
782
787
  <component name="SimpleScene" extends="Scene">
783
788
  </component>
@@ -793,23 +798,23 @@ describe('XmlFile', () => {
793
798
  const program = new Program_1.Program({
794
799
  rootDir: rootDir
795
800
  });
796
- file = new XmlFile_1.XmlFile('abs', 'rel', program);
797
801
  program.plugins.add({
798
802
  name: 'Transform plugins',
799
- afterFileParse: () => validateXml(file)
803
+ afterFileParse: file => validateXml(file)
800
804
  });
801
- file.parse((0, testHelpers_spec_1.trim) `
805
+ file = program.setFile('components/component.xml', (0, testHelpers_spec_1.trim) `
802
806
  <?xml version="1.0" encoding="utf-8" ?>
803
807
  <component name="Cmp1" extends="Scene">
804
808
  </component>
805
809
  `);
810
+ program.validate();
806
811
  return file;
807
812
  }
808
813
  it('Calls XML file validation plugins', () => {
809
814
  const validateXml = sinon.spy();
810
815
  const file = parseFileWithPlugins(validateXml);
811
- (0, chai_1.expect)(validateXml.callCount).to.equal(1);
812
- (0, chai_1.expect)(validateXml.calledWith(file)).to.be.true;
816
+ (0, chai_1.expect)(validateXml.callCount).to.be.greaterThan(0);
817
+ (0, chai_1.expect)(validateXml.getCalls().flatMap(x => x.args)).to.include(file);
813
818
  });
814
819
  });
815
820
  it('plugin diagnostics work for xml files', () => {
@@ -826,61 +831,60 @@ describe('XmlFile', () => {
826
831
  }
827
832
  }
828
833
  });
829
- program.addOrReplaceFile('components/comp.xml', (0, testHelpers_spec_1.trim) `
834
+ program.setFile('components/comp.xml', (0, testHelpers_spec_1.trim) `
830
835
  <?xml version="1.0" encoding="utf-8" ?>
831
836
  <component name="Cmp1" extends="Scene">
832
837
  </component>
833
838
  `);
834
839
  program.validate();
835
- (0, chai_1.expect)(program.getDiagnostics().map(x => ({ message: x.message, code: x.code }))).to.eql([{
840
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [{
836
841
  message: 'Test diagnostic',
837
842
  code: 9999
838
843
  }]);
839
844
  });
840
845
  describe('typedef', () => {
841
846
  it('loads d.bs files from parent scope', () => {
842
- var _a;
843
- program.addOrReplaceFile('components/ParentComponent.xml', (0, testHelpers_spec_1.trim) `
847
+ program.setFile('components/ParentComponent.xml', (0, testHelpers_spec_1.trim) `
844
848
  <?xml version="1.0" encoding="utf-8" ?>
845
849
  <component name="ParentComponent" extends="Scene">
846
850
  <script uri="ParentComponent.brs" />
847
851
  </component>
848
852
  `);
849
- program.addOrReplaceFile('components/ParentComponent.d.bs', `
853
+ program.setFile('components/ParentComponent.d.bs', `
850
854
  import "Lib.brs"
851
855
  namespace Parent
852
856
  sub log()
853
857
  end sub
854
858
  end namespace
855
859
  `);
856
- program.addOrReplaceFile('components/ParentComponent.brs', `
860
+ program.setFile('components/ParentComponent.brs', `
857
861
  sub Parent_log()
858
862
  end sub
859
863
  `);
860
- program.addOrReplaceFile('components/Lib.d.bs', `
864
+ program.setFile('components/Lib.d.bs', `
861
865
  namespace Lib
862
866
  sub log()
863
867
  end sub
864
868
  end namespace
865
869
  `);
866
- program.addOrReplaceFile('components/Lib.brs', `
870
+ program.setFile('components/Lib.brs', `
867
871
  sub Lib_log()
868
872
  end sub
869
873
  `);
870
- program.addOrReplaceFile('components/ChildComponent.xml', (0, testHelpers_spec_1.trim) `
874
+ program.setFile('components/ChildComponent.xml', (0, testHelpers_spec_1.trim) `
871
875
  <?xml version="1.0" encoding="utf-8" ?>
872
876
  <component name="ChildComponent" extends="ParentComponent">
873
877
  <script uri="ChildComponent.bs" />
874
878
  </component>
875
879
  `);
876
- program.addOrReplaceFile('components/ChildComponent.bs', `
880
+ program.setFile('components/ChildComponent.bs', `
877
881
  sub init()
878
882
  Parent.log()
879
883
  Lib.log()
880
884
  end sub
881
885
  `);
882
886
  program.validate();
883
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
887
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
884
888
  const scope = program.getComponentScope('ChildComponent');
885
889
  (0, chai_1.expect)([...scope.namespaceLookup.keys()].sort()).to.eql([
886
890
  'lib',
@@ -888,28 +892,28 @@ describe('XmlFile', () => {
888
892
  ]);
889
893
  });
890
894
  it('loads `d.bs` files into scope', () => {
891
- const xmlFile = program.addOrReplaceFile('components/Component1.xml', (0, testHelpers_spec_1.trim) `
895
+ const xmlFile = program.setFile('components/Component1.xml', (0, testHelpers_spec_1.trim) `
892
896
  <?xml version="1.0" encoding="utf-8" ?>
893
897
  <component name="Component1" extends="Scene">
894
898
  <script uri="Component1.brs" />
895
899
  </component>
896
900
  `);
897
- program.addOrReplaceFile('components/Component1.d.bs', `
901
+ program.setFile('components/Component1.d.bs', `
898
902
  sub logInfo()
899
903
  end sub
900
904
  `);
901
905
  (0, chai_1.expect)(program.getScopesForFile(xmlFile)[0].getAllCallables().map(x => x.callable.name)).to.include('logInfo');
902
906
  });
903
907
  it('does not include `d.bs` script during transpile', () => {
904
- program.addOrReplaceFile('source/logger.d.bs', `
908
+ program.setFile('source/logger.d.bs', `
905
909
  sub logInfo()
906
910
  end sub
907
911
  `);
908
- program.addOrReplaceFile('source/logger.brs', `
912
+ program.setFile('source/logger.brs', `
909
913
  sub logInfo()
910
914
  end sub
911
915
  `);
912
- program.addOrReplaceFile('components/Component1.bs', `
916
+ program.setFile('components/Component1.bs', `
913
917
  import "pkg:/source/logger.brs"
914
918
  sub init()
915
919
  end sub
@@ -929,7 +933,7 @@ describe('XmlFile', () => {
929
933
  `, 'none', 'components/Component1.xml');
930
934
  });
931
935
  it('does not load .brs information into scope if related d.bs is in scope', () => {
932
- const xmlFile = program.addOrReplaceFile('components/Component1.xml', (0, testHelpers_spec_1.trim) `
936
+ const xmlFile = program.setFile('components/Component1.xml', (0, testHelpers_spec_1.trim) `
933
937
  <?xml version="1.0" encoding="utf-8" ?>
934
938
  <component name="Component1" extends="Scene">
935
939
  <script uri="Component1.brs" />
@@ -937,7 +941,7 @@ describe('XmlFile', () => {
937
941
  `);
938
942
  const scope = program.getScopesForFile(xmlFile)[0];
939
943
  //load brs file
940
- program.addOrReplaceFile('components/Component1.brs', `
944
+ program.setFile('components/Component1.brs', `
941
945
  sub logInfo()
942
946
  end sub
943
947
  sub logWarning()
@@ -947,7 +951,7 @@ describe('XmlFile', () => {
947
951
  (0, chai_1.expect)(functionNames).to.include('logInfo');
948
952
  (0, chai_1.expect)(functionNames).to.include('logWarning');
949
953
  //load d.bs file, which should shadow out the .brs file
950
- program.addOrReplaceFile('components/Component1.d.bs', `
954
+ program.setFile('components/Component1.d.bs', `
951
955
  sub logError()
952
956
  end sub
953
957
  `);
@@ -957,7 +961,7 @@ describe('XmlFile', () => {
957
961
  (0, chai_1.expect)(functionNames).not.to.include('logWarning');
958
962
  });
959
963
  it('updates xml scope when typedef disappears', () => {
960
- const xmlFile = program.addOrReplaceFile('components/Component1.xml', (0, testHelpers_spec_1.trim) `
964
+ const xmlFile = program.setFile('components/Component1.xml', (0, testHelpers_spec_1.trim) `
961
965
  <?xml version="1.0" encoding="utf-8" ?>
962
966
  <component name="Component1" extends="Scene">
963
967
  <script uri="Component1.brs" />
@@ -965,12 +969,12 @@ describe('XmlFile', () => {
965
969
  `);
966
970
  const scope = program.getScopesForFile(xmlFile)[0];
967
971
  //load brs file
968
- program.addOrReplaceFile('components/Component1.brs', `
972
+ program.setFile('components/Component1.brs', `
969
973
  sub logBrs()
970
974
  end sub
971
975
  `);
972
976
  //load d.bs file, which should shadow out the .brs file
973
- const typedef = program.addOrReplaceFile('components/Component1.d.bs', `
977
+ const typedef = program.setFile('components/Component1.d.bs', `
974
978
  sub logTypedef()
975
979
  end sub
976
980
  `);
@@ -988,7 +992,7 @@ describe('XmlFile', () => {
988
992
  });
989
993
  it('finds script imports for single-quoted script tags', () => {
990
994
  var _a;
991
- const file = program.addOrReplaceFile('components/file.xml', (0, testHelpers_spec_1.trim) `
995
+ const file = program.setFile('components/file.xml', (0, testHelpers_spec_1.trim) `
992
996
  <?xml version="1.0" encoding="utf-8" ?>
993
997
  <component name="Cmp1" extends="Scene">
994
998
  <script uri='SingleQuotedFile.brs' />
@@ -999,7 +1003,7 @@ describe('XmlFile', () => {
999
1003
  describe('commentFlags', () => {
1000
1004
  it('ignores warning from previous line comment', () => {
1001
1005
  //component without a name attribute
1002
- program.addOrReplaceFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1006
+ program.setFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1003
1007
  <?xml version="1.0" encoding="utf-8" ?>
1004
1008
  <!--bs:disable-next-line-->
1005
1009
  <component>
@@ -1010,20 +1014,20 @@ describe('XmlFile', () => {
1010
1014
  });
1011
1015
  it('ignores warning from previous line just for the specified code', () => {
1012
1016
  //component without a name attribute
1013
- program.addOrReplaceFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1017
+ program.setFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1014
1018
  <?xml version="1.0" encoding="utf-8" ?>
1015
1019
  <!--bs:disable-next-line 1006-->
1016
1020
  <component>
1017
1021
  </component>
1018
1022
  `);
1019
1023
  program.validate();
1020
- (0, chai_1.expect)(program.getDiagnostics().map(x => x.message)).to.eql([
1021
- DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingExtendsAttribute().message
1024
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1025
+ DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingExtendsAttribute()
1022
1026
  ]);
1023
1027
  });
1024
1028
  it('ignores warning from previous line comment', () => {
1025
1029
  //component without a name attribute
1026
- program.addOrReplaceFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1030
+ program.setFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1027
1031
  <?xml version="1.0" encoding="utf-8" ?>
1028
1032
  <component> <!--bs:disable-line-->
1029
1033
  </component>
@@ -1033,50 +1037,50 @@ describe('XmlFile', () => {
1033
1037
  });
1034
1038
  it('ignores warning from previous line just for the specified code', () => {
1035
1039
  //component without a name attribute
1036
- program.addOrReplaceFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1040
+ program.setFile('components/file.xml', (0, testHelpers_spec_1.trim) `
1037
1041
  <?xml version="1.0" encoding="utf-8" ?>
1038
1042
  <component> <!--bs:disable-line 1006-->
1039
1043
  </component>
1040
1044
  `);
1041
1045
  program.validate();
1042
- (0, chai_1.expect)(program.getDiagnostics().map(x => x.message)).to.eql([
1043
- DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingExtendsAttribute().message
1046
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1047
+ DiagnosticMessages_1.DiagnosticMessages.xmlComponentMissingExtendsAttribute()
1044
1048
  ]);
1045
1049
  });
1046
1050
  });
1047
1051
  describe('duplicate components', () => {
1048
1052
  it('more gracefully handles multiple components with the same name', () => {
1049
- program.addOrReplaceFile('components/comp1.brs', ``);
1050
- program.addOrReplaceFile('components/comp1.xml', (0, testHelpers_spec_1.trim) `
1053
+ program.setFile('components/comp1.brs', ``);
1054
+ program.setFile('components/comp1.xml', (0, testHelpers_spec_1.trim) `
1051
1055
  <?xml version="1.0" encoding="utf-8" ?>
1052
1056
  <component name="comp1" extends="Group">
1053
1057
  <script uri="comp1.brs" />
1054
1058
  </component>
1055
1059
  `);
1056
1060
  //add another component with the same name
1057
- program.addOrReplaceFile('components/comp2.brs', ``);
1058
- program.addOrReplaceFile('components/comp2.xml', (0, testHelpers_spec_1.trim) `
1061
+ program.setFile('components/comp2.brs', ``);
1062
+ program.setFile('components/comp2.xml', (0, testHelpers_spec_1.trim) `
1059
1063
  <?xml version="1.0" encoding="utf-8" ?>
1060
1064
  <component name="comp1" extends="Group">
1061
1065
  <script uri="comp2.brs" />
1062
1066
  </component>
1063
1067
  `);
1064
1068
  program.validate();
1065
- (0, chai_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
1066
- DiagnosticMessages_1.DiagnosticMessages.duplicateComponentName('comp1').message,
1067
- DiagnosticMessages_1.DiagnosticMessages.duplicateComponentName('comp1').message
1069
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1070
+ DiagnosticMessages_1.DiagnosticMessages.duplicateComponentName('comp1'),
1071
+ DiagnosticMessages_1.DiagnosticMessages.duplicateComponentName('comp1')
1068
1072
  ]);
1069
1073
  });
1070
1074
  it('maintains consistent component selection', () => {
1071
1075
  //add comp2 first
1072
- const comp2 = program.addOrReplaceFile('components/comp2.xml', (0, testHelpers_spec_1.trim) `
1076
+ const comp2 = program.setFile('components/comp2.xml', (0, testHelpers_spec_1.trim) `
1073
1077
  <?xml version="1.0" encoding="utf-8" ?>
1074
1078
  <component name="comp1">
1075
1079
  </component>
1076
1080
  `);
1077
1081
  (0, chai_1.expect)(program.getComponent('comp1').file.pkgPath).to.equal(comp2.pkgPath);
1078
1082
  //add comp1. it should become the main component with this name
1079
- const comp1 = program.addOrReplaceFile('components/comp1.xml', (0, testHelpers_spec_1.trim) `
1083
+ const comp1 = program.setFile('components/comp1.xml', (0, testHelpers_spec_1.trim) `
1080
1084
  <?xml version="1.0" encoding="utf-8" ?>
1081
1085
  <component name="comp1" extends="Group">
1082
1086
  </component>
@@ -1086,7 +1090,7 @@ describe('XmlFile', () => {
1086
1090
  program.removeFile((0, util_1.standardizePath) `${rootDir}/components/comp1.xml`);
1087
1091
  (0, chai_1.expect)(program.getComponent('comp1').file.pkgPath).to.equal(comp2.pkgPath);
1088
1092
  //add comp3
1089
- program.addOrReplaceFile('components/comp3.xml', (0, testHelpers_spec_1.trim) `
1093
+ program.setFile('components/comp3.xml', (0, testHelpers_spec_1.trim) `
1090
1094
  <?xml version="1.0" encoding="utf-8" ?>
1091
1095
  <component name="comp1">
1092
1096
  </component>