brighterscript 1.0.0-alpha.13 → 1.0.0-alpha.16
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 +87 -2
- package/dist/Cache.d.ts +3 -8
- package/dist/Cache.js +9 -14
- package/dist/Cache.js.map +1 -1
- package/dist/DependencyGraph.js +5 -4
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +21 -1
- package/dist/DiagnosticMessages.js +21 -1
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +1 -6
- package/dist/LanguageServer.js +0 -9
- package/dist/LanguageServer.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 +30 -16
- package/dist/Program.js +108 -43
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.js +3 -3
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +29 -15
- package/dist/Scope.js +68 -28
- package/dist/Scope.js.map +1 -1
- package/dist/SymbolTable.d.ts +1 -1
- package/dist/XmlScope.d.ts +3 -3
- package/dist/astUtils/AstEditor.d.ts +6 -0
- package/dist/astUtils/AstEditor.js +10 -0
- package/dist/astUtils/AstEditor.js.map +1 -1
- package/dist/astUtils/AstEditor.spec.js +37 -0
- package/dist/astUtils/AstEditor.spec.js.map +1 -1
- package/dist/astUtils/creators.d.ts +8 -4
- package/dist/astUtils/creators.js +87 -6
- package/dist/astUtils/creators.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +5 -1
- package/dist/astUtils/reflection.js +15 -3
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +11 -10
- package/dist/astUtils/reflection.spec.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +3 -1
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +8 -8
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +4 -1
- package/dist/bscPlugin/BscPlugin.js +21 -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.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.d.ts → BrsFileSemanticTokensProcessor.spec.d.ts} +0 -0
- package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.js → BrsFileSemanticTokensProcessor.spec.js} +30 -2
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +36 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +11 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +94 -0
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
- package/dist/diagnosticUtils.js +3 -3
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +382 -232
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +26 -12
- package/dist/files/BrsFile.js +268 -119
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +570 -168
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +11 -10
- package/dist/files/XmlFile.js +16 -11
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +60 -58
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +8 -6
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/index.d.ts +12 -3
- package/dist/index.js +21 -4
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +63 -35
- package/dist/lexer/Lexer.js +1 -2
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +470 -462
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +2 -0
- package/dist/lexer/TokenKind.js +5 -0
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/Expression.d.ts +18 -16
- package/dist/parser/Expression.js +57 -48
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +33 -32
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +28 -7
- package/dist/parser/Parser.js +508 -296
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +157 -35
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGTypes.spec.js +9 -9
- package/dist/parser/SGTypes.spec.js.map +1 -1
- package/dist/parser/Statement.d.ts +80 -20
- package/dist/parser/Statement.js +257 -92
- package/dist/parser/Statement.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 +40 -40
- package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/ForEach.spec.js +22 -21
- package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/If.spec.js +100 -99
- package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/While.spec.js +25 -25
- package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
- package/dist/parser/tests/expression/Additive.spec.js +21 -21
- package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
- package/dist/parser/tests/expression/ArrayLiterals.spec.js +91 -91
- package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +102 -102
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/Boolean.spec.js +15 -15
- package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
- package/dist/parser/tests/expression/Call.spec.js +22 -21
- package/dist/parser/tests/expression/Call.spec.js.map +1 -1
- package/dist/parser/tests/expression/Exponential.spec.js +11 -11
- package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
- package/dist/parser/tests/expression/Function.spec.js +171 -171
- package/dist/parser/tests/expression/Function.spec.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +50 -50
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/dist/parser/tests/expression/Multiplicative.spec.js +25 -25
- package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +16 -16
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/PrefixUnary.spec.js +26 -26
- package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
- package/dist/parser/tests/expression/Primary.spec.js +27 -27
- package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +3 -2
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/Relational.spec.js +25 -25
- package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +7 -7
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +6 -6
- package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
- package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
- package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
- package/dist/parser/tests/statement/Declaration.spec.js +20 -20
- package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +774 -0
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
- package/dist/parser/tests/statement/For.spec.d.ts +1 -0
- package/dist/parser/tests/statement/For.spec.js +46 -0
- package/dist/parser/tests/statement/For.spec.js.map +1 -0
- package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
- package/dist/parser/tests/statement/ForEach.spec.js +37 -0
- package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
- package/dist/parser/tests/statement/Function.spec.js +121 -120
- package/dist/parser/tests/statement/Function.spec.js.map +1 -1
- package/dist/parser/tests/statement/Goto.spec.js +9 -8
- package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
- package/dist/parser/tests/statement/Increment.spec.js +22 -22
- package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +12 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/LibraryStatement.spec.js +7 -7
- package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Misc.spec.js +71 -70
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +17 -17
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/ReturnStatement.spec.js +33 -33
- package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Set.spec.js +53 -53
- package/dist/parser/tests/statement/Set.spec.js.map +1 -1
- package/dist/parser/tests/statement/Stop.spec.js +7 -6
- package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
- package/dist/preprocessor/Chunk.d.ts +1 -1
- package/dist/preprocessor/Preprocessor.d.ts +1 -1
- package/dist/preprocessor/Preprocessor.js +7 -7
- package/dist/preprocessor/Preprocessor.js.map +1 -1
- package/dist/types/ArrayType.d.ts +8 -5
- package/dist/types/ArrayType.js +45 -9
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +62 -3
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +1 -1
- package/dist/types/CustomType.d.ts +1 -1
- package/dist/types/CustomType.js +4 -2
- package/dist/types/CustomType.js.map +1 -1
- package/dist/types/FunctionType.d.ts +7 -6
- package/dist/types/FunctionType.js +21 -18
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/FunctionType.spec.js +6 -0
- package/dist/types/FunctionType.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/UniversalFunctionType.d.ts +9 -0
- package/dist/types/UniversalFunctionType.js +25 -0
- package/dist/types/UniversalFunctionType.js.map +1 -0
- package/dist/types/helpers.js +1 -1
- package/dist/types/helpers.js.map +1 -1
- package/dist/util.d.ts +26 -10
- package/dist/util.js +145 -61
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.js +17 -24
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +3 -3
- 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 +0 -63
- 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 -18
- 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,42 +2,43 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const chai_1 = require("chai");
|
|
4
4
|
const Parser_1 = require("../../Parser");
|
|
5
|
-
const
|
|
5
|
+
const TokenKind_1 = require("../../../lexer/TokenKind");
|
|
6
6
|
const Parser_spec_1 = require("../Parser.spec");
|
|
7
|
-
const __1 = require("../..");
|
|
8
7
|
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
8
|
+
const Statement_1 = require("../../Statement");
|
|
9
|
+
const Expression_1 = require("../../Expression");
|
|
9
10
|
const testHelpers_spec_1 = require("../../../testHelpers.spec");
|
|
10
11
|
describe('parser foreach loops', () => {
|
|
11
12
|
it('requires a name and target', () => {
|
|
12
13
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
13
|
-
(0, Parser_spec_1.token)(
|
|
14
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.ForEach, 'for each'),
|
|
14
15
|
(0, Parser_spec_1.identifier)('word'),
|
|
15
16
|
(0, Parser_spec_1.identifier)('in'),
|
|
16
17
|
(0, Parser_spec_1.identifier)('lipsum'),
|
|
17
|
-
(0, Parser_spec_1.token)(
|
|
18
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
18
19
|
// body would go here, but it's not necessary for this test
|
|
19
|
-
(0, Parser_spec_1.token)(
|
|
20
|
-
(0, Parser_spec_1.token)(
|
|
20
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.EndFor, 'end for'),
|
|
21
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
21
22
|
Parser_spec_1.EOF
|
|
22
23
|
]);
|
|
23
24
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
|
|
24
25
|
(0, chai_1.expect)(statements).to.exist;
|
|
25
26
|
let forEach = statements[0];
|
|
26
|
-
(0, chai_1.expect)(forEach).to.be.instanceof(
|
|
27
|
+
(0, chai_1.expect)(forEach).to.be.instanceof(Statement_1.ForEachStatement);
|
|
27
28
|
(0, chai_1.expect)(forEach.item.text).to.eql('word');
|
|
28
|
-
(0, chai_1.expect)(forEach.target).to.be.instanceof(
|
|
29
|
+
(0, chai_1.expect)(forEach.target).to.be.instanceof(Expression_1.VariableExpression);
|
|
29
30
|
(0, chai_1.expect)(forEach.target.name).to.deep.include((0, Parser_spec_1.identifier)('lipsum'));
|
|
30
31
|
});
|
|
31
32
|
it('allows \'next\' to terminate loop', () => {
|
|
32
33
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
33
|
-
(0, Parser_spec_1.token)(
|
|
34
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.ForEach, 'for each'),
|
|
34
35
|
(0, Parser_spec_1.identifier)('word'),
|
|
35
36
|
(0, Parser_spec_1.identifier)('in'),
|
|
36
37
|
(0, Parser_spec_1.identifier)('lipsum'),
|
|
37
|
-
(0, Parser_spec_1.token)(
|
|
38
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
38
39
|
// body would go here, but it's not necessary for this test
|
|
39
|
-
(0, Parser_spec_1.token)(
|
|
40
|
-
(0, Parser_spec_1.token)(
|
|
40
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Next, 'next'),
|
|
41
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
41
42
|
Parser_spec_1.EOF
|
|
42
43
|
]);
|
|
43
44
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
|
|
@@ -55,43 +56,43 @@ describe('parser foreach loops', () => {
|
|
|
55
56
|
*/
|
|
56
57
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
57
58
|
{
|
|
58
|
-
kind:
|
|
59
|
+
kind: TokenKind_1.TokenKind.ForEach,
|
|
59
60
|
text: 'for each',
|
|
60
61
|
isReserved: true,
|
|
61
62
|
range: vscode_languageserver_1.Range.create(0, 0, 0, 8)
|
|
62
63
|
},
|
|
63
64
|
{
|
|
64
|
-
kind:
|
|
65
|
+
kind: TokenKind_1.TokenKind.Identifier,
|
|
65
66
|
text: 'a',
|
|
66
67
|
isReserved: false,
|
|
67
68
|
range: vscode_languageserver_1.Range.create(0, 9, 0, 10)
|
|
68
69
|
},
|
|
69
70
|
{
|
|
70
|
-
kind:
|
|
71
|
+
kind: TokenKind_1.TokenKind.Identifier,
|
|
71
72
|
text: 'in',
|
|
72
73
|
isReserved: true,
|
|
73
74
|
range: vscode_languageserver_1.Range.create(0, 11, 0, 13)
|
|
74
75
|
},
|
|
75
76
|
{
|
|
76
|
-
kind:
|
|
77
|
+
kind: TokenKind_1.TokenKind.Identifier,
|
|
77
78
|
text: 'b',
|
|
78
79
|
isReserved: false,
|
|
79
80
|
range: vscode_languageserver_1.Range.create(0, 14, 0, 15)
|
|
80
81
|
},
|
|
81
82
|
{
|
|
82
|
-
kind:
|
|
83
|
+
kind: TokenKind_1.TokenKind.Newline,
|
|
83
84
|
text: '\n',
|
|
84
85
|
isReserved: false,
|
|
85
86
|
range: vscode_languageserver_1.Range.create(0, 15, 0, 16)
|
|
86
87
|
},
|
|
87
88
|
// loop body isn't significant for location tracking, so helper functions are safe
|
|
88
89
|
(0, Parser_spec_1.identifier)('Rnd'),
|
|
89
|
-
(0, Parser_spec_1.token)(
|
|
90
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.LeftParen, '('),
|
|
90
91
|
(0, Parser_spec_1.identifier)('a'),
|
|
91
|
-
(0, Parser_spec_1.token)(
|
|
92
|
-
(0, Parser_spec_1.token)(
|
|
92
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.RightParen, ')'),
|
|
93
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
93
94
|
{
|
|
94
|
-
kind:
|
|
95
|
+
kind: TokenKind_1.TokenKind.EndFor,
|
|
95
96
|
text: 'end for',
|
|
96
97
|
isReserved: false,
|
|
97
98
|
range: vscode_languageserver_1.Range.create(2, 0, 2, 7)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForEach.spec.js","sourceRoot":"","sources":["../../../../src/parser/tests/controlFlow/ForEach.spec.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAE9B,yCAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"ForEach.spec.js","sourceRoot":"","sources":["../../../../src/parser/tests/controlFlow/ForEach.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const chai_1 = require("chai");
|
|
4
4
|
const assert = require("assert");
|
|
5
5
|
const Parser_1 = require("../../Parser");
|
|
6
|
-
const
|
|
6
|
+
const Lexer_1 = require("../../../lexer/Lexer");
|
|
7
|
+
const TokenKind_1 = require("../../../lexer/TokenKind");
|
|
7
8
|
const Parser_spec_1 = require("../Parser.spec");
|
|
8
|
-
const
|
|
9
|
+
const reflection_1 = require("../../../astUtils/reflection");
|
|
9
10
|
describe('parser if statements', () => {
|
|
10
11
|
it('allows empty if blocks', () => {
|
|
11
12
|
var _a;
|
|
12
|
-
let { tokens } =
|
|
13
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
13
14
|
if true then
|
|
14
15
|
|
|
15
16
|
else if true then
|
|
@@ -24,7 +25,7 @@ describe('parser if statements', () => {
|
|
|
24
25
|
});
|
|
25
26
|
it('allows empty elseif blocks', () => {
|
|
26
27
|
var _a;
|
|
27
|
-
let { tokens } =
|
|
28
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
28
29
|
if true then
|
|
29
30
|
stop
|
|
30
31
|
else if true then
|
|
@@ -39,7 +40,7 @@ describe('parser if statements', () => {
|
|
|
39
40
|
});
|
|
40
41
|
it('allows empty else blocks', () => {
|
|
41
42
|
var _a;
|
|
42
|
-
let { tokens } =
|
|
43
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
43
44
|
if true then
|
|
44
45
|
stop
|
|
45
46
|
else if true then
|
|
@@ -54,7 +55,7 @@ describe('parser if statements', () => {
|
|
|
54
55
|
});
|
|
55
56
|
it('single-line if next to else or endif', () => {
|
|
56
57
|
var _a;
|
|
57
|
-
let { tokens } =
|
|
58
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
58
59
|
if type(component.TextAttrs.font) = "roString"
|
|
59
60
|
font = m.fonts.Lookup(component.TextAttrs.font)
|
|
60
61
|
if font = invalid then font = m.fonts.medium
|
|
@@ -68,17 +69,17 @@ describe('parser if statements', () => {
|
|
|
68
69
|
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
69
70
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
70
71
|
let ifs = statements[0];
|
|
71
|
-
if (!(0,
|
|
72
|
+
if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[1])) {
|
|
72
73
|
assert.fail('Missing single-line if inside if-then');
|
|
73
74
|
}
|
|
74
|
-
if (!(0,
|
|
75
|
+
if (!(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
|
|
75
76
|
assert.fail('Missing chained else-if statement');
|
|
76
77
|
}
|
|
77
78
|
(0, chai_1.expect)(ifs.elseBranch.elseBranch).to.exist;
|
|
78
79
|
});
|
|
79
80
|
it('single-line if inside multi-line if', () => {
|
|
80
81
|
var _a;
|
|
81
|
-
let { tokens } =
|
|
82
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
82
83
|
if true
|
|
83
84
|
if true then t = 1
|
|
84
85
|
else
|
|
@@ -89,16 +90,16 @@ describe('parser if statements', () => {
|
|
|
89
90
|
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
90
91
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
91
92
|
let ifs = statements[0];
|
|
92
|
-
if (!(0,
|
|
93
|
+
if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[0])) {
|
|
93
94
|
assert.fail('Missing single-line if inside if-then');
|
|
94
95
|
}
|
|
95
96
|
(0, chai_1.expect)(ifs.elseBranch).to.exist;
|
|
96
|
-
if (!(0,
|
|
97
|
+
if (!(0, reflection_1.isBlock)(ifs.elseBranch) || !(0, reflection_1.isCommentStatement)(ifs.elseBranch.statements[0])) {
|
|
97
98
|
assert.fail('Missing comment inside else branch');
|
|
98
99
|
}
|
|
99
100
|
});
|
|
100
101
|
it('dotted set in else block', () => {
|
|
101
|
-
let { tokens } =
|
|
102
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
102
103
|
if true then m.top.visible = true else m.top.visible = false
|
|
103
104
|
`);
|
|
104
105
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -111,15 +112,15 @@ describe('parser if statements', () => {
|
|
|
111
112
|
describe('single-line if', () => {
|
|
112
113
|
it('parses if only', () => {
|
|
113
114
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
114
|
-
(0, Parser_spec_1.token)(
|
|
115
|
-
(0, Parser_spec_1.token)(
|
|
116
|
-
(0, Parser_spec_1.token)(
|
|
117
|
-
(0, Parser_spec_1.token)(
|
|
118
|
-
(0, Parser_spec_1.token)(
|
|
115
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
|
|
116
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
|
|
117
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
|
|
118
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
|
|
119
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
|
|
119
120
|
(0, Parser_spec_1.identifier)('foo'),
|
|
120
|
-
(0, Parser_spec_1.token)(
|
|
121
|
-
(0, Parser_spec_1.token)(
|
|
122
|
-
(0, Parser_spec_1.token)(
|
|
121
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
122
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
|
|
123
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
123
124
|
Parser_spec_1.EOF
|
|
124
125
|
]);
|
|
125
126
|
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
@@ -127,19 +128,19 @@ describe('parser if statements', () => {
|
|
|
127
128
|
});
|
|
128
129
|
it('parses if-else', () => {
|
|
129
130
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
130
|
-
(0, Parser_spec_1.token)(
|
|
131
|
-
(0, Parser_spec_1.token)(
|
|
132
|
-
(0, Parser_spec_1.token)(
|
|
133
|
-
(0, Parser_spec_1.token)(
|
|
134
|
-
(0, Parser_spec_1.token)(
|
|
131
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
|
|
132
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
|
|
133
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
|
|
134
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
|
|
135
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
|
|
135
136
|
(0, Parser_spec_1.identifier)('foo'),
|
|
136
|
-
(0, Parser_spec_1.token)(
|
|
137
|
-
(0, Parser_spec_1.token)(
|
|
138
|
-
(0, Parser_spec_1.token)(
|
|
137
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
138
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
|
|
139
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
|
|
139
140
|
(0, Parser_spec_1.identifier)('foo'),
|
|
140
|
-
(0, Parser_spec_1.token)(
|
|
141
|
-
(0, Parser_spec_1.token)(
|
|
142
|
-
(0, Parser_spec_1.token)(
|
|
141
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
142
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.False, 'true'),
|
|
143
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
143
144
|
Parser_spec_1.EOF
|
|
144
145
|
]);
|
|
145
146
|
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
@@ -147,28 +148,28 @@ describe('parser if statements', () => {
|
|
|
147
148
|
});
|
|
148
149
|
it('parses if-elseif-else', () => {
|
|
149
150
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
150
|
-
(0, Parser_spec_1.token)(
|
|
151
|
-
(0, Parser_spec_1.token)(
|
|
152
|
-
(0, Parser_spec_1.token)(
|
|
153
|
-
(0, Parser_spec_1.token)(
|
|
154
|
-
(0, Parser_spec_1.token)(
|
|
151
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
|
|
152
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
|
|
153
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
|
|
154
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
|
|
155
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
|
|
155
156
|
(0, Parser_spec_1.identifier)('foo'),
|
|
156
|
-
(0, Parser_spec_1.token)(
|
|
157
|
-
(0, Parser_spec_1.token)(
|
|
158
|
-
(0, Parser_spec_1.token)(
|
|
159
|
-
(0, Parser_spec_1.token)(
|
|
160
|
-
(0, Parser_spec_1.token)(
|
|
161
|
-
(0, Parser_spec_1.token)(
|
|
162
|
-
(0, Parser_spec_1.token)(
|
|
163
|
-
(0, Parser_spec_1.token)(
|
|
157
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
158
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
|
|
159
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
|
|
160
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
|
|
161
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
|
|
162
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
163
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
|
|
164
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
|
|
164
165
|
(0, Parser_spec_1.identifier)('same'),
|
|
165
|
-
(0, Parser_spec_1.token)(
|
|
166
|
-
(0, Parser_spec_1.token)(
|
|
167
|
-
(0, Parser_spec_1.token)(
|
|
166
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
167
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
|
|
168
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
|
|
168
169
|
(0, Parser_spec_1.identifier)('foo'),
|
|
169
|
-
(0, Parser_spec_1.token)(
|
|
170
|
-
(0, Parser_spec_1.token)(
|
|
171
|
-
(0, Parser_spec_1.token)(
|
|
170
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
171
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
|
|
172
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
172
173
|
Parser_spec_1.EOF
|
|
173
174
|
]);
|
|
174
175
|
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
@@ -177,26 +178,26 @@ describe('parser if statements', () => {
|
|
|
177
178
|
it('allows \'then\' to be skipped', () => {
|
|
178
179
|
// if 1 < 2 foo = true else if 1 = 2 same = true
|
|
179
180
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
180
|
-
(0, Parser_spec_1.token)(
|
|
181
|
-
(0, Parser_spec_1.token)(
|
|
182
|
-
(0, Parser_spec_1.token)(
|
|
183
|
-
(0, Parser_spec_1.token)(
|
|
181
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
|
|
182
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
|
|
183
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
|
|
184
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
|
|
184
185
|
(0, Parser_spec_1.identifier)('foo'),
|
|
185
|
-
(0, Parser_spec_1.token)(
|
|
186
|
-
(0, Parser_spec_1.token)(
|
|
187
|
-
(0, Parser_spec_1.token)(
|
|
188
|
-
(0, Parser_spec_1.token)(
|
|
189
|
-
(0, Parser_spec_1.token)(
|
|
190
|
-
(0, Parser_spec_1.token)(
|
|
191
|
-
(0, Parser_spec_1.token)(
|
|
186
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
187
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
|
|
188
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
|
|
189
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
|
|
190
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
|
|
191
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
192
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
|
|
192
193
|
(0, Parser_spec_1.identifier)('same'),
|
|
193
|
-
(0, Parser_spec_1.token)(
|
|
194
|
-
(0, Parser_spec_1.token)(
|
|
195
|
-
(0, Parser_spec_1.token)(
|
|
194
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
195
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
|
|
196
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
|
|
196
197
|
(0, Parser_spec_1.identifier)('foo'),
|
|
197
|
-
(0, Parser_spec_1.token)(
|
|
198
|
-
(0, Parser_spec_1.token)(
|
|
199
|
-
(0, Parser_spec_1.token)(
|
|
198
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
|
|
199
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.False, 'false'),
|
|
200
|
+
(0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
|
|
200
201
|
Parser_spec_1.EOF
|
|
201
202
|
]);
|
|
202
203
|
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
@@ -219,7 +220,7 @@ describe('parser if statements', () => {
|
|
|
219
220
|
describe('block if', () => {
|
|
220
221
|
it('parses if only', () => {
|
|
221
222
|
//because the parser depends on line numbers for certain if statements, this needs to be location-aware
|
|
222
|
-
let { tokens } =
|
|
223
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
223
224
|
if 1 < 2 THEN
|
|
224
225
|
foo = true
|
|
225
226
|
bar = true
|
|
@@ -231,7 +232,7 @@ describe('parser if statements', () => {
|
|
|
231
232
|
});
|
|
232
233
|
it('parses if-else', () => {
|
|
233
234
|
//this test requires token locations, so use the lexer
|
|
234
|
-
let { tokens } =
|
|
235
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
235
236
|
if 1 < 2 then
|
|
236
237
|
foo = true
|
|
237
238
|
else
|
|
@@ -245,7 +246,7 @@ describe('parser if statements', () => {
|
|
|
245
246
|
});
|
|
246
247
|
it('parses if-elseif-else', () => {
|
|
247
248
|
//this test requires token locations, so use the lexer
|
|
248
|
-
let { tokens } =
|
|
249
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
249
250
|
if 1 < 2 then
|
|
250
251
|
foo = true
|
|
251
252
|
else if 1 > 2 then
|
|
@@ -261,7 +262,7 @@ describe('parser if statements', () => {
|
|
|
261
262
|
});
|
|
262
263
|
it('allows \'then\' to be skipped', () => {
|
|
263
264
|
//this test requires token locations, so use the lexer
|
|
264
|
-
let { tokens } =
|
|
265
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
265
266
|
if 1 < 2
|
|
266
267
|
foo = true
|
|
267
268
|
else if 1 > 2
|
|
@@ -277,7 +278,7 @@ describe('parser if statements', () => {
|
|
|
277
278
|
});
|
|
278
279
|
it('sets endif token properly', () => {
|
|
279
280
|
//this test requires token locations, so use the lexer
|
|
280
|
-
let { tokens } =
|
|
281
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
281
282
|
sub a()
|
|
282
283
|
if true then
|
|
283
284
|
print false
|
|
@@ -293,7 +294,7 @@ describe('parser if statements', () => {
|
|
|
293
294
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
294
295
|
//the endif token should be set
|
|
295
296
|
let ifs = statements[0].func.body.statements[0];
|
|
296
|
-
if (!(0,
|
|
297
|
+
if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
|
|
297
298
|
assert.fail('Unexpected statement found');
|
|
298
299
|
}
|
|
299
300
|
(0, chai_1.expect)(ifs.tokens.endIf).to.not.exist;
|
|
@@ -301,7 +302,7 @@ describe('parser if statements', () => {
|
|
|
301
302
|
});
|
|
302
303
|
});
|
|
303
304
|
it('supports trailing colons after conditional statements', () => {
|
|
304
|
-
let { tokens } =
|
|
305
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
305
306
|
sub main()
|
|
306
307
|
if 1 > 0:
|
|
307
308
|
print "positive!"
|
|
@@ -317,7 +318,7 @@ describe('parser if statements', () => {
|
|
|
317
318
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
318
319
|
});
|
|
319
320
|
it('supports trailing colons for one-line if statements', () => {
|
|
320
|
-
let { tokens } =
|
|
321
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
321
322
|
if 1 < 2: return true: end if
|
|
322
323
|
`);
|
|
323
324
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -326,7 +327,7 @@ describe('parser if statements', () => {
|
|
|
326
327
|
});
|
|
327
328
|
it('catches one-line if statement missing first colon', () => {
|
|
328
329
|
//missing colon after 2
|
|
329
|
-
let { tokens } =
|
|
330
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
330
331
|
if 1 < 2 return true : end if
|
|
331
332
|
`);
|
|
332
333
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -335,7 +336,7 @@ describe('parser if statements', () => {
|
|
|
335
336
|
});
|
|
336
337
|
it('catches one-line if statement with multiple statements missing first colon', () => {
|
|
337
338
|
//missing colon after 2
|
|
338
|
-
let { tokens } =
|
|
339
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
339
340
|
if 1 < 2 print "ok" : return true : end if
|
|
340
341
|
`);
|
|
341
342
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -344,7 +345,7 @@ describe('parser if statements', () => {
|
|
|
344
345
|
});
|
|
345
346
|
it('catches one-line if statement missing second colon', () => {
|
|
346
347
|
//missing colon after `2`
|
|
347
|
-
let { tokens } =
|
|
348
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
348
349
|
if 1 < 2 : return true end if
|
|
349
350
|
`);
|
|
350
351
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -353,7 +354,7 @@ describe('parser if statements', () => {
|
|
|
353
354
|
});
|
|
354
355
|
it('catches one-line if statement with else missing colons', () => {
|
|
355
356
|
//missing colon after `2`
|
|
356
|
-
let { tokens } =
|
|
357
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
357
358
|
if 1 < 2 : return true: else return false end if
|
|
358
359
|
`);
|
|
359
360
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -362,7 +363,7 @@ describe('parser if statements', () => {
|
|
|
362
363
|
});
|
|
363
364
|
it('catches one-line if statement with colon and missing end if', () => {
|
|
364
365
|
//missing colon after `2`
|
|
365
|
-
let { tokens } =
|
|
366
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
366
367
|
if 1 < 2: return true
|
|
367
368
|
`);
|
|
368
369
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -371,7 +372,7 @@ describe('parser if statements', () => {
|
|
|
371
372
|
});
|
|
372
373
|
it('catches one-line if multi-statement with colon and missing end if', () => {
|
|
373
374
|
//missing colon after `2`
|
|
374
|
-
let { tokens } =
|
|
375
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
375
376
|
if 1 < 2: print "ok": return true
|
|
376
377
|
`);
|
|
377
378
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -380,7 +381,7 @@ describe('parser if statements', () => {
|
|
|
380
381
|
});
|
|
381
382
|
it('catches one-line if statement with colon and missing endif inside a function', () => {
|
|
382
383
|
//missing 'end if'
|
|
383
|
-
let { tokens } =
|
|
384
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
384
385
|
function missingendif()
|
|
385
386
|
if true : return true
|
|
386
387
|
end function
|
|
@@ -391,7 +392,7 @@ describe('parser if statements', () => {
|
|
|
391
392
|
});
|
|
392
393
|
it('catches extraneous colon at the end of one-line if-else', () => {
|
|
393
394
|
//colon at the end not allowed
|
|
394
|
-
let { tokens } =
|
|
395
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
395
396
|
if 1 < 2 then return true else return false:
|
|
396
397
|
`);
|
|
397
398
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -400,7 +401,7 @@ describe('parser if statements', () => {
|
|
|
400
401
|
});
|
|
401
402
|
it('catches colon before if, unless there is `then` before', () => {
|
|
402
403
|
//colon before if isn't allowed
|
|
403
|
-
let { tokens } =
|
|
404
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
404
405
|
if 1 < 2 then: if 2<3: return false: end if
|
|
405
406
|
: if 1 < 2: return true: end if
|
|
406
407
|
end if
|
|
@@ -411,7 +412,7 @@ describe('parser if statements', () => {
|
|
|
411
412
|
});
|
|
412
413
|
it('catches extraneous colon+end if at the end of one-line if-else', () => {
|
|
413
414
|
//expected newline + unexpected endif
|
|
414
|
-
let { tokens } =
|
|
415
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
415
416
|
if 1 < 2 then return true else return false: end if
|
|
416
417
|
`);
|
|
417
418
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -420,7 +421,7 @@ describe('parser if statements', () => {
|
|
|
420
421
|
});
|
|
421
422
|
it('recovers from extraneous endif at the end of one-line if-else', () => {
|
|
422
423
|
//unexpected endif
|
|
423
|
-
let { tokens } =
|
|
424
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
424
425
|
function test1()
|
|
425
426
|
if 1 < 2: return true: else return false end if
|
|
426
427
|
end function
|
|
@@ -431,7 +432,7 @@ describe('parser if statements', () => {
|
|
|
431
432
|
});
|
|
432
433
|
it('recovers from missing end-if', () => {
|
|
433
434
|
//unexpected endif
|
|
434
|
-
let { tokens } =
|
|
435
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
435
436
|
function test1()
|
|
436
437
|
if 1 < 2 then if 1 < 3
|
|
437
438
|
return true
|
|
@@ -446,7 +447,7 @@ describe('parser if statements', () => {
|
|
|
446
447
|
});
|
|
447
448
|
it('catches extraneous colon at the end of one-line if', () => {
|
|
448
449
|
//colon at the end not allowed
|
|
449
|
-
let { tokens } =
|
|
450
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
450
451
|
if 1 < 2 then return true:
|
|
451
452
|
`);
|
|
452
453
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -455,7 +456,7 @@ describe('parser if statements', () => {
|
|
|
455
456
|
});
|
|
456
457
|
it('catches multi-line if inside a one-line if branch', () => {
|
|
457
458
|
//second if should be inline
|
|
458
|
-
let { tokens } =
|
|
459
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
459
460
|
if 1 < 2 then if 1 < 3
|
|
460
461
|
return true
|
|
461
462
|
end if
|
|
@@ -466,7 +467,7 @@ describe('parser if statements', () => {
|
|
|
466
467
|
});
|
|
467
468
|
it('supports multiple statements in one-line if statements', () => {
|
|
468
469
|
//second if should be inline
|
|
469
|
-
let { tokens } =
|
|
470
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
470
471
|
if 1 < 2 then ok = true : m.ok = true : print "ok" : ook() else if 1 < 3
|
|
471
472
|
return true
|
|
472
473
|
end if
|
|
@@ -477,7 +478,7 @@ describe('parser if statements', () => {
|
|
|
477
478
|
});
|
|
478
479
|
it('catches multi-line if inside a one-line if else branch', () => {
|
|
479
480
|
//second if should be inline
|
|
480
|
-
let { tokens } =
|
|
481
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
481
482
|
if 1 < 2 then return false else if 1 < 3
|
|
482
483
|
return true
|
|
483
484
|
end if
|
|
@@ -488,7 +489,7 @@ describe('parser if statements', () => {
|
|
|
488
489
|
});
|
|
489
490
|
it('catches else statement missing colon', () => {
|
|
490
491
|
//missing colon before `end if`
|
|
491
|
-
let { tokens } =
|
|
492
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
492
493
|
if 1 < 2
|
|
493
494
|
return true
|
|
494
495
|
else return false end if
|
|
@@ -498,7 +499,7 @@ describe('parser if statements', () => {
|
|
|
498
499
|
(0, chai_1.expect)(statements).to.be.lengthOf(1);
|
|
499
500
|
});
|
|
500
501
|
it('supports if statement with condition and action on one line, but end if on separate line', () => {
|
|
501
|
-
let { tokens } =
|
|
502
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
502
503
|
if 1 < 2: return true
|
|
503
504
|
end if
|
|
504
505
|
`);
|
|
@@ -507,7 +508,7 @@ describe('parser if statements', () => {
|
|
|
507
508
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
508
509
|
});
|
|
509
510
|
it('supports colon after return in single-line if statement', () => {
|
|
510
|
-
let { tokens } =
|
|
511
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
511
512
|
if false : print "true" : end if
|
|
512
513
|
`);
|
|
513
514
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -515,7 +516,7 @@ describe('parser if statements', () => {
|
|
|
515
516
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
516
517
|
});
|
|
517
518
|
it('supports if elseif endif single line', () => {
|
|
518
|
-
let { tokens } =
|
|
519
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
519
520
|
if true: print "8 worked": else if true: print "not run": else: print "not run": end if
|
|
520
521
|
`);
|
|
521
522
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -523,7 +524,7 @@ describe('parser if statements', () => {
|
|
|
523
524
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
524
525
|
});
|
|
525
526
|
it('supports comment at the end of one-line if', () => {
|
|
526
|
-
let { tokens } =
|
|
527
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
527
528
|
if 1 > 2 then return true 'OK
|
|
528
529
|
`);
|
|
529
530
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -531,7 +532,7 @@ describe('parser if statements', () => {
|
|
|
531
532
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
532
533
|
});
|
|
533
534
|
it('supports colon at the beginning of a line', () => {
|
|
534
|
-
let { tokens } =
|
|
535
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
535
536
|
if 1 < 2 then: if 1 < 4 then return false
|
|
536
537
|
: end if
|
|
537
538
|
`);
|
|
@@ -540,7 +541,7 @@ describe('parser if statements', () => {
|
|
|
540
541
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
541
542
|
});
|
|
542
543
|
it('supports one-line functions inside of one-line if statement', () => {
|
|
543
|
-
let { tokens } =
|
|
544
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
544
545
|
if true then : test = sub() : print "yes" : end sub : end if
|
|
545
546
|
`);
|
|
546
547
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
@@ -548,7 +549,7 @@ describe('parser if statements', () => {
|
|
|
548
549
|
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
549
550
|
});
|
|
550
551
|
it('single-line if block statements have correct range', () => {
|
|
551
|
-
let { tokens } =
|
|
552
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
552
553
|
if false then print "true"
|
|
553
554
|
if false then print "true": a = 10
|
|
554
555
|
if false then print "true" else print "false"
|