brighterscript 0.52.3 → 0.54.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 (103) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/DiagnosticMessages.d.ts +14 -3
  3. package/dist/DiagnosticMessages.js +14 -3
  4. package/dist/DiagnosticMessages.js.map +1 -1
  5. package/dist/LanguageServer.js +51 -9
  6. package/dist/LanguageServer.js.map +1 -1
  7. package/dist/Program.d.ts +8 -4
  8. package/dist/Program.js +70 -35
  9. package/dist/Program.js.map +1 -1
  10. package/dist/Scope.d.ts +24 -9
  11. package/dist/Scope.js +96 -50
  12. package/dist/Scope.js.map +1 -1
  13. package/dist/SymbolTable.d.ts +62 -0
  14. package/dist/SymbolTable.js +101 -0
  15. package/dist/SymbolTable.js.map +1 -0
  16. package/dist/astUtils/reflection.d.ts +2 -1
  17. package/dist/astUtils/reflection.js +6 -2
  18. package/dist/astUtils/reflection.js.map +1 -1
  19. package/dist/astUtils/visitors.d.ts +2 -1
  20. package/dist/astUtils/visitors.js.map +1 -1
  21. package/dist/bscPlugin/BscPlugin.d.ts +3 -1
  22. package/dist/bscPlugin/BscPlugin.js +8 -0
  23. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  24. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +1 -1
  25. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +11 -5
  26. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  27. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +75 -1
  28. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  29. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +6 -0
  30. package/dist/bscPlugin/completions/CompletionsProcessor.js +45 -0
  31. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
  32. package/dist/bscPlugin/hover/HoverProcessor.d.ts +13 -0
  33. package/dist/bscPlugin/hover/HoverProcessor.js +146 -0
  34. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
  35. package/dist/bscPlugin/hover/HoverProcessor.spec.d.ts +1 -0
  36. package/dist/bscPlugin/hover/HoverProcessor.spec.js +167 -0
  37. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
  38. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +7 -1
  39. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +81 -22
  40. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
  41. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +5 -1
  42. package/dist/bscPlugin/validation/BrsFileValidator.js +28 -2
  43. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  44. package/dist/bscPlugin/validation/ScopeValidator.d.ts +18 -3
  45. package/dist/bscPlugin/validation/ScopeValidator.js +139 -47
  46. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  47. package/dist/files/BrsFile.Class.spec.js +10 -10
  48. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  49. package/dist/files/BrsFile.d.ts +14 -9
  50. package/dist/files/BrsFile.js +121 -142
  51. package/dist/files/BrsFile.js.map +1 -1
  52. package/dist/files/BrsFile.spec.js +164 -109
  53. package/dist/files/BrsFile.spec.js.map +1 -1
  54. package/dist/files/XmlFile.d.ts +1 -2
  55. package/dist/files/XmlFile.js +0 -5
  56. package/dist/files/XmlFile.js.map +1 -1
  57. package/dist/files/tests/imports.spec.js +1 -1
  58. package/dist/files/tests/imports.spec.js.map +1 -1
  59. package/dist/files/tests/optionalChaning.spec.js +20 -16
  60. package/dist/files/tests/optionalChaning.spec.js.map +1 -1
  61. package/dist/globalCallables.js +3 -0
  62. package/dist/globalCallables.js.map +1 -1
  63. package/dist/index.d.ts +1 -1
  64. package/dist/index.js +3 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/interfaces.d.ts +44 -2
  67. package/dist/lexer/Lexer.spec.js +7 -0
  68. package/dist/lexer/Lexer.spec.js.map +1 -1
  69. package/dist/lexer/TokenKind.d.ts +1 -0
  70. package/dist/lexer/TokenKind.js +7 -3
  71. package/dist/lexer/TokenKind.js.map +1 -1
  72. package/dist/parser/Expression.d.ts +4 -1
  73. package/dist/parser/Expression.js +8 -2
  74. package/dist/parser/Expression.js.map +1 -1
  75. package/dist/parser/Parser.Class.spec.js +1 -1
  76. package/dist/parser/Parser.d.ts +13 -2
  77. package/dist/parser/Parser.js +137 -60
  78. package/dist/parser/Parser.js.map +1 -1
  79. package/dist/parser/Statement.d.ts +29 -1
  80. package/dist/parser/Statement.js +66 -4
  81. package/dist/parser/Statement.js.map +1 -1
  82. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +73 -31
  83. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  84. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +148 -47
  85. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  86. package/dist/parser/tests/expression/TernaryExpression.spec.js +219 -37
  87. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  88. package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
  89. package/dist/parser/tests/statement/ConstStatement.spec.js +182 -0
  90. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
  91. package/dist/parser/tests/statement/Enum.spec.js +17 -2
  92. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  93. package/dist/parser/tests/statement/PrintStatement.spec.js +72 -57
  94. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  95. package/dist/types/DynamicType.d.ts +1 -0
  96. package/dist/types/DynamicType.js +1 -0
  97. package/dist/types/DynamicType.js.map +1 -1
  98. package/dist/util.d.ts +37 -6
  99. package/dist/util.js +90 -6
  100. package/dist/util.js.map +1 -1
  101. package/dist/validators/ClassValidator.js +4 -6
  102. package/dist/validators/ClassValidator.js.map +1 -1
  103. package/package.json +1 -1
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const Program_1 = require("../../Program");
5
+ const util_1 = require("../../util");
6
+ const sinon_1 = require("sinon");
7
+ let sinon = (0, sinon_1.createSandbox)();
8
+ let rootDir = (0, util_1.standardizePath) `${process.cwd()}/.tmp/rootDir`;
9
+ const fence = (code) => util_1.default.mdFence(code, 'brightscript');
10
+ describe('HoverProcessor', () => {
11
+ let program;
12
+ beforeEach(() => {
13
+ program = new Program_1.Program({ rootDir: rootDir, sourceMap: true });
14
+ });
15
+ afterEach(() => {
16
+ sinon.restore();
17
+ program.dispose();
18
+ });
19
+ it('does not short-circuit the event since our plugin is the base plugin', () => {
20
+ const mock = sinon.mock();
21
+ program.plugins.add({
22
+ name: 'test-plugin',
23
+ provideHover: mock
24
+ });
25
+ const file = program.setFile('source/main.brs', `
26
+ sub main()
27
+ end sub
28
+ `);
29
+ //get the hover
30
+ program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 20));
31
+ //the onGetHover function from `test-plugin` should always get called because
32
+ //BscPlugin should never short-circuit the event
33
+ (0, chai_1.expect)(mock.called).to.be.true;
34
+ });
35
+ describe('BrsFile', () => {
36
+ it('works for param types', () => {
37
+ const file = program.setFile('source/main.brs', `
38
+ sub DoSomething(name as string)
39
+ name = 1
40
+ sayMyName = function(name as string)
41
+ end function
42
+ end sub
43
+ `);
44
+ //hover over the `name = 1` line
45
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(2, 24))[0];
46
+ (0, chai_1.expect)(hover).to.exist;
47
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(2, 20, 2, 24));
48
+ //hover over the `name` parameter declaration
49
+ hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 34))[0];
50
+ (0, chai_1.expect)(hover).to.exist;
51
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(1, 32, 1, 36));
52
+ });
53
+ //ignore this for now...it's not a huge deal
54
+ it('does not match on keywords or data types', () => {
55
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
56
+ sub Main(name as string)
57
+ end sub
58
+ sub as()
59
+ end sub
60
+ `);
61
+ //hover over the `as`
62
+ (0, chai_1.expect)(program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 31))).to.be.empty;
63
+ //hover over the `string`
64
+ (0, chai_1.expect)(program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 36))).to.be.empty;
65
+ });
66
+ it('finds declared function', () => {
67
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
68
+ function Main(count = 1)
69
+ firstName = "bob"
70
+ age = 21
71
+ shoeSize = 10
72
+ end function
73
+ `);
74
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(1, 28))[0];
75
+ (0, chai_1.expect)(hover).to.exist;
76
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(1, 25, 1, 29));
77
+ (0, chai_1.expect)(hover.contents).to.eql(fence('function Main(count? as dynamic) as dynamic'));
78
+ });
79
+ it('finds variable function hover in same scope', () => {
80
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
81
+ sub Main()
82
+ sayMyName = sub(name as string)
83
+ end sub
84
+
85
+ sayMyName()
86
+ end sub
87
+ `);
88
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(5, 24))[0];
89
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(5, 20, 5, 29));
90
+ (0, chai_1.expect)(hover.contents).to.eql(fence('sub sayMyName(name as string) as void'));
91
+ });
92
+ it('finds function hover in file scope', () => {
93
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
94
+ sub Main()
95
+ sayMyName()
96
+ end sub
97
+
98
+ sub sayMyName()
99
+
100
+ end sub
101
+ `);
102
+ let hover = program.getHover(file.pathAbsolute, util_1.default.createPosition(2, 25))[0];
103
+ (0, chai_1.expect)(hover.range).to.eql(util_1.default.createRange(2, 20, 2, 29));
104
+ (0, chai_1.expect)(hover.contents).to.eql(fence('sub sayMyName() as void'));
105
+ });
106
+ it('finds function hover in scope', () => {
107
+ let rootDir = process.cwd();
108
+ program = new Program_1.Program({
109
+ rootDir: rootDir
110
+ });
111
+ let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
112
+ sub Main()
113
+ sayMyName()
114
+ end sub
115
+ `);
116
+ program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
117
+ sub sayMyName(name as string)
118
+
119
+ end sub
120
+ `);
121
+ let hover = program.getHover(mainFile.pathAbsolute, util_1.default.createPosition(2, 25))[0];
122
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 20, 2, 29));
123
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('sub sayMyName(name as string) as void'));
124
+ });
125
+ it('finds top-level constant value', () => {
126
+ program.setFile('source/main.bs', `
127
+ sub main()
128
+ print SOME_VALUE
129
+ end sub
130
+ const SOME_VALUE = true
131
+ `);
132
+ // print SOM|E_VALUE
133
+ let hover = program.getHover('source/main.bs', util_1.default.createPosition(2, 29))[0];
134
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 26, 2, 36));
135
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('const SOME_VALUE = true'));
136
+ });
137
+ it('finds namespaced constant value', () => {
138
+ program.setFile('source/main.bs', `
139
+ sub main()
140
+ print name.SOME_VALUE
141
+ end sub
142
+ namespace name
143
+ const SOME_VALUE = true
144
+ end namespace
145
+ `);
146
+ // print name.SOM|E_VALUE
147
+ let hover = program.getHover('source/main.bs', util_1.default.createPosition(2, 34))[0];
148
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 31, 2, 41));
149
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('const name.SOME_VALUE = true'));
150
+ });
151
+ it('finds deep namespaced constant value', () => {
152
+ program.setFile('source/main.bs', `
153
+ sub main()
154
+ print name.sp.a.c.e.SOME_VALUE
155
+ end sub
156
+ namespace name.sp.a.c.e
157
+ const SOME_VALUE = true
158
+ end namespace
159
+ `);
160
+ // print name.sp.a.c.e.SOM|E_VALUE
161
+ let hover = program.getHover('source/main.bs', util_1.default.createPosition(2, 43))[0];
162
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.range).to.eql(util_1.default.createRange(2, 40, 2, 50));
163
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.eql(fence('const name.sp.a.c.e.SOME_VALUE = true'));
164
+ });
165
+ });
166
+ });
167
+ //# sourceMappingURL=HoverProcessor.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HoverProcessor.spec.js","sourceRoot":"","sources":["../../../src/bscPlugin/hover/HoverProcessor.spec.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,11 @@ export declare class BrsFilePreTranspileProcessor {
4
4
  private event;
