brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.22
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 +643 -253
- package/README.md +33 -9
- package/bsconfig.schema.json +22 -2
- package/dist/BsConfig.d.ts +9 -0
- package/dist/Cache.d.ts +5 -6
- package/dist/Cache.js +12 -11
- package/dist/Cache.js.map +1 -1
- package/dist/CodeActionUtil.d.ts +11 -2
- package/dist/CodeActionUtil.js +17 -3
- 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.d.ts +2 -2
- package/dist/DependencyGraph.js +20 -7
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticCollection.d.ts +3 -3
- package/dist/DiagnosticCollection.js +11 -11
- package/dist/DiagnosticCollection.js.map +1 -1
- package/dist/DiagnosticFilterer.js +5 -4
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +59 -4
- package/dist/DiagnosticMessages.js +65 -7
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +51 -39
- package/dist/LanguageServer.js +316 -232
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +2 -0
- package/dist/Logger.js +10 -8
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.d.ts +7 -3
- package/dist/PluginInterface.js +9 -0
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +43 -25
- package/dist/Program.js +212 -95
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +4 -0
- package/dist/ProgramBuilder.js +36 -20
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +126 -29
- package/dist/Scope.js +433 -156
- package/dist/Scope.js.map +1 -1
- package/dist/SemanticTokenUtils.d.ts +14 -0
- package/dist/SemanticTokenUtils.js +81 -0
- package/dist/SemanticTokenUtils.js.map +1 -0
- package/dist/SymbolTable.d.ts +10 -4
- package/dist/SymbolTable.js +55 -13
- package/dist/SymbolTable.js.map +1 -1
- package/dist/XmlScope.d.ts +7 -2
- package/dist/XmlScope.js +65 -27
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/AstEditor.d.ts +65 -0
- package/dist/astUtils/AstEditor.js +239 -0
- package/dist/astUtils/AstEditor.js.map +1 -0
- package/dist/{types/FunctionType.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
- package/dist/astUtils/AstEditor.spec.js +254 -0
- package/dist/astUtils/AstEditor.spec.js.map +1 -0
- package/dist/astUtils/creators.d.ts +28 -6
- package/dist/astUtils/creators.js +137 -19
- package/dist/astUtils/creators.js.map +1 -1
- package/dist/astUtils/creators.spec.js +14 -4
- package/dist/astUtils/creators.spec.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +32 -10
- package/dist/astUtils/reflection.js +82 -7
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +130 -119
- 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.d.ts +76 -51
- package/dist/astUtils/visitors.js +31 -11
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +126 -32
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/astUtils/xml.d.ts +4 -3
- package/dist/astUtils/xml.js +8 -3
- package/dist/astUtils/xml.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +7 -1
- package/dist/bscPlugin/BscPlugin.js +28 -0
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +4 -4
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +26 -26
- 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 +108 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +130 -0
- 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 +52 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.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 +29 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +183 -0
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
- package/dist/cli.js +10 -3
- package/dist/cli.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +1 -0
- package/dist/diagnosticUtils.js +15 -8
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/examples/plugins/removePrint.js +12 -14
- package/dist/examples/plugins/removePrint.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +717 -147
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +70 -30
- package/dist/files/BrsFile.js +719 -353
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +1238 -449
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +6 -5
- package/dist/files/XmlFile.js +38 -30
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +302 -237
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +44 -42
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
- package/dist/files/tests/optionalChaning.spec.js +88 -0
- package/dist/files/tests/optionalChaning.spec.js.map +1 -0
- package/dist/globalCallables.d.ts +3 -1
- package/dist/globalCallables.js +424 -152
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.js +28 -5
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +133 -16
- package/dist/lexer/Lexer.d.ts +19 -1
- package/dist/lexer/Lexer.js +127 -21
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +657 -536
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/Token.d.ts +2 -2
- package/dist/lexer/TokenKind.d.ts +13 -1
- package/dist/lexer/TokenKind.js +60 -3
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/BrsTranspileState.d.ts +9 -0
- package/dist/parser/BrsTranspileState.js +14 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +150 -34
- package/dist/parser/Expression.js +335 -165
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +189 -89
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +153 -30
- package/dist/parser/Parser.js +1100 -503
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +687 -266
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGParser.d.ts +41 -4
- package/dist/parser/SGParser.js +186 -175
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +35 -22
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +206 -38
- package/dist/parser/SGTypes.js +470 -161
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/SGTypes.spec.d.ts +1 -0
- package/dist/parser/SGTypes.spec.js +351 -0
- package/dist/parser/SGTypes.spec.js.map +1 -0
- package/dist/parser/Statement.d.ts +202 -48
- package/dist/parser/Statement.js +648 -193
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +11 -11
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/TranspileState.d.ts +1 -1
- package/dist/parser/TranspileState.js +15 -7
- package/dist/parser/TranspileState.js.map +1 -1
- package/dist/parser/tests/Parser.spec.d.ts +10 -9
- package/dist/parser/tests/Parser.spec.js +15 -11
- package/dist/parser/tests/Parser.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/For.spec.js +60 -60
- 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 +213 -194
- 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 +162 -138
- 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 +75 -63
- 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.d.ts +1 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
- 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 +9 -9
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +28 -28
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +102 -102
- 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/Enum.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +840 -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 +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.d.ts +1 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +254 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
- 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 +108 -106
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +40 -40
- 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 +15 -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 +5 -5
- package/dist/preprocessor/Manifest.js +14 -35
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/preprocessor/Manifest.spec.d.ts +1 -0
- package/dist/preprocessor/Manifest.spec.js +78 -103
- package/dist/preprocessor/Manifest.spec.js.map +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/roku-types/data.json +21891 -0
- package/dist/roku-types/index.d.ts +6776 -0
- package/dist/roku-types/index.js +11 -0
- package/dist/roku-types/index.js.map +1 -0
- package/dist/types/ArrayType.d.ts +8 -5
- package/dist/types/ArrayType.js +52 -12
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +72 -11
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/BooleanType.d.ts +4 -2
- package/dist/types/BooleanType.js +9 -4
- package/dist/types/BooleanType.js.map +1 -1
- package/dist/types/BooleanType.spec.js +5 -3
- package/dist/types/BooleanType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +20 -5
- package/dist/types/BscType.js +24 -0
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/CustomType.d.ts +8 -6
- package/dist/types/CustomType.js +20 -11
- package/dist/types/CustomType.js.map +1 -1
- package/dist/types/DoubleType.d.ts +2 -0
- package/dist/types/DoubleType.js +14 -9
- package/dist/types/DoubleType.js.map +1 -1
- package/dist/types/DoubleType.spec.js +5 -3
- package/dist/types/DoubleType.spec.js.map +1 -1
- package/dist/types/DynamicType.d.ts +2 -0
- package/dist/types/DynamicType.js +6 -2
- 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/EnumType.d.ts +22 -0
- package/dist/types/EnumType.js +55 -0
- package/dist/types/EnumType.js.map +1 -0
- package/dist/types/FloatType.d.ts +2 -0
- package/dist/types/FloatType.js +14 -9
- package/dist/types/FloatType.js.map +1 -1
- package/dist/types/FloatType.spec.js +4 -2
- package/dist/types/FloatType.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +7 -31
- package/dist/types/FunctionType.js +11 -57
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/IntegerType.d.ts +2 -0
- package/dist/types/IntegerType.js +14 -9
- package/dist/types/IntegerType.js.map +1 -1
- package/dist/types/IntegerType.spec.js +5 -3
- package/dist/types/IntegerType.spec.js.map +1 -1
- package/dist/types/InterfaceType.d.ts +13 -4
- package/dist/types/InterfaceType.js +48 -8
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/InterfaceType.spec.d.ts +1 -0
- package/dist/types/InterfaceType.spec.js +194 -0
- package/dist/types/InterfaceType.spec.js.map +1 -0
- package/dist/types/InvalidType.d.ts +4 -2
- package/dist/types/InvalidType.js +10 -5
- package/dist/types/InvalidType.js.map +1 -1
- package/dist/types/InvalidType.spec.js +4 -2
- package/dist/types/InvalidType.spec.js.map +1 -1
- package/dist/types/LazyType.d.ts +8 -7
- package/dist/types/LazyType.js +22 -10
- package/dist/types/LazyType.js.map +1 -1
- package/dist/types/LongIntegerType.d.ts +2 -0
- package/dist/types/LongIntegerType.js +14 -9
- package/dist/types/LongIntegerType.js.map +1 -1
- package/dist/types/LongIntegerType.spec.js +4 -2
- package/dist/types/LongIntegerType.spec.js.map +1 -1
- package/dist/types/ObjectType.d.ts +8 -4
- package/dist/types/ObjectType.js +9 -4
- 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.d.ts +4 -2
- package/dist/types/StringType.js +9 -4
- package/dist/types/StringType.js.map +1 -1
- package/dist/types/StringType.spec.js +4 -2
- package/dist/types/StringType.spec.js.map +1 -1
- package/dist/types/TypedFunctionType.d.ts +28 -0
- package/dist/types/TypedFunctionType.js +88 -0
- package/dist/types/TypedFunctionType.js.map +1 -0
- package/dist/types/TypedFunctionType.spec.d.ts +1 -0
- package/dist/types/TypedFunctionType.spec.js +37 -0
- package/dist/types/TypedFunctionType.spec.js.map +1 -0
- package/dist/types/UninitializedType.js +3 -3
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/VoidType.d.ts +4 -2
- package/dist/types/VoidType.js +8 -4
- 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.d.ts +42 -0
- package/dist/types/helpers.js +118 -0
- package/dist/types/helpers.js.map +1 -0
- package/dist/util.d.ts +91 -21
- package/dist/util.js +364 -114
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +19 -2
- package/dist/validators/ClassValidator.js +164 -103
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +30 -19
- 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/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
- package/dist/types/FunctionType.spec.js +0 -23
- package/dist/types/FunctionType.spec.js.map +0 -1
|
@@ -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
|
|
@@ -19,12 +20,12 @@ describe('parser if statements', () => {
|
|
|
19
20
|
end if
|
|
20
21
|
`);
|
|
21
22
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
22
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
23
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
23
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
24
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -34,12 +35,12 @@ describe('parser if statements', () => {
|
|
|
34
35
|
end if
|
|
35
36
|
`);
|
|
36
37
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
37
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
38
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
38
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
39
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -49,12 +50,12 @@ describe('parser if statements', () => {
|
|
|
49
50
|
end if
|
|
50
51
|
`);
|
|
51
52
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
52
|
-
chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
53
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
53
|
+
(0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
|
|
54
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -65,20 +66,20 @@ describe('parser if statements', () => {
|
|
|
65
66
|
end if
|
|
66
67
|
`);
|
|
67
68
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
68
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
69
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
69
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
70
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
70
71
|
let ifs = statements[0];
|
|
71
|
-
if (!
|
|
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 (!
|
|
75
|
+
if (!(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
|
|
75
76
|
assert.fail('Missing chained else-if statement');
|
|
76
77
|
}
|
|
77
|
-
chai_1.expect(ifs.elseBranch.elseBranch).to.exist;
|
|
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
|
|
@@ -86,121 +87,121 @@ describe('parser if statements', () => {
|
|
|
86
87
|
end if
|
|
87
88
|
`);
|
|
88
89
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
89
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
90
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
90
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
91
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
91
92
|
let ifs = statements[0];
|
|
92
|
-
if (!
|
|
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
|
-
chai_1.expect(ifs.elseBranch).to.exist;
|
|
96
|
-
if (!
|
|
96
|
+
(0, chai_1.expect)(ifs.elseBranch).to.exist;
|
|
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);
|
|
105
106
|
if (diagnostics.length > 0) {
|
|
106
107
|
console.log(diagnostics);
|
|
107
108
|
}
|
|
108
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
109
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
109
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
110
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
110
111
|
});
|
|
111
112
|
describe('single-line if', () => {
|
|
112
113
|
it('parses if only', () => {
|
|
113
114
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
114
|
-
Parser_spec_1.token(
|
|
115
|
-
Parser_spec_1.token(
|
|
116
|
-
Parser_spec_1.token(
|
|
117
|
-
Parser_spec_1.token(
|
|
118
|
-
Parser_spec_1.token(
|
|
119
|
-
Parser_spec_1.identifier('foo'),
|
|
120
|
-
Parser_spec_1.token(
|
|
121
|
-
Parser_spec_1.token(
|
|
122
|
-
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'),
|
|
120
|
+
(0, Parser_spec_1.identifier)('foo'),
|
|
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
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
126
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
126
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
127
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
127
128
|
});
|
|
128
129
|
it('parses if-else', () => {
|
|
129
130
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
130
|
-
Parser_spec_1.token(
|
|
131
|
-
Parser_spec_1.token(
|
|
132
|
-
Parser_spec_1.token(
|
|
133
|
-
Parser_spec_1.token(
|
|
134
|
-
Parser_spec_1.token(
|
|
135
|
-
Parser_spec_1.identifier('foo'),
|
|
136
|
-
Parser_spec_1.token(
|
|
137
|
-
Parser_spec_1.token(
|
|
138
|
-
Parser_spec_1.token(
|
|
139
|
-
Parser_spec_1.identifier('foo'),
|
|
140
|
-
Parser_spec_1.token(
|
|
141
|
-
Parser_spec_1.token(
|
|
142
|
-
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'),
|
|
136
|
+
(0, Parser_spec_1.identifier)('foo'),
|
|
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'),
|
|
140
|
+
(0, Parser_spec_1.identifier)('foo'),
|
|
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
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
146
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
146
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
147
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
147
148
|
});
|
|
148
149
|
it('parses if-elseif-else', () => {
|
|
149
150
|
let { statements, diagnostics } = Parser_1.Parser.parse([
|
|
150
|
-
Parser_spec_1.token(
|
|
151
|
-
Parser_spec_1.token(
|
|
152
|
-
Parser_spec_1.token(
|
|
153
|
-
Parser_spec_1.token(
|
|
154
|
-
Parser_spec_1.token(
|
|
155
|
-
Parser_spec_1.identifier('foo'),
|
|
156
|
-
Parser_spec_1.token(
|
|
157
|
-
Parser_spec_1.token(
|
|
158
|
-
Parser_spec_1.token(
|
|
159
|
-
Parser_spec_1.token(
|
|
160
|
-
Parser_spec_1.token(
|
|
161
|
-
Parser_spec_1.token(
|
|
162
|
-
Parser_spec_1.token(
|
|
163
|
-
Parser_spec_1.token(
|
|
164
|
-
Parser_spec_1.identifier('same'),
|
|
165
|
-
Parser_spec_1.token(
|
|
166
|
-
Parser_spec_1.token(
|
|
167
|
-
Parser_spec_1.token(
|
|
168
|
-
Parser_spec_1.identifier('foo'),
|
|
169
|
-
Parser_spec_1.token(
|
|
170
|
-
Parser_spec_1.token(
|
|
171
|
-
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'),
|
|
156
|
+
(0, Parser_spec_1.identifier)('foo'),
|
|
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'),
|
|
165
|
+
(0, Parser_spec_1.identifier)('same'),
|
|
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'),
|
|
169
|
+
(0, Parser_spec_1.identifier)('foo'),
|
|
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
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
175
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
175
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
176
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
176
177
|
});
|
|
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
|
-
Parser_spec_1.token(
|
|
181
|
-
Parser_spec_1.token(
|
|
182
|
-
Parser_spec_1.token(
|
|
183
|
-
Parser_spec_1.token(
|
|
184
|
-
Parser_spec_1.identifier('foo'),
|
|
185
|
-
Parser_spec_1.token(
|
|
186
|
-
Parser_spec_1.token(
|
|
187
|
-
Parser_spec_1.token(
|
|
188
|
-
Parser_spec_1.token(
|
|
189
|
-
Parser_spec_1.token(
|
|
190
|
-
Parser_spec_1.token(
|
|
191
|
-
Parser_spec_1.token(
|
|
192
|
-
Parser_spec_1.identifier('same'),
|
|
193
|
-
Parser_spec_1.token(
|
|
194
|
-
Parser_spec_1.token(
|
|
195
|
-
Parser_spec_1.token(
|
|
196
|
-
Parser_spec_1.identifier('foo'),
|
|
197
|
-
Parser_spec_1.token(
|
|
198
|
-
Parser_spec_1.token(
|
|
199
|
-
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'),
|
|
185
|
+
(0, Parser_spec_1.identifier)('foo'),
|
|
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'),
|
|
193
|
+
(0, Parser_spec_1.identifier)('same'),
|
|
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'),
|
|
197
|
+
(0, Parser_spec_1.identifier)('foo'),
|
|
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
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
203
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
203
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
204
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
204
205
|
});
|
|
205
206
|
it('parses special statements in inline block', () => {
|
|
206
207
|
const { statements, diagnostics } = Parser_1.Parser.parse(`
|
|
@@ -212,26 +213,26 @@ describe('parser if statements', () => {
|
|
|
212
213
|
if true return else print 1
|
|
213
214
|
if true then return else print 1
|
|
214
215
|
`);
|
|
215
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
216
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
216
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
217
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
217
218
|
});
|
|
218
219
|
});
|
|
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
|
|
226
227
|
end if
|
|
227
228
|
`);
|
|
228
229
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
229
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
230
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
230
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
231
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -240,12 +241,12 @@ describe('parser if statements', () => {
|
|
|
240
241
|
end if
|
|
241
242
|
`);
|
|
242
243
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
243
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
244
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
244
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
245
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -256,12 +257,12 @@ describe('parser if statements', () => {
|
|
|
256
257
|
end if
|
|
257
258
|
`);
|
|
258
259
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
259
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
260
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
260
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
261
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -272,12 +273,12 @@ describe('parser if statements', () => {
|
|
|
272
273
|
end if
|
|
273
274
|
`);
|
|
274
275
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
275
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
276
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
276
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
277
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -289,19 +290,19 @@ describe('parser if statements', () => {
|
|
|
289
290
|
end sub
|
|
290
291
|
`);
|
|
291
292
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
292
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
293
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
293
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
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 (!
|
|
297
|
+
if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
|
|
297
298
|
assert.fail('Unexpected statement found');
|
|
298
299
|
}
|
|
299
|
-
chai_1.expect(ifs.tokens.endIf).to.not.exist;
|
|
300
|
-
chai_1.expect(ifs.elseBranch.tokens.endIf).to.exist;
|
|
300
|
+
(0, chai_1.expect)(ifs.tokens.endIf).to.not.exist;
|
|
301
|
+
(0, chai_1.expect)(ifs.elseBranch.tokens.endIf).to.exist;
|
|
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!"
|
|
@@ -313,125 +314,125 @@ describe('parser if statements', () => {
|
|
|
313
314
|
end sub
|
|
314
315
|
`);
|
|
315
316
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
316
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
317
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
317
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
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);
|
|
324
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
325
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
325
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
326
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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);
|
|
333
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
334
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
334
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
335
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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);
|
|
342
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
343
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
343
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
344
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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);
|
|
351
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
352
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
352
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
353
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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);
|
|
360
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
361
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
361
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
362
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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);
|
|
369
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
370
|
-
chai_1.expect(statements).to.be.lengthOf(0);
|
|
370
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
371
|
+
(0, chai_1.expect)(statements).to.be.lengthOf(0);
|
|
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);
|
|
378
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
379
|
-
chai_1.expect(statements).to.be.lengthOf(0);
|
|
379
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
380
|
+
(0, chai_1.expect)(statements).to.be.lengthOf(0);
|
|
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
|
|
387
388
|
`);
|
|
388
389
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
389
|
-
chai_1.expect(diagnostics).to.be.lengthOf(2);
|
|
390
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
390
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(2);
|
|
391
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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);
|
|
398
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1);
|
|
399
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
399
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
|
|
400
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
407
408
|
`);
|
|
408
409
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
409
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1);
|
|
410
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
410
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
|
|
411
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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);
|
|
418
|
-
chai_1.expect(diagnostics).to.be.lengthOf(2);
|
|
419
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
419
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(2);
|
|
420
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
427
428
|
`);
|
|
428
429
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
429
|
-
chai_1.expect(diagnostics).to.be.lengthOf(2);
|
|
430
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
430
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(2);
|
|
431
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
@@ -440,112 +441,130 @@ describe('parser if statements', () => {
|
|
|
440
441
|
end function
|
|
441
442
|
`);
|
|
442
443
|
let { statements, diagnostics, references } = Parser_1.Parser.parse(tokens);
|
|
443
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
444
|
-
chai_1.expect(statements).to.be.lengthOf(2);
|
|
445
|
-
chai_1.expect(references.functionStatements).to.be.lengthOf(2);
|
|
444
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
445
|
+
(0, chai_1.expect)(statements).to.be.lengthOf(2);
|
|
446
|
+
(0, chai_1.expect)(references.functionStatements).to.be.lengthOf(2);
|
|
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);
|
|
453
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1);
|
|
454
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
454
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
|
|
455
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
462
463
|
`);
|
|
463
464
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
464
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1);
|
|
465
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
465
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
|
|
466
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
473
474
|
`);
|
|
474
475
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
475
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1);
|
|
476
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
476
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
|
|
477
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
484
485
|
`);
|
|
485
486
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
486
|
-
chai_1.expect(diagnostics).to.be.lengthOf(1);
|
|
487
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
487
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
|
|
488
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
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
|
|
495
496
|
`);
|
|
496
497
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
497
|
-
chai_1.expect(diagnostics).to.be.length.greaterThan(0);
|
|
498
|
-
chai_1.expect(statements).to.be.lengthOf(1);
|
|
498
|
+
(0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
|
|
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
|
`);
|
|
505
506
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
506
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
507
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
507
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
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);
|
|
514
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
515
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
515
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
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);
|
|
522
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
523
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
523
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
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);
|
|
530
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
531
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
531
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
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
|
`);
|
|
538
539
|
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
539
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
540
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
540
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
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);
|
|
547
|
-
chai_1.expect(diagnostics).to.be.lengthOf(0);
|
|
548
|
-
chai_1.expect(statements).to.be.length.greaterThan(0);
|
|
548
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
549
|
+
(0, chai_1.expect)(statements).to.be.length.greaterThan(0);
|
|
550
|
+
});
|
|
551
|
+
it('single-line if block statements have correct range', () => {
|
|
552
|
+
let { tokens } = Lexer_1.Lexer.scan(`
|
|
553
|
+
if false then print "true"
|
|
554
|
+
if false then print "true": a = 10
|
|
555
|
+
if false then print "true" else print "false"
|
|
556
|
+
if false then print "true" else print "false": a = 20
|
|
557
|
+
`);
|
|
558
|
+
let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
|
|
559
|
+
(0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
|
|
560
|
+
const then1 = statements[0].thenBranch;
|
|
561
|
+
(0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(then1.range, then1.statements)).to.be.true;
|
|
562
|
+
const then2 = statements[1].thenBranch;
|
|
563
|
+
(0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(then2.range, then2.statements)).to.be.true;
|
|
564
|
+
const else1 = statements[2].elseBranch;
|
|
565
|
+
(0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(else1.range, else1.statements)).to.be.true;
|
|
566
|
+
const else2 = statements[3].elseBranch;
|
|
567
|
+
(0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(else2.range, else2.statements)).to.be.true;
|
|
549
568
|
});
|
|
550
569
|
});
|
|
551
570
|
//# sourceMappingURL=If.spec.js.map
|