brighterscript 1.0.0-alpha.11 → 1.0.0-alpha.15

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 (228) hide show
  1. package/CHANGELOG.md +253 -268
  2. package/README.md +2 -2
  3. package/dist/Cache.d.ts +3 -8
  4. package/dist/Cache.js +9 -14
  5. package/dist/Cache.js.map +1 -1
  6. package/dist/CommentFlagProcessor.js +5 -3
  7. package/dist/CommentFlagProcessor.js.map +1 -1
  8. package/dist/DiagnosticMessages.d.ts +21 -1
  9. package/dist/DiagnosticMessages.js +21 -1
  10. package/dist/DiagnosticMessages.js.map +1 -1
  11. package/dist/LanguageServer.d.ts +1 -6
  12. package/dist/LanguageServer.js +0 -9
  13. package/dist/LanguageServer.js.map +1 -1
  14. package/dist/PluginInterface.d.ts +3 -3
  15. package/dist/PluginInterface.js +3 -0
  16. package/dist/PluginInterface.js.map +1 -1
  17. package/dist/Program.d.ts +30 -16
  18. package/dist/Program.js +110 -45
  19. package/dist/Program.js.map +1 -1
  20. package/dist/ProgramBuilder.js +3 -3
  21. package/dist/ProgramBuilder.js.map +1 -1
  22. package/dist/Scope.d.ts +31 -17
  23. package/dist/Scope.js +86 -48
  24. package/dist/Scope.js.map +1 -1
  25. package/dist/SymbolTable.d.ts +1 -1
  26. package/dist/XmlScope.d.ts +3 -3
  27. package/dist/astUtils/AstEditor.d.ts +33 -0
  28. package/dist/astUtils/AstEditor.js +107 -0
  29. package/dist/astUtils/AstEditor.js.map +1 -0
  30. package/dist/{bscPlugin/semanticTokens/SemanticTokensProcessor.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
  31. package/dist/astUtils/AstEditor.spec.js +170 -0
  32. package/dist/astUtils/AstEditor.spec.js.map +1 -0
  33. package/dist/astUtils/reflection.d.ts +3 -1
  34. package/dist/astUtils/reflection.js +10 -2
  35. package/dist/astUtils/reflection.js.map +1 -1
  36. package/dist/astUtils/reflection.spec.js +6 -6
  37. package/dist/astUtils/reflection.spec.js.map +1 -1
  38. package/dist/astUtils/visitors.d.ts +3 -1
  39. package/dist/astUtils/visitors.js.map +1 -1
  40. package/dist/astUtils/visitors.spec.js +8 -8
  41. package/dist/astUtils/visitors.spec.js.map +1 -1
  42. package/dist/astUtils/xml.d.ts +1 -0
  43. package/dist/astUtils/xml.js +6 -1
  44. package/dist/astUtils/xml.js.map +1 -1
  45. package/dist/bscPlugin/BscPlugin.d.ts +4 -1
  46. package/dist/bscPlugin/BscPlugin.js +21 -2
  47. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  48. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +3 -3
  49. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  50. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  51. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
  52. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
  53. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  54. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
  55. package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.js → BrsFileSemanticTokensProcessor.spec.js} +30 -2
  56. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  57. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  58. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +36 -0
  59. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  60. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  61. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  62. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  63. package/dist/bscPlugin/validation/ScopeValidator.d.ts +11 -0
  64. package/dist/bscPlugin/validation/ScopeValidator.js +94 -0
  65. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  66. package/dist/files/BrsFile.Class.spec.js +404 -230
  67. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  68. package/dist/files/BrsFile.d.ts +26 -12
  69. package/dist/files/BrsFile.js +265 -127
  70. package/dist/files/BrsFile.js.map +1 -1
  71. package/dist/files/BrsFile.spec.js +586 -169
  72. package/dist/files/BrsFile.spec.js.map +1 -1
  73. package/dist/files/XmlFile.d.ts +11 -10
  74. package/dist/files/XmlFile.js +13 -8
  75. package/dist/files/XmlFile.js.map +1 -1
  76. package/dist/files/XmlFile.spec.js +106 -59
  77. package/dist/files/XmlFile.spec.js.map +1 -1
  78. package/dist/files/tests/imports.spec.js +8 -6
  79. package/dist/files/tests/imports.spec.js.map +1 -1
  80. package/dist/globalCallables.d.ts +3 -1
  81. package/dist/globalCallables.js +198 -99
  82. package/dist/globalCallables.js.map +1 -1
  83. package/dist/index.d.ts +12 -3
  84. package/dist/index.js +21 -4
  85. package/dist/index.js.map +1 -1
  86. package/dist/interfaces.d.ts +68 -15
  87. package/dist/lexer/Lexer.js +1 -2
  88. package/dist/lexer/Lexer.js.map +1 -1
  89. package/dist/lexer/Lexer.spec.js +470 -462
  90. package/dist/lexer/Lexer.spec.js.map +1 -1
  91. package/dist/lexer/TokenKind.d.ts +2 -0
  92. package/dist/lexer/TokenKind.js +5 -0
  93. package/dist/lexer/TokenKind.js.map +1 -1
  94. package/dist/parser/Expression.d.ts +1 -1
  95. package/dist/parser/Expression.js +10 -10
  96. package/dist/parser/Expression.js.map +1 -1
  97. package/dist/parser/Parser.Class.spec.js +33 -32
  98. package/dist/parser/Parser.Class.spec.js.map +1 -1
  99. package/dist/parser/Parser.d.ts +28 -7
  100. package/dist/parser/Parser.js +494 -290
  101. package/dist/parser/Parser.js.map +1 -1
  102. package/dist/parser/Parser.spec.js +157 -35
  103. package/dist/parser/Parser.spec.js.map +1 -1
  104. package/dist/parser/SGParser.js +1 -1
  105. package/dist/parser/SGParser.js.map +1 -1
  106. package/dist/parser/SGTypes.d.ts +3 -0
  107. package/dist/parser/SGTypes.js +8 -3
  108. package/dist/parser/SGTypes.js.map +1 -1
  109. package/dist/parser/SGTypes.spec.js +9 -9
  110. package/dist/parser/SGTypes.spec.js.map +1 -1
  111. package/dist/parser/Statement.d.ts +55 -3
  112. package/dist/parser/Statement.js +162 -9
  113. package/dist/parser/Statement.js.map +1 -1
  114. package/dist/parser/tests/Parser.spec.d.ts +3 -3
  115. package/dist/parser/tests/Parser.spec.js +4 -4
  116. package/dist/parser/tests/Parser.spec.js.map +1 -1
  117. package/dist/parser/tests/controlFlow/For.spec.js +40 -40
  118. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  119. package/dist/parser/tests/controlFlow/ForEach.spec.js +22 -21
  120. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  121. package/dist/parser/tests/controlFlow/If.spec.js +100 -99
  122. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  123. package/dist/parser/tests/controlFlow/While.spec.js +25 -25
  124. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  125. package/dist/parser/tests/expression/Additive.spec.js +21 -21
  126. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  127. package/dist/parser/tests/expression/ArrayLiterals.spec.js +91 -91
  128. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  129. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +102 -102
  130. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  131. package/dist/parser/tests/expression/Boolean.spec.js +15 -15
  132. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  133. package/dist/parser/tests/expression/Call.spec.js +22 -21
  134. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  135. package/dist/parser/tests/expression/Exponential.spec.js +11 -11
  136. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  137. package/dist/parser/tests/expression/Function.spec.js +171 -171
  138. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  139. package/dist/parser/tests/expression/Indexing.spec.js +50 -50
  140. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  141. package/dist/parser/tests/expression/Multiplicative.spec.js +25 -25
  142. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  143. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +30 -18
  144. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  145. package/dist/parser/tests/expression/PrefixUnary.spec.js +26 -26
  146. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  147. package/dist/parser/tests/expression/Primary.spec.js +27 -27
  148. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  149. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +3 -2
  150. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  151. package/dist/parser/tests/expression/Relational.spec.js +25 -25
  152. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  153. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +7 -7
  154. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  155. package/dist/parser/tests/expression/TernaryExpression.spec.js +6 -6
  156. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  157. package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
  158. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  159. package/dist/parser/tests/statement/Declaration.spec.js +20 -20
  160. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  161. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  162. package/dist/parser/tests/statement/Enum.spec.js +774 -0
  163. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  164. package/dist/parser/tests/statement/Function.spec.js +121 -120
  165. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  166. package/dist/parser/tests/statement/Goto.spec.js +9 -8
  167. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  168. package/dist/parser/tests/statement/Increment.spec.js +22 -22
  169. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  170. package/dist/parser/tests/statement/InterfaceStatement.spec.js +12 -0
  171. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  172. package/dist/parser/tests/statement/LibraryStatement.spec.js +7 -7
  173. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  174. package/dist/parser/tests/statement/Misc.spec.js +71 -70
  175. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  176. package/dist/parser/tests/statement/PrintStatement.spec.js +17 -17
  177. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  178. package/dist/parser/tests/statement/ReturnStatement.spec.js +33 -33
  179. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  180. package/dist/parser/tests/statement/Set.spec.js +53 -53
  181. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  182. package/dist/parser/tests/statement/Stop.spec.js +7 -6
  183. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  184. package/dist/preprocessor/Chunk.d.ts +1 -1
  185. package/dist/preprocessor/Preprocessor.d.ts +1 -1
  186. package/dist/preprocessor/Preprocessor.js +7 -7
  187. package/dist/preprocessor/Preprocessor.js.map +1 -1
  188. package/dist/types/ArrayType.d.ts +8 -5
  189. package/dist/types/ArrayType.js +45 -9
  190. package/dist/types/ArrayType.js.map +1 -1
  191. package/dist/types/ArrayType.spec.js +62 -3
  192. package/dist/types/ArrayType.spec.js.map +1 -1
  193. package/dist/types/BscType.d.ts +1 -1
  194. package/dist/types/CustomType.d.ts +1 -1
  195. package/dist/types/CustomType.js +4 -2
  196. package/dist/types/CustomType.js.map +1 -1
  197. package/dist/types/FunctionType.d.ts +5 -5
  198. package/dist/types/FunctionType.js +11 -11
  199. package/dist/types/FunctionType.js.map +1 -1
  200. package/dist/types/FunctionType.spec.js +1 -1
  201. package/dist/types/FunctionType.spec.js.map +1 -1
  202. package/dist/types/LazyType.d.ts +1 -2
  203. package/dist/types/LazyType.js +1 -5
  204. package/dist/types/LazyType.js.map +1 -1
  205. package/dist/types/helpers.js +1 -1
  206. package/dist/types/helpers.js.map +1 -1
  207. package/dist/util.d.ts +25 -9
  208. package/dist/util.js +139 -55
  209. package/dist/util.js.map +1 -1
  210. package/dist/validators/ClassValidator.js +27 -27
  211. package/dist/validators/ClassValidator.js.map +1 -1
  212. package/package.json +4 -3
  213. package/dist/astUtils/index.d.ts +0 -7
  214. package/dist/astUtils/index.js +0 -26
  215. package/dist/astUtils/index.js.map +0 -1
  216. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
  217. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
  218. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
  219. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
  220. package/dist/lexer/index.d.ts +0 -3
  221. package/dist/lexer/index.js +0 -18
  222. package/dist/lexer/index.js.map +0 -1
  223. package/dist/parser/index.d.ts +0 -3
  224. package/dist/parser/index.js +0 -16
  225. package/dist/parser/index.js.map +0 -1
  226. package/dist/preprocessor/index.d.ts +0 -3
  227. package/dist/preprocessor/index.js +0 -16
  228. package/dist/preprocessor/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrsFileSemanticTokensProcessor.spec.js","sourceRoot":"","sources":["../../../src/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAC9B,mFAAoE;AAEpE,2CAAwC;AACxC,6DAA+D;AAC/D,qCAAwD;AAExD,MAAM,OAAO,GAAG,IAAA,sBAAC,EAAA,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC;AAEjD,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC5C,IAAI,OAAgB,CAAC;IACrB,UAAU,CAAC,GAAG,EAAE;QACZ,OAAO,GAAG,IAAI,iBAAO,CAAC;YAClB,OAAO,EAAE,OAAO;SACnB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAU,gBAAgB,EAAE;;;;;;;;;;SAUvD,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAA,wCAAqB,EAAC,OAAO,CAAC,CAAC;QAC/B,IAAA,aAAM,EACF,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAC1C,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBACN,KAAK,EAAE,WAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,EAAE,mDAAkB,CAAC,SAAS;aAC1C,EAAE;gBACC,KAAK,EAAE,WAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,EAAE,mDAAkB,CAAC,SAAS;aAC1C,EAAE;gBACC,KAAK,EAAE,WAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,EAAE,mDAAkB,CAAC,KAAK;aACtC,CAAC,CAAC,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAU,gBAAgB,EAAE;;;;;;;;;;SAUvD,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAA,wCAAqB,EAAC,OAAO,CAAC,CAAC;QAC/B,IAAA,aAAM,EACF,WAAI,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAC5D,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBACN,KAAK,EAAE,WAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,EAAE,mDAAkB,CAAC,SAAS;aAC1C,EAAE;gBACC,KAAK,EAAE,WAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,EAAE,mDAAkB,CAAC,SAAS;aAC1C,EAAE;gBACC,KAAK,EAAE,WAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,EAAE,mDAAkB,CAAC,IAAI;aACrC,EAAE;gBACC,KAAK,EAAE,WAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,EAAE,mDAAkB,CAAC,UAAU;aAC3C,CAAC,CAAC,CAAC;IACR,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BrsFile } from '../../files/BrsFile';
