brighterscript 0.43.0 → 0.45.1

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 (112) hide show
  1. package/CHANGELOG.md +37 -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 -3
  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 +67 -24
  15. package/dist/Program.js +155 -88
  16. package/dist/Program.js.map +1 -1
  17. package/dist/ProgramBuilder.js +3 -3
  18. package/dist/ProgramBuilder.js.map +1 -1
  19. package/dist/Scope.d.ts +16 -10
  20. package/dist/Scope.js +28 -1
  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 +3 -1
  29. package/dist/astUtils/reflection.js +10 -2
  30. package/dist/astUtils/reflection.js.map +1 -1
  31. package/dist/astUtils/visitors.d.ts +3 -1
  32. package/dist/astUtils/visitors.js.map +1 -1
  33. package/dist/astUtils/visitors.spec.js +6 -6
  34. package/dist/astUtils/visitors.spec.js.map +1 -1
  35. package/dist/bscPlugin/BscPlugin.d.ts +4 -1
  36. package/dist/bscPlugin/BscPlugin.js +21 -2
  37. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  38. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +18 -16
  39. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  40. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
  41. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
  42. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  43. package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.d.ts → BrsFileSemanticTokensProcessor.spec.d.ts} +0 -0
  44. package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.js → BrsFileSemanticTokensProcessor.spec.js} +32 -4
  45. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  46. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  47. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +36 -0
  48. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  49. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  50. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  51. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  52. package/dist/bscPlugin/validation/ScopeValidator.d.ts +11 -0
  53. package/dist/bscPlugin/validation/ScopeValidator.js +94 -0
  54. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  55. package/dist/diagnosticUtils.js +3 -3
  56. package/dist/diagnosticUtils.js.map +1 -1
  57. package/dist/files/BrsFile.Class.spec.js +47 -47
  58. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  59. package/dist/files/BrsFile.d.ts +16 -3
  60. package/dist/files/BrsFile.js +112 -30
  61. package/dist/files/BrsFile.js.map +1 -1
  62. package/dist/files/BrsFile.spec.js +194 -95
  63. package/dist/files/BrsFile.spec.js.map +1 -1
  64. package/dist/files/XmlFile.d.ts +10 -5
  65. package/dist/files/XmlFile.js +6 -1
  66. package/dist/files/XmlFile.js.map +1 -1
  67. package/dist/files/XmlFile.spec.js +83 -81
  68. package/dist/files/XmlFile.spec.js.map +1 -1
  69. package/dist/files/tests/imports.spec.js +23 -23
  70. package/dist/files/tests/imports.spec.js.map +1 -1
  71. package/dist/interfaces.d.ts +29 -8
  72. package/dist/lexer/Lexer.spec.js +8 -0
  73. package/dist/lexer/Lexer.spec.js.map +1 -1
  74. package/dist/lexer/TokenKind.d.ts +2 -0
  75. package/dist/lexer/TokenKind.js +5 -0
  76. package/dist/lexer/TokenKind.js.map +1 -1
  77. package/dist/parser/Parser.d.ts +10 -1
  78. package/dist/parser/Parser.js +90 -1
  79. package/dist/parser/Parser.js.map +1 -1
  80. package/dist/parser/SGParser.spec.js +1 -1
  81. package/dist/parser/SGParser.spec.js.map +1 -1
  82. package/dist/parser/Statement.d.ts +52 -0
  83. package/dist/parser/Statement.js +154 -1
  84. package/dist/parser/Statement.js.map +1 -1
  85. package/dist/parser/Statement.spec.js +1 -1
  86. package/dist/parser/Statement.spec.js.map +1 -1
  87. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +1 -1
  88. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  89. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +1 -1
  90. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  91. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +1 -1
  92. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  93. package/dist/parser/tests/expression/TernaryExpression.spec.js +1 -1
  94. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  95. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  96. package/dist/parser/tests/statement/Enum.spec.js +774 -0
  97. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  98. package/dist/parser/tests/statement/InterfaceStatement.spec.js +1 -1
  99. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  100. package/dist/types/FunctionType.d.ts +2 -2
  101. package/dist/types/FunctionType.js +3 -3
  102. package/dist/types/FunctionType.js.map +1 -1
  103. package/dist/types/FunctionType.spec.js +2 -2
  104. package/dist/types/FunctionType.spec.js.map +1 -1
  105. package/dist/util.d.ts +22 -0
  106. package/dist/util.js +60 -0
  107. package/dist/util.js.map +1 -1
  108. package/package.json +2 -3
  109. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
  110. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
  111. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
  112. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
@@ -37,7 +37,7 @@ describe('BrsFile', () => {
37
37
  program.dispose();
38
38
  });
