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.
Files changed (126) hide show
  1. package/CHANGELOG.md +108 -1
  2. package/dist/DiagnosticMessages.d.ts +19 -3
  3. package/dist/DiagnosticMessages.js +23 -7
  4. package/dist/DiagnosticMessages.js.map +1 -1
  5. package/dist/LanguageServer.js +74 -20
  6. package/dist/LanguageServer.js.map +1 -1
  7. package/dist/Program.d.ts +7 -5
  8. package/dist/Program.js +84 -49
  9. package/dist/Program.js.map +1 -1
  10. package/dist/ProgramBuilder.js +2 -1
  11. package/dist/ProgramBuilder.js.map +1 -1
  12. package/dist/Scope.d.ts +22 -15
  13. package/dist/Scope.js +108 -122
  14. package/dist/Scope.js.map +1 -1
  15. package/dist/SymbolTable.d.ts +17 -6
  16. package/dist/SymbolTable.js +38 -9
  17. package/dist/SymbolTable.js.map +1 -1
  18. package/dist/XmlScope.js +3 -2
  19. package/dist/XmlScope.js.map +1 -1
  20. package/dist/astUtils/reflection.d.ts +5 -1
  21. package/dist/astUtils/reflection.js +15 -2
  22. package/dist/astUtils/reflection.js.map +1 -1
  23. package/dist/astUtils/visitors.d.ts +2 -1
  24. package/dist/astUtils/visitors.js.map +1 -1
  25. package/dist/bscPlugin/BscPlugin.d.ts +3 -1
  26. package/dist/bscPlugin/BscPlugin.js +8 -0
  27. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  28. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +1 -1
  29. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +11 -5
  30. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  31. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +75 -1
  32. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  33. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +6 -0
  34. package/dist/bscPlugin/completions/CompletionsProcessor.js +53 -0
  35. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
  36. package/dist/bscPlugin/hover/HoverProcessor.d.ts +17 -0
  37. package/dist/bscPlugin/hover/HoverProcessor.js +190 -0
  38. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
  39. package/dist/bscPlugin/hover/HoverProcessor.spec.d.ts +1 -0
  40. package/dist/bscPlugin/hover/HoverProcessor.spec.js +195 -0
  41. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
  42. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +1 -0
  43. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +19 -8
  44. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  45. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +84 -0
  46. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  47. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +7 -1
  48. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +81 -22
  49. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
  50. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +14 -1
  51. package/dist/bscPlugin/validation/BrsFileValidator.js +104 -27
  52. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  53. package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +1 -0
  54. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +48 -0
  55. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -0
  56. package/dist/bscPlugin/validation/ScopeValidator.d.ts +24 -3
  57. package/dist/bscPlugin/validation/ScopeValidator.js +249 -48
  58. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  59. package/dist/cli.js +18 -10
  60. package/dist/cli.js.map +1 -1
  61. package/dist/files/BrsFile.Class.spec.js +51 -38
  62. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  63. package/dist/files/BrsFile.d.ts +21 -10
  64. package/dist/files/BrsFile.js +158 -179
  65. package/dist/files/BrsFile.js.map +1 -1
  66. package/dist/files/BrsFile.spec.js +222 -126
  67. package/dist/files/BrsFile.spec.js.map +1 -1
  68. package/dist/files/XmlFile.d.ts +2 -2
  69. package/dist/files/XmlFile.js +1 -0
  70. package/dist/files/XmlFile.js.map +1 -1
  71. package/dist/files/tests/imports.spec.js +1 -1
  72. package/dist/files/tests/imports.spec.js.map +1 -1
  73. package/dist/files/tests/optionalChaning.spec.js +20 -16
  74. package/dist/files/tests/optionalChaning.spec.js.map +1 -1
  75. package/dist/globalCallables.js +3 -0
  76. package/dist/globalCallables.js.map +1 -1
  77. package/dist/index.d.ts +1 -1
  78. package/dist/index.js +3 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/interfaces.d.ts +65 -3
  81. package/dist/lexer/Lexer.spec.js +7 -0
  82. package/dist/lexer/Lexer.spec.js.map +1 -1
  83. package/dist/lexer/TokenKind.d.ts +1 -0
  84. package/dist/lexer/TokenKind.js +8 -3
  85. package/dist/lexer/TokenKind.js.map +1 -1
  86. package/dist/parser/Expression.d.ts +12 -3
  87. package/dist/parser/Expression.js +16 -4
  88. package/dist/parser/Expression.js.map +1 -1
  89. package/dist/parser/Parser.Class.spec.js +1 -1
  90. package/dist/parser/Parser.d.ts +10 -3
  91. package/dist/parser/Parser.js +107 -47
  92. package/dist/parser/Parser.js.map +1 -1
  93. package/dist/parser/Parser.spec.js +181 -108
  94. package/dist/parser/Parser.spec.js.map +1 -1
  95. package/dist/parser/Statement.d.ts +41 -7
  96. package/dist/parser/Statement.js +84 -11
  97. package/dist/parser/Statement.js.map +1 -1
  98. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +73 -31
  99. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  100. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +148 -47
  101. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  102. package/dist/parser/tests/expression/TernaryExpression.spec.js +219 -37
  103. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  104. package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
  105. package/dist/parser/tests/statement/ConstStatement.spec.js +213 -0
  106. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
  107. package/dist/parser/tests/statement/Enum.spec.js +17 -2
  108. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  109. package/dist/parser/tests/statement/PrintStatement.spec.js +72 -57
  110. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  111. package/dist/preprocessor/Manifest.js +2 -2
  112. package/dist/preprocessor/Manifest.js.map +1 -1
  113. package/dist/preprocessor/Preprocessor.js +10 -6
  114. package/dist/preprocessor/Preprocessor.js.map +1 -1
  115. package/dist/roku-types/data.json +1002 -788
  116. package/dist/roku-types/index.d.ts +64 -239
  117. package/dist/types/DynamicType.d.ts +1 -0
  118. package/dist/types/DynamicType.js +1 -0
  119. package/dist/types/DynamicType.js.map +1 -1
  120. package/dist/util.d.ts +55 -14
  121. package/dist/util.js +131 -25
  122. package/dist/util.js.map +1 -1
  123. package/dist/validators/ClassValidator.d.ts +0 -1
  124. package/dist/validators/ClassValidator.js +15 -26
  125. package/dist/validators/ClassValidator.js.map +1 -1
  126. 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 __1 = require("../..");
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.validateEnumDeclarations();
13
+ this.walk();
14
+ this.flagTopLevelStatements();
13
15
  }
