brighterscript 1.0.0-alpha.23 → 1.0.0-alpha.24
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 +108 -1
- package/dist/DiagnosticMessages.d.ts +19 -3
- package/dist/DiagnosticMessages.js +23 -7
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.js +74 -20
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Program.d.ts +7 -5
- package/dist/Program.js +84 -49
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.js +2 -1
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +22 -15
- package/dist/Scope.js +108 -122
- package/dist/Scope.js.map +1 -1
- package/dist/SymbolTable.d.ts +17 -6
- package/dist/SymbolTable.js +38 -9
- package/dist/SymbolTable.js.map +1 -1
- package/dist/XmlScope.js +3 -2
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +5 -1
- package/dist/astUtils/reflection.js +15 -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 +53 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.d.ts +17 -0
- package/dist/bscPlugin/hover/HoverProcessor.js +190 -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 +195 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +19 -8
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +84 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
- 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 +14 -1
- package/dist/bscPlugin/validation/BrsFileValidator.js +104 -27
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
- package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.spec.js +48 -0
- package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +24 -3
- package/dist/bscPlugin/validation/ScopeValidator.js +249 -48
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
- package/dist/cli.js +18 -10
- package/dist/cli.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +51 -38
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +21 -10
- package/dist/files/BrsFile.js +158 -179
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +222 -126
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +2 -2
- package/dist/files/XmlFile.js +1 -0
- 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 +65 -3
- 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 +8 -3
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/Expression.d.ts +12 -3
- package/dist/parser/Expression.js +16 -4
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +1 -1
- package/dist/parser/Parser.d.ts +10 -3
- package/dist/parser/Parser.js +107 -47
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +181 -108
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/Statement.d.ts +41 -7
- package/dist/parser/Statement.js +84 -11
- 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 +213 -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/preprocessor/Manifest.js +2 -2
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/preprocessor/Preprocessor.js +10 -6
- package/dist/preprocessor/Preprocessor.js.map +1 -1
- package/dist/roku-types/data.json +1002 -788
- package/dist/roku-types/index.d.ts +64 -239
- 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 +55 -14
- package/dist/util.js +131 -25
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +0 -1
- package/dist/validators/ClassValidator.js +15 -26
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +5 -2
|
@@ -1,7 +1,8 @@
|
|
|
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
|
+
const visitors_1 = require("../../astUtils/visitors");
|
|
5
6
|
const DiagnosticMessages_1 = require("../../DiagnosticMessages");
|
|
6
7
|
const TokenKind_1 = require("../../lexer/TokenKind");
|
|
7
8
|
class BrsFileValidator {
|
|
@@ -9,42 +10,93 @@ class BrsFileValidator {
|
|
|
9
10
|
this.event = event;
|
|
10
11
|
}
|
|
11
12
|
process() {
|
|
12
|
-
this.
|
|
13
|
+
this.walk();
|
|
14
|
+
this.flagTopLevelStatements();
|
|
13
15
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Set the parent node on a given AstNode. This handles some edge cases where not every expression is iterated normally,
|
|
18
|
+
* so it will also reach into nested objects to set their parent values as well
|
|
19
|
+
*/
|
|
20
|
+
setParent(node1, parent) {
|
|
21
|
+
const pairs = [[node1, parent]];
|
|
22
|
+
while (pairs.length > 0) {
|
|
23
|
+
const [childNode, parentNode] = pairs.pop();
|
|
24
|
+
//skip this entry if there's already a parent
|
|
25
|
+
if (childNode === null || childNode === void 0 ? void 0 : childNode.parent) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if ((0, reflection_1.isDottedGetExpression)(childNode)) {
|
|
29
|
+
if (!childNode.obj.parent) {
|
|
30
|
+
pairs.push([childNode.obj, childNode]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if ((0, reflection_1.isNamespaceStatement)(childNode)) {
|
|
34
|
+
//namespace names shouldn't be walked, but it needs its parent assigned
|
|
35
|
+
pairs.push([childNode.nameExpression, childNode]);
|
|
36
|
+
}
|
|
37
|
+
else if ((0, reflection_1.isClassStatement)(childNode)) {
|
|
38
|
+
//class extends names don't get walked, but it needs its parent
|
|
39
|
+
if (childNode.parentClassName) {
|
|
40
|
+
pairs.push([childNode.parentClassName, childNode]);
|
|
29
41
|
}
|
|
30
|
-
|
|
31
|
-
|
|
42
|
+
}
|
|
43
|
+
else if ((0, reflection_1.isInterfaceStatement)(childNode)) {
|
|
44
|
+
//class extends names don't get walked, but it needs its parent
|
|
45
|
+
if (childNode.parentInterfaceName) {
|
|
46
|
+
pairs.push([childNode.parentInterfaceName, childNode]);
|
|
32
47
|
}
|
|
33
|
-
//Enforce all member values are the same type
|
|
34
|
-
this.validateEnumValueTypes(diagnostics, member, enumValueKind);
|
|
35
48
|
}
|
|
49
|
+
else if ((0, reflection_1.isNamespacedVariableNameExpression)(childNode)) {
|
|
50
|
+
pairs.push([childNode.expression, childNode]);
|
|
51
|
+
}
|
|
52
|
+
childNode.parent = parentNode;
|
|
36
53
|
}
|
|
37
|
-
this.event.file.addDiagnostics(diagnostics);
|
|
38
54
|
}
|
|
39
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Walk the full AST
|
|
57
|
+
*/
|
|
58
|
+
walk() {
|
|
59
|
+
this.event.file.ast.walk((node, parent) => {
|
|
60
|
+
// link every child with its parent
|
|
61
|
+
this.setParent(node, parent);
|
|
62
|
+
//do some file-based validations
|
|
63
|
+
if ((0, reflection_1.isEnumStatement)(node)) {
|
|
64
|
+
this.validateEnumDeclaration(node);
|
|
65
|
+
}
|
|
66
|
+
}, {
|
|
67
|
+
walkMode: visitors_1.WalkMode.visitAllRecursive
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
validateEnumDeclaration(stmt) {
|
|
71
|
+
var _a, _b, _c, _d, _e;
|
|
72
|
+
const members = stmt.getMembers();
|
|
73
|
+
//the enum data type is based on the first member value
|
|
74
|
+
const enumValueKind = (_d = (_c = (_b = (_a = members.find(x => x.value)) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.token) === null || _c === void 0 ? void 0 : _c.kind) !== null && _d !== void 0 ? _d : TokenKind_1.TokenKind.IntegerLiteral;
|
|
75
|
+
const memberNames = new Set();
|
|
76
|
+
for (const member of members) {
|
|
77
|
+
const memberNameLower = (_e = member.name) === null || _e === void 0 ? void 0 : _e.toLowerCase();
|
|
78
|
+
/**
|
|
79
|
+
* flag duplicate member names
|
|
80
|
+
*/
|
|
81
|
+
if (memberNames.has(memberNameLower)) {
|
|
82
|
+
this.event.file.addDiagnostic(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier(member.name)), { range: member.range }));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
memberNames.add(memberNameLower);
|
|
86
|
+
}
|
|
87
|
+
//Enforce all member values are the same type
|
|
88
|
+
this.validateEnumValueTypes(member, enumValueKind);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
validateEnumValueTypes(member, enumValueKind) {
|
|
40
92
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
41
93
|
const memberValueKind = (_b = (_a = member.value) === null || _a === void 0 ? void 0 : _a.token) === null || _b === void 0 ? void 0 : _b.kind;
|
|
42
94
|
if (
|
|
43
95
|
//is integer enum, has value, that value type is not integer
|
|
44
96
|
(enumValueKind === TokenKind_1.TokenKind.IntegerLiteral && memberValueKind && memberValueKind !== enumValueKind) ||
|
|
45
97
|
//has value, that value is not a literal
|
|
46
|
-
(member.value && !(0,
|
|
47
|
-
|
|
98
|
+
(member.value && !(0, reflection_1.isLiteralExpression)(member.value))) {
|
|
99
|
+
this.event.file.addDiagnostic(Object.assign(Object.assign({}, 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
100
|
}
|
|
49
101
|
//is non integer value
|
|
50
102
|
if (enumValueKind !== TokenKind_1.TokenKind.IntegerLiteral) {
|
|
@@ -52,12 +104,37 @@ class BrsFileValidator {
|
|
|
52
104
|
if (memberValueKind) {
|
|
53
105
|
//member value is same as enum
|
|
54
106
|
if (memberValueKind !== enumValueKind) {
|
|
55
|
-
|
|
107
|
+
this.event.file.addDiagnostic(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.enumValueMustBeType(enumValueKind.replace(/literal$/i, '').toLowerCase())), { range: (_f = ((_e = member.value) !== null && _e !== void 0 ? _e : member)) === null || _f === void 0 ? void 0 : _f.range }));
|
|
56
108
|
}
|
|
57
109
|
//default value missing
|
|
58
110
|
}
|
|
59
111
|
else {
|
|
60
|
-
|
|
112
|
+
this.event.file.addDiagnostic(Object.assign(Object.assign({ file: this.event.file }, DiagnosticMessages_1.DiagnosticMessages.enumValueIsRequired(enumValueKind.replace(/literal$/i, '').toLowerCase())), { range: (_h = ((_g = member.value) !== null && _g !== void 0 ? _g : member)) === null || _h === void 0 ? void 0 : _h.range }));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Find statements defined at the top level (or inside a namespace body) that are not allowed to be there
|
|
118
|
+
*/
|
|
119
|
+
flagTopLevelStatements() {
|
|
120
|
+
const statements = [...this.event.file.ast.statements];
|
|
121
|
+
while (statements.length > 0) {
|
|
122
|
+
const statement = statements.pop();
|
|
123
|
+
if ((0, reflection_1.isNamespaceStatement)(statement)) {
|
|
124
|
+
statements.push(...statement.body.statements);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
//only allow these statement types
|
|
128
|
+
if (!(0, reflection_1.isFunctionStatement)(statement) &&
|
|
129
|
+
!(0, reflection_1.isClassStatement)(statement) &&
|
|
130
|
+
!(0, reflection_1.isEnumStatement)(statement) &&
|
|
131
|
+
!(0, reflection_1.isInterfaceStatement)(statement) &&
|
|
132
|
+
!(0, reflection_1.isCommentStatement)(statement) &&
|
|
133
|
+
!(0, reflection_1.isLibraryStatement)(statement) &&
|
|
134
|
+
!(0, reflection_1.isImportStatement)(statement) &&
|
|
135
|
+
!(0, reflection_1.isConstStatement)(statement)) {
|
|
136
|
+
this.event.file.addDiagnostic(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedStatementOutsideFunction()), { range: statement.range }));
|
|
137
|
+
}
|
|
61
138
|
}
|
|
62
139
|
}
|
|
63
140
|
}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const Program_1 = require("../../Program");
|
|
5
|
+
describe('BrsFileValidator', () => {
|
|
6
|
+
let program;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
program = new Program_1.Program({});
|
|
9
|
+
});
|
|
10
|
+
it('links dotted get expression parents', () => {
|
|
11
|
+
const file = program.setFile('source/main.bs', `
|
|
12
|
+
sub main()
|
|
13
|
+
print {}.beta.charlie
|
|
14
|
+
end sub
|
|
15
|
+
`);
|
|
16
|
+
program.validate();
|
|
17
|
+
const func = file.parser.ast.statements[0];
|
|
18
|
+
const print = func.func.body.statements[0];
|
|
19
|
+
(0, chai_1.expect)(print.parent).to.equal(func.func.body);
|
|
20
|
+
const charlie = print.expressions[0];
|
|
21
|
+
(0, chai_1.expect)(charlie.parent).to.equal(print);
|
|
22
|
+
const beta = charlie.obj;
|
|
23
|
+
(0, chai_1.expect)(beta.parent).to.equal(charlie);
|
|
24
|
+
const aaLiteral = beta.obj;
|
|
25
|
+
(0, chai_1.expect)(aaLiteral.parent).to.equal(beta);
|
|
26
|
+
});
|
|
27
|
+
it('links NamespacedVariableNameExpression dotted get parents', () => {
|
|
28
|
+
const file = program.setFile('source/main.bs', `
|
|
29
|
+
namespace alpha.bravo
|
|
30
|
+
class Delta extends alpha.bravo.Charlie
|
|
31
|
+
end class
|
|
32
|
+
class Charlie
|
|
33
|
+
end class
|
|
34
|
+
end namespace
|
|
35
|
+
`);
|
|
36
|
+
program.validate();
|
|
37
|
+
const namespace = file.parser.ast.statements[0];
|
|
38
|
+
const deltaClass = namespace.body.statements[0];
|
|
39
|
+
(0, chai_1.expect)(deltaClass.parent).to.equal(namespace.body);
|
|
40
|
+
const charlie = deltaClass.parentClassName.expression;
|
|
41
|
+
(0, chai_1.expect)(charlie.parent).to.equal(deltaClass.parentClassName);
|
|
42
|
+
const bravo = charlie.obj;
|
|
43
|
+
(0, chai_1.expect)(bravo.parent).to.equal(charlie);
|
|
44
|
+
const alpha = bravo.obj;
|
|
45
|
+
(0, chai_1.expect)(alpha.parent).to.equal(bravo);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=BrsFileValidator.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BrsFileValidator.spec.js","sourceRoot":"","sources":["../../../src/bscPlugin/validation/BrsFileValidator.spec.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAI9B,2CAAwC;AAExC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,IAAI,OAAgB,CAAC;IACrB,UAAU,CAAC,GAAG,EAAE;QACZ,OAAO,GAAG,IAAI,iBAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAU,gBAAgB,EAAE;;;;SAIvD,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,IAAI,GAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAuB,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAmB,CAAC;QAC7D,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAwB,CAAC;QAC5D,IAAA,aAAM,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,GAA0B,CAAC;QAChD,IAAA,aAAM,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAA0B,CAAC;QAClD,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAU,gBAAgB,EAAE;;;;;;;SAOvD,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,SAAS,GAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAwB,CAAC;QACxE,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAmB,CAAC;QAClE,IAAA,aAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAI,UAAU,CAAC,eAAe,CAAC,UAAkC,CAAC;QAC/E,IAAA,aAAM,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAE5D,MAAM,KAAK,GAAG,OAAO,CAAC,GAA0B,CAAC;QACjD,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvC,MAAM,KAAK,GAAG,KAAK,CAAC,GAA0B,CAAC;QAC/C,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -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`.
|
|
@@ -26,4 +41,10 @@ export declare class ScopeValidator {
|
|
|
26
41
|
* do this manually for now.
|
|
27
42
|
*/
|
|
28
43
|
protected validateCreateObjectCalls(event: OnScopeValidateEvent): void;
|
|
44
|
+
protected detectInvalidFunctionCalls(event: OnScopeValidateEvent): void;
|
|
45
|
+
/**
|
|
46
|
+
* Find functions with either the wrong type of parameters, or the wrong number of parameters
|
|
47
|
+
*/
|
|
48
|
+
private detectInvalidFunctionCallsForFile;
|
|
49
|
+
private getMismatchParamCountDiagnostic;
|
|
29
50
|
}
|