brighterscript 1.0.0-alpha.20 → 1.0.0-alpha.23
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 +134 -0
- package/README.md +6 -3
- package/bsconfig.schema.json +10 -2
- package/dist/BsConfig.d.ts +5 -0
- package/dist/Cache.d.ts +5 -1
- package/dist/Cache.js +6 -0
- package/dist/Cache.js.map +1 -1
- package/dist/DependencyGraph.d.ts +2 -2
- package/dist/DependencyGraph.js +15 -3
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticCollection.d.ts +5 -3
- package/dist/DiagnosticCollection.js +10 -12
- package/dist/DiagnosticCollection.js.map +1 -1
- package/dist/DiagnosticFilterer.js +4 -3
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +6 -1
- package/dist/DiagnosticMessages.js +9 -4
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +48 -25
- package/dist/LanguageServer.js +303 -222
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Program.d.ts +7 -3
- package/dist/Program.js +60 -22
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.js +11 -11
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +41 -15
- package/dist/Scope.js +86 -21
- package/dist/Scope.js.map +1 -1
- package/dist/SymbolTable.js +15 -0
- package/dist/SymbolTable.js.map +1 -1
- package/dist/XmlScope.d.ts +3 -3
- package/dist/astUtils/AstEditor.d.ts +32 -0
- package/dist/astUtils/AstEditor.js +132 -0
- package/dist/astUtils/AstEditor.js.map +1 -1
- package/dist/astUtils/AstEditor.spec.js +118 -34
- package/dist/astUtils/AstEditor.spec.js.map +1 -1
- package/dist/astUtils/creators.d.ts +6 -2
- package/dist/astUtils/creators.js +9 -2
- package/dist/astUtils/creators.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +6 -3
- package/dist/astUtils/reflection.js +18 -8
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +74 -64
- package/dist/astUtils/visitors.js +30 -10
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +95 -3
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +7 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +55 -54
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +205 -17
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +13 -25
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
- package/dist/bscPlugin/validation/ScopeValidator.js +26 -20
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +167 -2
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +8 -0
- package/dist/files/BrsFile.js +48 -30
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +183 -0
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +5 -5
- package/dist/files/XmlFile.js +5 -4
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +18 -2
- package/dist/parser/BrsTranspileState.d.ts +2 -0
- package/dist/parser/BrsTranspileState.js +5 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.js +6 -23
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +8 -4
- package/dist/parser/Parser.js +40 -7
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +51 -7
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/Statement.d.ts +20 -20
- package/dist/parser/Statement.js +108 -90
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.js +39 -6
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +16 -2
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
- package/dist/types/EnumType.d.ts +22 -0
- package/dist/types/EnumType.js +55 -0
- package/dist/types/EnumType.js.map +1 -0
- package/dist/util.d.ts +6 -7
- package/dist/util.js +32 -24
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +4 -0
- package/dist/validators/ClassValidator.js +27 -7
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +11 -11
package/dist/parser/Statement.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.
|
|
3
|
+
exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = exports.Statement = void 0;
|
|
4
4
|
const TokenKind_1 = require("../lexer/TokenKind");
|
|
5
5
|
const Expression_1 = require("./Expression");
|
|
6
6
|
const util_1 = require("../util");
|
|
@@ -12,6 +12,8 @@ const DynamicType_1 = require("../types/DynamicType");
|
|
|
12
12
|
const SymbolTable_1 = require("../SymbolTable");
|
|
13
13
|
const CustomType_1 = require("../types/CustomType");
|
|
14
14
|
const InterfaceType_1 = require("../types/InterfaceType");
|
|
15
|
+
const EnumType_1 = require("../types/EnumType");
|
|
16
|
+
const FunctionType_1 = require("../types/FunctionType");
|
|
15
17
|
/**
|
|
16
18
|
* A BrightScript statement
|
|
17
19
|
*/
|
|
@@ -92,9 +94,7 @@ class Body extends Statement {
|
|
|
92
94
|
}
|
|
93
95
|
walk(visitor, options) {
|
|
94
96
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
95
|
-
|
|
96
|
-
(0, visitors_1.walk)(this.statements, i, visitor, options, this);
|
|
97
|
-
}
|
|
97
|
+
(0, visitors_1.walkArray)(this.statements, visitor, options, this);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
}
|
|
@@ -166,9 +166,7 @@ class Block extends Statement {
|
|
|
166
166
|
}
|
|
167
167
|
walk(visitor, options) {
|
|
168
168
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
169
|
-
|
|
170
|
-
(0, visitors_1.walk)(this.statements, i, visitor, options, this);
|
|
171
|
-
}
|
|
169
|
+
(0, visitors_1.walkArray)(this.statements, visitor, options, this);
|
|
172
170
|
}
|
|
173
171
|
}
|
|
174
172
|
}
|
|
@@ -456,12 +454,8 @@ class PrintStatement extends Statement {
|
|
|
456
454
|
}
|
|
457
455
|
walk(visitor, options) {
|
|
458
456
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
if ((0, reflection_1.isExpression)(this.expressions[i])) {
|
|
462
|
-
(0, visitors_1.walk)(this.expressions, i, visitor, options, this);
|
|
463
|
-
}
|
|
464
|
-
}
|
|
457
|
+
//sometimes we have semicolon Tokens in the expressions list (should probably fix that...), so only walk the actual expressions
|
|
458
|
+
(0, visitors_1.walkArray)(this.expressions, visitor, options, this, (item) => (0, reflection_1.isExpression)(item));
|
|
465
459
|
}
|
|
466
460
|
}
|
|
467
461
|
}
|
|
@@ -496,9 +490,7 @@ class DimStatement extends Statement {
|
|
|
496
490
|
walk(visitor, options) {
|
|
497
491
|
var _a;
|
|
498
492
|
if (((_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) > 0 && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
499
|
-
|
|
500
|
-
(0, visitors_1.walk)(this.dimensions, i, visitor, options, this);
|
|
501
|
-
}
|
|
493
|
+
(0, visitors_1.walkArray)(this.dimensions, visitor, options, this);
|
|
502
494
|
}
|
|
503
495
|
}
|
|
504
496
|
}
|
|
@@ -950,29 +942,9 @@ class InterfaceStatement extends Statement {
|
|
|
950
942
|
}
|
|
951
943
|
else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
|
|
952
944
|
this.fields.push(statement);
|
|
953
|
-
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
/**
|
|
958
|
-
* The name of the interface WITH its leading namespace (if applicable)
|
|
959
|
-
*/
|
|
960
|
-
getName(parseMode) {
|
|
961
|
-
var _a;
|
|
962
|
-
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
963
|
-
if (name) {
|
|
964
|
-
if (this.namespaceName) {
|
|
965
|
-
let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
|
|
966
|
-
return `${namespaceName}.${name}`;
|
|
967
|
-
}
|
|
968
|
-
else {
|
|
969
|
-
return name;
|
|
945
|
+
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
970
946
|
}
|
|
971
947
|
}
|
|
972
|
-
else {
|
|
973
|
-
//return undefined which will allow outside callers to know that this interface doesn't have a name
|
|
974
|
-
return undefined;
|
|
975
|
-
}
|
|
976
948
|
}
|
|
977
949
|
buildSymbolTable(parentIface) {
|
|
978
950
|
var _a, _b;
|
|
@@ -985,7 +957,7 @@ class InterfaceStatement extends Statement {
|
|
|
985
957
|
this.memberTable.addSymbol((_a = statement === null || statement === void 0 ? void 0 : statement.name) === null || _a === void 0 ? void 0 : _a.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
|
|
986
958
|
}
|
|
987
959
|
for (const statement of this.fields) {
|
|
988
|
-
this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.
|
|
960
|
+
this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
|
|
989
961
|
}
|
|
990
962
|
}
|
|
991
963
|
hasParent() {
|
|
@@ -1018,6 +990,26 @@ class InterfaceStatement extends Statement {
|
|
|
1018
990
|
getThisBscType() {
|
|
1019
991
|
return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
1020
992
|
}
|
|
993
|
+
/**
|
|
994
|
+
* The name of the interface WITH its leading namespace (if applicable)
|
|
995
|
+
*/
|
|
996
|
+
getName(parseMode) {
|
|
997
|
+
var _a;
|
|
998
|
+
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
999
|
+
if (name) {
|
|
1000
|
+
if (this.namespaceName) {
|
|
1001
|
+
let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
|
|
1002
|
+
return `${namespaceName}.${name}`;
|
|
1003
|
+
}
|
|
1004
|
+
else {
|
|
1005
|
+
return name;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
else {
|
|
1009
|
+
//return undefined which will allow outside callers to know that this interface doesn't have a name
|
|
1010
|
+
return undefined;
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1021
1013
|
transpile(state) {
|
|
1022
1014
|
//interfaces should completely disappear at runtime
|
|
1023
1015
|
return [];
|
|
@@ -1053,9 +1045,7 @@ class InterfaceStatement extends Statement {
|
|
|
1053
1045
|
}
|
|
1054
1046
|
walk(visitor, options) {
|
|
1055
1047
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1056
|
-
|
|
1057
|
-
(0, visitors_1.walk)(this.body, i, visitor, options, this);
|
|
1058
|
-
}
|
|
1048
|
+
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1059
1049
|
}
|
|
1060
1050
|
}
|
|
1061
1051
|
}
|
|
@@ -1135,11 +1125,11 @@ class ClassStatement extends Statement {
|
|
|
1135
1125
|
this.symbolTable.setParent(currentSymbolTable);
|
|
1136
1126
|
this.range = (_b = util_1.util.createBoundingRange(this.classKeyword, this.name, this.extendsKeyword, this.parentClassName, ...this.body, this.end)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
1137
1127
|
for (let statement of this.body) {
|
|
1138
|
-
if ((0, reflection_1.
|
|
1128
|
+
if ((0, reflection_1.isMethodStatement)(statement)) {
|
|
1139
1129
|
this.methods.push(statement);
|
|
1140
1130
|
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
1141
1131
|
}
|
|
1142
|
-
else if ((0, reflection_1.
|
|
1132
|
+
else if ((0, reflection_1.isFieldStatement)(statement)) {
|
|
1143
1133
|
this.fields.push(statement);
|
|
1144
1134
|
this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
|
|
1145
1135
|
}
|
|
@@ -1167,9 +1157,9 @@ class ClassStatement extends Statement {
|
|
|
1167
1157
|
return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
1168
1158
|
}
|
|
1169
1159
|
getConstructorFunctionType() {
|
|
1170
|
-
var _a;
|
|
1171
|
-
const constructFunc =
|
|
1172
|
-
const constructorFuncType = constructFunc.func.getFunctionType();
|
|
1160
|
+
var _a, _b;
|
|
1161
|
+
const constructFunc = this.getConstructorFunction();
|
|
1162
|
+
const constructorFuncType = (_b = (_a = constructFunc === null || constructFunc === void 0 ? void 0 : constructFunc.func) === null || _a === void 0 ? void 0 : _a.getFunctionType()) !== null && _b !== void 0 ? _b : new FunctionType_1.FunctionType();
|
|
1173
1163
|
constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
|
|
1174
1164
|
constructorFuncType.isNew = true;
|
|
1175
1165
|
return constructorFuncType;
|
|
@@ -1204,7 +1194,6 @@ class ClassStatement extends Statement {
|
|
|
1204
1194
|
}
|
|
1205
1195
|
getTypedef(state) {
|
|
1206
1196
|
var _a, _b;
|
|
1207
|
-
this.ensureConstructorFunctionExists();
|
|
1208
1197
|
const result = [];
|
|
1209
1198
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1210
1199
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
@@ -1216,7 +1205,15 @@ class ClassStatement extends Statement {
|
|
|
1216
1205
|
}
|
|
1217
1206
|
result.push(state.newline);
|
|
1218
1207
|
state.blockDepth++;
|
|
1219
|
-
|
|
1208
|
+
let body = this.body;
|
|
1209
|
+
//inject an empty "new" method if missing
|
|
1210
|
+
if (!this.getConstructorFunction()) {
|
|
1211
|
+
body = [
|
|
1212
|
+
(0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
|
|
1213
|
+
...this.body
|
|
1214
|
+
];
|
|
1215
|
+
}
|
|
1216
|
+
for (const member of body) {
|
|
1220
1217
|
if ((0, reflection_1.isTypedefProvider)(member)) {
|
|
1221
1218
|
result.push(state.indent(), ...member.getTypedef(state), state.newline);
|
|
1222
1219
|
}
|
|
@@ -1244,7 +1241,13 @@ class ClassStatement extends Statement {
|
|
|
1244
1241
|
break;
|
|
1245
1242
|
}
|
|
1246
1243
|
}
|
|
1247
|
-
|
|
1244
|
+
const result = myIndex - 1;
|
|
1245
|
+
if (result >= 0) {
|
|
1246
|
+
return result;
|
|
1247
|
+
}
|
|
1248
|
+
else {
|
|
1249
|
+
return null;
|
|
1250
|
+
}
|
|
1248
1251
|
}
|
|
1249
1252
|
hasParent() {
|
|
1250
1253
|
return !!this.parentClassName;
|
|
@@ -1299,25 +1302,10 @@ class ClassStatement extends Statement {
|
|
|
1299
1302
|
* Get the constructor function for this class (if exists), or undefined if not exist
|
|
1300
1303
|
*/
|
|
1301
1304
|
getConstructorFunction() {
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
return member;
|
|
1307
|
-
}
|
|
1308
|
-
}
|
|
1309
|
-
}
|
|
1310
|
-
getEmptyNewFunction() {
|
|
1311
|
-
return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
|
|
1312
|
-
}
|
|
1313
|
-
/**
|
|
1314
|
-
* Create an empty `new` function if class is missing it (simplifies transpile logic)
|
|
1315
|
-
*/
|
|
1316
|
-
ensureConstructorFunctionExists() {
|
|
1317
|
-
if (!this.getConstructorFunction()) {
|
|
1318
|
-
this.memberMap.new = this.getEmptyNewFunction();
|
|
1319
|
-
this.body = [this.memberMap.new, ...this.body];
|
|
1320
|
-
}
|
|
1305
|
+
return this.body.find((stmt) => {
|
|
1306
|
+
var _a, _b;
|
|
1307
|
+
return ((_b = (_a = stmt === null || stmt === void 0 ? void 0 : stmt.name) === null || _a === void 0 ? void 0 : _a.text) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'new';
|
|
1308
|
+
});
|
|
1321
1309
|
}
|
|
1322
1310
|
/**
|
|
1323
1311
|
* Determine if the specified field was declared in one of the ancestor classes
|
|
@@ -1338,7 +1326,6 @@ class ClassStatement extends Statement {
|
|
|
1338
1326
|
*/
|
|
1339
1327
|
getTranspiledBuilder(state) {
|
|
1340
1328
|
var _a;
|
|
1341
|
-
this.ensureConstructorFunctionExists();
|
|
1342
1329
|
let result = [];
|
|
1343
1330
|
result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
|
|
1344
1331
|
state.blockDepth++;
|
|
@@ -1359,14 +1346,22 @@ class ClassStatement extends Statement {
|
|
|
1359
1346
|
}
|
|
1360
1347
|
result.push(state.newline, state.indent());
|
|
1361
1348
|
let parentClassIndex = this.getParentClassIndex(state);
|
|
1362
|
-
|
|
1349
|
+
let body = this.body;
|
|
1350
|
+
//inject an empty "new" method if missing
|
|
1351
|
+
if (!this.getConstructorFunction()) {
|
|
1352
|
+
body = [
|
|
1353
|
+
(0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
|
|
1354
|
+
...this.body
|
|
1355
|
+
];
|
|
1356
|
+
}
|
|
1357
|
+
for (let statement of body) {
|
|
1363
1358
|
//is field statement
|
|
1364
|
-
if ((0, reflection_1.
|
|
1359
|
+
if ((0, reflection_1.isFieldStatement)(statement)) {
|
|
1365
1360
|
//do nothing with class fields in this situation, they are handled elsewhere
|
|
1366
1361
|
continue;
|
|
1367
1362
|
//methods
|
|
1368
1363
|
}
|
|
1369
|
-
else if ((0, reflection_1.
|
|
1364
|
+
else if ((0, reflection_1.isMethodStatement)(statement)) {
|
|
1370
1365
|
//store overridden parent methods as super{parentIndex}_{methodName}
|
|
1371
1366
|
if (
|
|
1372
1367
|
//is override method
|
|
@@ -1434,18 +1429,32 @@ class ClassStatement extends Statement {
|
|
|
1434
1429
|
}
|
|
1435
1430
|
walk(visitor, options) {
|
|
1436
1431
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1437
|
-
|
|
1438
|
-
(0, visitors_1.walk)(this.body, i, visitor, options, this);
|
|
1439
|
-
}
|
|
1432
|
+
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1440
1433
|
}
|
|
1441
1434
|
}
|
|
1442
1435
|
}
|
|
1443
1436
|
exports.ClassStatement = ClassStatement;
|
|
1444
|
-
|
|
1445
|
-
|
|
1437
|
+
const accessModifiers = [
|
|
1438
|
+
TokenKind_1.TokenKind.Public,
|
|
1439
|
+
TokenKind_1.TokenKind.Protected,
|
|
1440
|
+
TokenKind_1.TokenKind.Private
|
|
1441
|
+
];
|
|
1442
|
+
class MethodStatement extends FunctionStatement {
|
|
1443
|
+
constructor(modifiers, name, func, override) {
|
|
1446
1444
|
super(name, func, undefined);
|
|
1447
|
-
this.accessModifier = accessModifier;
|
|
1448
1445
|
this.override = override;
|
|
1446
|
+
this.modifiers = [];
|
|
1447
|
+
if (modifiers) {
|
|
1448
|
+
if (Array.isArray(modifiers)) {
|
|
1449
|
+
this.modifiers.push(...modifiers);
|
|
1450
|
+
}
|
|
1451
|
+
else {
|
|
1452
|
+
this.modifiers.push(modifiers);
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
get accessModifier() {
|
|
1457
|
+
return this.modifiers.find(x => accessModifiers.includes(x.kind));
|
|
1449
1458
|
}
|
|
1450
1459
|
get range() {
|
|
1451
1460
|
return this.cacheRange();
|
|
@@ -1469,15 +1478,15 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1469
1478
|
const visitor = (0, visitors_1.createVisitor)({
|
|
1470
1479
|
VariableExpression: e => {
|
|
1471
1480
|
if (e.name.text.toLocaleLowerCase() === 'super') {
|
|
1472
|
-
e.name
|
|
1481
|
+
state.editor.setProperty(e.name, 'text', `m.super${parentClassIndex}_new`);
|
|
1473
1482
|
}
|
|
1474
1483
|
},
|
|
1475
1484
|
DottedGetExpression: e => {
|
|
1476
1485
|
const beginningVariable = util_1.util.findBeginningVariableExpression(e);
|
|
1477
1486
|
const lowerName = beginningVariable === null || beginningVariable === void 0 ? void 0 : beginningVariable.getName(Parser_1.ParseMode.BrighterScript).toLowerCase();
|
|
1478
1487
|
if (lowerName === 'super') {
|
|
1479
|
-
beginningVariable.name
|
|
1480
|
-
e.name
|
|
1488
|
+
state.editor.setProperty(beginningVariable.name, 'text', 'm');
|
|
1489
|
+
state.editor.setProperty(e.name, 'text', `super${parentClassIndex}_${e.name.text}`);
|
|
1481
1490
|
}
|
|
1482
1491
|
}
|
|
1483
1492
|
});
|
|
@@ -1522,7 +1531,7 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1522
1531
|
return;
|
|
1523
1532
|
}
|
|
1524
1533
|
//this is a child class, and the first statement isn't a call to super. Inject one
|
|
1525
|
-
|
|
1534
|
+
const superCall = new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
|
|
1526
1535
|
kind: TokenKind_1.TokenKind.Identifier,
|
|
1527
1536
|
text: 'super',
|
|
1528
1537
|
isReserved: false,
|
|
@@ -1540,7 +1549,8 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1540
1549
|
isReserved: false,
|
|
1541
1550
|
range: state.classStatement.name.range,
|
|
1542
1551
|
leadingWhitespace: ''
|
|
1543
|
-
}, [], null))
|
|
1552
|
+
}, [], null));
|
|
1553
|
+
state.editor.arrayUnshift(this.func.body.statements, superCall);
|
|
1544
1554
|
}
|
|
1545
1555
|
/**
|
|
1546
1556
|
* Inject field initializers at the top of the `new` function (after any present `super()` call)
|
|
@@ -1560,7 +1570,7 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1560
1570
|
newStatements.push(new AssignmentStatement(thisQualifiedName, (0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), (0, creators_1.createInvalidLiteral)('invalid', field.name.range), this.func));
|
|
1561
1571
|
}
|
|
1562
1572
|
}
|
|
1563
|
-
this.func.body.statements
|
|
1573
|
+
state.editor.arraySplice(this.func.body.statements, startingIndex, 0, ...newStatements);
|
|
1564
1574
|
}
|
|
1565
1575
|
walk(visitor, options) {
|
|
1566
1576
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
@@ -1568,8 +1578,8 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1568
1578
|
}
|
|
1569
1579
|
}
|
|
1570
1580
|
}
|
|
1571
|
-
exports.
|
|
1572
|
-
class
|
|
1581
|
+
exports.MethodStatement = MethodStatement;
|
|
1582
|
+
class FieldStatement extends Statement {
|
|
1573
1583
|
constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
|
|
1574
1584
|
var _a;
|
|
1575
1585
|
super();
|
|
@@ -1622,7 +1632,7 @@ class ClassFieldStatement extends Statement {
|
|
|
1622
1632
|
}
|
|
1623
1633
|
}
|
|
1624
1634
|
}
|
|
1625
|
-
exports.
|
|
1635
|
+
exports.FieldStatement = FieldStatement;
|
|
1626
1636
|
class TryCatchStatement extends Statement {
|
|
1627
1637
|
constructor(tokens, tryBranch, catchStatement) {
|
|
1628
1638
|
var _a;
|
|
@@ -1717,6 +1727,7 @@ class EnumStatement extends Statement {
|
|
|
1717
1727
|
this.tokens = tokens;
|
|
1718
1728
|
this.body = body;
|
|
1719
1729
|
this.namespaceName = namespaceName;
|
|
1730
|
+
this.symbolTable = new SymbolTable_1.SymbolTable();
|
|
1720
1731
|
this.range = (_a = util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1721
1732
|
this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
|
|
1722
1733
|
}
|
|
@@ -1764,6 +1775,12 @@ class EnumStatement extends Statement {
|
|
|
1764
1775
|
getMemberValue(name) {
|
|
1765
1776
|
return this.getMemberValueMap().get(name.toLowerCase());
|
|
1766
1777
|
}
|
|
1778
|
+
buildSymbolTable() {
|
|
1779
|
+
this.symbolTable.clear();
|
|
1780
|
+
for (const member of this.getMembers()) {
|
|
1781
|
+
this.symbolTable.addSymbol(member === null || member === void 0 ? void 0 : member.name, member === null || member === void 0 ? void 0 : member.range, new EnumType_1.EnumMemberType(this.fullName, member === null || member === void 0 ? void 0 : member.name));
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1767
1784
|
/**
|
|
1768
1785
|
* The name of the enum (without the namespace prefix)
|
|
1769
1786
|
*/
|
|
@@ -1791,6 +1808,9 @@ class EnumStatement extends Statement {
|
|
|
1791
1808
|
return undefined;
|
|
1792
1809
|
}
|
|
1793
1810
|
}
|
|
1811
|
+
getThisBscType() {
|
|
1812
|
+
return new EnumType_1.EnumType(this.fullName, this.symbolTable);
|
|
1813
|
+
}
|
|
1794
1814
|
transpile(state) {
|
|
1795
1815
|
//enum declarations do not exist at runtime, so don't transpile anything...
|
|
1796
1816
|
return [];
|
|
@@ -1815,9 +1835,7 @@ class EnumStatement extends Statement {
|
|
|
1815
1835
|
}
|
|
1816
1836
|
walk(visitor, options) {
|
|
1817
1837
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1818
|
-
|
|
1819
|
-
(0, visitors_1.walk)(this.body, i, visitor, options, this);
|
|
1820
|
-
}
|
|
1838
|
+
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1821
1839
|
}
|
|
1822
1840
|
}
|
|
1823
1841
|
}
|