14
- validateEnumDeclarations() {
15
- var _a, _b, _c, _d, _e;
16
- const diagnostics = [];
17
- for (const stmt of this.event.file.parser.references.enumStatements) {
18
- const members = stmt.getMembers();
19
- //the enum data type is based on the first member value
20
- 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;
21
- const memberNames = new Set();
22
- for (const member of members) {
23
- const memberNameLower = (_e = member.name) === null || _e === void 0 ? void 0 : _e.toLowerCase();
24
- /**
25
- * flag duplicate member names
26
- */
27
- if (memberNames.has(memberNameLower)) {
28
- diagnostics.push(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier(member.name)), { file: this.event.file, range: member.range }));
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
- else {
31
- memberNames.add(memberNameLower);
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
- validateEnumValueTypes(diagnostics, member, enumValueKind) {
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, __1.isLiteralExpression)(member.value))) {
47
- 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 }));
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
- diagnostics.push(Object.assign(Object.assign({ file: this.event.file }, 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 }));
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
- diagnostics.push(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 }));
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,6BAA4C;AAC5C,iEAA8D;AAG9D,qDAAkD;AAIlD,MAAa,gBAAgB;IACzB,YACW,KAAmC;QAAnC,UAAK,GAAL,KAAK,CAA8B;IAE9C,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAEM,wBAAwB;;QAC3B,MAAM,WAAW,GAAG,EAAoB,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,uDAAuD;YACvD,MAAM,aAAa,GAAG,MAAA,MAAA,MAAC,MAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,0CAAE,KAA2B,0CAAE,KAAK,0CAAE,IAAI,mCAAI,qBAAS,CAAC,cAAc,CAAC;YACxH,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC1B,MAAM,eAAe,GAAG,MAAA,MAAM,CAAC,IAAI,0CAAE,WAAW,EAAE,CAAC;gBAEnD;;mBAEG;gBACH,IAAI,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;oBAClC,WAAW,CAAC,IAAI,iCACT,uCAAkB,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,KACtD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IACrB,CAAC;iBACN;qBAAM;oBACH,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;iBACpC;gBAED,6CAA6C;gBAC7C,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;aAEnE;SAEJ;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAEO,sBAAsB,CAAC,WAA2B,EAAE,MAA2B,EAAE,aAAwB;;QAC7G,MAAM,eAAe,GAAG,MAAA,MAAC,MAAM,CAAC,KAA2B,0CAAE,KAAK,0CAAE,IAAI,CAAC;QAEzE;QACI,4DAA4D;QAC5D,CAAC,aAAa,KAAK,qBAAS,CAAC,cAAc,IAAI,eAAe,IAAI,eAAe,KAAK,aAAa,CAAC;YACpG,wCAAwC;YACxC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,IAAA,uBAAmB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACtD;YACE,WAAW,CAAC,IAAI,+BACZ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAClB,uCAAkB,CAAC,mBAAmB,CACrC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CACvD,KACD,KAAK,EAAE,MAAA,CAAC,MAAA,MAAM,CAAC,KAAK,mCAAI,MAAM,CAAC,0CAAE,KAAK,IACxC,CAAC;SACN;QAED,sBAAsB;QACtB,IAAI,aAAa,KAAK,qBAAS,CAAC,cAAc,EAAE;YAC5C,uBAAuB;YACvB,IAAI,eAAe,EAAE;gBACjB,8BAA8B;gBAC9B,IAAI,eAAe,KAAK,aAAa,EAAE;oBACnC,WAAW,CAAC,IAAI,+BACZ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAClB,uCAAkB,CAAC,mBAAmB,CACrC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CACvD,KACD,KAAK,EAAE,MAAA,CAAC,MAAA,MAAM,CAAC,KAAK,mCAAI,MAAM,CAAC,0CAAE,KAAK,IACxC,CAAC;iBACN;gBAED,uBAAuB;aAC1B;iBAAM;gBACH,WAAW,CAAC,IAAI,+BACZ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAClB,uCAAkB,CAAC,mBAAmB,CACrC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CACvD,KACD,KAAK,EAAE,MAAA,CAAC,MAAA,MAAM,CAAC,KAAK,mCAAI,MAAM,CAAC,0CAAE,KAAK,IACxC,CAAC;aACN;SACJ;IACL,CAAC;CACJ;AAvFD,4CAuFC"}
1
+ {"version":3,"file":"BrsFileValidator.js","sourceRoot":"","sources":["../../../src/bscPlugin/validation/BrsFileValidator.ts"],"names":[],"mappings":"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"}
@@ -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 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`.
@@ -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
  }