brighterscript 1.0.0-alpha.16 → 1.0.0-alpha.19
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 +72 -1
- package/README.md +30 -9
- package/dist/BsConfig.d.ts +4 -0
- package/dist/DiagnosticMessages.d.ts +16 -1
- package/dist/DiagnosticMessages.js +15 -0
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/Logger.js +5 -5
- package/dist/Logger.js.map +1 -1
- package/dist/Program.d.ts +2 -2
- package/dist/Program.js +3 -3
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +4 -0
- package/dist/ProgramBuilder.js +14 -4
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +58 -8
- package/dist/Scope.js +141 -25
- package/dist/Scope.js.map +1 -1
- package/dist/XmlScope.js +1 -1
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/creators.d.ts +3 -3
- package/dist/astUtils/creators.js +8 -8
- package/dist/astUtils/creators.js.map +1 -1
- package/dist/astUtils/creators.spec.js +10 -0
- package/dist/astUtils/creators.spec.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +8 -5
- package/dist/astUtils/reflection.js +18 -6
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +10 -0
- package/dist/astUtils/reflection.spec.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +4 -1
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +2 -0
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +2 -2
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +7 -3
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
- package/dist/{types/FunctionType.spec.d.ts → bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts} +0 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
- package/dist/cli.js +9 -2
- package/dist/cli.js.map +1 -1
- package/dist/examples/plugins/removePrint.js +12 -14
- package/dist/examples/plugins/removePrint.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +3 -3
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +2 -2
- package/dist/files/BrsFile.js +89 -59
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +187 -67
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/globalCallables.js +79 -79
- package/dist/globalCallables.js.map +1 -1
- package/dist/interfaces.d.ts +43 -4
- package/dist/parser/Expression.d.ts +75 -8
- package/dist/parser/Expression.js +147 -22
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +6 -6
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +3 -6
- package/dist/parser/Parser.js +145 -142
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +61 -6
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +2 -2
- package/dist/parser/SGTypes.js +2 -2
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/Statement.d.ts +63 -43
- package/dist/parser/Statement.js +135 -92
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +181 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/TryCatch.spec.js +7 -5
- package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
- package/dist/types/ArrayType.js +4 -1
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +3 -1
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/BooleanType.d.ts +4 -2
- package/dist/types/BooleanType.js +7 -2
- package/dist/types/BooleanType.js.map +1 -1
- package/dist/types/BooleanType.spec.js +3 -1
- package/dist/types/BooleanType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +1 -0
- package/dist/types/BscType.js +16 -1
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/CustomType.js +10 -0
- package/dist/types/CustomType.js.map +1 -1
- package/dist/types/DoubleType.d.ts +2 -0
- package/dist/types/DoubleType.js +7 -2
- package/dist/types/DoubleType.js.map +1 -1
- package/dist/types/DoubleType.spec.js +3 -1
- package/dist/types/DoubleType.spec.js.map +1 -1
- package/dist/types/DynamicType.d.ts +2 -0
- package/dist/types/DynamicType.js +5 -1
- package/dist/types/DynamicType.js.map +1 -1
- package/dist/types/FloatType.d.ts +3 -1
- package/dist/types/FloatType.js +7 -2
- package/dist/types/FloatType.js.map +1 -1
- package/dist/types/FloatType.spec.js +2 -0
- package/dist/types/FloatType.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +3 -22
- package/dist/types/FunctionType.js +8 -68
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/IntegerType.d.ts +3 -1
- package/dist/types/IntegerType.js +7 -2
- package/dist/types/IntegerType.js.map +1 -1
- package/dist/types/IntegerType.spec.js +3 -1
- package/dist/types/IntegerType.spec.js.map +1 -1
- package/dist/types/InterfaceType.d.ts +13 -10
- package/dist/types/InterfaceType.js +33 -29
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/InterfaceType.spec.js +36 -16
- package/dist/types/InterfaceType.spec.js.map +1 -1
- package/dist/types/InvalidType.d.ts +4 -2
- package/dist/types/InvalidType.js +7 -2
- package/dist/types/InvalidType.js.map +1 -1
- package/dist/types/InvalidType.spec.js +2 -0
- package/dist/types/InvalidType.spec.js.map +1 -1
- package/dist/types/LazyType.js +4 -0
- package/dist/types/LazyType.js.map +1 -1
- package/dist/types/LongIntegerType.d.ts +3 -1
- package/dist/types/LongIntegerType.js +7 -2
- package/dist/types/LongIntegerType.js.map +1 -1
- package/dist/types/LongIntegerType.spec.js +2 -0
- package/dist/types/LongIntegerType.spec.js.map +1 -1
- package/dist/types/ObjectType.d.ts +2 -1
- package/dist/types/ObjectType.js +4 -2
- package/dist/types/ObjectType.js.map +1 -1
- package/dist/types/StringType.d.ts +4 -2
- package/dist/types/StringType.js +7 -2
- package/dist/types/StringType.js.map +1 -1
- package/dist/types/StringType.spec.js +2 -0
- package/dist/types/StringType.spec.js.map +1 -1
- package/dist/types/TypedFunctionType.d.ts +28 -0
- package/dist/types/TypedFunctionType.js +88 -0
- package/dist/types/TypedFunctionType.js.map +1 -0
- package/dist/types/TypedFunctionType.spec.d.ts +1 -0
- package/dist/types/TypedFunctionType.spec.js +37 -0
- package/dist/types/TypedFunctionType.spec.js.map +1 -0
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/VoidType.d.ts +4 -2
- package/dist/types/VoidType.js +5 -1
- package/dist/types/VoidType.js.map +1 -1
- package/dist/types/helpers.js +7 -2
- package/dist/types/helpers.js.map +1 -1
- package/dist/util.d.ts +6 -7
- package/dist/util.js +43 -55
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +14 -1
- package/dist/validators/ClassValidator.js +129 -82
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +3 -2
- package/dist/types/FunctionType.spec.js +0 -35
- package/dist/types/FunctionType.spec.js.map +0 -1
- package/dist/types/UniversalFunctionType.d.ts +0 -9
- package/dist/types/UniversalFunctionType.js +0 -25
- package/dist/types/UniversalFunctionType.js.map +0 -1
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.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = 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;
|
|
3
|
+
exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = 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");
|
|
@@ -11,6 +11,7 @@ const creators_1 = require("../astUtils/creators");
|
|
|
11
11
|
const DynamicType_1 = require("../types/DynamicType");
|
|
12
12
|
const SymbolTable_1 = require("../SymbolTable");
|
|
13
13
|
const CustomType_1 = require("../types/CustomType");
|
|
14
|
+
const InterfaceType_1 = require("../types/InterfaceType");
|
|
14
15
|
/**
|
|
15
16
|
* A BrightScript statement
|
|
16
17
|
*/
|
|
@@ -326,14 +327,11 @@ class IfStatement extends Statement {
|
|
|
326
327
|
results.push(' ');
|
|
327
328
|
//conditions
|
|
328
329
|
results.push(...this.condition.transpile(state));
|
|
329
|
-
results.push(' ');
|
|
330
330
|
//then
|
|
331
331
|
if (this.tokens.then) {
|
|
332
|
+
results.push(' ');
|
|
332
333
|
results.push(state.transpileToken(this.tokens.then));
|
|
333
334
|
}
|
|
334
|
-
else {
|
|
335
|
-
results.push('then');
|
|
336
|
-
}
|
|
337
335
|
state.lineage.unshift(this);
|
|
338
336
|
//if statement body
|
|
339
337
|
let thenNodes = this.thenBranch.transpile(state);
|
|
@@ -354,7 +352,8 @@ class IfStatement extends Statement {
|
|
|
354
352
|
let body = this.elseBranch.transpile(state);
|
|
355
353
|
state.lineage.shift();
|
|
356
354
|
if (body.length > 0) {
|
|
357
|
-
|
|
355
|
+
//zero or more spaces between the `else` and the `if`
|
|
356
|
+
results.push(this.elseBranch.tokens.if.leadingWhitespace);
|
|
358
357
|
results.push(...body);
|
|
359
358
|
// stop here because chained if will transpile the rest
|
|
360
359
|
return results;
|
|
@@ -928,28 +927,37 @@ class ImportStatement extends Statement {
|
|
|
928
927
|
exports.ImportStatement = ImportStatement;
|
|
929
928
|
class InterfaceStatement extends Statement {
|
|
930
929
|
constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
|
|
931
|
-
var _a;
|
|
930
|
+
var _a, _b, _c;
|
|
932
931
|
super();
|
|
932
|
+
this.name = name;
|
|
933
933
|
this.parentInterfaceName = parentInterfaceName;
|
|
934
934
|
this.body = body;
|
|
935
935
|
this.namespaceName = namespaceName;
|
|
936
|
+
this.memberTable = new SymbolTable_1.SymbolTable();
|
|
936
937
|
this.tokens = {};
|
|
938
|
+
this.memberMap = {};
|
|
939
|
+
this.methods = [];
|
|
940
|
+
this.fields = [];
|
|
937
941
|
this.tokens.interface = interfaceToken;
|
|
938
942
|
this.tokens.name = name;
|
|
939
943
|
this.tokens.extends = extendsToken;
|
|
940
944
|
this.tokens.endInterface = endInterfaceToken;
|
|
941
945
|
this.range = (_a = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
946
|
+
for (let statement of this.body) {
|
|
947
|
+
if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
|
|
948
|
+
this.methods.push(statement);
|
|
949
|
+
this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
|
|
950
|
+
}
|
|
951
|
+
else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
|
|
952
|
+
this.fields.push(statement);
|
|
953
|
+
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
948
956
|
}
|
|
949
957
|
/**
|
|
950
958
|
* The name of the interface WITH its leading namespace (if applicable)
|
|
951
959
|
*/
|
|
952
|
-
|
|
960
|
+
getName(parseMode) {
|
|
953
961
|
var _a;
|
|
954
962
|
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
955
963
|
if (name) {
|
|
@@ -966,12 +974,49 @@ class InterfaceStatement extends Statement {
|
|
|
966
974
|
return undefined;
|
|
967
975
|
}
|
|
968
976
|
}
|
|
977
|
+
buildSymbolTable(parentIface) {
|
|
978
|
+
var _a, _b;
|
|
979
|
+
this.memberTable.clear();
|
|
980
|
+
if (parentIface) {
|
|
981
|
+
this.memberTable.setParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
|
|
982
|
+
}
|
|
983
|
+
for (const statement of this.methods) {
|
|
984
|
+
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
|
|
985
|
+
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
|
+
}
|
|
987
|
+
for (const statement of this.fields) {
|
|
988
|
+
this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
hasParent() {
|
|
992
|
+
return !!this.parentInterfaceName;
|
|
993
|
+
}
|
|
994
|
+
getParentName() {
|
|
995
|
+
return !!this.parentInterfaceName;
|
|
996
|
+
}
|
|
969
997
|
/**
|
|
970
|
-
*
|
|
998
|
+
* Gets an array of possible parent interface names, taking into account the namespace this interface was created under
|
|
999
|
+
* @returns array of possible parent interface names
|
|
971
1000
|
*/
|
|
972
|
-
|
|
1001
|
+
getPossibleFullParentNames() {
|
|
973
1002
|
var _a;
|
|
974
|
-
|
|
1003
|
+
if (!this.hasParent()) {
|
|
1004
|
+
return [];
|
|
1005
|
+
}
|
|
1006
|
+
if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
1007
|
+
// The specified parent interface already has a dot, so it must already reference a namespace
|
|
1008
|
+
return [this.parentInterfaceName.getName()];
|
|
1009
|
+
}
|
|
1010
|
+
const names = [];
|
|
1011
|
+
if (this.namespaceName) {
|
|
1012
|
+
// We're under a namespace, so the full parent name MIGHT be with this namespace too
|
|
1013
|
+
names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
|
|
1014
|
+
}
|
|
1015
|
+
names.push(this.parentInterfaceName.getName());
|
|
1016
|
+
return names;
|
|
1017
|
+
}
|
|
1018
|
+
getThisBscType() {
|
|
1019
|
+
return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
975
1020
|
}
|
|
976
1021
|
transpile(state) {
|
|
977
1022
|
//interfaces should completely disappear at runtime
|
|
@@ -1016,84 +1061,53 @@ class InterfaceStatement extends Statement {
|
|
|
1016
1061
|
}
|
|
1017
1062
|
exports.InterfaceStatement = InterfaceStatement;
|
|
1018
1063
|
class InterfaceFieldStatement extends Statement {
|
|
1019
|
-
constructor(nameToken, asToken,
|
|
1064
|
+
constructor(nameToken, asToken, type, namespaceName) {
|
|
1020
1065
|
var _a;
|
|
1021
1066
|
super();
|
|
1022
1067
|
this.type = type;
|
|
1068
|
+
this.namespaceName = namespaceName;
|
|
1023
1069
|
this.tokens = {};
|
|
1024
1070
|
this.tokens.name = nameToken;
|
|
1025
1071
|
this.tokens.as = asToken;
|
|
1026
|
-
this.tokens.type
|
|
1027
|
-
this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.tokens.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1072
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1028
1073
|
}
|
|
1029
1074
|
transpile(state) {
|
|
1030
1075
|
throw new Error('Method not implemented.');
|
|
1031
1076
|
}
|
|
1077
|
+
getType() {
|
|
1078
|
+
var _a;
|
|
1079
|
+
return (_a = this.type) === null || _a === void 0 ? void 0 : _a.type;
|
|
1080
|
+
}
|
|
1032
1081
|
get name() {
|
|
1033
|
-
return this.tokens.name
|
|
1082
|
+
return this.tokens.name;
|
|
1034
1083
|
}
|
|
1035
1084
|
walk(visitor, options) {
|
|
1036
1085
|
//nothing to walk
|
|
1037
1086
|
}
|
|
1038
1087
|
getTypedef(state) {
|
|
1039
|
-
var _a
|
|
1088
|
+
var _a;
|
|
1040
1089
|
const result = [];
|
|
1041
1090
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1042
1091
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1043
1092
|
}
|
|
1044
1093
|
result.push(this.tokens.name.text);
|
|
1045
|
-
if (
|
|
1046
|
-
result.push(' as ', this.
|
|
1094
|
+
if (this.tokens.as && this.type) {
|
|
1095
|
+
result.push(' as ', ...this.type.transpile(state));
|
|
1047
1096
|
}
|
|
1048
1097
|
return result;
|
|
1049
1098
|
}
|
|
1050
1099
|
}
|
|
1051
1100
|
exports.InterfaceFieldStatement = InterfaceFieldStatement;
|
|
1052
|
-
class InterfaceMethodStatement extends
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
this.tokens = {};
|
|
1059
|
-
this.tokens.functionType = functionTypeToken;
|
|
1060
|
-
this.tokens.name = nameToken;
|
|
1061
|
-
this.tokens.leftParen = leftParen;
|
|
1062
|
-
this.tokens.rightParen = rightParen;
|
|
1063
|
-
this.tokens.as = asToken;
|
|
1064
|
-
this.tokens.returnType = returnTypeToken;
|
|
1065
|
-
this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.tokens.leftParen, ...this.params, this.tokens.rightParen, this.tokens.as, this.tokens.returnType)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1101
|
+
class InterfaceMethodStatement extends FunctionStatement {
|
|
1102
|
+
transpile(state) {
|
|
1103
|
+
throw new Error('Method not implemented.');
|
|
1104
|
+
}
|
|
1105
|
+
constructor(name, func) {
|
|
1106
|
+
super(name, func, undefined);
|
|
1066
1107
|
}
|
|
1067
1108
|
walk(visitor, options) {
|
|
1068
1109
|
//nothing to walk
|
|
1069
1110
|
}
|
|
1070
|
-
getTypedef(state) {
|
|
1071
|
-
var _a, _b, _c, _d, _e;
|
|
1072
|
-
const result = [];
|
|
1073
|
-
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1074
|
-
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1075
|
-
}
|
|
1076
|
-
result.push(this.tokens.functionType.text, ' ', this.tokens.name.text, '(');
|
|
1077
|
-
const params = (_b = this.params) !== null && _b !== void 0 ? _b : [];
|
|
1078
|
-
for (let i = 0; i < params.length; i++) {
|
|
1079
|
-
if (i > 0) {
|
|
1080
|
-
result.push(', ');
|
|
1081
|
-
}
|
|
1082
|
-
const param = params[i];
|
|
1083
|
-
result.push(param.name.text);
|
|
1084
|
-
if (((_d = (_c = param.typeToken) === null || _c === void 0 ? void 0 : _c.text) === null || _d === void 0 ? void 0 : _d.length) > 0) {
|
|
1085
|
-
result.push(' as ', param.typeToken.text);
|
|
1086
|
-
}
|
|
1087
|
-
}
|
|
1088
|
-
result.push(')');
|
|
1089
|
-
if (((_e = this.tokens.returnType) === null || _e === void 0 ? void 0 : _e.text.length) > 0) {
|
|
1090
|
-
result.push(' as ', this.tokens.returnType.text);
|
|
1091
|
-
}
|
|
1092
|
-
return result;
|
|
1093
|
-
}
|
|
1094
|
-
transpile(state) {
|
|
1095
|
-
throw new Error('Method not implemented.');
|
|
1096
|
-
}
|
|
1097
1111
|
}
|
|
1098
1112
|
exports.InterfaceMethodStatement = InterfaceMethodStatement;
|
|
1099
1113
|
class ClassStatement extends Statement {
|
|
@@ -1149,7 +1163,7 @@ class ClassStatement extends Statement {
|
|
|
1149
1163
|
return undefined;
|
|
1150
1164
|
}
|
|
1151
1165
|
}
|
|
1152
|
-
|
|
1166
|
+
getThisBscType() {
|
|
1153
1167
|
return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
1154
1168
|
}
|
|
1155
1169
|
getConstructorFunctionType() {
|
|
@@ -1163,9 +1177,9 @@ class ClassStatement extends Statement {
|
|
|
1163
1177
|
buildSymbolTable(parentClass) {
|
|
1164
1178
|
var _a, _b, _c, _d, _e;
|
|
1165
1179
|
this.symbolTable.clear();
|
|
1166
|
-
this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.
|
|
1180
|
+
this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
|
|
1167
1181
|
this.memberTable.clear();
|
|
1168
|
-
if (parentClass) {
|
|
1182
|
+
if ((0, reflection_1.isClassStatement)(parentClass)) {
|
|
1169
1183
|
this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
|
|
1170
1184
|
this.memberTable.setParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
|
|
1171
1185
|
}
|
|
@@ -1190,6 +1204,7 @@ class ClassStatement extends Statement {
|
|
|
1190
1204
|
}
|
|
1191
1205
|
getTypedef(state) {
|
|
1192
1206
|
var _a, _b;
|
|
1207
|
+
this.ensureConstructorFunctionExists();
|
|
1193
1208
|
const result = [];
|
|
1194
1209
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1195
1210
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
@@ -1231,7 +1246,7 @@ class ClassStatement extends Statement {
|
|
|
1231
1246
|
}
|
|
1232
1247
|
return myIndex - 1;
|
|
1233
1248
|
}
|
|
1234
|
-
|
|
1249
|
+
hasParent() {
|
|
1235
1250
|
return !!this.parentClassName;
|
|
1236
1251
|
}
|
|
1237
1252
|
/**
|
|
@@ -1240,7 +1255,7 @@ class ClassStatement extends Statement {
|
|
|
1240
1255
|
*/
|
|
1241
1256
|
getPossibleFullParentNames() {
|
|
1242
1257
|
var _a;
|
|
1243
|
-
if (!this.
|
|
1258
|
+
if (!this.hasParent()) {
|
|
1244
1259
|
return [];
|
|
1245
1260
|
}
|
|
1246
1261
|
if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
@@ -1295,6 +1310,15 @@ class ClassStatement extends Statement {
|
|
|
1295
1310
|
getEmptyNewFunction() {
|
|
1296
1311
|
return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
|
|
1297
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
|
+
}
|
|
1321
|
+
}
|
|
1298
1322
|
/**
|
|
1299
1323
|
* Determine if the specified field was declared in one of the ancestor classes
|
|
1300
1324
|
*/
|
|
@@ -1314,6 +1338,7 @@ class ClassStatement extends Statement {
|
|
|
1314
1338
|
*/
|
|
1315
1339
|
getTranspiledBuilder(state) {
|
|
1316
1340
|
var _a;
|
|
1341
|
+
this.ensureConstructorFunctionExists();
|
|
1317
1342
|
let result = [];
|
|
1318
1343
|
result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
|
|
1319
1344
|
state.blockDepth++;
|
|
@@ -1334,11 +1359,6 @@ class ClassStatement extends Statement {
|
|
|
1334
1359
|
}
|
|
1335
1360
|
result.push(state.newline, state.indent());
|
|
1336
1361
|
let parentClassIndex = this.getParentClassIndex(state);
|
|
1337
|
-
//create empty `new` function if class is missing it (simplifies transpile logic)
|
|
1338
|
-
if (!this.getConstructorFunction()) {
|
|
1339
|
-
this.memberMap.new = this.getEmptyNewFunction();
|
|
1340
|
-
this.body = [this.memberMap.new, ...this.body];
|
|
1341
|
-
}
|
|
1342
1362
|
for (let statement of this.body) {
|
|
1343
1363
|
//is field statement
|
|
1344
1364
|
if ((0, reflection_1.isClassFieldStatement)(statement)) {
|
|
@@ -1526,7 +1546,7 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1526
1546
|
* Inject field initializers at the top of the `new` function (after any present `super()` call)
|
|
1527
1547
|
*/
|
|
1528
1548
|
injectFieldInitializersForConstructor(state) {
|
|
1529
|
-
let startingIndex = state.classStatement.
|
|
1549
|
+
let startingIndex = state.classStatement.hasParent() ? 1 : 0;
|
|
1530
1550
|
let newStatements = [];
|
|
1531
1551
|
//insert the field initializers in order
|
|
1532
1552
|
for (let field of state.classStatement.fields) {
|
|
@@ -1568,7 +1588,7 @@ class ClassFieldStatement extends Statement {
|
|
|
1568
1588
|
*/
|
|
1569
1589
|
getType(parseMode = Parser_1.ParseMode.BrighterScript) {
|
|
1570
1590
|
if (this.type) {
|
|
1571
|
-
return
|
|
1591
|
+
return this.type.type;
|
|
1572
1592
|
}
|
|
1573
1593
|
else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
|
|
1574
1594
|
return this.initialValue.type;
|
|
@@ -1596,47 +1616,70 @@ class ClassFieldStatement extends Statement {
|
|
|
1596
1616
|
return result;
|
|
1597
1617
|
}
|
|
1598
1618
|
walk(visitor, options) {
|
|
1599
|
-
if (
|
|
1619
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1620
|
+
(0, visitors_1.walk)(this, 'type', visitor, options);
|
|
1600
1621
|
(0, visitors_1.walk)(this, 'initialValue', visitor, options);
|
|
1601
1622
|
}
|
|
1602
1623
|
}
|
|
1603
1624
|
}
|
|
1604
1625
|
exports.ClassFieldStatement = ClassFieldStatement;
|
|
1605
1626
|
class TryCatchStatement extends Statement {
|
|
1606
|
-
constructor(
|
|
1627
|
+
constructor(tokens, tryBranch, catchStatement) {
|
|
1607
1628
|
var _a;
|
|
1608
1629
|
super();
|
|
1609
|
-
this.
|
|
1630
|
+
this.tokens = tokens;
|
|
1610
1631
|
this.tryBranch = tryBranch;
|
|
1611
|
-
this.
|
|
1612
|
-
this.
|
|
1613
|
-
this.catchBranch = catchBranch;
|
|
1614
|
-
this.endTryToken = endTryToken;
|
|
1615
|
-
this.range = (_a = util_1.util.createBoundingRange(this.tryToken, this.tryBranch, this.catchToken, this.exceptionVariable, this.catchBranch, this.endTryToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1632
|
+
this.catchStatement = catchStatement;
|
|
1633
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.try, this.tryBranch, this.catchStatement, this.tokens.endTry)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1616
1634
|
}
|
|
1617
1635
|
transpile(state) {
|
|
1636
|
+
var _a, _b;
|
|
1618
1637
|
return [
|
|
1619
|
-
state.transpileToken(this.
|
|
1638
|
+
state.transpileToken(this.tokens.try),
|
|
1620
1639
|
...this.tryBranch.transpile(state),
|
|
1621
1640
|
state.newline,
|
|
1622
1641
|
state.indent(),
|
|
1623
|
-
|
|
1624
|
-
' ',
|
|
1625
|
-
state.transpileToken(this.exceptionVariable),
|
|
1626
|
-
...this.catchBranch.transpile(state),
|
|
1642
|
+
...((_b = (_a = this.catchStatement) === null || _a === void 0 ? void 0 : _a.transpile(state)) !== null && _b !== void 0 ? _b : ['catch']),
|
|
1627
1643
|
state.newline,
|
|
1628
1644
|
state.indent(),
|
|
1629
|
-
state.transpileToken(this.
|
|
1645
|
+
state.transpileToken(this.tokens.endTry)
|
|
1630
1646
|
];
|
|
1631
1647
|
}
|
|
1632
1648
|
walk(visitor, options) {
|
|
1633
1649
|
if (this.tryBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1634
1650
|
(0, visitors_1.walk)(this, 'tryBranch', visitor, options);
|
|
1635
|
-
(0, visitors_1.walk)(this, '
|
|
1651
|
+
(0, visitors_1.walk)(this, 'catchStatement', visitor, options);
|
|
1636
1652
|
}
|
|
1637
1653
|
}
|
|
1638
1654
|
}
|
|
1639
1655
|
exports.TryCatchStatement = TryCatchStatement;
|
|
1656
|
+
class CatchStatement extends Statement {
|
|
1657
|
+
constructor(tokens, exceptionVariable, catchBranch) {
|
|
1658
|
+
super();
|
|
1659
|
+
this.tokens = tokens;
|
|
1660
|
+
this.exceptionVariable = exceptionVariable;
|
|
1661
|
+
this.catchBranch = catchBranch;
|
|
1662
|
+
}
|
|
1663
|
+
get range() {
|
|
1664
|
+
var _a, _b;
|
|
1665
|
+
return util_1.util.createRangeFromPositions(this.tokens.catch.range.start, ((_b = (_a = this.catchBranch) !== null && _a !== void 0 ? _a : this.exceptionVariable) !== null && _b !== void 0 ? _b : this.tokens.catch).range.end);
|
|
1666
|
+
}
|
|
1667
|
+
transpile(state) {
|
|
1668
|
+
var _a, _b, _c, _d;
|
|
1669
|
+
return [
|
|
1670
|
+
state.transpileToken(this.tokens.catch),
|
|
1671
|
+
' ',
|
|
1672
|
+
(_b = (_a = this.exceptionVariable) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'e',
|
|
1673
|
+
...((_d = (_c = this.catchBranch) === null || _c === void 0 ? void 0 : _c.transpile(state)) !== null && _d !== void 0 ? _d : [])
|
|
1674
|
+
];
|
|
1675
|
+
}
|
|
1676
|
+
walk(visitor, options) {
|
|
1677
|
+
if (this.catchBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1678
|
+
(0, visitors_1.walk)(this, 'catchBranch', visitor, options);
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
exports.CatchStatement = CatchStatement;
|
|
1640
1683
|
class ThrowStatement extends Statement {
|
|
1641
1684
|
constructor(throwToken, expression) {
|
|
1642
1685
|
var _a;
|