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.
- package/CHANGELOG.md +29 -0
- package/dist/DiagnosticMessages.d.ts +14 -3
- package/dist/DiagnosticMessages.js +14 -3
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.js +51 -9
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Program.d.ts +8 -4
- package/dist/Program.js +70 -35
- package/dist/Program.js.map +1 -1
- package/dist/Scope.d.ts +24 -9
- package/dist/Scope.js +96 -50
- package/dist/Scope.js.map +1 -1
- package/dist/SymbolTable.d.ts +62 -0
- package/dist/SymbolTable.js +101 -0
- package/dist/SymbolTable.js.map +1 -0
- package/dist/astUtils/reflection.d.ts +2 -1
- package/dist/astUtils/reflection.js +6 -2
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +2 -1
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +3 -1
- package/dist/bscPlugin/BscPlugin.js +8 -0
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +11 -5
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +75 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +6 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.js +45 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.d.ts +13 -0
- package/dist/bscPlugin/hover/HoverProcessor.js +146 -0
- package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.js +167 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +7 -1
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +81 -22
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +5 -1
- package/dist/bscPlugin/validation/BrsFileValidator.js +28 -2
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +18 -3
- package/dist/bscPlugin/validation/ScopeValidator.js +139 -47
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +10 -10
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +14 -9
- package/dist/files/BrsFile.js +121 -142
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +164 -109
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +1 -2
- package/dist/files/XmlFile.js +0 -5
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/tests/imports.spec.js +1 -1
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/files/tests/optionalChaning.spec.js +20 -16
- package/dist/files/tests/optionalChaning.spec.js.map +1 -1
- package/dist/globalCallables.js +3 -0
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +44 -2
- package/dist/lexer/Lexer.spec.js +7 -0
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +1 -0
- package/dist/lexer/TokenKind.js +7 -3
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/Expression.d.ts +4 -1
- package/dist/parser/Expression.js +8 -2
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +1 -1
- package/dist/parser/Parser.d.ts +13 -2
- package/dist/parser/Parser.js +137 -60
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Statement.d.ts +29 -1
- package/dist/parser/Statement.js +66 -4
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +73 -31
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +148 -47
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +219 -37
- package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
- package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
- package/dist/parser/tests/statement/ConstStatement.spec.js +182 -0
- package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +17 -2
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +72 -57
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/types/DynamicType.d.ts +1 -0
- package/dist/types/DynamicType.js +1 -0
- package/dist/types/DynamicType.js.map +1 -1
- package/dist/util.d.ts +37 -6
- package/dist/util.js +90 -6
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.js +4 -6
- package/dist/validators/ClassValidator.js.map +1 -1
- 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
|
|
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
|
|
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.
|
|
15
|
+
if ((0, reflection_1.isBrsFile)(this.event.file)) {
|
|
16
|
+
this.iterateExpressions();
|
|
17
|
+
}
|
|
12
18
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
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":";;;AAAA,
|
|
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
|
|
16
|
+
private onceCache;
|
|
17
|
+
private addDiagnostic;
|
|
17
18
|
/**
|
|
18
|
-
*
|
|
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`.
|