brighterscript 1.0.0-alpha.10 → 1.0.0-alpha.14
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 +247 -267
- package/README.md +2 -2
- package/dist/Cache.d.ts +3 -3
- package/dist/Cache.js +10 -6
- package/dist/Cache.js.map +1 -1
- package/dist/CodeActionUtil.js.map +1 -1
- package/dist/CommentFlagProcessor.d.ts +4 -4
- package/dist/CommentFlagProcessor.js +5 -3
- package/dist/CommentFlagProcessor.js.map +1 -1
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticFilterer.js +1 -1
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/LanguageServer.d.ts +1 -6
- package/dist/LanguageServer.js +5 -14
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.d.ts +3 -3
- package/dist/PluginInterface.js +3 -0
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +35 -20
- package/dist/Program.js +132 -67
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.js +4 -4
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +22 -13
- package/dist/Scope.js +85 -70
- package/dist/Scope.js.map +1 -1
- package/dist/SymbolTable.d.ts +1 -1
- package/dist/SymbolTable.js +2 -2
- package/dist/SymbolTable.js.map +1 -1
- package/dist/XmlScope.d.ts +2 -2
- package/dist/XmlScope.js +5 -5
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/AstEditor.d.ts +27 -0
- package/dist/astUtils/AstEditor.js +97 -0
- package/dist/astUtils/AstEditor.js.map +1 -0
- package/dist/{bscPlugin/semanticTokens/SemanticTokensProcessor.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
- package/dist/astUtils/AstEditor.spec.js +133 -0
- package/dist/astUtils/AstEditor.spec.js.map +1 -0
- package/dist/astUtils/creators.spec.js +4 -4
- package/dist/astUtils/creators.spec.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +4 -2
- package/dist/astUtils/reflection.js +10 -1
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +116 -116
- package/dist/astUtils/reflection.spec.js.map +1 -1
- package/dist/astUtils/stackedVisitor.js.map +1 -1
- package/dist/astUtils/stackedVisitor.spec.js +13 -13
- package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
- package/dist/astUtils/visitors.js +1 -1
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +26 -26
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/astUtils/xml.d.ts +1 -0
- package/dist/astUtils/xml.js +6 -1
- package/dist/astUtils/xml.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.js +5 -2
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +3 -3
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +17 -17
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +8 -0
- package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.js → BrsFileSemanticTokensProcessor.js} +13 -15
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.js → BrsFileSemanticTokensProcessor.spec.js} +5 -5
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
- package/dist/diagnosticUtils.d.ts +1 -0
- package/dist/diagnosticUtils.js +14 -7
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/examples/plugins/removePrint.js +2 -2
- package/dist/examples/plugins/removePrint.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +444 -269
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +17 -11
- package/dist/files/BrsFile.js +220 -153
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +620 -272
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +6 -5
- package/dist/files/XmlFile.js +14 -9
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +238 -191
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +29 -27
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/globalCallables.d.ts +3 -1
- package/dist/globalCallables.js +198 -99
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +12 -3
- package/dist/index.js +22 -4
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +71 -10
- package/dist/lexer/Lexer.d.ts +5 -1
- package/dist/lexer/Lexer.js +52 -35
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +564 -534
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +4 -0
- package/dist/lexer/TokenKind.js +44 -1
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/Expression.d.ts +1 -1
- package/dist/parser/Expression.js +66 -66
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +107 -106
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +17 -5
- package/dist/parser/Parser.js +431 -315
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +418 -296
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGParser.js +2 -2
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +22 -22
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +3 -0
- package/dist/parser/SGTypes.js +12 -7
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/SGTypes.spec.js +84 -84
- package/dist/parser/SGTypes.spec.js.map +1 -1
- package/dist/parser/Statement.d.ts +3 -3
- package/dist/parser/Statement.js +61 -61
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +10 -10
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/tests/Parser.spec.d.ts +3 -3
- package/dist/parser/tests/Parser.spec.js +4 -4
- package/dist/parser/tests/Parser.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/For.spec.js +58 -58
- package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/ForEach.spec.js +40 -39
- package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/If.spec.js +201 -200
- package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/While.spec.js +37 -37
- package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
- package/dist/parser/tests/expression/Additive.spec.js +30 -30
- package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
- package/dist/parser/tests/expression/ArrayLiterals.spec.js +119 -119
- package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +141 -141
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/Boolean.spec.js +24 -24
- package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
- package/dist/parser/tests/expression/Call.spec.js +41 -40
- package/dist/parser/tests/expression/Call.spec.js.map +1 -1
- package/dist/parser/tests/expression/Exponential.spec.js +17 -17
- package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
- package/dist/parser/tests/expression/Function.spec.js +256 -256
- package/dist/parser/tests/expression/Function.spec.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +87 -87
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/dist/parser/tests/expression/Multiplicative.spec.js +37 -37
- package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +74 -62
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/PrefixUnary.spec.js +41 -41
- package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
- package/dist/parser/tests/expression/Primary.spec.js +41 -41
- package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +110 -2
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/Relational.spec.js +43 -43
- package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +6 -6
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +18 -18
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +100 -100
- package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
- package/dist/parser/tests/statement/AssignmentOperators.spec.js +36 -36
- package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
- package/dist/parser/tests/statement/Declaration.spec.js +44 -44
- package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
- package/dist/parser/tests/statement/Dim.spec.js +21 -21
- package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
- package/dist/parser/tests/statement/Function.spec.js +198 -197
- package/dist/parser/tests/statement/Function.spec.js.map +1 -1
- package/dist/parser/tests/statement/Goto.spec.js +15 -14
- package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
- package/dist/parser/tests/statement/Increment.spec.js +50 -50
- package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +14 -2
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/LibraryStatement.spec.js +17 -17
- package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Misc.spec.js +91 -90
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +34 -34
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/ReturnStatement.spec.js +46 -46
- package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Set.spec.js +83 -83
- package/dist/parser/tests/statement/Set.spec.js.map +1 -1
- package/dist/parser/tests/statement/Stop.spec.js +12 -11
- package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
- package/dist/parser/tests/statement/Throw.spec.js +5 -5
- package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
- package/dist/parser/tests/statement/TryCatch.spec.js +13 -13
- package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
- package/dist/preprocessor/Chunk.d.ts +1 -1
- package/dist/preprocessor/Chunk.js.map +1 -1
- package/dist/preprocessor/Manifest.d.ts +1 -1
- package/dist/preprocessor/Preprocessor.d.ts +1 -1
- package/dist/preprocessor/Preprocessor.js +8 -8
- package/dist/preprocessor/Preprocessor.js.map +1 -1
- package/dist/preprocessor/Preprocessor.spec.js +49 -49
- package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
- package/dist/preprocessor/PreprocessorParser.spec.js +72 -72
- package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
- package/dist/types/ArrayType.d.ts +8 -5
- package/dist/types/ArrayType.js +48 -12
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +69 -10
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/BooleanType.js +3 -3
- package/dist/types/BooleanType.js.map +1 -1
- package/dist/types/BooleanType.spec.js +2 -2
- package/dist/types/BooleanType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +1 -1
- package/dist/types/BscType.js +1 -1
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/CustomType.d.ts +1 -1
- package/dist/types/CustomType.js +6 -4
- package/dist/types/CustomType.js.map +1 -1
- package/dist/types/DoubleType.js +7 -7
- package/dist/types/DoubleType.js.map +1 -1
- package/dist/types/DoubleType.spec.js +2 -2
- package/dist/types/DoubleType.spec.js.map +1 -1
- package/dist/types/DynamicType.js +1 -1
- package/dist/types/DynamicType.js.map +1 -1
- package/dist/types/DynamicType.spec.js +2 -2
- package/dist/types/DynamicType.spec.js.map +1 -1
- package/dist/types/FloatType.js +7 -7
- package/dist/types/FloatType.js.map +1 -1
- package/dist/types/FloatType.spec.js +2 -2
- package/dist/types/FloatType.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +5 -5
- package/dist/types/FunctionType.js +13 -13
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/FunctionType.spec.js +7 -7
- package/dist/types/FunctionType.spec.js.map +1 -1
- package/dist/types/IntegerType.js +7 -7
- package/dist/types/IntegerType.js.map +1 -1
- package/dist/types/IntegerType.spec.js +2 -2
- package/dist/types/IntegerType.spec.js.map +1 -1
- package/dist/types/InterfaceType.js +3 -3
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/InterfaceType.spec.js +7 -7
- package/dist/types/InterfaceType.spec.js.map +1 -1
- package/dist/types/InvalidType.js +4 -4
- package/dist/types/InvalidType.js.map +1 -1
- package/dist/types/InvalidType.spec.js +2 -2
- package/dist/types/InvalidType.spec.js.map +1 -1
- package/dist/types/LazyType.d.ts +1 -2
- package/dist/types/LazyType.js +1 -5
- package/dist/types/LazyType.js.map +1 -1
- package/dist/types/LongIntegerType.js +8 -8
- package/dist/types/LongIntegerType.js.map +1 -1
- package/dist/types/LongIntegerType.spec.js +2 -2
- package/dist/types/LongIntegerType.spec.js.map +1 -1
- package/dist/types/ObjectType.js +3 -3
- package/dist/types/ObjectType.js.map +1 -1
- package/dist/types/ObjectType.spec.js +2 -2
- package/dist/types/ObjectType.spec.js.map +1 -1
- package/dist/types/StringType.js +3 -3
- package/dist/types/StringType.js.map +1 -1
- package/dist/types/StringType.spec.js +2 -2
- package/dist/types/StringType.spec.js.map +1 -1
- package/dist/types/UninitializedType.js +3 -3
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/VoidType.js +3 -3
- package/dist/types/VoidType.js.map +1 -1
- package/dist/types/VoidType.spec.js +2 -2
- package/dist/types/VoidType.spec.js.map +1 -1
- package/dist/types/helpers.js +6 -6
- package/dist/types/helpers.js.map +1 -1
- package/dist/util.d.ts +15 -9
- package/dist/util.js +104 -57
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.js +40 -40
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +10 -9
- package/dist/astUtils/index.d.ts +0 -7
- package/dist/astUtils/index.js +0 -26
- package/dist/astUtils/index.js.map +0 -1
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
- package/dist/lexer/index.d.ts +0 -3
- package/dist/lexer/index.js +0 -17
- package/dist/lexer/index.js.map +0 -1
- package/dist/parser/index.d.ts +0 -3
- package/dist/parser/index.js +0 -16
- package/dist/parser/index.js.map +0 -1
- package/dist/preprocessor/index.d.ts +0 -3
- package/dist/preprocessor/index.js +0 -16
- package/dist/preprocessor/index.js.map +0 -1
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.failStatementType = exports.rangeToArray = void 0;
|
|
4
4
|
const chai_1 = require("chai");
|
|
5
|
-
const
|
|
5
|
+
const Lexer_1 = require("../lexer/Lexer");
|
|
6
|
+
const TokenKind_1 = require("../lexer/TokenKind");
|
|
6
7
|
const Expression_1 = require("./Expression");
|
|
7
8
|
const Parser_1 = require("./Parser");
|
|
8
9
|
const Statement_1 = require("./Statement");
|
|
@@ -10,19 +11,24 @@ const vscode_languageserver_1 = require("vscode-languageserver");
|
|
|
10
11
|
const DiagnosticMessages_1 = require("../DiagnosticMessages");
|
|
11
12
|
const reflection_1 = require("../astUtils/reflection");
|
|
12
13
|
const testHelpers_spec_1 = require("../testHelpers.spec");
|
|
13
|
-
const
|
|
14
|
+
const BrsTranspileState_1 = require("./BrsTranspileState");
|
|
15
|
+
const source_map_1 = require("source-map");
|
|
16
|
+
const BrsFile_1 = require("../files/BrsFile");
|
|
17
|
+
const Program_1 = require("../Program");
|
|
18
|
+
const SymbolTable_1 = require("../SymbolTable");
|
|
14
19
|
const FunctionType_1 = require("../types/FunctionType");
|
|
15
|
-
const
|
|
16
|
-
const CustomType_1 = require("../types/CustomType");
|
|
20
|
+
const LazyType_1 = require("../types/LazyType");
|
|
17
21
|
const IntegerType_1 = require("../types/IntegerType");
|
|
22
|
+
const StringType_1 = require("../types/StringType");
|
|
18
23
|
const ObjectType_1 = require("../types/ObjectType");
|
|
19
|
-
const
|
|
24
|
+
const CustomType_1 = require("../types/CustomType");
|
|
25
|
+
const VoidType_1 = require("../types/VoidType");
|
|
20
26
|
const DynamicType_1 = require("../types/DynamicType");
|
|
21
27
|
const util_1 = require("../util");
|
|
22
|
-
const
|
|
28
|
+
const ArrayType_1 = require("../types/ArrayType");
|
|
23
29
|
describe('parser', () => {
|
|
24
30
|
it('emits empty object when empty token list is provided', () => {
|
|
25
|
-
chai_1.expect(Parser_1.Parser.parse([])).to.deep.include({
|
|
31
|
+
(0, chai_1.expect)(Parser_1.Parser.parse([])).to.deep.include({
|
|
26
32
|
statements: [],
|
|
27
33
|
diagnostics: []
|
|
28
34
|
});
|
|
@@ -40,7 +46,7 @@ describe('parser', () => {
|
|
|
40
46
|
humansAreAlive = false
|
|
41
47
|
end sub
|
|
42
48
|
`);
|
|
43
|
-
chai_1.expect(parser.references.functionExpressions[0].symbolTable.getOwnSymbols().map(x => x.name).sort()).to.eql([
|
|
49
|
+
(0, chai_1.expect)(parser.references.functionExpressions[0].symbolTable.getOwnSymbols().map(x => x.name).sort()).to.eql([
|
|
44
50
|
'herd',
|
|
45
51
|
'humansAreAlive',
|
|
46
52
|
'i',
|
|
@@ -49,7 +55,7 @@ describe('parser', () => {
|
|
|
49
55
|
'zombie'
|
|
50
56
|
]);
|
|
51
57
|
parser.invalidateReferences();
|
|
52
|
-
chai_1.expect(parser.references.functionExpressions[0].symbolTable.getOwnSymbols().map(x => x.name).sort()).to.eql([
|
|
58
|
+
(0, chai_1.expect)(parser.references.functionExpressions[0].symbolTable.getOwnSymbols().map(x => x.name).sort()).to.eql([
|
|
53
59
|
'herd',
|
|
54
60
|
'humansAreAlive',
|
|
55
61
|
'i',
|
|
@@ -69,13 +75,17 @@ describe('parser', () => {
|
|
|
69
75
|
end sub
|
|
70
76
|
`);
|
|
71
77
|
parser.invalidateReferences();
|
|
72
|
-
chai_1.expect(parser.references.functionExpressions
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
(0, chai_1.expect)(parser.references.functionExpressions.map(x => {
|
|
79
|
+
return x.symbolTable.getOwnSymbols().map(x => x.name);
|
|
80
|
+
})).to.eql([
|
|
81
|
+
[
|
|
82
|
+
'outerName',
|
|
83
|
+
'speak',
|
|
84
|
+
'age'
|
|
85
|
+
],
|
|
86
|
+
[
|
|
87
|
+
'innerName'
|
|
88
|
+
]
|
|
79
89
|
]);
|
|
80
90
|
});
|
|
81
91
|
it('gets called if references are missing', () => {
|
|
@@ -86,7 +96,7 @@ describe('parser', () => {
|
|
|
86
96
|
sub UnusedFunction()
|
|
87
97
|
end sub
|
|
88
98
|
`);
|
|
89
|
-
chai_1.expect(parser.references.functionStatements.map(x => x.name.text)).to.eql([
|
|
99
|
+
(0, chai_1.expect)(parser.references.functionStatements.map(x => x.name.text)).to.eql([
|
|
90
100
|
'main',
|
|
91
101
|
'UnusedFunction'
|
|
92
102
|
]);
|
|
@@ -94,12 +104,69 @@ describe('parser', () => {
|
|
|
94
104
|
parser.ast.statements.splice(1);
|
|
95
105
|
//tell the parser we modified the AST and need to regenerate references
|
|
96
106
|
parser.invalidateReferences();
|
|
97
|
-
chai_1.expect(parser['_references']).not.to.exist;
|
|
107
|
+
(0, chai_1.expect)(parser['_references']).not.to.exist;
|
|
98
108
|
//calling `references` automatically regenerates the references
|
|
99
|
-
chai_1.expect(parser.references.functionStatements.map(x => x.name.text)).to.eql([
|
|
109
|
+
(0, chai_1.expect)(parser.references.functionStatements.map(x => x.name.text)).to.eql([
|
|
100
110
|
'main'
|
|
101
111
|
]);
|
|
102
112
|
});
|
|
113
|
+
function expressionsToStrings(expressions) {
|
|
114
|
+
return [...expressions.values()].map(x => {
|
|
115
|
+
const file = new BrsFile_1.BrsFile('', '', new Program_1.Program({}));
|
|
116
|
+
const state = new BrsTranspileState_1.BrsTranspileState(file);
|
|
117
|
+
return new source_map_1.SourceNode(null, null, null, x.transpile(state)).toString();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
it('works for references.expressions', () => {
|
|
121
|
+
const parser = Parser_1.Parser.parse(`
|
|
122
|
+
a += 1 + 2
|
|
123
|
+
a++
|
|
124
|
+
a--
|
|
125
|
+
some.node@.doCallfunc()
|
|
126
|
+
bravo(3 + 4).jump(callMe())
|
|
127
|
+
obj = {
|
|
128
|
+
val1: someValue
|
|
129
|
+
}
|
|
130
|
+
arr = [
|
|
131
|
+
one
|
|
132
|
+
]
|
|
133
|
+
thing = alpha.bravo
|
|
134
|
+
alpha.charlie()
|
|
135
|
+
delta(alpha.delta)
|
|
136
|
+
call1().a.b.call2()
|
|
137
|
+
class Person
|
|
138
|
+
name as string = "bob"
|
|
139
|
+
end class
|
|
140
|
+
function thing(p1 = name.space.getSomething())
|
|
141
|
+
|
|
142
|
+
end function
|
|
143
|
+
`);
|
|
144
|
+
const expected = [
|
|
145
|
+
'a += 1 + 2',
|
|
146
|
+
'a++',
|
|
147
|
+
'a--',
|
|
148
|
+
//currently the "toString" does a transpile, so that's why this is different.
|
|
149
|
+
'some.node.callfunc("doCallfunc", invalid)',
|
|
150
|
+
'3 + 4',
|
|
151
|
+
'callMe()',
|
|
152
|
+
'bravo(3 + 4).jump(callMe())',
|
|
153
|
+
'someValue',
|
|
154
|
+
'{\n val1: someValue\n}',
|
|
155
|
+
'one',
|
|
156
|
+
'[\n one\n]',
|
|
157
|
+
'alpha.bravo',
|
|
158
|
+
'alpha.charlie()',
|
|
159
|
+
'alpha.delta',
|
|
160
|
+
'delta(alpha.delta)',
|
|
161
|
+
'call1().a.b.call2()',
|
|
162
|
+
'"bob"',
|
|
163
|
+
'name.space.getSomething()'
|
|
164
|
+
].sort();
|
|
165
|
+
(0, chai_1.expect)(expressionsToStrings(parser.references.expressions).sort()).to.eql(expected);
|
|
166
|
+
//tell the parser we modified the AST and need to regenerate references
|
|
167
|
+
parser.invalidateReferences();
|
|
168
|
+
(0, chai_1.expect)(expressionsToStrings(parser.references.expressions).sort()).to.eql(expected);
|
|
169
|
+
});
|
|
103
170
|
});
|
|
104
171
|
describe('callfunc operator', () => {
|
|
105
172
|
it('is not allowed in brightscript mode', () => {
|
|
@@ -109,7 +176,7 @@ describe('parser', () => {
|
|
|
109
176
|
node@.doSomething(1, 2)
|
|
110
177
|
end sub
|
|
111
178
|
`, Parser_1.ParseMode.BrightScript);
|
|
112
|
-
chai_1.expect((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('callfunc operator').message);
|
|
179
|
+
(0, chai_1.expect)((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('callfunc operator').message);
|
|
113
180
|
});
|
|
114
181
|
it('does not cause parse errors', () => {
|
|
115
182
|
var _a, _b, _c, _d, _e;
|
|
@@ -118,13 +185,13 @@ describe('parser', () => {
|
|
|
118
185
|
node@.doSomething(1, 2)
|
|
119
186
|
end sub
|
|
120
187
|
`, Parser_1.ParseMode.BrighterScript);
|
|
121
|
-
chai_1.expect((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
122
|
-
chai_1.expect((_e = (_d = (_c = (_b = parser.statements[0]) === null || _b === void 0 ? void 0 : _b.func) === null || _c === void 0 ? void 0 : _c.body) === null || _d === void 0 ? void 0 : _d.statements[0]) === null || _e === void 0 ? void 0 : _e.expression).to.be.instanceof(Expression_1.CallfuncExpression);
|
|
188
|
+
(0, chai_1.expect)((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
189
|
+
(0, chai_1.expect)((_e = (_d = (_c = (_b = parser.statements[0]) === null || _b === void 0 ? void 0 : _b.func) === null || _c === void 0 ? void 0 : _c.body) === null || _d === void 0 ? void 0 : _d.statements[0]) === null || _e === void 0 ? void 0 : _e.expression).to.be.instanceof(Expression_1.CallfuncExpression);
|
|
123
190
|
});
|
|
124
191
|
});
|
|
125
192
|
describe('diagnostic locations', () => {
|
|
126
193
|
it('tracks basic diagnostic locations', () => {
|
|
127
|
-
chai_1.expect(parse(`
|
|
194
|
+
(0, chai_1.expect)(parse(`
|
|
128
195
|
sub main()
|
|
129
196
|
call()a
|
|
130
197
|
end sub
|
|
@@ -140,8 +207,8 @@ describe('parser', () => {
|
|
|
140
207
|
return "6c5cdf1"
|
|
141
208
|
end functionasdf
|
|
142
209
|
`).diagnostics;
|
|
143
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.exist.and.to.eql(DiagnosticMessages_1.DiagnosticMessages.expectedStatementOrFunctionCallButReceivedExpression().message);
|
|
144
|
-
chai_1.expect((_b = diagnostics[0]) === null || _b === void 0 ? void 0 : _b.range).to.eql(vscode_languageserver_1.Range.create(3, 20, 3, 32));
|
|
210
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.exist.and.to.eql(DiagnosticMessages_1.DiagnosticMessages.expectedStatementOrFunctionCallButReceivedExpression().message);
|
|
211
|
+
(0, chai_1.expect)((_b = diagnostics[0]) === null || _b === void 0 ? void 0 : _b.range).to.eql(vscode_languageserver_1.Range.create(3, 20, 3, 32));
|
|
145
212
|
});
|
|
146
213
|
});
|
|
147
214
|
describe('parse', () => {
|
|
@@ -154,7 +221,7 @@ describe('parser', () => {
|
|
|
154
221
|
end function()
|
|
155
222
|
end sub
|
|
156
223
|
`);
|
|
157
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser);
|
|
224
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser);
|
|
158
225
|
});
|
|
159
226
|
it('supports grouped iife in assignment', () => {
|
|
160
227
|
const parser = parse(`
|
|
@@ -165,7 +232,7 @@ describe('parser', () => {
|
|
|
165
232
|
end function)()
|
|
166
233
|
end sub
|
|
167
234
|
`);
|
|
168
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser);
|
|
235
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser);
|
|
169
236
|
});
|
|
170
237
|
it('supports returning iife call', () => {
|
|
171
238
|
const parser = parse(`
|
|
@@ -174,11 +241,11 @@ describe('parser', () => {
|
|
|
174
241
|
end sub)()
|
|
175
242
|
end sub
|
|
176
243
|
`);
|
|
177
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser);
|
|
244
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser);
|
|
178
245
|
});
|
|
179
246
|
it('supports using "interface" as parameter name', () => {
|
|
180
247
|
var _a;
|
|
181
|
-
chai_1.expect((_a = parse(`
|
|
248
|
+
(0, chai_1.expect)((_a = parse(`
|
|
182
249
|
sub main(interface as object)
|
|
183
250
|
end sub
|
|
184
251
|
`, Parser_1.ParseMode.BrighterScript).diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
@@ -186,7 +253,7 @@ describe('parser', () => {
|
|
|
186
253
|
describe('namespace', () => {
|
|
187
254
|
it('catches namespaces declared not at root level', () => {
|
|
188
255
|
var _a;
|
|
189
|
-
chai_1.expect((_a = parse(`
|
|
256
|
+
(0, chai_1.expect)((_a = parse(`
|
|
190
257
|
sub main()
|
|
191
258
|
namespace Name.Space
|
|
192
259
|
end namespace
|
|
@@ -199,8 +266,8 @@ describe('parser', () => {
|
|
|
199
266
|
namespace Name.Space
|
|
200
267
|
end namespace
|
|
201
268
|
`, Parser_1.ParseMode.BrighterScript);
|
|
202
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
203
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
269
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
270
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
204
271
|
});
|
|
205
272
|
it('includes body', () => {
|
|
206
273
|
var _a;
|
|
@@ -210,9 +277,9 @@ describe('parser', () => {
|
|
|
210
277
|
end sub
|
|
211
278
|
end namespace
|
|
212
279
|
`, Parser_1.ParseMode.BrighterScript);
|
|
213
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
214
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
215
|
-
chai_1.expect(statements[0].body.statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
280
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
281
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
282
|
+
(0, chai_1.expect)(statements[0].body.statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
216
283
|
});
|
|
217
284
|
it('supports comments and newlines', () => {
|
|
218
285
|
var _a;
|
|
@@ -228,7 +295,7 @@ describe('parser', () => {
|
|
|
228
295
|
'comment
|
|
229
296
|
end namespace 'comment
|
|
230
297
|
`, Parser_1.ParseMode.BrighterScript);
|
|
231
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
298
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
232
299
|
});
|
|
233
300
|
it('catches missing name', () => {
|
|
234
301
|
var _a;
|
|
@@ -236,7 +303,7 @@ describe('parser', () => {
|
|
|
236
303
|
namespace
|
|
237
304
|
end namespace
|
|
238
305
|
`, Parser_1.ParseMode.BrighterScript);
|
|
239
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedIdentifierAfterKeyword('namespace').message);
|
|
306
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedIdentifierAfterKeyword('namespace').message);
|
|
240
307
|
});
|
|
241
308
|
it('recovers after missing `end namespace`', () => {
|
|
242
309
|
var _a, _b, _c;
|
|
@@ -245,9 +312,9 @@ describe('parser', () => {
|
|
|
245
312
|
sub main()
|
|
246
313
|
end sub
|
|
247
314
|
`, Parser_1.ParseMode.BrighterScript);
|
|
248
|
-
chai_1.expect(parser.ast.statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
249
|
-
chai_1.expect((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.couldNotFindMatchingEndKeyword('namespace').message);
|
|
250
|
-
chai_1.expect((_c = (_b = parser.ast.statements[0]) === null || _b === void 0 ? void 0 : _b.body) === null || _c === void 0 ? void 0 : _c.statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
315
|
+
(0, chai_1.expect)(parser.ast.statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
316
|
+
(0, chai_1.expect)((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.couldNotFindMatchingEndKeyword('namespace').message);
|
|
317
|
+
(0, chai_1.expect)((_c = (_b = parser.ast.statements[0]) === null || _b === void 0 ? void 0 : _b.body) === null || _c === void 0 ? void 0 : _c.statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
251
318
|
});
|
|
252
319
|
it('adds diagnostic when encountering namespace in brightscript mode', () => {
|
|
253
320
|
var _a;
|
|
@@ -255,7 +322,7 @@ describe('parser', () => {
|
|
|
255
322
|
namespace Name.Space
|
|
256
323
|
end namespace
|
|
257
324
|
`);
|
|
258
|
-
chai_1.expect((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('namespace').message);
|
|
325
|
+
(0, chai_1.expect)((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('namespace').message);
|
|
259
326
|
});
|
|
260
327
|
it('declares a symbol table for the namespace', () => {
|
|
261
328
|
let parser = parse(`
|
|
@@ -269,13 +336,13 @@ describe('parser', () => {
|
|
|
269
336
|
end function
|
|
270
337
|
end namespace
|
|
271
338
|
`, Parser_1.ParseMode.BrighterScript);
|
|
272
|
-
chai_1.expect(parser.ast.statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
339
|
+
(0, chai_1.expect)(parser.ast.statements[0]).to.be.instanceof(Statement_1.NamespaceStatement);
|
|
273
340
|
const namespaceStmt = parser.ast.statements[0];
|
|
274
|
-
chai_1.expect(namespaceStmt.symbolTable).to.be.instanceof(SymbolTable_1.SymbolTable);
|
|
275
|
-
chai_1.expect(namespaceStmt.symbolTable.getSymbolType('funcInt').toString()).to.equal('function funcInt() as integer');
|
|
276
|
-
chai_1.expect(namespaceStmt.symbolTable.getSymbolType('funcStr')).to.be.instanceof(FunctionType_1.FunctionType);
|
|
341
|
+
(0, chai_1.expect)(namespaceStmt.symbolTable).to.be.instanceof(SymbolTable_1.SymbolTable);
|
|
342
|
+
(0, chai_1.expect)(namespaceStmt.symbolTable.getSymbolType('funcInt').toString()).to.equal('function funcInt() as integer');
|
|
343
|
+
(0, chai_1.expect)(namespaceStmt.symbolTable.getSymbolType('funcStr')).to.be.instanceof(FunctionType_1.FunctionType);
|
|
277
344
|
const strFunctionType = namespaceStmt.symbolTable.getSymbolType('funcStr');
|
|
278
|
-
chai_1.expect(strFunctionType.returnType.toString()).to.equal('string');
|
|
345
|
+
(0, chai_1.expect)(strFunctionType.returnType.toString()).to.equal('string');
|
|
279
346
|
});
|
|
280
347
|
it('adds a fully qualified name of a function in a namespace to the parsers symbol table', () => {
|
|
281
348
|
let parser = parse(`
|
|
@@ -289,13 +356,13 @@ describe('parser', () => {
|
|
|
289
356
|
end function
|
|
290
357
|
end namespace
|
|
291
358
|
`, Parser_1.ParseMode.BrighterScript);
|
|
292
|
-
chai_1.expect(parser.symbolTable.getSymbolType('Name.Space.funcInt')).to.be.instanceof(FunctionType_1.FunctionType);
|
|
293
|
-
chai_1.expect(parser.symbolTable.getSymbolType('Name.Space.funcStr')).to.be.instanceof(FunctionType_1.FunctionType);
|
|
359
|
+
(0, chai_1.expect)(parser.symbolTable.getSymbolType('Name.Space.funcInt')).to.be.instanceof(FunctionType_1.FunctionType);
|
|
360
|
+
(0, chai_1.expect)(parser.symbolTable.getSymbolType('Name.Space.funcStr')).to.be.instanceof(FunctionType_1.FunctionType);
|
|
294
361
|
});
|
|
295
362
|
});
|
|
296
363
|
it('supports << operator', () => {
|
|
297
364
|
var _a;
|
|
298
|
-
chai_1.expect((_a = parse(`
|
|
365
|
+
(0, chai_1.expect)((_a = parse(`
|
|
299
366
|
sub main()
|
|
300
367
|
print ((r << 24) + (g << 16) + (b << 8) + a)
|
|
301
368
|
end sub
|
|
@@ -303,7 +370,7 @@ describe('parser', () => {
|
|
|
303
370
|
});
|
|
304
371
|
it('supports >> operator', () => {
|
|
305
372
|
var _a;
|
|
306
|
-
chai_1.expect((_a = parse(`
|
|
373
|
+
(0, chai_1.expect)((_a = parse(`
|
|
307
374
|
sub main()
|
|
308
375
|
print ((r >> 24) + (g >> 16) + (b >> 8) + a)
|
|
309
376
|
end sub
|
|
@@ -311,7 +378,7 @@ describe('parser', () => {
|
|
|
311
378
|
});
|
|
312
379
|
it('allows global function names with same as token to be called', () => {
|
|
313
380
|
var _a;
|
|
314
|
-
chai_1.expect((_a = parse(`
|
|
381
|
+
(0, chai_1.expect)((_a = parse(`
|
|
315
382
|
sub main()
|
|
316
383
|
print string(123)
|
|
317
384
|
end sub
|
|
@@ -325,18 +392,18 @@ describe('parser', () => {
|
|
|
325
392
|
age = personXml.firstChild@age
|
|
326
393
|
end sub
|
|
327
394
|
`);
|
|
328
|
-
chai_1.expect((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
|
|
395
|
+
(0, chai_1.expect)((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
|
|
329
396
|
let statements = parser.statements[0].func.body.statements;
|
|
330
397
|
let first = statements[0].value;
|
|
331
|
-
chai_1.expect(first).to.be.instanceof(Expression_1.XmlAttributeGetExpression);
|
|
332
|
-
chai_1.expect(first.name.text).to.equal('firstName');
|
|
333
|
-
chai_1.expect(first.at.text).to.equal('@');
|
|
334
|
-
chai_1.expect(first.obj.name.text).to.equal('personXml');
|
|
398
|
+
(0, chai_1.expect)(first).to.be.instanceof(Expression_1.XmlAttributeGetExpression);
|
|
399
|
+
(0, chai_1.expect)(first.name.text).to.equal('firstName');
|
|
400
|
+
(0, chai_1.expect)(first.at.text).to.equal('@');
|
|
401
|
+
(0, chai_1.expect)(first.obj.name.text).to.equal('personXml');
|
|
335
402
|
let second = statements[1].value;
|
|
336
|
-
chai_1.expect(second).to.be.instanceof(Expression_1.XmlAttributeGetExpression);
|
|
337
|
-
chai_1.expect(second.name.text).to.equal('age');
|
|
338
|
-
chai_1.expect(second.at.text).to.equal('@');
|
|
339
|
-
chai_1.expect(second.obj.name.text).to.equal('firstChild');
|
|
403
|
+
(0, chai_1.expect)(second).to.be.instanceof(Expression_1.XmlAttributeGetExpression);
|
|
404
|
+
(0, chai_1.expect)(second.name.text).to.equal('age');
|
|
405
|
+
(0, chai_1.expect)(second.at.text).to.equal('@');
|
|
406
|
+
(0, chai_1.expect)(second.obj.name.text).to.equal('firstChild');
|
|
340
407
|
});
|
|
341
408
|
it('does not allow chaining of @ symbols', () => {
|
|
342
409
|
let parser = parse(`
|
|
@@ -345,58 +412,58 @@ describe('parser', () => {
|
|
|
345
412
|
name = personXml@name@age@shoeSize
|
|
346
413
|
end sub
|
|
347
414
|
`);
|
|
348
|
-
chai_1.expect(parser.diagnostics).not.to.be.empty;
|
|
415
|
+
(0, chai_1.expect)(parser.diagnostics).not.to.be.empty;
|
|
349
416
|
});
|
|
350
417
|
it('unknown function type does not invalidate rest of function', () => {
|
|
351
418
|
let { statements, diagnostics } = parse(`
|
|
352
419
|
function log() as UNKNOWN_TYPE
|
|
353
420
|
end function
|
|
354
421
|
`, Parser_1.ParseMode.BrightScript);
|
|
355
|
-
chai_1.expect(diagnostics.length).to.be.greaterThan(0);
|
|
356
|
-
chai_1.expect(statements[0]).to.exist;
|
|
422
|
+
(0, chai_1.expect)(diagnostics.length).to.be.greaterThan(0);
|
|
423
|
+
(0, chai_1.expect)(statements[0]).to.exist;
|
|
357
424
|
});
|
|
358
425
|
it('unknown function type is not a problem in Brighterscript mode', () => {
|
|
359
426
|
let { statements, diagnostics } = parse(`
|
|
360
427
|
function log() as UNKNOWN_TYPE
|
|
361
428
|
end function
|
|
362
429
|
`, Parser_1.ParseMode.BrighterScript);
|
|
363
|
-
chai_1.expect(diagnostics.length).to.equal(0);
|
|
364
|
-
chai_1.expect(statements[0]).to.exist;
|
|
430
|
+
(0, chai_1.expect)(diagnostics.length).to.equal(0);
|
|
431
|
+
(0, chai_1.expect)(statements[0]).to.exist;
|
|
365
432
|
});
|
|
366
433
|
it('allows namespaced function type in Brighterscript mode', () => {
|
|
367
434
|
let { statements, diagnostics } = parse(`
|
|
368
435
|
function log() as SOME_NAMESPACE.UNKNOWN_TYPE
|
|
369
436
|
end function
|
|
370
437
|
`, Parser_1.ParseMode.BrighterScript);
|
|
371
|
-
chai_1.expect(diagnostics.length).to.equal(0);
|
|
372
|
-
chai_1.expect(statements[0]).to.exist;
|
|
438
|
+
(0, chai_1.expect)(diagnostics.length).to.equal(0);
|
|
439
|
+
(0, chai_1.expect)(statements[0]).to.exist;
|
|
373
440
|
});
|
|
374
441
|
it('allows custom parameter types in BrighterscriptMode', () => {
|
|
375
442
|
let { statements, diagnostics } = parse(`
|
|
376
443
|
sub foo(value as UNKNOWN_TYPE)
|
|
377
444
|
end sub
|
|
378
445
|
`, Parser_1.ParseMode.BrighterScript);
|
|
379
|
-
chai_1.expect(diagnostics.length).to.equal(0);
|
|
380
|
-
chai_1.expect(statements[0]).to.exist;
|
|
446
|
+
(0, chai_1.expect)(diagnostics.length).to.equal(0);
|
|
447
|
+
(0, chai_1.expect)(statements[0]).to.exist;
|
|
381
448
|
});
|
|
382
449
|
it('does not allow custom parameter types in Brightscript Mode', () => {
|
|
383
450
|
let { diagnostics } = parse(`
|
|
384
451
|
sub foo(value as UNKNOWN_TYPE)
|
|
385
452
|
end sub
|
|
386
453
|
`, Parser_1.ParseMode.BrightScript);
|
|
387
|
-
chai_1.expect(diagnostics.length).not.to.equal(0);
|
|
454
|
+
(0, chai_1.expect)(diagnostics.length).not.to.equal(0);
|
|
388
455
|
});
|
|
389
456
|
it('allows custom namespaced parameter types in BrighterscriptMode', () => {
|
|
390
457
|
let { statements, diagnostics } = parse(`
|
|
391
458
|
sub foo(value as SOME_NAMESPACE.UNKNOWN_TYPE)
|
|
392
459
|
end sub
|
|
393
460
|
`, Parser_1.ParseMode.BrighterScript);
|
|
394
|
-
chai_1.expect(diagnostics.length).to.equal(0);
|
|
395
|
-
chai_1.expect(statements[0]).to.exist;
|
|
461
|
+
(0, chai_1.expect)(diagnostics.length).to.equal(0);
|
|
462
|
+
(0, chai_1.expect)(statements[0]).to.exist;
|
|
396
463
|
});
|
|
397
464
|
it('works with conditionals', () => {
|
|
398
465
|
var _a;
|
|
399
|
-
chai_1.expect((_a = parse(`
|
|
466
|
+
(0, chai_1.expect)((_a = parse(`
|
|
400
467
|
function printNumber()
|
|
401
468
|
if true then
|
|
402
469
|
print 1
|
|
@@ -408,11 +475,11 @@ describe('parser', () => {
|
|
|
408
475
|
});
|
|
409
476
|
it('supports single-line if statements', () => {
|
|
410
477
|
var _a;
|
|
411
|
-
chai_1.expect((_a = parse(`If true Then print "error" : Stop`).diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
|
|
478
|
+
(0, chai_1.expect)((_a = parse(`If true Then print "error" : Stop`).diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
|
|
412
479
|
});
|
|
413
480
|
it('works with excess newlines', () => {
|
|
414
481
|
var _a;
|
|
415
|
-
let { tokens } =
|
|
482
|
+
let { tokens } = Lexer_1.Lexer.scan('function boolToNumber() as string\n\n' +
|
|
416
483
|
' if true then\n\n' +
|
|
417
484
|
' print 1\n\n' +
|
|
418
485
|
' elseif true then\n\n' +
|
|
@@ -421,39 +488,39 @@ describe('parser', () => {
|
|
|
421
488
|
' print 1\n\n' +
|
|
422
489
|
' end if\n\n' +
|
|
423
490
|
'end function\n\n');
|
|
424
|
-
chai_1.expect((_a = Parser_1.Parser.parse(tokens).diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
|
|
491
|
+
(0, chai_1.expect)((_a = Parser_1.Parser.parse(tokens).diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
|
|
425
492
|
});
|
|
426
493
|
it('does not invalidate entire file when line ends with a period', () => {
|
|
427
|
-
let { tokens } =
|
|
494
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
428
495
|
sub main()
|
|
429
496
|
person.a
|
|
430
497
|
end sub
|
|
431
498
|
|
|
432
499
|
`);
|
|
433
500
|
let { diagnostics } = Parser_1.Parser.parse(tokens);
|
|
434
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1, 'Error count should be 0');
|
|
501
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1, 'Error count should be 0');
|
|
435
502
|
});
|
|
436
503
|
it.skip('allows printing object with trailing period', () => {
|
|
437
|
-
let { tokens } =
|
|
504
|
+
let { tokens } = Lexer_1.Lexer.scan(`print a.`);
|
|
438
505
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
439
506
|
let printStatement = statements[0];
|
|
440
|
-
chai_1.expect(diagnostics).to.be.empty;
|
|
441
|
-
chai_1.expect(printStatement).to.be.instanceof(Statement_1.PrintStatement);
|
|
442
|
-
chai_1.expect(printStatement.expressions[0]).to.be.instanceof(Expression_1.DottedGetExpression);
|
|
507
|
+
(0, chai_1.expect)(diagnostics).to.be.empty;
|
|
508
|
+
(0, chai_1.expect)(printStatement).to.be.instanceof(Statement_1.PrintStatement);
|
|
509
|
+
(0, chai_1.expect)(printStatement.expressions[0]).to.be.instanceof(Expression_1.DottedGetExpression);
|
|
443
510
|
});
|
|
444
511
|
describe('comments', () => {
|
|
445
512
|
it('combines multi-line comments', () => {
|
|
446
|
-
let { tokens } =
|
|
513
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
447
514
|
'line 1
|
|
448
515
|
'line 2
|
|
449
516
|
'line 3
|
|
450
517
|
`);
|
|
451
518
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
452
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
453
|
-
chai_1.expect(statements[0].text).to.equal(`'line 1\n'line 2\n'line 3`);
|
|
519
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
520
|
+
(0, chai_1.expect)(statements[0].text).to.equal(`'line 1\n'line 2\n'line 3`);
|
|
454
521
|
});
|
|
455
522
|
it('does not combile comments separated by newlines', () => {
|
|
456
|
-
let { tokens } =
|
|
523
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
457
524
|
'line 1
|
|
458
525
|
|
|
459
526
|
'line 2
|
|
@@ -461,57 +528,57 @@ describe('parser', () => {
|
|
|
461
528
|
'line 3
|
|
462
529
|
`);
|
|
463
530
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
464
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
465
|
-
chai_1.expect(statements).to.be.lengthOf(3);
|
|
466
|
-
chai_1.expect(statements[0].text).to.equal(`'line 1`);
|
|
467
|
-
chai_1.expect(statements[1].text).to.equal(`'line 2`);
|
|
468
|
-
chai_1.expect(statements[2].text).to.equal(`'line 3`);
|
|
531
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
532
|
+
(0, chai_1.expect)(statements).to.be.lengthOf(3);
|
|
533
|
+
(0, chai_1.expect)(statements[0].text).to.equal(`'line 1`);
|
|
534
|
+
(0, chai_1.expect)(statements[1].text).to.equal(`'line 2`);
|
|
535
|
+
(0, chai_1.expect)(statements[2].text).to.equal(`'line 3`);
|
|
469
536
|
});
|
|
470
537
|
it('works after print statement', () => {
|
|
471
|
-
let { tokens } =
|
|
538
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
472
539
|
sub main()
|
|
473
540
|
print "hi" 'comment 1
|
|
474
541
|
end sub
|
|
475
542
|
`);
|
|
476
543
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
477
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
478
|
-
chai_1.expect(statements[0].func.body.statements[1].text).to.equal(`'comment 1`);
|
|
544
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
545
|
+
(0, chai_1.expect)(statements[0].func.body.statements[1].text).to.equal(`'comment 1`);
|
|
479
546
|
});
|
|
480
547
|
it('declaration-level', () => {
|
|
481
|
-
let { tokens } =
|
|
548
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
482
549
|
'comment 1
|
|
483
550
|
function a()
|
|
484
551
|
end function
|
|
485
552
|
'comment 2
|
|
486
553
|
`);
|
|
487
554
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
488
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
489
|
-
chai_1.expect(statements[0].text).to.equal(`'comment 1`);
|
|
490
|
-
chai_1.expect(statements[2].text).to.equal(`'comment 2`);
|
|
555
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
556
|
+
(0, chai_1.expect)(statements[0].text).to.equal(`'comment 1`);
|
|
557
|
+
(0, chai_1.expect)(statements[2].text).to.equal(`'comment 2`);
|
|
491
558
|
});
|
|
492
559
|
it('works in aa literal as its own statement', () => {
|
|
493
|
-
let { tokens } =
|
|
560
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
494
561
|
obj = {
|
|
495
562
|
"name": true,
|
|
496
563
|
'comment
|
|
497
564
|
}
|
|
498
565
|
`);
|
|
499
566
|
let { diagnostics } = Parser_1.Parser.parse(tokens);
|
|
500
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
567
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be 0');
|
|
501
568
|
});
|
|
502
569
|
it('parses after function call', () => {
|
|
503
|
-
let { tokens } =
|
|
570
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
504
571
|
sub Main()
|
|
505
572
|
name = "Hello"
|
|
506
573
|
DoSomething(name) 'comment 1
|
|
507
574
|
end sub
|
|
508
575
|
`);
|
|
509
576
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
510
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Should have zero diagnostics');
|
|
511
|
-
chai_1.expect(statements[0].func.body.statements[2].text).to.equal(`'comment 1`);
|
|
577
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Should have zero diagnostics');
|
|
578
|
+
(0, chai_1.expect)(statements[0].func.body.statements[2].text).to.equal(`'comment 1`);
|
|
512
579
|
});
|
|
513
580
|
it('function', () => {
|
|
514
|
-
let { tokens } =
|
|
581
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
515
582
|
function a() 'comment 1
|
|
516
583
|
'comment 2
|
|
517
584
|
num = 1
|
|
@@ -519,14 +586,14 @@ describe('parser', () => {
|
|
|
519
586
|
end function 'comment 4
|
|
520
587
|
`);
|
|
521
588
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
522
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Should have zero diagnostics');
|
|
523
|
-
chai_1.expect(statements[0].func.body.statements[0].text).to.equal(`'comment 1`);
|
|
524
|
-
chai_1.expect(statements[0].func.body.statements[1].text).to.equal(`'comment 2`);
|
|
525
|
-
chai_1.expect(statements[0].func.body.statements[3].text).to.equal(`'comment 3`);
|
|
526
|
-
chai_1.expect(statements[1].text).to.equal(`'comment 4`);
|
|
589
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Should have zero diagnostics');
|
|
590
|
+
(0, chai_1.expect)(statements[0].func.body.statements[0].text).to.equal(`'comment 1`);
|
|
591
|
+
(0, chai_1.expect)(statements[0].func.body.statements[1].text).to.equal(`'comment 2`);
|
|
592
|
+
(0, chai_1.expect)(statements[0].func.body.statements[3].text).to.equal(`'comment 3`);
|
|
593
|
+
(0, chai_1.expect)(statements[1].text).to.equal(`'comment 4`);
|
|
527
594
|
});
|
|
528
595
|
it('if statement`', () => {
|
|
529
|
-
let { tokens } =
|
|
596
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
530
597
|
function a()
|
|
531
598
|
if true then 'comment 1
|
|
532
599
|
'comment 2
|
|
@@ -544,21 +611,21 @@ describe('parser', () => {
|
|
|
544
611
|
end function
|
|
545
612
|
`);
|
|
546
613
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
547
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Should have zero diagnostics');
|
|
614
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Should have zero diagnostics');
|
|
548
615
|
let fnSmt = statements[0];
|
|
549
|
-
if (reflection_1.isFunctionStatement(fnSmt)) {
|
|
616
|
+
if ((0, reflection_1.isFunctionStatement)(fnSmt)) {
|
|
550
617
|
let ifStmt = fnSmt.func.body.statements[0];
|
|
551
|
-
if (reflection_1.isIfStatement(ifStmt)) {
|
|
618
|
+
if ((0, reflection_1.isIfStatement)(ifStmt)) {
|
|
552
619
|
expectCommentWithText(ifStmt.thenBranch.statements[0], `'comment 1`);
|
|
553
620
|
expectCommentWithText(ifStmt.thenBranch.statements[1], `'comment 2`);
|
|
554
621
|
expectCommentWithText(ifStmt.thenBranch.statements[3], `'comment 3`);
|
|
555
622
|
let elseIfBranch = ifStmt.elseBranch;
|
|
556
|
-
if (reflection_1.isIfStatement(elseIfBranch)) {
|
|
623
|
+
if ((0, reflection_1.isIfStatement)(elseIfBranch)) {
|
|
557
624
|
expectCommentWithText(elseIfBranch.thenBranch.statements[0], `'comment 4`);
|
|
558
625
|
expectCommentWithText(elseIfBranch.thenBranch.statements[1], `'comment 5`);
|
|
559
626
|
expectCommentWithText(elseIfBranch.thenBranch.statements[3], `'comment 6`);
|
|
560
627
|
let elseBranch = elseIfBranch.elseBranch;
|
|
561
|
-
if (reflection_1.isBlock(elseBranch)) {
|
|
628
|
+
if ((0, reflection_1.isBlock)(elseBranch)) {
|
|
562
629
|
expectCommentWithText(elseBranch.statements[0], `'comment 7`);
|
|
563
630
|
expectCommentWithText(elseBranch.statements[1], `'comment 8`);
|
|
564
631
|
expectCommentWithText(elseBranch.statements[3], `'comment 9`);
|
|
@@ -581,7 +648,7 @@ describe('parser', () => {
|
|
|
581
648
|
}
|
|
582
649
|
});
|
|
583
650
|
it('while', () => {
|
|
584
|
-
let { tokens } =
|
|
651
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
585
652
|
function a()
|
|
586
653
|
while true 'comment 1
|
|
587
654
|
'comment 2
|
|
@@ -591,15 +658,15 @@ describe('parser', () => {
|
|
|
591
658
|
end function
|
|
592
659
|
`);
|
|
593
660
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
594
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be zero');
|
|
661
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be zero');
|
|
595
662
|
let stmt = statements[0].func.body.statements[0];
|
|
596
|
-
chai_1.expect(stmt.body.statements[0].text).to.equal(`'comment 1`);
|
|
597
|
-
chai_1.expect(stmt.body.statements[1].text).to.equal(`'comment 2`);
|
|
598
|
-
chai_1.expect(stmt.body.statements[3].text).to.equal(`'comment 3`);
|
|
599
|
-
chai_1.expect(statements[0].func.body.statements[1].text).to.equal(`'comment 4`);
|
|
663
|
+
(0, chai_1.expect)(stmt.body.statements[0].text).to.equal(`'comment 1`);
|
|
664
|
+
(0, chai_1.expect)(stmt.body.statements[1].text).to.equal(`'comment 2`);
|
|
665
|
+
(0, chai_1.expect)(stmt.body.statements[3].text).to.equal(`'comment 3`);
|
|
666
|
+
(0, chai_1.expect)(statements[0].func.body.statements[1].text).to.equal(`'comment 4`);
|
|
600
667
|
});
|
|
601
668
|
it('for', () => {
|
|
602
|
-
let { tokens } =
|
|
669
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
603
670
|
function a()
|
|
604
671
|
for i = 0 to 10 step 1 'comment 1
|
|
605
672
|
'comment 2
|
|
@@ -609,15 +676,15 @@ describe('parser', () => {
|
|
|
609
676
|
end function
|
|
610
677
|
`);
|
|
611
678
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
612
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be zero');
|
|
679
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be zero');
|
|
613
680
|
let stmt = statements[0].func.body.statements[0];
|
|
614
|
-
chai_1.expect(stmt.body.statements[0].text).to.equal(`'comment 1`);
|
|
615
|
-
chai_1.expect(stmt.body.statements[1].text).to.equal(`'comment 2`);
|
|
616
|
-
chai_1.expect(stmt.body.statements[3].text).to.equal(`'comment 3`);
|
|
617
|
-
chai_1.expect(statements[0].func.body.statements[1].text).to.equal(`'comment 4`);
|
|
681
|
+
(0, chai_1.expect)(stmt.body.statements[0].text).to.equal(`'comment 1`);
|
|
682
|
+
(0, chai_1.expect)(stmt.body.statements[1].text).to.equal(`'comment 2`);
|
|
683
|
+
(0, chai_1.expect)(stmt.body.statements[3].text).to.equal(`'comment 3`);
|
|
684
|
+
(0, chai_1.expect)(statements[0].func.body.statements[1].text).to.equal(`'comment 4`);
|
|
618
685
|
});
|
|
619
686
|
it('for each', () => {
|
|
620
|
-
let { tokens } =
|
|
687
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
621
688
|
function a()
|
|
622
689
|
for each val in [1,2,3] 'comment 1
|
|
623
690
|
'comment 2
|
|
@@ -627,12 +694,12 @@ describe('parser', () => {
|
|
|
627
694
|
end function
|
|
628
695
|
`);
|
|
629
696
|
let { diagnostics, statements } = Parser_1.Parser.parse(tokens);
|
|
630
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0, 'Error count should be zero');
|
|
697
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0, 'Error count should be zero');
|
|
631
698
|
let stmt = statements[0].func.body.statements[0];
|
|
632
|
-
chai_1.expect(stmt.body.statements[0].text).to.equal(`'comment 1`);
|
|
633
|
-
chai_1.expect(stmt.body.statements[1].text).to.equal(`'comment 2`);
|
|
634
|
-
chai_1.expect(stmt.body.statements[3].text).to.equal(`'comment 3`);
|
|
635
|
-
chai_1.expect(statements[0].func.body.statements[1].text).to.equal(`'comment 4`);
|
|
699
|
+
(0, chai_1.expect)(stmt.body.statements[0].text).to.equal(`'comment 1`);
|
|
700
|
+
(0, chai_1.expect)(stmt.body.statements[1].text).to.equal(`'comment 2`);
|
|
701
|
+
(0, chai_1.expect)(stmt.body.statements[3].text).to.equal(`'comment 3`);
|
|
702
|
+
(0, chai_1.expect)(statements[0].func.body.statements[1].text).to.equal(`'comment 4`);
|
|
636
703
|
});
|
|
637
704
|
});
|
|
638
705
|
});
|
|
@@ -644,7 +711,7 @@ describe('parser', () => {
|
|
|
644
711
|
then = true
|
|
645
712
|
end sub
|
|
646
713
|
`);
|
|
647
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1);
|
|
714
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
|
|
648
715
|
});
|
|
649
716
|
it('is allowed as an AA property name', () => {
|
|
650
717
|
var _a;
|
|
@@ -657,7 +724,7 @@ describe('parser', () => {
|
|
|
657
724
|
print person.then
|
|
658
725
|
end sub
|
|
659
726
|
`);
|
|
660
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
727
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
661
728
|
});
|
|
662
729
|
});
|
|
663
730
|
it('"end" is not allowed as a local identifier', () => {
|
|
@@ -666,20 +733,20 @@ describe('parser', () => {
|
|
|
666
733
|
end = true
|
|
667
734
|
end sub
|
|
668
735
|
`);
|
|
669
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
736
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
670
737
|
});
|
|
671
738
|
it('none of them can be used as local variables', () => {
|
|
672
|
-
let reservedWords = new Set(
|
|
739
|
+
let reservedWords = new Set(TokenKind_1.ReservedWords);
|
|
673
740
|
//remove the rem keyword because it's a comment...won't cause error
|
|
674
741
|
reservedWords.delete('rem');
|
|
675
742
|
for (let reservedWord of reservedWords) {
|
|
676
|
-
let { tokens } =
|
|
743
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
677
744
|
sub main()
|
|
678
745
|
${reservedWord} = true
|
|
679
746
|
end sub
|
|
680
747
|
`);
|
|
681
748
|
let { diagnostics } = Parser_1.Parser.parse(tokens);
|
|
682
|
-
chai_1.expect(diagnostics, `assigning to reserved word "${reservedWord}" should have been an error`).to.be.length.greaterThan(0);
|
|
749
|
+
(0, chai_1.expect)(diagnostics, `assigning to reserved word "${reservedWord}" should have been an error`).to.be.length.greaterThan(0);
|
|
683
750
|
}
|
|
684
751
|
});
|
|
685
752
|
});
|
|
@@ -689,24 +756,24 @@ describe('parser', () => {
|
|
|
689
756
|
let { statements, diagnostics } = parse(`
|
|
690
757
|
import "somePath"
|
|
691
758
|
`, Parser_1.ParseMode.BrighterScript);
|
|
692
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
693
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.ImportStatement);
|
|
759
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
760
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.ImportStatement);
|
|
694
761
|
});
|
|
695
762
|
it('catches import statements used in brightscript files', () => {
|
|
696
763
|
var _a;
|
|
697
764
|
let { statements, diagnostics } = parse(`
|
|
698
765
|
import "somePath"
|
|
699
766
|
`, Parser_1.ParseMode.BrightScript);
|
|
700
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.eql(DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('import statements').message);
|
|
701
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.ImportStatement);
|
|
767
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.eql(DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('import statements').message);
|
|
768
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.ImportStatement);
|
|
702
769
|
});
|
|
703
770
|
it('catches missing file path', () => {
|
|
704
771
|
var _a;
|
|
705
772
|
let { statements, diagnostics } = parse(`
|
|
706
773
|
import
|
|
707
774
|
`, Parser_1.ParseMode.BrighterScript);
|
|
708
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedStringLiteralAfterKeyword('import').message);
|
|
709
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.ImportStatement);
|
|
775
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedStringLiteralAfterKeyword('import').message);
|
|
776
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.ImportStatement);
|
|
710
777
|
});
|
|
711
778
|
});
|
|
712
779
|
describe('Annotations', () => {
|
|
@@ -717,7 +784,7 @@ describe('parser', () => {
|
|
|
717
784
|
sub main()
|
|
718
785
|
end sub
|
|
719
786
|
`, Parser_1.ParseMode.BrighterScript);
|
|
720
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unexpectedToken('@').message);
|
|
787
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unexpectedToken('@').message);
|
|
721
788
|
});
|
|
722
789
|
it('properly handles empty annotation above class method', () => {
|
|
723
790
|
var _a;
|
|
@@ -729,7 +796,7 @@ describe('parser', () => {
|
|
|
729
796
|
end sub
|
|
730
797
|
end class
|
|
731
798
|
`, Parser_1.ParseMode.BrighterScript);
|
|
732
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedIdentifier().message);
|
|
799
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedIdentifier().message);
|
|
733
800
|
});
|
|
734
801
|
it('parses with error if annotation is not followed by a statement', () => {
|
|
735
802
|
var _a, _b, _c, _d;
|
|
@@ -743,11 +810,11 @@ describe('parser', () => {
|
|
|
743
810
|
end class
|
|
744
811
|
@meta1
|
|
745
812
|
`, Parser_1.ParseMode.BrighterScript);
|
|
746
|
-
chai_1.expect(diagnostics.length).to.equal(4);
|
|
747
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
748
|
-
chai_1.expect((_b = diagnostics[1]) === null || _b === void 0 ? void 0 : _b.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
749
|
-
chai_1.expect((_c = diagnostics[2]) === null || _c === void 0 ? void 0 : _c.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
750
|
-
chai_1.expect((_d = diagnostics[3]) === null || _d === void 0 ? void 0 : _d.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
813
|
+
(0, chai_1.expect)(diagnostics.length).to.equal(4);
|
|
814
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
815
|
+
(0, chai_1.expect)((_b = diagnostics[1]) === null || _b === void 0 ? void 0 : _b.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
816
|
+
(0, chai_1.expect)((_c = diagnostics[2]) === null || _c === void 0 ? void 0 : _c.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
817
|
+
(0, chai_1.expect)((_d = diagnostics[3]) === null || _d === void 0 ? void 0 : _d.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.unusedAnnotation().message);
|
|
751
818
|
});
|
|
752
819
|
it('attaches an annotation to next statement', () => {
|
|
753
820
|
var _a;
|
|
@@ -759,18 +826,18 @@ describe('parser', () => {
|
|
|
759
826
|
@meta2 sub init()
|
|
760
827
|
end sub
|
|
761
828
|
`, Parser_1.ParseMode.BrighterScript);
|
|
762
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
763
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
829
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
830
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
764
831
|
let fn = statements[0];
|
|
765
|
-
chai_1.expect(fn.annotations).to.exist;
|
|
766
|
-
chai_1.expect(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
767
|
-
chai_1.expect(fn.annotations[0].nameToken.text).to.equal('meta1');
|
|
768
|
-
chai_1.expect(fn.annotations[0].name).to.equal('meta1');
|
|
769
|
-
chai_1.expect(statements[1]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
832
|
+
(0, chai_1.expect)(fn.annotations).to.exist;
|
|
833
|
+
(0, chai_1.expect)(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
834
|
+
(0, chai_1.expect)(fn.annotations[0].nameToken.text).to.equal('meta1');
|
|
835
|
+
(0, chai_1.expect)(fn.annotations[0].name).to.equal('meta1');
|
|
836
|
+
(0, chai_1.expect)(statements[1]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
770
837
|
fn = statements[1];
|
|
771
|
-
chai_1.expect(fn.annotations).to.exist;
|
|
772
|
-
chai_1.expect(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
773
|
-
chai_1.expect(fn.annotations[0].nameToken.text).to.equal('meta2');
|
|
838
|
+
(0, chai_1.expect)(fn.annotations).to.exist;
|
|
839
|
+
(0, chai_1.expect)(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
840
|
+
(0, chai_1.expect)(fn.annotations[0].nameToken.text).to.equal('meta2');
|
|
774
841
|
});
|
|
775
842
|
it('attaches annotations inside a function body', () => {
|
|
776
843
|
var _a, _b;
|
|
@@ -780,13 +847,13 @@ describe('parser', () => {
|
|
|
780
847
|
print "hello"
|
|
781
848
|
end function
|
|
782
849
|
`, Parser_1.ParseMode.BrighterScript);
|
|
783
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
850
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
784
851
|
let fn = statements[0];
|
|
785
852
|
let fnStatements = fn.func.body.statements;
|
|
786
853
|
let stat = fnStatements[0];
|
|
787
|
-
chai_1.expect(stat).to.exist;
|
|
788
|
-
chai_1.expect((_b = stat.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
789
|
-
chai_1.expect(stat.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
854
|
+
(0, chai_1.expect)(stat).to.exist;
|
|
855
|
+
(0, chai_1.expect)((_b = stat.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
856
|
+
(0, chai_1.expect)(stat.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
790
857
|
});
|
|
791
858
|
it('attaches multiple annotations to next statement', () => {
|
|
792
859
|
var _a;
|
|
@@ -796,14 +863,14 @@ describe('parser', () => {
|
|
|
796
863
|
function main()
|
|
797
864
|
end function
|
|
798
865
|
`, Parser_1.ParseMode.BrighterScript);
|
|
799
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
800
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
866
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
867
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
801
868
|
let fn = statements[0];
|
|
802
|
-
chai_1.expect(fn.annotations).to.exist;
|
|
803
|
-
chai_1.expect(fn.annotations.length).to.equal(3);
|
|
804
|
-
chai_1.expect(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
805
|
-
chai_1.expect(fn.annotations[1]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
806
|
-
chai_1.expect(fn.annotations[2]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
869
|
+
(0, chai_1.expect)(fn.annotations).to.exist;
|
|
870
|
+
(0, chai_1.expect)(fn.annotations.length).to.equal(3);
|
|
871
|
+
(0, chai_1.expect)(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
872
|
+
(0, chai_1.expect)(fn.annotations[1]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
873
|
+
(0, chai_1.expect)(fn.annotations[2]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
807
874
|
});
|
|
808
875
|
it('allows annotations with parameters', () => {
|
|
809
876
|
var _a;
|
|
@@ -812,12 +879,12 @@ describe('parser', () => {
|
|
|
812
879
|
function main()
|
|
813
880
|
end function
|
|
814
881
|
`, Parser_1.ParseMode.BrighterScript);
|
|
815
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
882
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
816
883
|
let fn = statements[0];
|
|
817
|
-
chai_1.expect(fn.annotations).to.exist;
|
|
818
|
-
chai_1.expect(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
819
|
-
chai_1.expect(fn.annotations[0].nameToken.text).to.equal('meta1');
|
|
820
|
-
chai_1.expect(fn.annotations[0].call).to.be.instanceof(Expression_1.CallExpression);
|
|
884
|
+
(0, chai_1.expect)(fn.annotations).to.exist;
|
|
885
|
+
(0, chai_1.expect)(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
886
|
+
(0, chai_1.expect)(fn.annotations[0].nameToken.text).to.equal('meta1');
|
|
887
|
+
(0, chai_1.expect)(fn.annotations[0].call).to.be.instanceof(Expression_1.CallExpression);
|
|
821
888
|
});
|
|
822
889
|
it('attaches annotations to a class', () => {
|
|
823
890
|
var _a, _b;
|
|
@@ -829,10 +896,10 @@ describe('parser', () => {
|
|
|
829
896
|
end function
|
|
830
897
|
end class
|
|
831
898
|
`, Parser_1.ParseMode.BrighterScript);
|
|
832
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
899
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
833
900
|
let cs = statements[0];
|
|
834
|
-
chai_1.expect((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
835
|
-
chai_1.expect(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
901
|
+
(0, chai_1.expect)((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
902
|
+
(0, chai_1.expect)(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
836
903
|
});
|
|
837
904
|
it('attaches annotations to multiple clases', () => {
|
|
838
905
|
var _a, _b, _c;
|
|
@@ -850,15 +917,15 @@ describe('parser', () => {
|
|
|
850
917
|
end function
|
|
851
918
|
end class
|
|
852
919
|
`, Parser_1.ParseMode.BrighterScript);
|
|
853
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
920
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
854
921
|
let cs = statements[0];
|
|
855
|
-
chai_1.expect((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
856
|
-
chai_1.expect(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
857
|
-
chai_1.expect(cs.annotations[0].name).to.equal('meta1');
|
|
922
|
+
(0, chai_1.expect)((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
923
|
+
(0, chai_1.expect)(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
924
|
+
(0, chai_1.expect)(cs.annotations[0].name).to.equal('meta1');
|
|
858
925
|
let cs2 = statements[1];
|
|
859
|
-
chai_1.expect((_c = cs2.annotations) === null || _c === void 0 ? void 0 : _c.length).to.equal(1);
|
|
860
|
-
chai_1.expect(cs2.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
861
|
-
chai_1.expect(cs2.annotations[0].name).to.equal('meta2');
|
|
926
|
+
(0, chai_1.expect)((_c = cs2.annotations) === null || _c === void 0 ? void 0 : _c.length).to.equal(1);
|
|
927
|
+
(0, chai_1.expect)(cs2.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
928
|
+
(0, chai_1.expect)(cs2.annotations[0].name).to.equal('meta2');
|
|
862
929
|
});
|
|
863
930
|
it('attaches annotations to a namespaced class', () => {
|
|
864
931
|
var _a, _b;
|
|
@@ -872,11 +939,11 @@ describe('parser', () => {
|
|
|
872
939
|
end class
|
|
873
940
|
end namespace
|
|
874
941
|
`, Parser_1.ParseMode.BrighterScript);
|
|
875
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
942
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
876
943
|
let ns = statements[0];
|
|
877
944
|
let cs = ns.body.statements[0];
|
|
878
|
-
chai_1.expect((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
879
|
-
chai_1.expect(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
945
|
+
(0, chai_1.expect)((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
946
|
+
(0, chai_1.expect)(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
880
947
|
});
|
|
881
948
|
it('attaches annotations to a namespaced class - multiple', () => {
|
|
882
949
|
var _a, _b, _c;
|
|
@@ -896,16 +963,16 @@ describe('parser', () => {
|
|
|
896
963
|
end class
|
|
897
964
|
end namespace
|
|
898
965
|
`, Parser_1.ParseMode.BrighterScript);
|
|
899
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
966
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
900
967
|
let ns = statements[0];
|
|
901
968
|
let cs = ns.body.statements[0];
|
|
902
|
-
chai_1.expect((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
903
|
-
chai_1.expect(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
904
|
-
chai_1.expect(cs.annotations[0].name).to.equal('meta1');
|
|
969
|
+
(0, chai_1.expect)((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
970
|
+
(0, chai_1.expect)(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
971
|
+
(0, chai_1.expect)(cs.annotations[0].name).to.equal('meta1');
|
|
905
972
|
let cs2 = ns.body.statements[1];
|
|
906
|
-
chai_1.expect((_c = cs2.annotations) === null || _c === void 0 ? void 0 : _c.length).to.equal(1);
|
|
907
|
-
chai_1.expect(cs2.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
908
|
-
chai_1.expect(cs2.annotations[0].name).to.equal('meta2');
|
|
973
|
+
(0, chai_1.expect)((_c = cs2.annotations) === null || _c === void 0 ? void 0 : _c.length).to.equal(1);
|
|
974
|
+
(0, chai_1.expect)(cs2.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
975
|
+
(0, chai_1.expect)(cs2.annotations[0].name).to.equal('meta2');
|
|
909
976
|
});
|
|
910
977
|
it('attaches annotations to a class constructor', () => {
|
|
911
978
|
var _a, _b;
|
|
@@ -920,11 +987,11 @@ describe('parser', () => {
|
|
|
920
987
|
end function
|
|
921
988
|
end class
|
|
922
989
|
`, Parser_1.ParseMode.BrighterScript);
|
|
923
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
990
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
924
991
|
let cs = statements[0];
|
|
925
992
|
let stat = cs.body[0];
|
|
926
|
-
chai_1.expect((_b = stat.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
927
|
-
chai_1.expect(stat.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
993
|
+
(0, chai_1.expect)((_b = stat.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
994
|
+
(0, chai_1.expect)(stat.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
928
995
|
});
|
|
929
996
|
it('attaches annotations to a class methods', () => {
|
|
930
997
|
var _a, _b;
|
|
@@ -939,11 +1006,11 @@ describe('parser', () => {
|
|
|
939
1006
|
end function
|
|
940
1007
|
end class
|
|
941
1008
|
`, Parser_1.ParseMode.BrighterScript);
|
|
942
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
1009
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
943
1010
|
let cs = statements[0];
|
|
944
1011
|
let stat = cs.body[1];
|
|
945
|
-
chai_1.expect((_b = stat.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
946
|
-
chai_1.expect(stat.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
1012
|
+
(0, chai_1.expect)((_b = stat.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
1013
|
+
(0, chai_1.expect)(stat.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
947
1014
|
});
|
|
948
1015
|
it('attaches annotations to a class methods, fields and constructor', () => {
|
|
949
1016
|
var _a, _b, _c, _d, _e;
|
|
@@ -967,19 +1034,19 @@ describe('parser', () => {
|
|
|
967
1034
|
public foo="bar"
|
|
968
1035
|
end class
|
|
969
1036
|
`, Parser_1.ParseMode.BrighterScript);
|
|
970
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
1037
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
971
1038
|
let cs = statements[0];
|
|
972
|
-
chai_1.expect((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(2);
|
|
973
|
-
chai_1.expect(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
1039
|
+
(0, chai_1.expect)((_b = cs.annotations) === null || _b === void 0 ? void 0 : _b.length).to.equal(2);
|
|
1040
|
+
(0, chai_1.expect)(cs.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
974
1041
|
let stat1 = cs.body[0];
|
|
975
1042
|
let stat2 = cs.body[1];
|
|
976
1043
|
let f1 = cs.body[2];
|
|
977
|
-
chai_1.expect((_c = stat1.annotations) === null || _c === void 0 ? void 0 : _c.length).to.equal(2);
|
|
978
|
-
chai_1.expect(stat1.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
979
|
-
chai_1.expect((_d = stat2.annotations) === null || _d === void 0 ? void 0 : _d.length).to.equal(2);
|
|
980
|
-
chai_1.expect(stat2.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
981
|
-
chai_1.expect((_e = f1.annotations) === null || _e === void 0 ? void 0 : _e.length).to.equal(2);
|
|
982
|
-
chai_1.expect(f1.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
1044
|
+
(0, chai_1.expect)((_c = stat1.annotations) === null || _c === void 0 ? void 0 : _c.length).to.equal(2);
|
|
1045
|
+
(0, chai_1.expect)(stat1.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
1046
|
+
(0, chai_1.expect)((_d = stat2.annotations) === null || _d === void 0 ? void 0 : _d.length).to.equal(2);
|
|
1047
|
+
(0, chai_1.expect)(stat2.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
1048
|
+
(0, chai_1.expect)((_e = f1.annotations) === null || _e === void 0 ? void 0 : _e.length).to.equal(2);
|
|
1049
|
+
(0, chai_1.expect)(f1.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
983
1050
|
});
|
|
984
1051
|
it('ignores annotations on commented out lines', () => {
|
|
985
1052
|
var _a;
|
|
@@ -990,9 +1057,9 @@ describe('parser', () => {
|
|
|
990
1057
|
print "hello"
|
|
991
1058
|
end function
|
|
992
1059
|
`, Parser_1.ParseMode.BrighterScript);
|
|
993
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
1060
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
994
1061
|
let cs = statements[0];
|
|
995
|
-
chai_1.expect(cs.annotations).to.be.undefined;
|
|
1062
|
+
(0, chai_1.expect)(cs.annotations).to.be.undefined;
|
|
996
1063
|
});
|
|
997
1064
|
it('can convert argument of an annotation to JS types', () => {
|
|
998
1065
|
var _a;
|
|
@@ -1010,22 +1077,22 @@ describe('parser', () => {
|
|
|
1010
1077
|
sub init()
|
|
1011
1078
|
end sub
|
|
1012
1079
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1013
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
1014
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
1080
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
1081
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
1015
1082
|
let fn = statements[0];
|
|
1016
|
-
chai_1.expect(fn.annotations).to.exist;
|
|
1017
|
-
chai_1.expect(fn.annotations[0].getArguments()).to.deep.equal([]);
|
|
1018
|
-
chai_1.expect(statements[1]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
1083
|
+
(0, chai_1.expect)(fn.annotations).to.exist;
|
|
1084
|
+
(0, chai_1.expect)(fn.annotations[0].getArguments()).to.deep.equal([]);
|
|
1085
|
+
(0, chai_1.expect)(statements[1]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
1019
1086
|
fn = statements[1];
|
|
1020
|
-
chai_1.expect(fn.annotations).to.exist;
|
|
1021
|
-
chai_1.expect(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
1022
|
-
chai_1.expect(fn.annotations[0].getArguments()).to.deep.equal([
|
|
1087
|
+
(0, chai_1.expect)(fn.annotations).to.exist;
|
|
1088
|
+
(0, chai_1.expect)(fn.annotations[0]).to.be.instanceof(Expression_1.AnnotationExpression);
|
|
1089
|
+
(0, chai_1.expect)(fn.annotations[0].getArguments()).to.deep.equal([
|
|
1023
1090
|
'arg', 2, true,
|
|
1024
1091
|
{ prop: 'value' }, [1, 2],
|
|
1025
1092
|
null
|
|
1026
1093
|
]);
|
|
1027
1094
|
let allArgs = fn.annotations[0].getArguments(false);
|
|
1028
|
-
chai_1.expect(allArgs.pop()).to.be.instanceOf(Expression_1.FunctionExpression);
|
|
1095
|
+
(0, chai_1.expect)(allArgs.pop()).to.be.instanceOf(Expression_1.FunctionExpression);
|
|
1029
1096
|
});
|
|
1030
1097
|
it('can handle negative numbers', () => {
|
|
1031
1098
|
var _a;
|
|
@@ -1037,11 +1104,11 @@ describe('parser', () => {
|
|
|
1037
1104
|
sub init()
|
|
1038
1105
|
end sub
|
|
1039
1106
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1040
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
1041
|
-
chai_1.expect(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
1107
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
1108
|
+
(0, chai_1.expect)(statements[0]).to.be.instanceof(Statement_1.FunctionStatement);
|
|
1042
1109
|
let fn = statements[0];
|
|
1043
|
-
chai_1.expect(fn.annotations).to.exist;
|
|
1044
|
-
chai_1.expect(fn.annotations[0].getArguments()).to.deep.equal([-100]);
|
|
1110
|
+
(0, chai_1.expect)(fn.annotations).to.exist;
|
|
1111
|
+
(0, chai_1.expect)(fn.annotations[0].getArguments()).to.deep.equal([-100]);
|
|
1045
1112
|
});
|
|
1046
1113
|
});
|
|
1047
1114
|
describe('getBscTypeFromExpression', () => {
|
|
@@ -1054,8 +1121,8 @@ describe('parser', () => {
|
|
|
1054
1121
|
end sub
|
|
1055
1122
|
`);
|
|
1056
1123
|
const func = parser.ast.statements[0].func;
|
|
1057
|
-
const type = Parser_1.getBscTypeFromExpression(func.body.statements[0].value, func);
|
|
1058
|
-
chai_1.expect(type.returnType).to.be.instanceof(VoidType_1.VoidType);
|
|
1124
|
+
const type = (0, Parser_1.getBscTypeFromExpression)(func.body.statements[0].value, func);
|
|
1125
|
+
(0, chai_1.expect)(type.returnType).to.be.instanceof(VoidType_1.VoidType);
|
|
1059
1126
|
});
|
|
1060
1127
|
it('computes return type for sub with explicit return type', () => {
|
|
1061
1128
|
const parser = parse(`
|
|
@@ -1066,8 +1133,8 @@ describe('parser', () => {
|
|
|
1066
1133
|
end sub
|
|
1067
1134
|
`);
|
|
1068
1135
|
const func = parser.ast.statements[0].func;
|
|
1069
|
-
const type = Parser_1.getBscTypeFromExpression(func.body.statements[0].value, func);
|
|
1070
|
-
chai_1.expect(type.returnType).to.be.instanceof(StringType_1.StringType);
|
|
1136
|
+
const type = (0, Parser_1.getBscTypeFromExpression)(func.body.statements[0].value, func);
|
|
1137
|
+
(0, chai_1.expect)(type.returnType).to.be.instanceof(StringType_1.StringType);
|
|
1071
1138
|
});
|
|
1072
1139
|
it('supports sub with custom return type', () => {
|
|
1073
1140
|
const parser = parse(`
|
|
@@ -1080,11 +1147,25 @@ describe('parser', () => {
|
|
|
1080
1147
|
class Person
|
|
1081
1148
|
end class
|
|
1082
1149
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1083
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1150
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1084
1151
|
const func = parser.ast.statements[0].func;
|
|
1085
|
-
const type = Parser_1.getBscTypeFromExpression(func.body.statements[0].value, func);
|
|
1152
|
+
const type = (0, Parser_1.getBscTypeFromExpression)(func.body.statements[0].value, func);
|
|
1086
1153
|
// Return type is LazyType, because "Person" is not fully known yet
|
|
1087
|
-
chai_1.expect(type.returnType).to.be.instanceof(LazyType_1.LazyType);
|
|
1154
|
+
(0, chai_1.expect)(type.returnType).to.be.instanceof(LazyType_1.LazyType);
|
|
1155
|
+
});
|
|
1156
|
+
it('supports function with array return type', () => {
|
|
1157
|
+
const parser = parse(`
|
|
1158
|
+
sub main()
|
|
1159
|
+
getNums = sub() as integer[]
|
|
1160
|
+
return [1,2,3]
|
|
1161
|
+
end sub
|
|
1162
|
+
end sub
|
|
1163
|
+
`, Parser_1.ParseMode.BrighterScript);
|
|
1164
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1165
|
+
const func = parser.ast.statements[0].func;
|
|
1166
|
+
const type = (0, Parser_1.getBscTypeFromExpression)(func.body.statements[0].value, func);
|
|
1167
|
+
(0, chai_1.expect)(type.returnType).to.be.instanceof(ArrayType_1.ArrayType);
|
|
1168
|
+
(0, chai_1.expect)(type.returnType.getDefaultType()).to.be.instanceof(IntegerType_1.IntegerType);
|
|
1088
1169
|
});
|
|
1089
1170
|
});
|
|
1090
1171
|
describe('symbolTable', () => {
|
|
@@ -1100,12 +1181,12 @@ describe('parser', () => {
|
|
|
1100
1181
|
class CustomKlass
|
|
1101
1182
|
end class
|
|
1102
1183
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1103
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1184
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1104
1185
|
const mainSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1105
|
-
chai_1.expect(mainSymbolTable.getSymbolType('someNum')).to.be.instanceof(IntegerType_1.IntegerType);
|
|
1106
|
-
chai_1.expect(mainSymbolTable.getSymbolType('someString')).to.be.instanceof(StringType_1.StringType);
|
|
1107
|
-
chai_1.expect(mainSymbolTable.getSymbolType('someObj')).to.be.instanceof(ObjectType_1.ObjectType);
|
|
1108
|
-
chai_1.expect(mainSymbolTable.getSymbolType('someCustom')).to.be.instanceof(CustomType_1.CustomType);
|
|
1186
|
+
(0, chai_1.expect)(mainSymbolTable.getSymbolType('someNum')).to.be.instanceof(IntegerType_1.IntegerType);
|
|
1187
|
+
(0, chai_1.expect)(mainSymbolTable.getSymbolType('someString')).to.be.instanceof(StringType_1.StringType);
|
|
1188
|
+
(0, chai_1.expect)(mainSymbolTable.getSymbolType('someObj')).to.be.instanceof(ObjectType_1.ObjectType);
|
|
1189
|
+
(0, chai_1.expect)(mainSymbolTable.getSymbolType('someCustom')).to.be.instanceof(CustomType_1.CustomType);
|
|
1109
1190
|
});
|
|
1110
1191
|
it('stores typed parameters in functions', () => {
|
|
1111
1192
|
const parser = parse(`
|
|
@@ -1113,11 +1194,11 @@ describe('parser', () => {
|
|
|
1113
1194
|
temp = param2
|
|
1114
1195
|
end sub
|
|
1115
1196
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1116
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1197
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1117
1198
|
const someFuncSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1118
|
-
chai_1.expect(someFuncSymbolTable.getSymbolType('param1')).to.be.instanceof(StringType_1.StringType);
|
|
1119
|
-
chai_1.expect(someFuncSymbolTable.getSymbolType('param2')).to.be.instanceof(IntegerType_1.IntegerType);
|
|
1120
|
-
chai_1.expect(someFuncSymbolTable.getSymbolType('temp')).to.be.instanceof(IntegerType_1.IntegerType);
|
|
1199
|
+
(0, chai_1.expect)(someFuncSymbolTable.getSymbolType('param1')).to.be.instanceof(StringType_1.StringType);
|
|
1200
|
+
(0, chai_1.expect)(someFuncSymbolTable.getSymbolType('param2')).to.be.instanceof(IntegerType_1.IntegerType);
|
|
1201
|
+
(0, chai_1.expect)(someFuncSymbolTable.getSymbolType('temp')).to.be.instanceof(IntegerType_1.IntegerType);
|
|
1121
1202
|
});
|
|
1122
1203
|
it('properly defers typing lazy types', () => {
|
|
1123
1204
|
const parser = parse(`
|
|
@@ -1129,10 +1210,10 @@ describe('parser', () => {
|
|
|
1129
1210
|
return "foo"
|
|
1130
1211
|
end function
|
|
1131
1212
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1132
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1213
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1133
1214
|
const someFuncSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1134
|
-
chai_1.expect(reflection_1.isLazyType(someFuncSymbolTable.getSymbol('temp')[0].type)).to.be.true;
|
|
1135
|
-
chai_1.expect(someFuncSymbolTable.getSymbolType('temp').toTypeString()).to.eq('string');
|
|
1215
|
+
(0, chai_1.expect)((0, reflection_1.isLazyType)(someFuncSymbolTable.getSymbol('temp')[0].type)).to.be.true;
|
|
1216
|
+
(0, chai_1.expect)(someFuncSymbolTable.getSymbolType('temp').toTypeString()).to.eq('string');
|
|
1136
1217
|
});
|
|
1137
1218
|
it('does not know about symbols declared in parent functions', () => {
|
|
1138
1219
|
const parser = parse(`
|
|
@@ -1143,20 +1224,20 @@ describe('parser', () => {
|
|
|
1143
1224
|
end sub
|
|
1144
1225
|
end sub
|
|
1145
1226
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1146
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1227
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1147
1228
|
const addOneSymbolTable = parser.references.functionExpressions[0].childFunctionExpressions[0].symbolTable;
|
|
1148
|
-
chai_1.expect(reflection_1.isUninitializedType(addOneSymbolTable.getSymbolType('oldVal'))).to.be.true;
|
|
1229
|
+
(0, chai_1.expect)((0, reflection_1.isUninitializedType)(addOneSymbolTable.getSymbolType('oldVal'))).to.be.true;
|
|
1149
1230
|
});
|
|
1150
1231
|
it('finds params', () => {
|
|
1151
1232
|
const parser = parse(`
|
|
1152
1233
|
sub alert(p1, p2 as string, p3 = 1)
|
|
1153
1234
|
end sub
|
|
1154
1235
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1155
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1156
|
-
testHelpers_spec_1.expectSymbolTableEquals(parser.references.functionExpressions[0].symbolTable, [
|
|
1157
|
-
['p1', new DynamicType_1.DynamicType(), util_1.
|
|
1158
|
-
['p2', new StringType_1.StringType(), util_1.
|
|
1159
|
-
['p3', new IntegerType_1.IntegerType(), util_1.
|
|
1236
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1237
|
+
(0, testHelpers_spec_1.expectSymbolTableEquals)(parser.references.functionExpressions[0].symbolTable, [
|
|
1238
|
+
['p1', new DynamicType_1.DynamicType(), util_1.util.createRange(1, 26, 1, 28)],
|
|
1239
|
+
['p2', new StringType_1.StringType(), util_1.util.createRange(1, 30, 1, 32)],
|
|
1240
|
+
['p3', new IntegerType_1.IntegerType(), util_1.util.createRange(1, 44, 1, 46)]
|
|
1160
1241
|
]);
|
|
1161
1242
|
});
|
|
1162
1243
|
describe('loops', () => {
|
|
@@ -1168,9 +1249,9 @@ describe('parser', () => {
|
|
|
1168
1249
|
end for
|
|
1169
1250
|
end sub
|
|
1170
1251
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1171
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1252
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1172
1253
|
const currentSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1173
|
-
chai_1.expect(currentSymbolTable.getSymbolType('i')
|
|
1254
|
+
(0, chai_1.expect)((0, reflection_1.isIntegerType)(currentSymbolTable.getSymbolType('i'))).to.be.true;
|
|
1174
1255
|
});
|
|
1175
1256
|
it('stores the loop variable in a for each loop', () => {
|
|
1176
1257
|
const parser = parse(`
|
|
@@ -1180,9 +1261,50 @@ describe('parser', () => {
|
|
|
1180
1261
|
end for
|
|
1181
1262
|
end sub
|
|
1182
1263
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1183
|
-
testHelpers_spec_1.expectZeroDiagnostics(parser.diagnostics);
|
|
1264
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1265
|
+
const currentSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1266
|
+
(0, chai_1.expect)((0, reflection_1.isDynamicType)(currentSymbolTable.getSymbolType('datum'))).to.be.true;
|
|
1267
|
+
});
|
|
1268
|
+
it('determines the type of the variable in a for each if the target is an array literal', () => {
|
|
1269
|
+
const parser = parse(`
|
|
1270
|
+
sub doLoop()
|
|
1271
|
+
someData = [1,2,3]
|
|
1272
|
+
for each datum in someData
|
|
1273
|
+
print datum
|
|
1274
|
+
end for
|
|
1275
|
+
end sub
|
|
1276
|
+
`, Parser_1.ParseMode.BrighterScript);
|
|
1277
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1278
|
+
const currentSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1279
|
+
(0, chai_1.expect)((0, reflection_1.isIntegerType)(currentSymbolTable.getSymbolType('datum'))).to.be.true;
|
|
1280
|
+
});
|
|
1281
|
+
it('determines the type of the variable in a for each if the target is an array', () => {
|
|
1282
|
+
const parser = parse(`
|
|
1283
|
+
sub doLoop(someData as integer[])
|
|
1284
|
+
for each datum in someData
|
|
1285
|
+
print datum
|
|
1286
|
+
end for
|
|
1287
|
+
end sub
|
|
1288
|
+
`, Parser_1.ParseMode.BrighterScript);
|
|
1289
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1290
|
+
const currentSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1291
|
+
(0, chai_1.expect)((0, reflection_1.isIntegerType)(currentSymbolTable.getSymbolType('datum'))).to.be.true;
|
|
1292
|
+
});
|
|
1293
|
+
it('determines the type of the variable in a for each if the target is an array of some custom type', () => {
|
|
1294
|
+
const parser = parse(`
|
|
1295
|
+
sub doLoop(someData as MyKlass[])
|
|
1296
|
+
for each datum in someData
|
|
1297
|
+
print datum.name
|
|
1298
|
+
end for
|
|
1299
|
+
end sub
|
|
1300
|
+
|
|
1301
|
+
class MyKlass
|
|
1302
|
+
name as string
|
|
1303
|
+
end class
|
|
1304
|
+
`, Parser_1.ParseMode.BrighterScript);
|
|
1305
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(parser.diagnostics);
|
|
1184
1306
|
const currentSymbolTable = parser.references.functionExpressions[0].symbolTable;
|
|
1185
|
-
chai_1.expect(currentSymbolTable.
|
|
1307
|
+
(0, chai_1.expect)((0, reflection_1.isLazyType)(currentSymbolTable.getSymbol('datum')[0].type)).to.be.true;
|
|
1186
1308
|
});
|
|
1187
1309
|
});
|
|
1188
1310
|
});
|
|
@@ -1196,9 +1318,9 @@ describe('parser', () => {
|
|
|
1196
1318
|
const childFieldToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 38));
|
|
1197
1319
|
const tokenChain = parser.getTokenChain(childFieldToken).chain;
|
|
1198
1320
|
const tokenChainTokens = tokenChain.map(tcm => tcm.token);
|
|
1199
|
-
chai_1.expect(tokenChain.length).to.equal(3);
|
|
1200
|
-
chai_1.expect(tokenChainTokens.map(token => token.text)).to.eql(['m', 'field', 'childField']);
|
|
1201
|
-
chai_1.expect(tokenChain.map(tcm => tcm.usage)).to.eql([Parser_1.TokenUsage.Direct, Parser_1.TokenUsage.Direct, Parser_1.TokenUsage.Direct]);
|
|
1321
|
+
(0, chai_1.expect)(tokenChain.length).to.equal(3);
|
|
1322
|
+
(0, chai_1.expect)(tokenChainTokens.map(token => token.text)).to.eql(['m', 'field', 'childField']);
|
|
1323
|
+
(0, chai_1.expect)(tokenChain.map(tcm => tcm.usage)).to.eql([Parser_1.TokenUsage.Direct, Parser_1.TokenUsage.Direct, Parser_1.TokenUsage.Direct]);
|
|
1202
1324
|
});
|
|
1203
1325
|
it('can find a chain of tokens with function call with no args in the middle', () => {
|
|
1204
1326
|
const parser = parse(`
|
|
@@ -1209,9 +1331,9 @@ describe('parser', () => {
|
|
|
1209
1331
|
const childFieldToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 49));
|
|
1210
1332
|
const tokenChain = parser.getTokenChain(childFieldToken).chain;
|
|
1211
1333
|
const tokenChainTokens = tokenChain.map(tcm => tcm.token);
|
|
1212
|
-
chai_1.expect(tokenChain.length).to.equal(4);
|
|
1213
|
-
chai_1.expect(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'funcCall', 'childField']);
|
|
1214
|
-
chai_1.expect(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.Call);
|
|
1334
|
+
(0, chai_1.expect)(tokenChain.length).to.equal(4);
|
|
1335
|
+
(0, chai_1.expect)(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'funcCall', 'childField']);
|
|
1336
|
+
(0, chai_1.expect)(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.Call);
|
|
1215
1337
|
});
|
|
1216
1338
|
it('can find a chain of tokens with function call with multiple args in the middle', () => {
|
|
1217
1339
|
const parser = parse(`
|
|
@@ -1222,9 +1344,9 @@ describe('parser', () => {
|
|
|
1222
1344
|
const childFieldToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 75));
|
|
1223
1345
|
const tokenChain = parser.getTokenChain(childFieldToken).chain;
|
|
1224
1346
|
const tokenChainTokens = tokenChain.map(tcm => tcm.token);
|
|
1225
|
-
chai_1.expect(tokenChain.length).to.equal(4);
|
|
1226
|
-
chai_1.expect(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'funcCall', 'childField']);
|
|
1227
|
-
chai_1.expect(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.Call);
|
|
1347
|
+
(0, chai_1.expect)(tokenChain.length).to.equal(4);
|
|
1348
|
+
(0, chai_1.expect)(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'funcCall', 'childField']);
|
|
1349
|
+
(0, chai_1.expect)(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.Call);
|
|
1228
1350
|
});
|
|
1229
1351
|
it('can find a chain of tokens with function call with function call inside', () => {
|
|
1230
1352
|
const parser = parse(`
|
|
@@ -1235,9 +1357,9 @@ describe('parser', () => {
|
|
|
1235
1357
|
const childFieldToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 90));
|
|
1236
1358
|
const tokenChain = parser.getTokenChain(childFieldToken).chain;
|
|
1237
1359
|
const tokenChainTokens = tokenChain.map(tcm => tcm.token);
|
|
1238
|
-
chai_1.expect(tokenChain.length).to.equal(4);
|
|
1239
|
-
chai_1.expect(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'funcCall', 'childField']);
|
|
1240
|
-
chai_1.expect(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.Call);
|
|
1360
|
+
(0, chai_1.expect)(tokenChain.length).to.equal(4);
|
|
1361
|
+
(0, chai_1.expect)(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'funcCall', 'childField']);
|
|
1362
|
+
(0, chai_1.expect)(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.Call);
|
|
1241
1363
|
});
|
|
1242
1364
|
it('can find a chain of tokens with array references inside', () => {
|
|
1243
1365
|
const parser = parse(`
|
|
@@ -1248,9 +1370,9 @@ describe('parser', () => {
|
|
|
1248
1370
|
const childFieldToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 50));
|
|
1249
1371
|
const tokenChain = parser.getTokenChain(childFieldToken).chain;
|
|
1250
1372
|
const tokenChainTokens = tokenChain.map(tcm => tcm.token);
|
|
1251
|
-
chai_1.expect(tokenChain.length).to.equal(4);
|
|
1252
|
-
chai_1.expect(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'myArray', 'childField']);
|
|
1253
|
-
chai_1.expect(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.ArrayReference);
|
|
1373
|
+
(0, chai_1.expect)(tokenChain.length).to.equal(4);
|
|
1374
|
+
(0, chai_1.expect)(tokenChainTokens.map(token => token.text)).to.eql(['var', 'field', 'myArray', 'childField']);
|
|
1375
|
+
(0, chai_1.expect)(tokenChain[2].usage).to.eql(Parser_1.TokenUsage.ArrayReference);
|
|
1254
1376
|
});
|
|
1255
1377
|
it('includes unknown when an expression in brackets is part of the chain', () => {
|
|
1256
1378
|
const parser = parse(`
|
|
@@ -1260,7 +1382,7 @@ describe('parser', () => {
|
|
|
1260
1382
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1261
1383
|
const toStrToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 34));
|
|
1262
1384
|
const tokenChainResponse = parser.getTokenChain(toStrToken);
|
|
1263
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1385
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1264
1386
|
});
|
|
1265
1387
|
it('includes unknown when an expression in double brackets is part of the chain', () => {
|
|
1266
1388
|
const parser = parse(`
|
|
@@ -1270,7 +1392,7 @@ describe('parser', () => {
|
|
|
1270
1392
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1271
1393
|
const toStrToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 38));
|
|
1272
1394
|
const tokenChainResponse = parser.getTokenChain(toStrToken);
|
|
1273
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1395
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1274
1396
|
});
|
|
1275
1397
|
it('includes unknown when a complicated expression in brackets is part of the chain', () => {
|
|
1276
1398
|
const parser = parse(`
|
|
@@ -1280,7 +1402,7 @@ describe('parser', () => {
|
|
|
1280
1402
|
`, Parser_1.ParseMode.BrighterScript);
|
|
1281
1403
|
const toStrToken = parser.getTokenAt(vscode_languageserver_1.Position.create(2, 81));
|
|
1282
1404
|
const tokenChainResponse = parser.getTokenChain(toStrToken);
|
|
1283
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1405
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1284
1406
|
});
|
|
1285
1407
|
});
|
|
1286
1408
|
it('includes unknown when property is referenced via brackets', () => {
|
|
@@ -1296,13 +1418,13 @@ describe('parser', () => {
|
|
|
1296
1418
|
const propAsAsBracketToken = parser.getTokenAt(vscode_languageserver_1.Position.create(4, 47)); // complexObj["subObj"].prop
|
|
1297
1419
|
const propAsAsDoubleBracketToken = parser.getTokenAt(vscode_languageserver_1.Position.create(5, 64)); // complexObj["subObj"]["grandChildObj"].prop
|
|
1298
1420
|
let tokenChainResponse = parser.getTokenChain(propAsChainToken);
|
|
1299
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1300
|
-
chai_1.expect(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['complexObj', 'subObj', 'prop']);
|
|
1421
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1422
|
+
(0, chai_1.expect)(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['complexObj', 'subObj', 'prop']);
|
|
1301
1423
|
tokenChainResponse = parser.getTokenChain(propAsAsBracketToken);
|
|
1302
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1303
|
-
chai_1.expect(tokenChainResponse.chain[0].usage).to.eql(Parser_1.TokenUsage.ArrayReference);
|
|
1424
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1425
|
+
(0, chai_1.expect)(tokenChainResponse.chain[0].usage).to.eql(Parser_1.TokenUsage.ArrayReference);
|
|
1304
1426
|
tokenChainResponse = parser.getTokenChain(propAsAsDoubleBracketToken);
|
|
1305
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1427
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.true;
|
|
1306
1428
|
});
|
|
1307
1429
|
it('allows token kinds from AllowedLocalIdentifiers as start of a chain', () => {
|
|
1308
1430
|
const parser = parse(`
|
|
@@ -1316,14 +1438,14 @@ describe('parser', () => {
|
|
|
1316
1438
|
const stringFuncToken = parser.getTokenAt(vscode_languageserver_1.Position.create(3, 40)); // string.someProp.someFunc()
|
|
1317
1439
|
const floatFuncToken = parser.getTokenAt(vscode_languageserver_1.Position.create(4, 38)); // float.someProp.someFunc()
|
|
1318
1440
|
let tokenChainResponse = parser.getTokenChain(overrideFuncToken);
|
|
1319
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1320
|
-
chai_1.expect(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['override', 'someProp', 'someFunc']);
|
|
1441
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1442
|
+
(0, chai_1.expect)(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['override', 'someProp', 'someFunc']);
|
|
1321
1443
|
tokenChainResponse = parser.getTokenChain(stringFuncToken);
|
|
1322
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1323
|
-
chai_1.expect(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['string', 'someProp', 'someFunc']);
|
|
1444
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1445
|
+
(0, chai_1.expect)(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['string', 'someProp', 'someFunc']);
|
|
1324
1446
|
tokenChainResponse = parser.getTokenChain(floatFuncToken);
|
|
1325
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1326
|
-
chai_1.expect(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['float', 'someProp', 'someFunc']);
|
|
1447
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1448
|
+
(0, chai_1.expect)(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['float', 'someProp', 'someFunc']);
|
|
1327
1449
|
});
|
|
1328
1450
|
it('allows token kinds from AllowedProperties in middle of a chain', () => {
|
|
1329
1451
|
const parser = parse(`
|
|
@@ -1337,18 +1459,18 @@ describe('parser', () => {
|
|
|
1337
1459
|
const stringFuncToken = parser.getTokenAt(vscode_languageserver_1.Position.create(3, 36)); // someObj.string.someFunc()
|
|
1338
1460
|
const floatFuncToken = parser.getTokenAt(vscode_languageserver_1.Position.create(4, 36)); // someObj.float.someFunc()
|
|
1339
1461
|
let tokenChainResponse = parser.getTokenChain(overrideFuncToken);
|
|
1340
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1341
|
-
chai_1.expect(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['someObj', 'override', 'someFunc']);
|
|
1462
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1463
|
+
(0, chai_1.expect)(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['someObj', 'override', 'someFunc']);
|
|
1342
1464
|
tokenChainResponse = parser.getTokenChain(stringFuncToken);
|
|
1343
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1344
|
-
chai_1.expect(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['someObj', 'string', 'someFunc']);
|
|
1465
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1466
|
+
(0, chai_1.expect)(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['someObj', 'string', 'someFunc']);
|
|
1345
1467
|
tokenChainResponse = parser.getTokenChain(floatFuncToken);
|
|
1346
|
-
chai_1.expect(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1347
|
-
chai_1.expect(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['someObj', 'float', 'someFunc']);
|
|
1468
|
+
(0, chai_1.expect)(tokenChainResponse.includesUnknowableTokenType).to.be.false;
|
|
1469
|
+
(0, chai_1.expect)(tokenChainResponse.chain.map(tcm => tcm.token).map(token => token.text)).to.eql(['someObj', 'float', 'someFunc']);
|
|
1348
1470
|
});
|
|
1349
1471
|
});
|
|
1350
1472
|
function parse(text, mode) {
|
|
1351
|
-
let { tokens } =
|
|
1473
|
+
let { tokens } = Lexer_1.Lexer.scan(text);
|
|
1352
1474
|
return Parser_1.Parser.parse(tokens, {
|
|
1353
1475
|
mode: mode
|
|
1354
1476
|
});
|
|
@@ -1363,8 +1485,8 @@ function rangeToArray(range) {
|
|
|
1363
1485
|
}
|
|
1364
1486
|
exports.rangeToArray = rangeToArray;
|
|
1365
1487
|
function expectCommentWithText(stat, text) {
|
|
1366
|
-
if (reflection_1.isCommentStatement(stat)) {
|
|
1367
|
-
chai_1.expect(stat.text).to.equal(text);
|
|
1488
|
+
if ((0, reflection_1.isCommentStatement)(stat)) {
|
|
1489
|
+
(0, chai_1.expect)(stat.text).to.equal(text);
|
|
1368
1490
|
}
|
|
1369
1491
|
else {
|
|
1370
1492
|
failStatementType(stat, 'Comment');
|