5
5
  constructor(event: BeforeFileTranspileEvent<BrsFile>);
6
6
  process(): void;
7
- private replaceEnumValues;
7
+ private iterateExpressions;
8
+ /**
9
+ * Given a string optionally separated by dots, find an enum related to it.
10
+ * For example, all of these would return the enum: `SomeNamespace.SomeEnum.SomeMember`, SomeEnum.SomeMember, `SomeEnum`
11
+ */
12
+ private getEnumInfo;
13
+ private processExpression;
8
14
  }
@@ -1,38 +1,97 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BrsFilePreTranspileProcessor = void 0;
4
- const Cache_1 = require("../../Cache");
4
+ const creators_1 = require("../../astUtils/creators");
5
+ const reflection_1 = require("../../astUtils/reflection");
6
+ const TokenKind_1 = require("../../lexer/TokenKind");
7
+ const Expression_1 = require("../../parser/Expression");
8
+ const Parser_1 = require("../../parser/Parser");
5
9
  const util_1 = require("../../util");
6
10
  class BrsFilePreTranspileProcessor {
7
11
  constructor(event) {
8
12
  this.event = event;
9
13
  }
10
14
  process() {
11
- this.replaceEnumValues();
15
+ if ((0, reflection_1.isBrsFile)(this.event.file)) {
16
+ this.iterateExpressions();
17
+ }
12
18
  }
13
- replaceEnumValues() {
14
- var _a, _b, _c, _d;
15
- const membersByEnum = new Cache_1.Cache();
16
- const enumLookup = (_a = this.event.file.program.getFirstScopeForFile(this.event.file)) === null || _a === void 0 ? void 0 : _a.getEnumMap();
17
- //skip this logic if current scope has no enums
18
- if (((_b = enumLookup === null || enumLookup === void 0 ? void 0 : enumLookup.size) !== null && _b !== void 0 ? _b : 0) === 0) {
19
- return;
19
+ iterateExpressions() {
20
+ const scope = this.event.program.getFirstScopeForFile(this.event.file);
21
+ for (let expression of this.event.file.parser.references.expressions) {
22
+ if (expression) {
23
+ this.processExpression(expression, scope);
24
+ }
25
+ }
26
+ }
27
+ /**
28
+ * Given a string optionally separated by dots, find an enum related to it.
29
+ * For example, all of these would return the enum: `SomeNamespace.SomeEnum.SomeMember`, SomeEnum.SomeMember, `SomeEnum`
30
+ */
31
+ getEnumInfo(name, containingNamespace, scope) {
32
+ //look for the enum directly
33
+ let result = scope.getEnumFileLink(name, containingNamespace);
34
+ if (result) {
35
+ return {
36
+ enum: result.item
37
+ };
38
+ }
39
+ //assume we've been given the enum.member syntax, so pop the member and try again
40
+ const parts = name.split('.');
41
+ const memberName = parts.pop();
42
+ result = scope.getEnumMap().get(parts.join('.'));
43
+ if (result) {
44
+ const value = result.item.getMemberValue(memberName);
45
+ return {
46
+ enum: result.item,
47
+ value: new Expression_1.LiteralExpression((0, creators_1.createToken)(
48
+ //just use float literal for now...it will transpile properly with any literal value
49
+ value.startsWith('"') ? TokenKind_1.TokenKind.StringLiteral : TokenKind_1.TokenKind.FloatLiteral, value))
50
+ };
20
51
  }
21
- for (const expression of this.event.file.parser.references.expressions) {
22
- const parts = (_c = util_1.default.getAllDottedGetParts(expression)) === null || _c === void 0 ? void 0 : _c.map(x => x.text.toLowerCase());
23
- if (parts) {
24
- //get the name of the enum member
25
- const memberName = parts.pop();
26
- //get the name of the enum (including leading namespace if applicable)
27
- const enumName = parts.join('.');
28
- const lowerEnumName = enumName.toLowerCase();
29
- const theEnum = (_d = enumLookup.get(lowerEnumName)) === null || _d === void 0 ? void 0 : _d.item;
30
- if (theEnum) {
31
- const members = membersByEnum.getOrAdd(lowerEnumName, () => theEnum.getMemberValueMap());
32
- const value = members === null || members === void 0 ? void 0 : members.get(memberName);
33
- this.event.editor.overrideTranspileResult(expression, value);
52
+ }
53
+ processExpression(expression, scope) {
54
+ var _a, _b, _c, _d;
55
+ let containingNamespace = (_a = this.event.file.getNamespaceStatementForPosition(expression.range.start)) === null || _a === void 0 ? void 0 : _a.getName(Parser_1.ParseMode.BrighterScript);
56
+ const parts = util_1.default.splitExpression(expression);
57
+ const processedNames = [];
58
+ for (let i = 0; i < parts.length; i++) {
59
+ const part = parts[i];
60
+ let entityName;
61
+ if ((0, reflection_1.isVariableExpression)(part) || (0, reflection_1.isDottedGetExpression)(part)) {
62
+ processedNames.push((_c = (_b = part === null || part === void 0 ? void 0 : part.name) === null || _b === void 0 ? void 0 : _b.text) === null || _c === void 0 ? void 0 : _c.toLocaleLowerCase());
63
+ entityName = processedNames.join('.');
64
+ }
65
+ else {
66
+ return;
67
+ }
68
+ let value;
69
+ //did we find a const? transpile the value
70
+ let constStatement = (_d = scope.getConstFileLink(entityName, containingNamespace)) === null || _d === void 0 ? void 0 : _d.item;
71
+ if (constStatement) {
72
+ value = constStatement.value;
73
+ }
74
+ else {
75
+ //did we find an enum member? transpile that
76
+ let enumInfo = this.getEnumInfo(entityName, containingNamespace, scope);
77
+ if (enumInfo === null || enumInfo === void 0 ? void 0 : enumInfo.value) {
78
+ value = enumInfo.value;
34
79
  }
35
80
  }
81
+ if (value) {
82
+ //override the transpile for this item.
83
+ this.event.editor.setProperty(part, 'transpile', (state) => {
84
+ if ((0, reflection_1.isLiteralExpression)(value)) {
85
+ return value.transpile(state);
86
+ }
87
+ else {
88
+ //wrap non-literals with parens to prevent on-device compile errors
89
+ return ['(', ...value.transpile(state), ')'];
90
+ }
91
+ });
92
+ //we are finished handling this expression
93
+ return;
94
+ }
36
95
  }
37
96
  }
38
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BrsFilePreTranspileProcessor.js","sourceRoot":"","sources":["../../../src/bscPlugin/transpile/BrsFilePreTranspileProcessor.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AAGpC,qCAA8B;AAE9B,MAAa,4BAA4B;IACrC,YACY,KAAwC;QAAxC,UAAK,GAAL,KAAK,CAAmC;IAEpD,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAEO,iBAAiB;;QACrB,MAAM,aAAa,GAAG,IAAI,aAAK,EAA+B,CAAC;QAE/D,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,0CAAE,UAAU,EAAE,CAAC;QAC/F,+CAA+C;QAC/C,IAAI,CAAC,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,mCAAI,CAAC,CAAC,KAAK,CAAC,EAAE;YAC/B,OAAO;SACV;QACD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE;YACpE,MAAM,KAAK,GAAG,MAAA,cAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACpF,IAAI,KAAK,EAAE;gBACP,iCAAiC;gBACjC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC/B,sEAAsE;gBACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjC,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAA,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,0CAAE,IAAI,CAAC;gBACpD,IAAI,OAAO,EAAE;oBACT,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;oBACzF,MAAM,KAAK,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAC,UAAU,CAAC,CAAC;oBACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;iBAChE;aACJ;SACJ;IACL,CAAC;CACJ;AAnCD,oEAmCC"}
1
+ {"version":3,"file":"BrsFilePreTranspileProcessor.js","sourceRoot":"","sources":["../../../src/bscPlugin/transpile/BrsFilePreTranspileProcessor.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,10 @@ export declare class BrsFileValidator {
4
4
  event: OnFileValidateEvent<BrsFile>;
5
5
  constructor(event: OnFileValidateEvent<BrsFile>);
6
6
  process(): void;
7
- validateEnumDeclarations(): void;
7
+ private validateEnumDeclarations;
8
8
  private validateEnumValueTypes;
9
+ /**
10
+ * Find statements defined at the top level (or inside a namespace body) that are not allowed to be there
11
+ */
12
+ private flagTopLevelStatements;
9
13
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BrsFileValidator = void 0;
4
- const __1 = require("../..");
4
+ const reflection_1 = require("../../astUtils/reflection");
5
5
  const DiagnosticMessages_1 = require("../../DiagnosticMessages");
6
6
  const TokenKind_1 = require("../../lexer/TokenKind");
7
7
  class BrsFileValidator {
@@ -10,6 +10,7 @@ class BrsFileValidator {
10
10
  }
11
11
  process() {
12
12
  this.validateEnumDeclarations();
13
+ this.flagTopLevelStatements();
13
14
  }
14
15
  validateEnumDeclarations() {
15
16
  var _a, _b, _c, _d, _e;
@@ -43,7 +44,7 @@ class BrsFileValidator {
43
44
  //is integer enum, has value, that value type is not integer
44
45
  (enumValueKind === TokenKind_1.TokenKind.IntegerLiteral && memberValueKind && memberValueKind !== enumValueKind) ||
45
46
  //has value, that value is not a literal
46
- (member.value && !(0, __1.isLiteralExpression)(member.value))) {
47
+ (member.value && !(0, reflection_1.isLiteralExpression)(member.value))) {
47
48
  diagnostics.push(Object.assign(Object.assign({ file: this.event.file }, DiagnosticMessages_1.DiagnosticMessages.enumValueMustBeType(enumValueKind.replace(/literal$/i, '').toLowerCase())), { range: (_d = ((_c = member.value) !== null && _c !== void 0 ? _c : member)) === null || _d === void 0 ? void 0 : _d.range }));
48
49
  }
49
50
  //is non integer value
@@ -61,6 +62,31 @@ class BrsFileValidator {
61
62
  }
62
63
  }
63
64
  }
65
+ /**
66
+ * Find statements defined at the top level (or inside a namespace body) that are not allowed to be there
67
+ */
68
+ flagTopLevelStatements() {
69
+ const statements = [...this.event.file.ast.statements];
70
+ while (statements.length > 0) {
71
+ const statement = statements.pop();
72
+ if ((0, reflection_1.isNamespaceStatement)(statement)) {
73
+ statements.push(...statement.body.statements);
74
+ }
75
+ else {
76
+ //only allow these statement types
77
+ if (!(0, reflection_1.isFunctionStatement)(statement) &&
78
+ !(0, reflection_1.isClassStatement)(statement) &&
79
+ !(0, reflection_1.isEnumStatement)(statement) &&
80
+ !(0, reflection_1.isInterfaceStatement)(statement) &&
81
+ !(0, reflection_1.isCommentStatement)(statement) &&
82
+ !(0, reflection_1.isLibraryStatement)(statement) &&
83
+ !(0, reflection_1.isImportStatement)(statement) &&
84
+ !(0, reflection_1.isConstStatement)(statement)) {
85
+ this.event.file.addDiagnostic(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedStatementOutsideFunction()), { range: statement.range }));
86
+ }
87
+ }
88
+ }
89
+ }
64
90
  }
65
91
  exports.BrsFileValidator = BrsFileValidator;
66
92
  //# sourceMappingURL=BrsFileValidator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrsFileValidator.js","sourceRoot":"","sources":["../../../src/bscPlugin/validation/BrsFileValidator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BrsFileValidator.js","sourceRoot":"","sources":["../../../src/bscPlugin/validation/BrsFileValidator.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,26 @@ export declare class ScopeValidator {
13
13
  * for diagnostics where scope isn't important. (i.e. CreateObject validations)
14
14
  */
15
15
  private addDiagnosticOnce;
16
- private cache;
16
+ private onceCache;
17
+ private addDiagnostic;
17
18
  /**
18
- * Find all expressions and validate the ones that look like enums
19
+ * Add a diagnostic (to the first scope) that will have `relatedInformation` for each affected scope
20
+ */
21
+ private addMultiScopeDiagnostic;
22
+ /**
23
+ * Find the closest symbol table for the given position
24
+ */
25
+ private getSymbolTable;
26
+ private multiScopeCache;
27
+ private iterateExpressions;
28
+ /**
29
+ * Given a string optionally separated by dots, find an enum related to it.
30
+ * For example, all of these would return the enum: `SomeNamespace.SomeEnum.SomeMember`, SomeEnum.SomeMember, `SomeEnum`
31
+ */
32
+ private getEnum;
33
+ /**
34
+ * Flag duplicate enums
19
35
  */
20
- validateEnumUsage(event: OnScopeValidateEvent): void;
21
36
  private detectDuplicateEnums;
22
37
  /**
23
38
  * Validate every function call to `CreateObject`.