2
+ import type { BeforeFileTranspileEvent } from '../../interfaces';
3
+ export declare class BrsFilePreTranspileProcessor {
4
+ private event;
5
+ constructor(event: BeforeFileTranspileEvent<BrsFile>);
6
+ process(): void;
7
+ private replaceEnumValues;
8
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrsFilePreTranspileProcessor = void 0;
4
+ const Cache_1 = require("../../Cache");
5
+ const util_1 = require("../../util");
6
+ class BrsFilePreTranspileProcessor {
7
+ constructor(event) {
8
+ this.event = event;
9
+ }
10
+ process() {
11
+ this.replaceEnumValues();
12
+ }
13
+ replaceEnumValues() {
14
+ var _a, _b, _c;
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
+ for (const expression of this.event.file.parser.references.expressions) {
18
+ const parts = (_b = util_1.default.getAllDottedGetParts(expression)) === null || _b === void 0 ? void 0 : _b.map(x => x.toLowerCase());
19
+ if (parts) {
20
+ //get the name of the enum member
21
+ const memberName = parts.pop();
22
+ //get the name of the enum (including leading namespace if applicable)
23
+ const enumName = parts.join('.');
24
+ const lowerEnumName = enumName.toLowerCase();
25
+ const theEnum = (_c = enumLookup.get(lowerEnumName)) === null || _c === void 0 ? void 0 : _c.item;
26
+ if (theEnum) {
27
+ const members = membersByEnum.getOrAdd(lowerEnumName, () => theEnum.getMemberValueMap());
28
+ const value = members === null || members === void 0 ? void 0 : members.get(memberName);
29
+ this.event.editor.overrideTranspileResult(expression, value);
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ exports.BrsFilePreTranspileProcessor = BrsFilePreTranspileProcessor;
36
+ //# sourceMappingURL=BrsFilePreTranspileProcessor.js.map
@@ -0,0 +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,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,WAAW,EAAE,CAAC,CAAC;YAC/E,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;AA/BD,oEA+BC"}
@@ -0,0 +1,9 @@
1
+ import type { BrsFile } from '../../files/BrsFile';
2
+ import type { OnFileValidateEvent } from '../../interfaces';
3
+ export declare class BrsFileValidator {
4
+ event: OnFileValidateEvent<BrsFile>;
5
+ constructor(event: OnFileValidateEvent<BrsFile>);
6
+ process(): void;
7
+ validateEnumDeclarations(): void;
8
+ private validateEnumValueTypes;
9
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrsFileValidator = void 0;
4
+ const __1 = require("../..");
5
+ const DiagnosticMessages_1 = require("../../DiagnosticMessages");
6
+ const TokenKind_1 = require("../../lexer/TokenKind");
7
+ class BrsFileValidator {
8
+ constructor(event) {
9
+ this.event = event;
10
+ }
11
+ process() {
12
+ this.validateEnumDeclarations();
13
+ }
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 }));
29
+ }
30
+ else {
31
+ memberNames.add(memberNameLower);
32
+ }
33
+ //Enforce all member values are the same type
34
+ this.validateEnumValueTypes(diagnostics, member, enumValueKind);
35
+ }
36
+ }
37
+ this.event.file.addDiagnostics(diagnostics);
38
+ }
39
+ validateEnumValueTypes(diagnostics, member, enumValueKind) {
40
+ var _a, _b, _c, _d, _e, _f, _g, _h;
41
+ const memberValueKind = (_b = (_a = member.value) === null || _a === void 0 ? void 0 : _a.token) === null || _b === void 0 ? void 0 : _b.kind;
42
+ if (
43
+ //is integer enum, has value, that value type is not integer
44
+ (enumValueKind === TokenKind_1.TokenKind.IntegerLiteral && memberValueKind && memberValueKind !== enumValueKind) ||
45
+ //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 }));
48
+ }
49
+ //is non integer value
50
+ if (enumValueKind !== TokenKind_1.TokenKind.IntegerLiteral) {
51
+ //default value present
52
+ if (memberValueKind) {
53
+ //member value is same as enum
54
+ 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 }));
56
+ }
57
+ //default value missing
58
+ }
59
+ 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 }));
61
+ }
62
+ }
63
+ }
64
+ }
65
+ exports.BrsFileValidator = BrsFileValidator;
66
+ //# sourceMappingURL=BrsFileValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrsFileValidator.js","sourceRoot":"","sources":["../../../src/bscPlugin/validation/BrsFileValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { OnScopeValidateEvent } from '../../interfaces';
2
+ export declare class ScopeValidator {
3
+ private event;
4
+ constructor(event: OnScopeValidateEvent);
5
+ process(): void;
6
+ /**
7
+ * Find all expressions and validate the ones that look like enums
8
+ */
9
+ validateEnumUsage(): void;
10
+ private detectDuplicateEnums;
11
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScopeValidator = void 0;
4
+ const vscode_languageserver_1 = require("vscode-languageserver");
5
+ const vscode_uri_1 = require("vscode-uri");
6
+ const reflection_1 = require("../../astUtils/reflection");
7
+ const Cache_1 = require("../../Cache");
8
+ const DiagnosticMessages_1 = require("../../DiagnosticMessages");
9
+ const util_1 = require("../../util");
10
+ class ScopeValidator {
11
+ constructor(event) {
12
+ this.event = event;
13
+ }
14
+ process() {
15
+ this.validateEnumUsage();
16
+ this.detectDuplicateEnums();
17
+ }
18
+ /**
19
+ * Find all expressions and validate the ones that look like enums
20
+ */
21
+ validateEnumUsage() {
22
+ const diagnostics = [];
23
+ const membersByEnum = new Cache_1.Cache();
24
+ //if there are any enums defined in this scope
25
+ const enumLookup = this.event.scope.getEnumMap();
26
+ //skip enum validation if there are no enums defined in this scope
27
+ if (enumLookup.size === 0) {
28
+ return;
29
+ }
30
+ this.event.scope.enumerateOwnFiles((file) => {
31
+ var _a;
32
+ //skip non-brs files
33
+ if (!(0, reflection_1.isBrsFile)(file)) {
34
+ return;
35
+ }
36
+ for (const expression of file.parser.references.expressions) {
37
+ const parts = util_1.default.getAllDottedGetParts(expression);
38
+ //skip expressions that aren't fully dotted gets
39
+ if (!parts) {
40
+ continue;
41
+ }
42
+ //get the name of the enum member
43
+ const memberName = parts.pop();
44
+ //get the name of the enum (including leading namespace if applicable)
45
+ const enumName = parts.join('.');
46
+ const lowerEnumName = enumName.toLowerCase();
47
+ const theEnum = (_a = enumLookup.get(lowerEnumName)) === null || _a === void 0 ? void 0 : _a.item;
48
+ if (theEnum) {
49
+ const members = membersByEnum.getOrAdd(lowerEnumName, () => theEnum.getMemberValueMap());
50
+ const value = members === null || members === void 0 ? void 0 : members.get(memberName.toLowerCase());
51
+ if (!value) {
52
+ diagnostics.push(Object.assign(Object.assign({ file: file }, DiagnosticMessages_1.DiagnosticMessages.unknownEnumValue(memberName, theEnum.fullName)), { range: expression.name.range, relatedInformation: [{
53
+ message: 'Enum declared here',
54
+ location: vscode_languageserver_1.Location.create(vscode_uri_1.URI.file(file.srcPath).toString(), theEnum.tokens.name.range)
55
+ }] }));
56
+ }
57
+ }
58
+ }
59
+ });
60
+ this.event.scope.addDiagnostics(diagnostics);
61
+ }
62
+ detectDuplicateEnums() {
63
+ const diagnostics = [];
64
+ const enumLocationsByName = new Cache_1.Cache();
65
+ this.event.scope.enumerateBrsFiles((file) => {
66
+ for (const enumStatement of file.parser.references.enumStatements) {
67
+ const fullName = enumStatement.fullName;
68
+ const nameLower = fullName === null || fullName === void 0 ? void 0 : fullName.toLowerCase();
69
+ if ((nameLower === null || nameLower === void 0 ? void 0 : nameLower.length) > 0) {
70
+ enumLocationsByName.getOrAdd(nameLower, () => []).push({
71
+ file: file,
72
+ statement: enumStatement
73
+ });
74
+ }
75
+ }
76
+ });
77
+ //now that we've collected all enum declarations, flag duplicates
78
+ for (const enumLocations of enumLocationsByName.values()) {
79
+ //sort by srcPath to keep the primary enum location consistent
80
+ enumLocations.sort((a, b) => { var _a, _b, _c; return (_b = (_a = a.file) === null || _a === void 0 ? void 0 : _a.srcPath) === null || _b === void 0 ? void 0 : _b.localeCompare((_c = b.file) === null || _c === void 0 ? void 0 : _c.srcPath); });
81
+ const primaryEnum = enumLocations.shift();
82
+ const fullName = primaryEnum.statement.fullName;
83
+ for (const duplicateEnumInfo of enumLocations) {
84
+ diagnostics.push(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateEnumDeclaration(this.event.scope.name, fullName)), { file: duplicateEnumInfo.file, range: duplicateEnumInfo.statement.tokens.name.range, relatedInformation: [{
85
+ message: 'Enum declared here',
86
+ location: vscode_languageserver_1.Location.create(vscode_uri_1.URI.file(primaryEnum.file.srcPath).toString(), primaryEnum.statement.tokens.name.range)
87
+ }] }));
88
+ }
89
+ }
90
+ this.event.scope.addDiagnostics(diagnostics);
91
+ }
92
+ }
93
+ exports.ScopeValidator = ScopeValidator;
94
+ //# sourceMappingURL=ScopeValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScopeValidator.js","sourceRoot":"","sources":["../../../src/bscPlugin/validation/ScopeValidator.ts"],"names":[],"mappings":"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"}