39
39
  it('supports the third parameter in CreateObject', () => {
40
- program.addOrReplaceFile('source/main.brs', `
40
+ program.setFile('source/main.brs', `
41
41
  sub main()
42
42
  regexp = CreateObject("roRegex", "[a-z]+", "i")
43
43
  end sub
@@ -46,7 +46,7 @@ describe('BrsFile', () => {
46
46
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
47
47
  });
48
48
  it('supports the 6 params in CreateObject for roRegion', () => {
49
- program.addOrReplaceFile('source/main.brs', `
49
+ program.setFile('source/main.brs', `
50
50
  sub createRegion(bitmap as object)
51
51
  region = CreateObject("roRegion", bitmap, 20, 40, 100, 200)
52
52
  end sub
@@ -75,7 +75,7 @@ describe('BrsFile', () => {
75
75
  dest: `source/lib.brs`
76
76
  };
77
77
  it('creates proper tokens', () => {
78
- file = program.addOrReplaceFile(entry, `call(ModuleA.ModuleB.ModuleC.`);
78
+ file = program.setFile(entry, `call(ModuleA.ModuleB.ModuleC.`);
79
79
  (0, chai_1.expect)(file['getPartialVariableName'](file.parser.tokens[7])).to.equal('ModuleA.ModuleB.ModuleC.');
80
80
  (0, chai_1.expect)(file['getPartialVariableName'](file.parser.tokens[6])).to.equal('ModuleA.ModuleB.ModuleC');
81
81
  (0, chai_1.expect)(file['getPartialVariableName'](file.parser.tokens[5])).to.equal('ModuleA.ModuleB.');
@@ -87,13 +87,13 @@ describe('BrsFile', () => {
87
87
  describe('getScopesForFile', () => {
88
88
  it('finds the scope for the file', () => {
89
89
  var _a;
90
- let file = program.addOrReplaceFile('source/main.brs', ``);
90
+ let file = program.setFile('source/main.brs', ``);
91
91
  (0, chai_1.expect)((_a = program.getScopesForFile(file)[0]) === null || _a === void 0 ? void 0 : _a.name).to.equal('source');
92
92
  });
93
93
  });
94
94
  describe('getCompletions', () => {
95
95
  it('does not crash for callfunc on a function call', () => {
96
- const file = program.addOrReplaceFile('source/main.brs', `
96
+ const file = program.setFile('source/main.brs', `
97
97
  sub main()
98
98
  getManager()@.
99
99
  end sub
@@ -103,7 +103,7 @@ describe('BrsFile', () => {
103
103
  }).not.to.throw;
104
104
  });
105
105
  it('suggests pkg paths in strings that match that criteria', () => {
106
- program.addOrReplaceFile('source/main.brs', `
106
+ program.setFile('source/main.brs', `
107
107
  sub main()
108
108
  print "pkg:"
109
109
  end sub
@@ -115,7 +115,7 @@ describe('BrsFile', () => {
115
115
  ]);
116
116
  });
117
117
  it('suggests libpkg paths in strings that match that criteria', () => {
118
- program.addOrReplaceFile('source/main.brs', `
118
+ program.setFile('source/main.brs', `
119
119
  sub main()
120
120
  print "libpkg:"
121
121
  end sub
@@ -127,7 +127,7 @@ describe('BrsFile', () => {
127
127
  ]);
128
128
  });
129
129
  it('suggests pkg paths in template strings', () => {
130
- program.addOrReplaceFile('source/main.brs', `
130
+ program.setFile('source/main.brs', `
131
131
  sub main()
132
132
  print \`pkg:\`
133
133
  end sub
@@ -140,7 +140,7 @@ describe('BrsFile', () => {
140
140
  });
141
141
  it('waits for the file to be processed before collecting completions', () => {
142
142
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
143
- program.addOrReplaceFile('source/main.brs', `
143
+ program.setFile('source/main.brs', `
144
144
  sub Main()
145
145
  print "hello"
146
146
  Say
@@ -154,9 +154,79 @@ describe('BrsFile', () => {
154
154
  (0, chai_1.expect)(names).to.includes('Main');
155
155
  (0, chai_1.expect)(names).to.includes('SayHello');
156
156
  });
157
+ it('includes every type of item at base level', () => {
158
+ program.setFile('source/main.bs', `
159
+ sub main()
160
+ print
161
+ end sub
162
+ sub speak()
163
+ end sub
164
+ namespace stuff
165
+ end namespace
166
+ class Person
167
+ end class
168
+ enum Direction
169
+ end enum
170
+ `);
171
+ (0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 26)), [{
172
+ label: 'main',
173
+ kind: vscode_languageserver_1.CompletionItemKind.Function
174
+ }, {
175
+ label: 'speak',
176
+ kind: vscode_languageserver_1.CompletionItemKind.Function
177
+ }, {
178
+ label: 'stuff',
179
+ kind: vscode_languageserver_1.CompletionItemKind.Module
180
+ }, {
181
+ label: 'Person',
182
+ kind: vscode_languageserver_1.CompletionItemKind.Class
183
+ }, {
184
+ label: 'Direction',
185
+ kind: vscode_languageserver_1.CompletionItemKind.Enum
186
+ }]);
187
+ });
188
+ describe('namespaces', () => {
189
+ it('gets full namespace completions at any point through the leading identifier', () => {
190
+ program.setFile('source/main.bs', `
191
+ sub main()
192
+ foo.bar
193
+ end sub
194
+
195
+ namespace foo.bar
196
+ end namespace
197
+
198
+ class Person
199
+ end class
200
+ `);
201
+ const result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 24)).map(x => x.label);
202
+ (0, chai_1.expect)(result).includes('main');
203
+ (0, chai_1.expect)(result).includes('foo');
204
+ (0, chai_1.expect)(result).includes('Person');
205
+ });
206
+ it('gets namespace completions', () => {
207
+ program.setFile('source/main.bs', `
208
+ namespace foo.bar
209
+ function sayHello()
210
+ end function
211
+ end namespace
212
+
213
+ sub Main()
214
+ print "hello"
215
+ foo.ba
216
+ foo.bar.
217
+ end sub
218
+ `);
219
+ let result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 30));
220
+ let names = result.map(x => x.label);
221
+ (0, chai_1.expect)(names).to.includes('bar');
222
+ result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(9, 32));
223
+ names = result.map(x => x.label);
224
+ (0, chai_1.expect)(names).to.includes('sayHello');
225
+ });
226
+ });
157
227
  it('always includes `m`', () => {
158
228
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
159
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
229
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
160
230
  sub Main()
161
231
 
162
232
  end sub
@@ -167,14 +237,14 @@ describe('BrsFile', () => {
167
237
  });
168
238
  it('does not fail for missing previousToken', () => {
169
239
  //add a single character to the file, and get completions after it
170
- program.addOrReplaceFile('source/main.brs', `i`);
240
+ program.setFile('source/main.brs', `i`);
171
241
  (0, chai_1.expect)(() => {
172
242
  program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(0, 1)).map(x => x.label);
173
243
  }).not.to.throw;
174
244
  });
175
245
  it('includes all keywords`', () => {
176
246
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
177
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
247
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
178
248
  sub Main()
179
249
 
180
250
  end sub
@@ -195,7 +265,7 @@ describe('BrsFile', () => {
195
265
  });
196
266
  it('does not provide completions within a comment', () => {
197
267
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
198
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
268
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
199
269
  sub Main()
200
270
  'some comment
201
271
  end sub
@@ -206,7 +276,7 @@ describe('BrsFile', () => {
206
276
  });
207
277
  it('does not provide duplicate entries for variables', () => {
208
278
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
209
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
279
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
210
280
  sub Main()
211
281
  name = "bob"
212
282
  age = 12
@@ -221,7 +291,7 @@ describe('BrsFile', () => {
221
291
  });
222
292
  it('does not include `as` and `string` text options when used in function params', () => {
223
293
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
224
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
294
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
225
295
  sub Main(name as string)
226
296
 
227
297
  end sub
@@ -232,7 +302,7 @@ describe('BrsFile', () => {
232
302
  });
233
303
  it('does not provide intellisense results when inside a comment', () => {
234
304
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
235
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
305
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
236
306
  sub Main(name as string)
237
307
  'this is a comment
238
308
  end sub
@@ -243,7 +313,7 @@ describe('BrsFile', () => {
243
313
  it('does provide intellisence for labels only after a goto keyword', () => {
244
314
  var _a;
245
315
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
246
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
316
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
247
317
  sub Main(name as string)
248
318
  something:
249
319
  goto \nend sub
@@ -256,7 +326,7 @@ describe('BrsFile', () => {
256
326
  describe('comment flags', () => {
257
327
  describe('bs:disable-next-line', () => {
258
328
  it('disables critical diagnostic issues', () => {
259
- program.addOrReplaceFile('source/main.brs', `
329
+ program.setFile('source/main.brs', `
260
330
  sub main()
261
331
  Dim requestData
262
332
  end sub
@@ -264,7 +334,7 @@ describe('BrsFile', () => {
264
334
  //should have an error
265
335
  program.validate();
266
336
  (0, testHelpers_spec_1.expectHasDiagnostics)(program);
267
- program.addOrReplaceFile('source/main.brs', `
337
+ program.setFile('source/main.brs', `
268
338
  sub main()
269
339
  'bs:disable-next-line
270
340
  Dim requestData
@@ -275,7 +345,7 @@ describe('BrsFile', () => {
275
345
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
276
346
  });
277
347
  it('works with leading whitespace', () => {
278
- program.addOrReplaceFile('source/main.brs', `
348
+ program.setFile('source/main.brs', `
279
349
  sub main()
280
350
  ' bs:disable-next-line
281
351
  =asdf=sadf=
@@ -286,7 +356,7 @@ describe('BrsFile', () => {
286
356
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
287
357
  });
288
358
  it('works for all', () => {
289
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
359
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
290
360
  sub Main()
291
361
  'bs:disable-next-line
292
362
  name = "bob
@@ -303,7 +373,7 @@ describe('BrsFile', () => {
303
373
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
304
374
  });
305
375
  it('works for specific codes', () => {
306
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
376
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
307
377
  sub Main()
308
378
  'bs:disable-next-line: 1083, 1001
309
379
  name = "bob
@@ -319,7 +389,7 @@ describe('BrsFile', () => {
319
389
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
320
390
  });
321
391
  it('recognizes non-numeric codes', () => {
322
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
392
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
323
393
  sub Main()
324
394
  'bs:disable-next-line: LINT9999
325
395
  name = "bob
@@ -330,7 +400,7 @@ describe('BrsFile', () => {
330
400
  });
331
401
  it('supports disabling non-numeric error codes', () => {
332
402
  const program = new Program_1.Program({});
333
- const file = program.addOrReplaceFile('source/main.brs', `
403
+ const file = program.setFile('source/main.brs', `
334
404
  sub main()
335
405
  something = true 'bs:disable-line: LINT1005
336
406
  end sub
@@ -345,7 +415,7 @@ describe('BrsFile', () => {
345
415
  (0, testHelpers_spec_1.expectZeroDiagnostics)(scope);
346
416
  });
347
417
  it('adds diagnostics for unknown numeric diagnostic codes', () => {
348
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
418
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
349
419
  sub main()
350
420
  print "hi" 'bs:disable-line: 123456 999999 aaaab
351
421
  end sub
@@ -356,7 +426,7 @@ describe('BrsFile', () => {
356
426
  });
357
427
  describe('bs:disable-line', () => {
358
428
  it('works for all', () => {
359
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
429
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
360
430
  sub Main()
361
431
  z::;;%%%%%% 'bs:disable-line
362
432
  end sub
@@ -372,7 +442,7 @@ describe('BrsFile', () => {
372
442
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
373
443
  });
374
444
  it('works for specific codes', () => {
375
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
445
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
376
446
  sub main()
377
447
  'should not have any errors
378
448
  DoSomething(1) 'bs:disable-line:1002
@@ -391,7 +461,7 @@ describe('BrsFile', () => {
391
461
  //the current version of BRS causes parse errors after the `parse` keyword, showing error in comments
392
462
  //the program should ignore all diagnostics found in brs:* comment lines EXCEPT
393
463
  //for the diagnostics about using unknown error codes
394
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
464
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
395
465
  sub main()
396
466
  stop 'bs:disable-line
397
467
  print "need a valid line to fix stop error"
@@ -404,7 +474,7 @@ describe('BrsFile', () => {
404
474
  });
405
475
  describe('parse', () => {
406
476
  it('supports iife in assignment', () => {
407
- program.addOrReplaceFile('source/main.brs', `
477
+ program.setFile('source/main.brs', `
408
478
  sub main()
409
479
  result = sub()
410
480
  end sub()
@@ -416,7 +486,7 @@ describe('BrsFile', () => {
416
486
  });
417
487
  it('uses the proper parse mode based on file extension', () => {
418
488
  function testParseMode(destPath, expectedParseMode) {
419
- const file = program.addOrReplaceFile(destPath, '');
489
+ const file = program.setFile(destPath, '');
420
490
  (0, chai_1.expect)(file.parseMode).to.equal(expectedParseMode);
421
491
  }
422
492
  testParseMode('source/main.brs', Parser_1.ParseMode.BrightScript);
@@ -427,7 +497,7 @@ describe('BrsFile', () => {
427
497
  testParseMode('source/main.spec.bs', Parser_1.ParseMode.BrighterScript);
428
498
  });
429
499
  it('supports labels and goto statements', () => {
430
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
500
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
431
501
  sub Main()
432
502
  'multiple goto statements on one line
433
503
  goto myLabel : goto myLabel
@@ -437,7 +507,7 @@ describe('BrsFile', () => {
437
507
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
438
508
  });
439
509
  it('supports empty print statements', () => {
440
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
510
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
441
511
  sub main()
442
512
  print
443
513
  end sub
@@ -446,7 +516,7 @@ describe('BrsFile', () => {
446
516
  });
447
517
  describe('conditional compile', () => {
448
518
  it('works for upper case keywords', () => {
449
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
519
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
450
520
  sub main()
451
521
  #CONST someFlag = true
452
522
  #IF someFlag
@@ -461,7 +531,7 @@ describe('BrsFile', () => {
461
531
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
462
532
  });
463
533
  it('supports single-word #elseif and #endif', () => {
464
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
534
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
465
535
  sub main()
466
536
  #const someFlag = true
467
537
  #if someFlag
@@ -474,7 +544,7 @@ describe('BrsFile', () => {
474
544
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
475
545
  });
476
546
  it('supports multi-word #else if and #end if', () => {
477
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
547
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
478
548
  sub main()
479
549
  #const someFlag = true
480
550
  #if someFlag
@@ -487,7 +557,7 @@ describe('BrsFile', () => {
487
557
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
488
558
  });
489
559
  it('does not choke on invalid code inside a false conditional compile', () => {
490
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
560
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
491
561
  sub main()
492
562
  #if false
493
563
  non-commented code here should not cause parse errors
@@ -497,7 +567,7 @@ describe('BrsFile', () => {
497
567
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
498
568
  });
499
569
  it('detects syntax error in #if', () => {
500
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
570
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
501
571
  sub main()
502
572
  #if true1
503
573
  print "true"
@@ -509,7 +579,7 @@ describe('BrsFile', () => {
509
579
  ]);
510
580
  });
511
581
  it('detects syntax error in #const', () => {
512
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
582
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
513
583
  sub main()
514
584
  #if %
515
585
  print "true"
@@ -522,7 +592,7 @@ describe('BrsFile', () => {
522
592
  ]);
523
593
  });
524
594
  it('detects #const name using reserved word', () => {
525
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
595
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
526
596
  sub main()
527
597
  #const function = true
528
598
  end sub
@@ -533,7 +603,7 @@ describe('BrsFile', () => {
533
603
  ]);
534
604
  });
535
605
  it('detects syntax error in #const', () => {
536
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
606
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
537
607
  sub main()
538
608
  #const someConst = 123
539
609
  end sub
@@ -544,7 +614,7 @@ describe('BrsFile', () => {
544
614
  });
545
615
  });
546
616
  it('supports stop statement', () => {
547
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
617
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
548
618
  sub main()
549
619
  stop
550
620
  end sub
@@ -552,7 +622,7 @@ describe('BrsFile', () => {
552
622
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
553
623
  });
554
624
  it('supports single-line if statements', () => {
555
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
625
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
556
626
  sub main()
557
627
  if 1 < 2: return true: end if
558
628
  if 1 < 2: return true
@@ -901,38 +971,42 @@ describe('BrsFile', () => {
901
971
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
902
972
  });
903
973
  it('adds error for library statements NOT at top of file', () => {
904
- let file = program.addOrReplaceFile('source/main.bs', `
974
+ program.setFile('source/file.brs', ``);
975
+ program.setFile('source/main.bs', `
905
976
  sub main()
906
977
  end sub
907
978
  import "file.brs"
908
979
  `);
909
- (0, testHelpers_spec_1.expectDiagnostics)(file, [
980
+ program.validate();
981
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
910
982
  DiagnosticMessages_1.DiagnosticMessages.importStatementMustBeDeclaredAtTopOfFile()
911
983
  ]);
912
984
  });
913
985
  it('supports library imports', () => {
914
- file.parse(`
986
+ program.setFile('source/main.brs', `
915
987
  Library "v30/bslCore.brs"
916
988
  `);
917
- (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
989
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
918
990
  });
919
991
  it('adds error for library statements NOT at top of file', () => {
920
- let file = program.addOrReplaceFile('source/main.brs', `
992
+ program.setFile('source/main.brs', `
921
993
  sub main()
922
994
  end sub
923
995
  Library "v30/bslCore.brs"
924
996
  `);
925
- (0, testHelpers_spec_1.expectDiagnostics)(file, [
997
+ program.validate();
998
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
926
999
  DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile()
927
1000
  ]);
928
1001
  });
929
1002
  it('adds error for library statements inside of function body', () => {
930
- let file = program.addOrReplaceFile('source/main.brs', `
1003
+ program.setFile('source/main.brs', `
931
1004
  sub main()
932
1005
  Library "v30/bslCore.brs"
933
1006
  end sub
934
1007
  `);
935
- (0, testHelpers_spec_1.expectDiagnostics)(file, [
1008
+ program.validate();
1009
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
936
1010
  DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile()
937
1011
  ]);
938
1012
  });
@@ -945,7 +1019,7 @@ describe('BrsFile', () => {
945
1019
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
946
1020
  });
947
1021
  it('succeeds when finding variables with "sub" in them', () => {
948
- let file = program.addOrReplaceFile('source/main.brs', `
1022
+ let file = program.setFile('source/main.brs', `
949
1023
  function DoSomething()
950
1024
  return value.subType()
951
1025
  end function
@@ -1175,7 +1249,7 @@ describe('BrsFile', () => {
1175
1249
  }]);
1176
1250
  });
1177
1251
  it('finds function calls nested inside statements', () => {
1178
- program.addOrReplaceFile(`source/main.brs`, `
1252
+ program.setFile(`source/main.brs`, `
1179
1253
  sub main()
1180
1254
  if true then
1181
1255
  DoesNotExist(1, 2)
@@ -1220,7 +1294,7 @@ describe('BrsFile', () => {
1220
1294
  (0, chai_1.expect)(file.callables.length).to.equal(0);
1221
1295
  });
1222
1296
  it('finds return type', () => {
1223
- let file = program.addOrReplaceFile('source/main.brs', `
1297
+ let file = program.setFile('source/main.brs', `
1224
1298
  function DoSomething() as string
1225
1299
  end function
1226
1300
  `);
@@ -1314,7 +1388,7 @@ describe('BrsFile', () => {
1314
1388
  (0, chai_1.expect)(scope.variableDeclarations[0].name).to.equal('theLength');
1315
1389
  });
1316
1390
  it('finds value from global return', () => {
1317
- let file = program.addOrReplaceFile('source/main.brs', `
1391
+ let file = program.setFile('source/main.brs', `
1318
1392
  sub Main()
1319
1393
  myName = GetName()
1320
1394
  end sub
@@ -1359,7 +1433,7 @@ describe('BrsFile', () => {
1359
1433
  });
1360
1434
  describe('getHover', () => {
1361
1435
  it('works for param types', () => {
1362
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1436
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1363
1437
  sub DoSomething(name as string)
1364
1438
  name = 1
1365
1439
  sayMyName = function(name as string)
@@ -1377,7 +1451,7 @@ describe('BrsFile', () => {
1377
1451
  });
1378
1452
  //ignore this for now...it's not a huge deal
1379
1453
  it('does not match on keywords or data types', () => {
1380
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1454
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1381
1455
  sub Main(name as string)
1382
1456
  end sub
1383
1457
  sub as()
@@ -1389,7 +1463,7 @@ describe('BrsFile', () => {
1389
1463
  (0, chai_1.expect)(file.getHover(vscode_languageserver_1.Position.create(1, 36))).not.to.exist;
1390
1464
  });
1391
1465
  it('finds declared function', () => {
1392
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1466
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1393
1467
  function Main(count = 1)
1394
1468
  firstName = "bob"
1395
1469
  age = 21
@@ -1406,7 +1480,7 @@ describe('BrsFile', () => {
1406
1480
  ].join('\n'));
1407
1481
  });
1408
1482
  it('finds variable function hover in same scope', () => {
1409
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1483
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1410
1484
  sub Main()
1411
1485
  sayMyName = sub(name as string)
1412
1486
  end sub
@@ -1422,8 +1496,33 @@ describe('BrsFile', () => {
1422
1496
  '```'
1423
1497
  ].join('\n'));
1424
1498
  });
1499
+ it('does not crash when hovering on built-in functions', async () => {
1500
+ let file = program.setFile('source/main.brs', `
1501
+ function doUcase(text)
1502
+ return ucase(text)
1503
+ end function
1504
+ `);
1505
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(2, 30))).contents).to.equal([
1506
+ '```brightscript',
1507
+ 'function UCase(s as string) as string',
1508
+ '```'
1509
+ ].join('\n'));
1510
+ });
1511
+ it('does not crash when hovering on object method call', async () => {
1512
+ let file = program.setFile('source/main.brs', `
1513
+ function getInstr(url, text)
1514
+ return url.instr(text)
1515
+ end function
1516
+ `);
1517
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(2, 35))).contents).to.equal([
1518
+ '```brightscript',
1519
+ //TODO this really shouldn't be returning the global function, but it does...so make sure it doesn't crash right now.
1520
+ 'function Instr(start as integer, text as string, substring as string) as integer',
1521
+ '```'
1522
+ ].join('\n'));
1523
+ });
1425
1524
  it('finds function hover in file scope', () => {
1426
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1525
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1427
1526
  sub Main()
1428
1527
  sayMyName()
1429
1528
  end sub
@@ -1445,12 +1544,12 @@ describe('BrsFile', () => {
1445
1544
  program = new Program_1.Program({
1446
1545
  rootDir: rootDir
1447
1546
  });
1448
- let mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1547
+ let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1449
1548
  sub Main()
1450
1549
  sayMyName()
1451
1550
  end sub
1452
1551
  `);
1453
- program.addOrReplaceFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
1552
+ program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
1454
1553
  sub sayMyName(name as string)
1455
1554
 
1456
1555
  end sub
@@ -1469,7 +1568,7 @@ describe('BrsFile', () => {
1469
1568
  program = new Program_1.Program({
1470
1569
  rootDir: rootDir
1471
1570
  });
1472
- const file = program.addOrReplaceFile('source/lib.brs', `
1571
+ const file = program.setFile('source/lib.brs', `
1473
1572
  '
1474
1573
  ' The main function
1475
1574
  '
@@ -1507,7 +1606,7 @@ describe('BrsFile', () => {
1507
1606
  `);
1508
1607
  });
1509
1608
  it('handles mixed case `then` partions of conditionals', () => {
1510
- let mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1609
+ let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1511
1610
  sub Main()
1512
1611
  if true then
1513
1612
  print "works"
@@ -1515,7 +1614,7 @@ describe('BrsFile', () => {
1515
1614
  end sub
1516
1615
  `);
1517
1616
  (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1518
- mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1617
+ mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1519
1618
  sub Main()
1520
1619
  if true Then
1521
1620
  print "works"
@@ -1523,7 +1622,7 @@ describe('BrsFile', () => {
1523
1622
  end sub
1524
1623
  `);
1525
1624
  (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1526
- mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1625
+ mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1527
1626
  sub Main()
1528
1627
  if true THEN
1529
1628
  print "works"
@@ -1534,7 +1633,7 @@ describe('BrsFile', () => {
1534
1633
  });
1535
1634
  });
1536
1635
  it('does not throw when encountering incomplete import statement', () => {
1537
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1636
+ program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1538
1637
  import
1539
1638
  sub main()
1540
1639
  end sub
@@ -2057,7 +2156,7 @@ describe('BrsFile', () => {
2057
2156
  `);
2058
2157
  });
2059
2158
  it('simple mapped files include a reference to the source map', () => {
2060
- let file = program.addOrReplaceFile('source/logger.brs', (0, testHelpers_spec_1.trim) `
2159
+ let file = program.setFile('source/logger.brs', (0, testHelpers_spec_1.trim) `
2061
2160
  sub logInfo()
2062
2161
  end sub
2063
2162
  `);
@@ -2066,7 +2165,7 @@ describe('BrsFile', () => {
2066
2165
  (0, chai_1.expect)(code.endsWith(`'//# sourceMappingURL=./logger.brs.map`)).to.be.true;
2067
2166
  });
2068
2167
  it('AST generated files include a reference to the source map', () => {
2069
- let file = program.addOrReplaceFile('source/logger.brs', (0, testHelpers_spec_1.trim) `
2168
+ let file = program.setFile('source/logger.brs', (0, testHelpers_spec_1.trim) `
2070
2169
  sub logInfo()
2071
2170
  end sub
2072
2171
  `);
@@ -2075,7 +2174,7 @@ describe('BrsFile', () => {
2075
2174
  (0, chai_1.expect)(code.endsWith(`'//# sourceMappingURL=./logger.brs.map`)).to.be.true;
2076
2175
  });
2077
2176
  it('replaces custom types in parameter types and return types', () => {
2078
- program.addOrReplaceFile('source/SomeKlass.bs', `
2177
+ program.setFile('source/SomeKlass.bs', `
2079
2178
  class SomeKlass
2080
2179
  end class
2081
2180
  `);
@@ -2099,7 +2198,7 @@ describe('BrsFile', () => {
2099
2198
  describe('callfunc operator', () => {
2100
2199
  describe('transpile', () => {
2101
2200
  it('does not produce diagnostics', () => {
2102
- program.addOrReplaceFile('source/main.bs', `
2201
+ program.setFile('source/main.bs', `
2103
2202
  sub main()
2104
2203
  someObject@.someFunction(paramObject.value)
2105
2204
  end sub
@@ -2145,7 +2244,7 @@ describe('BrsFile', () => {
2145
2244
  name: 'transform callback',
2146
2245
  afterFileParse: onParsed
2147
2246
  });
2148
- file = program.addOrReplaceFile({ src: `absolute_path/file${ext}`, dest: `relative_path/file${ext}` }, `
2247
+ file = program.setFile({ src: `absolute_path/file${ext}`, dest: `relative_path/file${ext}` }, `
2149
2248
  sub Sum()
2150
2249
  print "hello world"
2151
2250
  end sub
@@ -2166,25 +2265,25 @@ describe('BrsFile', () => {
2166
2265
  });
2167
2266
  describe('typedefKey', () => {
2168
2267
  it('works for .brs files', () => {
2169
- (0, chai_1.expect)((0, util_1.standardizePath)((program.addOrReplaceFile('source/main.brs', '')).typedefKey)).to.equal((0, util_1.standardizePath) `${rootDir.toLowerCase()}/source/main.d.bs`);
2268
+ (0, chai_1.expect)((0, util_1.standardizePath)((program.setFile('source/main.brs', '')).typedefKey)).to.equal((0, util_1.standardizePath) `${rootDir.toLowerCase()}/source/main.d.bs`);
2170
2269
  });
2171
2270
  it('returns undefined for files that should not have a typedef', () => {
2172
- (0, chai_1.expect)((program.addOrReplaceFile('source/main.bs', '')).typedefKey).to.be.undefined;
2173
- (0, chai_1.expect)((program.addOrReplaceFile('source/main.d.bs', '')).typedefKey).to.be.undefined;
2174
- const xmlFile = program.addOrReplaceFile('components/comp.xml', '');
2271
+ (0, chai_1.expect)((program.setFile('source/main.bs', '')).typedefKey).to.be.undefined;
2272
+ (0, chai_1.expect)((program.setFile('source/main.d.bs', '')).typedefKey).to.be.undefined;
2273
+ const xmlFile = program.setFile('components/comp.xml', '');
2175
2274
  (0, chai_1.expect)(xmlFile.typedefKey).to.be.undefined;
2176
2275
  });
2177
2276
  });
2178
2277
  describe('type definitions', () => {
2179
2278
  it('only exposes defined functions even if source has more', () => {
2180
2279
  //parse the .brs file first so it doesn't know about the typedef
2181
- program.addOrReplaceFile('source/main.brs', `
2280
+ program.setFile('source/main.brs', `
2182
2281
  sub main()
2183
2282
  end sub
2184
2283
  sub speak()
2185
2284
  end sub
2186
2285
  `);
2187
- program.addOrReplaceFile('source/main.d.bs', `
2286
+ program.setFile('source/main.d.bs', `
2188
2287
  sub main()
2189
2288
  end sub
2190
2289
  `);
@@ -2194,7 +2293,7 @@ describe('BrsFile', () => {
2194
2293
  (0, chai_1.expect)(functionNames).not.to.include('speak');
2195
2294
  });
2196
2295
  it('reacts to typedef file changes', () => {
2197
- let file = program.addOrReplaceFile('source/main.brs', `
2296
+ let file = program.setFile('source/main.brs', `
2198
2297
  sub main()
2199
2298
  end sub
2200
2299
  sub speak()
@@ -2202,14 +2301,14 @@ describe('BrsFile', () => {
2202
2301
  `);
2203
2302
  (0, chai_1.expect)(file.hasTypedef).to.be.false;
2204
2303
  (0, chai_1.expect)(file.typedefFile).not.to.exist;
2205
- program.addOrReplaceFile('source/main.d.bs', `
2304
+ program.setFile('source/main.d.bs', `
2206
2305
  sub main()
2207
2306
  end sub
2208
2307
  `);
2209
2308
  (0, chai_1.expect)(file.hasTypedef).to.be.true;
2210
2309
  (0, chai_1.expect)(file.typedefFile).to.exist;
2211
2310
  //add replace file, does it still find the typedef
2212
- file = program.addOrReplaceFile('source/main.brs', `
2311
+ file = program.setFile('source/main.brs', `
2213
2312
  sub main()
2214
2313
  end sub
2215
2314
  sub speak()
@@ -2224,36 +2323,36 @@ describe('BrsFile', () => {
2224
2323
  });
2225
2324
  describe('typedef', () => {
2226
2325
  it('sets typedef path properly', () => {
2227
- (0, chai_1.expect)((program.addOrReplaceFile('source/main1.brs', '')).typedefKey).to.equal((0, util_1.standardizePath) `${rootDir}/source/main1.d.bs`.toLowerCase());
2228
- (0, chai_1.expect)((program.addOrReplaceFile('source/main2.d.bs', '')).typedefKey).to.equal(undefined);
2229
- (0, chai_1.expect)((program.addOrReplaceFile('source/main3.bs', '')).typedefKey).to.equal(undefined);
2326
+ (0, chai_1.expect)((program.setFile('source/main1.brs', '')).typedefKey).to.equal((0, util_1.standardizePath) `${rootDir}/source/main1.d.bs`.toLowerCase());
2327
+ (0, chai_1.expect)((program.setFile('source/main2.d.bs', '')).typedefKey).to.equal(undefined);
2328
+ (0, chai_1.expect)((program.setFile('source/main3.bs', '')).typedefKey).to.equal(undefined);
2230
2329
  //works for dest with `.brs` extension
2231
- (0, chai_1.expect)((program.addOrReplaceFile({ src: 'source/main4.bs', dest: 'source/main4.brs' }, '')).typedefKey).to.equal(undefined);
2330
+ (0, chai_1.expect)((program.setFile({ src: 'source/main4.bs', dest: 'source/main4.brs' }, '')).typedefKey).to.equal(undefined);
2232
2331
  });
2233
2332
  it('does not link when missing from program', () => {
2234
- const file = program.addOrReplaceFile('source/main.brs', ``);
2333
+ const file = program.setFile('source/main.brs', ``);
2235
2334
  (0, chai_1.expect)(file.typedefFile).not.to.exist;
2236
2335
  });
2237
2336
  it('links typedef when added BEFORE .brs file', () => {
2238
- const typedef = program.addOrReplaceFile('source/main.d.bs', ``);
2239
- const file = program.addOrReplaceFile('source/main.brs', ``);
2337
+ const typedef = program.setFile('source/main.d.bs', ``);
2338
+ const file = program.setFile('source/main.brs', ``);
2240
2339
  (0, chai_1.expect)(file.typedefFile).to.equal(typedef);
2241
2340
  });
2242
2341
  it('links typedef when added AFTER .brs file', () => {
2243
- const file = program.addOrReplaceFile('source/main.brs', ``);
2244
- const typedef = program.addOrReplaceFile('source/main.d.bs', ``);
2342
+ const file = program.setFile('source/main.brs', ``);
2343
+ const typedef = program.setFile('source/main.d.bs', ``);
2245
2344
  (0, chai_1.expect)(file.typedefFile).to.eql(typedef);
2246
2345
  });
2247
2346
  it('removes typedef link when typedef is removed', () => {
2248
- const typedef = program.addOrReplaceFile('source/main.d.bs', ``);
2249
- const file = program.addOrReplaceFile('source/main.brs', ``);
2347
+ const typedef = program.setFile('source/main.d.bs', ``);
2348
+ const file = program.setFile('source/main.brs', ``);
2250
2349
  program.removeFile(typedef.pathAbsolute);
2251
2350
  (0, chai_1.expect)(file.typedefFile).to.be.undefined;
2252
2351
  });
2253
2352
  });
2254
2353
  describe('getTypedef', () => {
2255
2354
  function testTypedef(original, expected) {
2256
- let file = program.addOrReplaceFile('source/main.brs', original);
2355
+ let file = program.setFile('source/main.brs', original);
2257
2356
  (0, chai_1.expect)(file.getTypedef()).to.eql(expected);
2258
2357
  }
2259
2358
  it('includes namespace on extend class names', () => {
@@ -2504,7 +2603,7 @@ describe('BrsFile', () => {
2504
2603
  });
2505
2604
  describe('parser getter', () => {
2506
2605
  it('recreates the parser when missing', () => {
2507
- const file = program.addOrReplaceFile('source/main.brs', `
2606
+ const file = program.setFile('source/main.brs', `
2508
2607
  sub main()
2509
2608
  end sub
2510
2609
  `);
@@ -2518,11 +2617,11 @@ describe('BrsFile', () => {
2518
2617
  (0, chai_1.expect)(file.parser).to.equal(newParser);
2519
2618
  });
2520
2619
  it('call parse when previously skipped', () => {
2521
- program.addOrReplaceFile('source/main.d.bs', `
2620
+ program.setFile('source/main.d.bs', `'typedef
2522
2621
  sub main()
2523
2622
  end sub
2524
2623
  `);
2525
- const file = program.addOrReplaceFile('source/main.brs', `
2624
+ const file = program.setFile('source/main.brs', `'source
2526
2625
  sub main()
2527
2626
  end sub
2528
2627
  `);