brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.20
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 +542 -253
- package/README.md +30 -9
- package/bsconfig.schema.json +13 -1
- package/dist/BsConfig.d.ts +4 -0
- package/dist/Cache.d.ts +3 -8
- package/dist/Cache.js +9 -14
- 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.js +5 -4
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticFilterer.js +1 -1
- 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 +4 -14
- package/dist/LanguageServer.js +40 -26
- 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 +180 -82
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +4 -0
- package/dist/ProgramBuilder.js +30 -14
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +100 -28
- package/dist/Scope.js +382 -154
- 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 +40 -13
- package/dist/SymbolTable.js.map +1 -1
- package/dist/XmlScope.d.ts +8 -3
- package/dist/XmlScope.js +65 -27
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/AstEditor.d.ts +33 -0
- package/dist/astUtils/AstEditor.js +107 -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 +170 -0
- package/dist/astUtils/AstEditor.spec.js.map +1 -0
- package/dist/astUtils/creators.d.ts +24 -6
- package/dist/astUtils/creators.js +130 -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 +27 -8
- package/dist/astUtils/reflection.js +66 -1
- 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 +17 -2
- package/dist/astUtils/visitors.js +2 -2
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +31 -29
- 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 +97 -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 +73 -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 +9 -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 +634 -145
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +62 -30
- package/dist/files/BrsFile.js +683 -335
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +1055 -449
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +11 -10
- package/dist/files/XmlFile.js +33 -26
- 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 +23 -4
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +129 -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 +7 -0
- package/dist/parser/BrsTranspileState.js +9 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +150 -34
- package/dist/parser/Expression.js +337 -150
- 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 +152 -29
- package/dist/parser/Parser.js +1095 -501
- 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 +194 -40
- package/dist/parser/Statement.js +597 -160
- 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/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 +87 -16
- package/dist/util.js +339 -94
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +19 -2
- package/dist/validators/ClassValidator.js +163 -102
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +26 -15
- 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
package/dist/parser/Statement.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ThrowStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = exports.ClassStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = exports.Statement = void 0;
|
|
4
|
-
const
|
|
3
|
+
exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = exports.Statement = void 0;
|
|
4
|
+
const TokenKind_1 = require("../lexer/TokenKind");
|
|
5
5
|
const Expression_1 = require("./Expression");
|
|
6
6
|
const util_1 = require("../util");
|
|
7
|
-
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
8
7
|
const Parser_1 = require("./Parser");
|
|
9
8
|
const visitors_1 = require("../astUtils/visitors");
|
|
10
9
|
const reflection_1 = require("../astUtils/reflection");
|
|
11
10
|
const creators_1 = require("../astUtils/creators");
|
|
12
11
|
const DynamicType_1 = require("../types/DynamicType");
|
|
13
12
|
const SymbolTable_1 = require("../SymbolTable");
|
|
13
|
+
const CustomType_1 = require("../types/CustomType");
|
|
14
|
+
const InterfaceType_1 = require("../types/InterfaceType");
|
|
14
15
|
/**
|
|
15
16
|
* A BrightScript statement
|
|
16
17
|
*/
|
|
@@ -45,12 +46,10 @@ exports.EmptyStatement = EmptyStatement;
|
|
|
45
46
|
*/
|
|
46
47
|
class Body extends Statement {
|
|
47
48
|
constructor(statements = []) {
|
|
49
|
+
var _a;
|
|
48
50
|
super();
|
|
49
51
|
this.statements = statements;
|
|
50
|
-
|
|
51
|
-
get range() {
|
|
52
|
-
var _a, _b, _c, _d;
|
|
53
|
-
return util_1.util.createRangeFromPositions((_b = (_a = this.statements[0]) === null || _a === void 0 ? void 0 : _a.range.start) !== null && _b !== void 0 ? _b : vscode_languageserver_1.Position.create(0, 0), (_d = (_c = this.statements[this.statements.length - 1]) === null || _c === void 0 ? void 0 : _c.range.end) !== null && _d !== void 0 ? _d : vscode_languageserver_1.Position.create(0, 0));
|
|
52
|
+
this.range = (_a = util_1.util.createBoundingRange(...this.statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
54
53
|
}
|
|
55
54
|
transpile(state) {
|
|
56
55
|
let result = [];
|
|
@@ -62,15 +61,15 @@ class Body extends Statement {
|
|
|
62
61
|
//this is the first statement. do nothing related to spacing and newlines
|
|
63
62
|
//if comment is on same line as prior sibling
|
|
64
63
|
}
|
|
65
|
-
else if (reflection_1.isCommentStatement(statement) && previousStatement && statement.range.start.line === previousStatement.range.end.line) {
|
|
64
|
+
else if ((0, reflection_1.isCommentStatement)(statement) && previousStatement && statement.range.start.line === previousStatement.range.end.line) {
|
|
66
65
|
result.push(' ');
|
|
67
66
|
//add double newline if this is a comment, and next is a function
|
|
68
67
|
}
|
|
69
|
-
else if (reflection_1.isCommentStatement(statement) && nextStatement && reflection_1.isFunctionStatement(nextStatement)) {
|
|
68
|
+
else if ((0, reflection_1.isCommentStatement)(statement) && nextStatement && (0, reflection_1.isFunctionStatement)(nextStatement)) {
|
|
70
69
|
result.push('\n\n');
|
|
71
70
|
//add double newline if is function not preceeded by a comment
|
|
72
71
|
}
|
|
73
|
-
else if (reflection_1.isFunctionStatement(statement) && previousStatement && !(reflection_1.isCommentStatement(previousStatement))) {
|
|
72
|
+
else if ((0, reflection_1.isFunctionStatement)(statement) && previousStatement && !((0, reflection_1.isCommentStatement)(previousStatement))) {
|
|
74
73
|
result.push('\n\n');
|
|
75
74
|
}
|
|
76
75
|
else {
|
|
@@ -85,7 +84,7 @@ class Body extends Statement {
|
|
|
85
84
|
let result = [];
|
|
86
85
|
for (const statement of this.statements) {
|
|
87
86
|
//if the current statement supports generating typedef, call it
|
|
88
|
-
if (
|
|
87
|
+
if ((0, reflection_1.isTypedefProvider)(statement)) {
|
|
89
88
|
result.push(state.indent(), ...statement.getTypedef(state), state.newline);
|
|
90
89
|
}
|
|
91
90
|
}
|
|
@@ -94,7 +93,7 @@ class Body extends Statement {
|
|
|
94
93
|
walk(visitor, options) {
|
|
95
94
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
96
95
|
for (let i = 0; i < this.statements.length; i++) {
|
|
97
|
-
visitors_1.walk(this.statements, i, visitor, options, this);
|
|
96
|
+
(0, visitors_1.walk)(this.statements, i, visitor, options, this);
|
|
98
97
|
}
|
|
99
98
|
}
|
|
100
99
|
}
|
|
@@ -102,17 +101,18 @@ class Body extends Statement {
|
|
|
102
101
|
exports.Body = Body;
|
|
103
102
|
class AssignmentStatement extends Statement {
|
|
104
103
|
constructor(name, equals, value, containingFunction) {
|
|
104
|
+
var _a;
|
|
105
105
|
super();
|
|
106
106
|
this.name = name;
|
|
107
107
|
this.equals = equals;
|
|
108
108
|
this.value = value;
|
|
109
109
|
this.containingFunction = containingFunction;
|
|
110
|
-
this.range = util_1.util.
|
|
110
|
+
this.range = (_a = util_1.util.createBoundingRange(this.name, this.equals, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
111
111
|
}
|
|
112
112
|
transpile(state) {
|
|
113
113
|
var _a, _b;
|
|
114
114
|
//if the value is a compound assignment, just transpile the expression itself
|
|
115
|
-
if (
|
|
115
|
+
if (TokenKind_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
|
|
116
116
|
return this.value.transpile(state);
|
|
117
117
|
}
|
|
118
118
|
else {
|
|
@@ -127,19 +127,18 @@ class AssignmentStatement extends Statement {
|
|
|
127
127
|
}
|
|
128
128
|
walk(visitor, options) {
|
|
129
129
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
130
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
130
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
exports.AssignmentStatement = AssignmentStatement;
|
|
135
135
|
class Block extends Statement {
|
|
136
136
|
constructor(statements, startingRange) {
|
|
137
|
+
var _a;
|
|
137
138
|
super();
|
|
138
139
|
this.statements = statements;
|
|
139
140
|
this.startingRange = startingRange;
|
|
140
|
-
this.range = util_1.util.
|
|
141
|
-
? this.statements[this.statements.length - 1].range.end
|
|
142
|
-
: this.startingRange.start);
|
|
141
|
+
this.range = (_a = util_1.util.createBoundingRange({ range: this.startingRange }, ...statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
143
142
|
}
|
|
144
143
|
transpile(state) {
|
|
145
144
|
state.blockDepth++;
|
|
@@ -148,7 +147,7 @@ class Block extends Statement {
|
|
|
148
147
|
let previousStatement = this.statements[i - 1];
|
|
149
148
|
let statement = this.statements[i];
|
|
150
149
|
//if comment is on same line as parent
|
|
151
|
-
if (reflection_1.isCommentStatement(statement) &&
|
|
150
|
+
if ((0, reflection_1.isCommentStatement)(statement) &&
|
|
152
151
|
(util_1.util.linesTouch(state.lineage[0], statement) || util_1.util.linesTouch(previousStatement, statement))) {
|
|
153
152
|
results.push(' ');
|
|
154
153
|
//is not a comment
|
|
@@ -168,7 +167,7 @@ class Block extends Statement {
|
|
|
168
167
|
walk(visitor, options) {
|
|
169
168
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
170
169
|
for (let i = 0; i < this.statements.length; i++) {
|
|
171
|
-
visitors_1.walk(this.statements, i, visitor, options, this);
|
|
170
|
+
(0, visitors_1.walk)(this.statements, i, visitor, options, this);
|
|
172
171
|
}
|
|
173
172
|
}
|
|
174
173
|
}
|
|
@@ -176,16 +175,17 @@ class Block extends Statement {
|
|
|
176
175
|
exports.Block = Block;
|
|
177
176
|
class ExpressionStatement extends Statement {
|
|
178
177
|
constructor(expression) {
|
|
178
|
+
var _a, _b;
|
|
179
179
|
super();
|
|
180
180
|
this.expression = expression;
|
|
181
|
-
this.range = this.expression.range;
|
|
181
|
+
this.range = (_b = (_a = this.expression) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
182
182
|
}
|
|
183
183
|
transpile(state) {
|
|
184
184
|
return this.expression.transpile(state);
|
|
185
185
|
}
|
|
186
186
|
walk(visitor, options) {
|
|
187
187
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
188
|
-
visitors_1.walk(this, 'expression', visitor, options);
|
|
188
|
+
(0, visitors_1.walk)(this, 'expression', visitor, options);
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
}
|
|
@@ -195,10 +195,8 @@ class CommentStatement extends Statement {
|
|
|
195
195
|
var _a;
|
|
196
196
|
super();
|
|
197
197
|
this.comments = comments;
|
|
198
|
+
this.range = (_a = util_1.util.createBoundingRange(...this.comments)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
198
199
|
this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
|
|
199
|
-
if (((_a = this.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
200
|
-
this.range = util_1.util.createRangeFromPositions(this.comments[0].range.start, this.comments[this.comments.length - 1].range.end);
|
|
201
|
-
}
|
|
202
200
|
}
|
|
203
201
|
get text() {
|
|
204
202
|
return this.comments.map(x => x.text).join('\n');
|
|
@@ -228,9 +226,10 @@ class CommentStatement extends Statement {
|
|
|
228
226
|
exports.CommentStatement = CommentStatement;
|
|
229
227
|
class ExitForStatement extends Statement {
|
|
230
228
|
constructor(tokens) {
|
|
229
|
+
var _a, _b, _c;
|
|
231
230
|
super();
|
|
232
231
|
this.tokens = tokens;
|
|
233
|
-
this.range = this.tokens.exitFor.range;
|
|
232
|
+
this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitFor) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
|
|
234
233
|
}
|
|
235
234
|
transpile(state) {
|
|
236
235
|
return [
|
|
@@ -244,9 +243,10 @@ class ExitForStatement extends Statement {
|
|
|
244
243
|
exports.ExitForStatement = ExitForStatement;
|
|
245
244
|
class ExitWhileStatement extends Statement {
|
|
246
245
|
constructor(tokens) {
|
|
246
|
+
var _a, _b, _c;
|
|
247
247
|
super();
|
|
248
248
|
this.tokens = tokens;
|
|
249
|
-
this.range = this.tokens.exitWhile.range;
|
|
249
|
+
this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitWhile) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
|
|
250
250
|
}
|
|
251
251
|
transpile(state) {
|
|
252
252
|
return [
|
|
@@ -264,7 +264,16 @@ class FunctionStatement extends Statement {
|
|
|
264
264
|
this.name = name;
|
|
265
265
|
this.func = func;
|
|
266
266
|
this.namespaceName = namespaceName;
|
|
267
|
-
|
|
267
|
+
}
|
|
268
|
+
get range() {
|
|
269
|
+
return this.cacheRange();
|
|
270
|
+
}
|
|
271
|
+
cacheRange() {
|
|
272
|
+
var _a, _b;
|
|
273
|
+
if (!this._range) {
|
|
274
|
+
this._range = (_b = (_a = this.func) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : this.name.range;
|
|
275
|
+
}
|
|
276
|
+
return this._range;
|
|
268
277
|
}
|
|
269
278
|
/**
|
|
270
279
|
* Get the name of this expression based on the parse mode
|
|
@@ -295,21 +304,21 @@ class FunctionStatement extends Statement {
|
|
|
295
304
|
}
|
|
296
305
|
walk(visitor, options) {
|
|
297
306
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
298
|
-
visitors_1.walk(this, 'func', visitor, options);
|
|
307
|
+
(0, visitors_1.walk)(this, 'func', visitor, options);
|
|
299
308
|
}
|
|
300
309
|
}
|
|
301
310
|
}
|
|
302
311
|
exports.FunctionStatement = FunctionStatement;
|
|
303
312
|
class IfStatement extends Statement {
|
|
304
313
|
constructor(tokens, condition, thenBranch, elseBranch, isInline) {
|
|
305
|
-
var _a
|
|
314
|
+
var _a;
|
|
306
315
|
super();
|
|
307
316
|
this.tokens = tokens;
|
|
308
317
|
this.condition = condition;
|
|
309
318
|
this.thenBranch = thenBranch;
|
|
310
319
|
this.elseBranch = elseBranch;
|
|
311
320
|
this.isInline = isInline;
|
|
312
|
-
this.range = util_1.util.
|
|
321
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.if, this.condition, this.tokens.then, this.thenBranch, this.tokens.else, this.elseBranch, this.tokens.endIf)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
313
322
|
}
|
|
314
323
|
transpile(state) {
|
|
315
324
|
let results = [];
|
|
@@ -318,14 +327,11 @@ class IfStatement extends Statement {
|
|
|
318
327
|
results.push(' ');
|
|
319
328
|
//conditions
|
|
320
329
|
results.push(...this.condition.transpile(state));
|
|
321
|
-
results.push(' ');
|
|
322
330
|
//then
|
|
323
331
|
if (this.tokens.then) {
|
|
332
|
+
results.push(' ');
|
|
324
333
|
results.push(state.transpileToken(this.tokens.then));
|
|
325
334
|
}
|
|
326
|
-
else {
|
|
327
|
-
results.push('then');
|
|
328
|
-
}
|
|
329
335
|
state.lineage.unshift(this);
|
|
330
336
|
//if statement body
|
|
331
337
|
let thenNodes = this.thenBranch.transpile(state);
|
|
@@ -340,13 +346,14 @@ class IfStatement extends Statement {
|
|
|
340
346
|
results.push(state.indent(), state.transpileToken(this.tokens.else));
|
|
341
347
|
}
|
|
342
348
|
if (this.elseBranch) {
|
|
343
|
-
if (reflection_1.isIfStatement(this.elseBranch)) {
|
|
349
|
+
if ((0, reflection_1.isIfStatement)(this.elseBranch)) {
|
|
344
350
|
//chained elseif
|
|
345
351
|
state.lineage.unshift(this.elseBranch);
|
|
346
352
|
let body = this.elseBranch.transpile(state);
|
|
347
353
|
state.lineage.shift();
|
|
348
354
|
if (body.length > 0) {
|
|
349
|
-
|
|
355
|
+
//zero or more spaces between the `else` and the `if`
|
|
356
|
+
results.push(this.elseBranch.tokens.if.leadingWhitespace);
|
|
350
357
|
results.push(...body);
|
|
351
358
|
// stop here because chained if will transpile the rest
|
|
352
359
|
return results;
|
|
@@ -378,23 +385,24 @@ class IfStatement extends Statement {
|
|
|
378
385
|
}
|
|
379
386
|
walk(visitor, options) {
|
|
380
387
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
381
|
-
visitors_1.walk(this, 'condition', visitor, options);
|
|
388
|
+
(0, visitors_1.walk)(this, 'condition', visitor, options);
|
|
382
389
|
}
|
|
383
390
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
384
|
-
visitors_1.walk(this, 'thenBranch', visitor, options);
|
|
391
|
+
(0, visitors_1.walk)(this, 'thenBranch', visitor, options);
|
|
385
392
|
}
|
|
386
393
|
if (this.elseBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
387
|
-
visitors_1.walk(this, 'elseBranch', visitor, options);
|
|
394
|
+
(0, visitors_1.walk)(this, 'elseBranch', visitor, options);
|
|
388
395
|
}
|
|
389
396
|
}
|
|
390
397
|
}
|
|
391
398
|
exports.IfStatement = IfStatement;
|
|
392
399
|
class IncrementStatement extends Statement {
|
|
393
400
|
constructor(value, operator) {
|
|
401
|
+
var _a;
|
|
394
402
|
super();
|
|
395
403
|
this.value = value;
|
|
396
404
|
this.operator = operator;
|
|
397
|
-
this.range = util_1.util.
|
|
405
|
+
this.range = (_a = util_1.util.createBoundingRange(this.value, this.operator)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
398
406
|
}
|
|
399
407
|
transpile(state) {
|
|
400
408
|
return [
|
|
@@ -404,7 +412,7 @@ class IncrementStatement extends Statement {
|
|
|
404
412
|
}
|
|
405
413
|
walk(visitor, options) {
|
|
406
414
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
407
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
415
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
408
416
|
}
|
|
409
417
|
}
|
|
410
418
|
}
|
|
@@ -419,12 +427,11 @@ class PrintStatement extends Statement {
|
|
|
419
427
|
* evaluated and printed.
|
|
420
428
|
*/
|
|
421
429
|
constructor(tokens, expressions) {
|
|
430
|
+
var _a;
|
|
422
431
|
super();
|
|
423
432
|
this.tokens = tokens;
|
|
424
433
|
this.expressions = expressions;
|
|
425
|
-
this.range = util_1.util.
|
|
426
|
-
? this.expressions[this.expressions.length - 1].range.end
|
|
427
|
-
: this.tokens.print.range.end);
|
|
434
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.print, ...this.expressions)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
428
435
|
}
|
|
429
436
|
transpile(state) {
|
|
430
437
|
var _a;
|
|
@@ -451,8 +458,8 @@ class PrintStatement extends Statement {
|
|
|
451
458
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
452
459
|
for (let i = 0; i < this.expressions.length; i++) {
|
|
453
460
|
//sometimes we have semicolon `Token`s in the expressions list (should probably fix that...), so only emit the actual expressions
|
|
454
|
-
if (reflection_1.isExpression(this.expressions[i])) {
|
|
455
|
-
visitors_1.walk(this.expressions, i, visitor, options, this);
|
|
461
|
+
if ((0, reflection_1.isExpression)(this.expressions[i])) {
|
|
462
|
+
(0, visitors_1.walk)(this.expressions, i, visitor, options, this);
|
|
456
463
|
}
|
|
457
464
|
}
|
|
458
465
|
}
|
|
@@ -461,14 +468,14 @@ class PrintStatement extends Statement {
|
|
|
461
468
|
exports.PrintStatement = PrintStatement;
|
|
462
469
|
class DimStatement extends Statement {
|
|
463
470
|
constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
|
|
464
|
-
var _a
|
|
471
|
+
var _a;
|
|
465
472
|
super();
|
|
466
473
|
this.dimToken = dimToken;
|
|
467
474
|
this.identifier = identifier;
|
|
468
475
|
this.openingSquare = openingSquare;
|
|
469
476
|
this.dimensions = dimensions;
|
|
470
477
|
this.closingSquare = closingSquare;
|
|
471
|
-
this.range = util_1.util.
|
|
478
|
+
this.range = (_a = util_1.util.createBoundingRange(this.dimToken, this.identifier, this.openingSquare, ...this.dimensions, this.closingSquare)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
472
479
|
}
|
|
473
480
|
transpile(state) {
|
|
474
481
|
let result = [
|
|
@@ -490,7 +497,7 @@ class DimStatement extends Statement {
|
|
|
490
497
|
var _a;
|
|
491
498
|
if (((_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) > 0 && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
492
499
|
for (let i = 0; i < this.dimensions.length; i++) {
|
|
493
|
-
visitors_1.walk(this.dimensions, i, visitor, options, this);
|
|
500
|
+
(0, visitors_1.walk)(this.dimensions, i, visitor, options, this);
|
|
494
501
|
}
|
|
495
502
|
}
|
|
496
503
|
}
|
|
@@ -498,9 +505,10 @@ class DimStatement extends Statement {
|
|
|
498
505
|
exports.DimStatement = DimStatement;
|
|
499
506
|
class GotoStatement extends Statement {
|
|
500
507
|
constructor(tokens) {
|
|
508
|
+
var _a;
|
|
501
509
|
super();
|
|
502
510
|
this.tokens = tokens;
|
|
503
|
-
this.range = util_1.util.
|
|
511
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.goto, this.tokens.label)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
504
512
|
}
|
|
505
513
|
transpile(state) {
|
|
506
514
|
return [
|
|
@@ -516,9 +524,10 @@ class GotoStatement extends Statement {
|
|
|
516
524
|
exports.GotoStatement = GotoStatement;
|
|
517
525
|
class LabelStatement extends Statement {
|
|
518
526
|
constructor(tokens) {
|
|
527
|
+
var _a;
|
|
519
528
|
super();
|
|
520
529
|
this.tokens = tokens;
|
|
521
|
-
this.range = util_1.util.
|
|
530
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.identifier, this.tokens.colon)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
522
531
|
}
|
|
523
532
|
transpile(state) {
|
|
524
533
|
return [
|
|
@@ -537,7 +546,7 @@ class ReturnStatement extends Statement {
|
|
|
537
546
|
super();
|
|
538
547
|
this.tokens = tokens;
|
|
539
548
|
this.value = value;
|
|
540
|
-
this.range = util_1.util.
|
|
549
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.return, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
541
550
|
}
|
|
542
551
|
transpile(state) {
|
|
543
552
|
let result = [];
|
|
@@ -550,16 +559,17 @@ class ReturnStatement extends Statement {
|
|
|
550
559
|
}
|
|
551
560
|
walk(visitor, options) {
|
|
552
561
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
553
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
562
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
554
563
|
}
|
|
555
564
|
}
|
|
556
565
|
}
|
|
557
566
|
exports.ReturnStatement = ReturnStatement;
|
|
558
567
|
class EndStatement extends Statement {
|
|
559
568
|
constructor(tokens) {
|
|
569
|
+
var _a, _b;
|
|
560
570
|
super();
|
|
561
571
|
this.tokens = tokens;
|
|
562
|
-
this.range =
|
|
572
|
+
this.range = (_b = (_a = this.tokens.end) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
563
573
|
}
|
|
564
574
|
transpile(state) {
|
|
565
575
|
return [
|
|
@@ -573,9 +583,10 @@ class EndStatement extends Statement {
|
|
|
573
583
|
exports.EndStatement = EndStatement;
|
|
574
584
|
class StopStatement extends Statement {
|
|
575
585
|
constructor(tokens) {
|
|
586
|
+
var _a, _b;
|
|
576
587
|
super();
|
|
577
588
|
this.tokens = tokens;
|
|
578
|
-
this.range =
|
|
589
|
+
this.range = (_b = (_a = this.tokens.stop) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
579
590
|
}
|
|
580
591
|
transpile(state) {
|
|
581
592
|
return [
|
|
@@ -589,7 +600,7 @@ class StopStatement extends Statement {
|
|
|
589
600
|
exports.StopStatement = StopStatement;
|
|
590
601
|
class ForStatement extends Statement {
|
|
591
602
|
constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
|
|
592
|
-
var _a
|
|
603
|
+
var _a;
|
|
593
604
|
super();
|
|
594
605
|
this.forToken = forToken;
|
|
595
606
|
this.counterDeclaration = counterDeclaration;
|
|
@@ -599,8 +610,7 @@ class ForStatement extends Statement {
|
|
|
599
610
|
this.endForToken = endForToken;
|
|
600
611
|
this.stepToken = stepToken;
|
|
601
612
|
this.increment = increment;
|
|
602
|
-
|
|
603
|
-
this.range = util_1.util.createRangeFromPositions(this.forToken.range.start, lastRange.end);
|
|
613
|
+
this.range = (_a = util_1.util.createBoundingRange(this.forToken, this.counterDeclaration, this.toToken, this.finalValue, this.body, this.stepToken, this.increment, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
604
614
|
}
|
|
605
615
|
transpile(state) {
|
|
606
616
|
let result = [];
|
|
@@ -620,30 +630,29 @@ class ForStatement extends Statement {
|
|
|
620
630
|
state.lineage.unshift(this);
|
|
621
631
|
result.push(...this.body.transpile(state));
|
|
622
632
|
state.lineage.shift();
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
}
|
|
633
|
+
// add new line before "end for"
|
|
634
|
+
result.push('\n');
|
|
626
635
|
//end for
|
|
627
636
|
result.push(state.indent(), state.transpileToken(this.endForToken));
|
|
628
637
|
return result;
|
|
629
638
|
}
|
|
630
639
|
walk(visitor, options) {
|
|
631
640
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
632
|
-
visitors_1.walk(this, 'counterDeclaration', visitor, options);
|
|
641
|
+
(0, visitors_1.walk)(this, 'counterDeclaration', visitor, options);
|
|
633
642
|
}
|
|
634
643
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
635
|
-
visitors_1.walk(this, 'finalValue', visitor, options);
|
|
636
|
-
visitors_1.walk(this, 'increment', visitor, options);
|
|
644
|
+
(0, visitors_1.walk)(this, 'finalValue', visitor, options);
|
|
645
|
+
(0, visitors_1.walk)(this, 'increment', visitor, options);
|
|
637
646
|
}
|
|
638
647
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
639
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
648
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
640
649
|
}
|
|
641
650
|
}
|
|
642
651
|
}
|
|
643
652
|
exports.ForStatement = ForStatement;
|
|
644
653
|
class ForEachStatement extends Statement {
|
|
645
654
|
constructor(forEachToken, item, inToken, target, body, endForToken) {
|
|
646
|
-
var _a
|
|
655
|
+
var _a;
|
|
647
656
|
super();
|
|
648
657
|
this.forEachToken = forEachToken;
|
|
649
658
|
this.item = item;
|
|
@@ -651,7 +660,7 @@ class ForEachStatement extends Statement {
|
|
|
651
660
|
this.target = target;
|
|
652
661
|
this.body = body;
|
|
653
662
|
this.endForToken = endForToken;
|
|
654
|
-
this.range = util_1.util.
|
|
663
|
+
this.range = (_a = util_1.util.createBoundingRange(this.forEachToken, this.item, this.inToken, this.target, this.body, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
655
664
|
}
|
|
656
665
|
transpile(state) {
|
|
657
666
|
let result = [];
|
|
@@ -667,32 +676,30 @@ class ForEachStatement extends Statement {
|
|
|
667
676
|
state.lineage.unshift(this);
|
|
668
677
|
result.push(...this.body.transpile(state));
|
|
669
678
|
state.lineage.shift();
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
}
|
|
679
|
+
// add new line before "end for"
|
|
680
|
+
result.push('\n');
|
|
673
681
|
//end for
|
|
674
682
|
result.push(state.indent(), state.transpileToken(this.endForToken));
|
|
675
683
|
return result;
|
|
676
684
|
}
|
|
677
685
|
walk(visitor, options) {
|
|
678
686
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
679
|
-
visitors_1.walk(this, 'target', visitor, options);
|
|
687
|
+
(0, visitors_1.walk)(this, 'target', visitor, options);
|
|
680
688
|
}
|
|
681
689
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
682
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
690
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
683
691
|
}
|
|
684
692
|
}
|
|
685
693
|
}
|
|
686
694
|
exports.ForEachStatement = ForEachStatement;
|
|
687
695
|
class WhileStatement extends Statement {
|
|
688
696
|
constructor(tokens, condition, body) {
|
|
689
|
-
var _a
|
|
697
|
+
var _a;
|
|
690
698
|
super();
|
|
691
699
|
this.tokens = tokens;
|
|
692
700
|
this.condition = condition;
|
|
693
701
|
this.body = body;
|
|
694
|
-
|
|
695
|
-
this.range = util_1.util.createRangeFromPositions(this.tokens.while.range.start, lastRange.end);
|
|
702
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.while, this.condition, this.body, this.tokens.endWhile)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
696
703
|
}
|
|
697
704
|
transpile(state) {
|
|
698
705
|
let result = [];
|
|
@@ -712,26 +719,29 @@ class WhileStatement extends Statement {
|
|
|
712
719
|
}
|
|
713
720
|
walk(visitor, options) {
|
|
714
721
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
715
|
-
visitors_1.walk(this, 'condition', visitor, options);
|
|
722
|
+
(0, visitors_1.walk)(this, 'condition', visitor, options);
|
|
716
723
|
}
|
|
717
724
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
718
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
725
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
719
726
|
}
|
|
720
727
|
}
|
|
721
728
|
}
|
|
722
729
|
exports.WhileStatement = WhileStatement;
|
|
723
730
|
class DottedSetStatement extends Statement {
|
|
724
|
-
constructor(obj, name, value) {
|
|
731
|
+
constructor(obj, name, value, dot, operator) {
|
|
732
|
+
var _a;
|
|
725
733
|
super();
|
|
726
734
|
this.obj = obj;
|
|
727
735
|
this.name = name;
|
|
728
736
|
this.value = value;
|
|
729
|
-
this.
|
|
737
|
+
this.dot = dot;
|
|
738
|
+
this.operator = operator;
|
|
739
|
+
this.range = (_a = util_1.util.createBoundingRange(this.obj, this.dot, this.name, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
730
740
|
}
|
|
731
741
|
transpile(state) {
|
|
732
742
|
var _a, _b;
|
|
733
743
|
//if the value is a compound assignment, don't add the obj, dot, name, or operator...the expression will handle that
|
|
734
|
-
if (
|
|
744
|
+
if (TokenKind_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
|
|
735
745
|
return this.value.transpile(state);
|
|
736
746
|
}
|
|
737
747
|
else {
|
|
@@ -749,26 +759,28 @@ class DottedSetStatement extends Statement {
|
|
|
749
759
|
}
|
|
750
760
|
walk(visitor, options) {
|
|
751
761
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
752
|
-
visitors_1.walk(this, 'obj', visitor, options);
|
|
753
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
762
|
+
(0, visitors_1.walk)(this, 'obj', visitor, options);
|
|
763
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
754
764
|
}
|
|
755
765
|
}
|
|
756
766
|
}
|
|
757
767
|
exports.DottedSetStatement = DottedSetStatement;
|
|
758
768
|
class IndexedSetStatement extends Statement {
|
|
759
|
-
constructor(obj, index, value, openingSquare, closingSquare) {
|
|
769
|
+
constructor(obj, index, value, openingSquare, closingSquare, operator) {
|
|
770
|
+
var _a;
|
|
760
771
|
super();
|
|
761
772
|
this.obj = obj;
|
|
762
773
|
this.index = index;
|
|
763
774
|
this.value = value;
|
|
764
775
|
this.openingSquare = openingSquare;
|
|
765
776
|
this.closingSquare = closingSquare;
|
|
766
|
-
this.
|
|
777
|
+
this.operator = operator;
|
|
778
|
+
this.range = (_a = util_1.util.createBoundingRange(this.obj, this.openingSquare, this.index, this.closingSquare, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
767
779
|
}
|
|
768
780
|
transpile(state) {
|
|
769
781
|
var _a, _b;
|
|
770
782
|
//if the value is a component assignment, don't add the obj, index or operator...the expression will handle that
|
|
771
|
-
if (
|
|
783
|
+
if (TokenKind_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
|
|
772
784
|
return this.value.transpile(state);
|
|
773
785
|
}
|
|
774
786
|
else {
|
|
@@ -790,18 +802,19 @@ class IndexedSetStatement extends Statement {
|
|
|
790
802
|
}
|
|
791
803
|
walk(visitor, options) {
|
|
792
804
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
793
|
-
visitors_1.walk(this, 'obj', visitor, options);
|
|
794
|
-
visitors_1.walk(this, 'index', visitor, options);
|
|
795
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
805
|
+
(0, visitors_1.walk)(this, 'obj', visitor, options);
|
|
806
|
+
(0, visitors_1.walk)(this, 'index', visitor, options);
|
|
807
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
796
808
|
}
|
|
797
809
|
}
|
|
798
810
|
}
|
|
799
811
|
exports.IndexedSetStatement = IndexedSetStatement;
|
|
800
812
|
class LibraryStatement extends Statement {
|
|
801
813
|
constructor(tokens) {
|
|
814
|
+
var _a;
|
|
802
815
|
super();
|
|
803
816
|
this.tokens = tokens;
|
|
804
|
-
this.range = util_1.util.
|
|
817
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
805
818
|
}
|
|
806
819
|
transpile(state) {
|
|
807
820
|
let result = [];
|
|
@@ -834,8 +847,14 @@ class NamespaceStatement extends Statement {
|
|
|
834
847
|
this.symbolTable = new SymbolTable_1.SymbolTable(parentSymbolTable);
|
|
835
848
|
}
|
|
836
849
|
get range() {
|
|
837
|
-
|
|
838
|
-
|
|
850
|
+
return this.cacheRange();
|
|
851
|
+
}
|
|
852
|
+
cacheRange() {
|
|
853
|
+
var _a;
|
|
854
|
+
if (!this._range) {
|
|
855
|
+
this._range = (_a = util_1.util.createBoundingRange(this.keyword, this.nameExpression, this.body, this.endKeyword)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
856
|
+
}
|
|
857
|
+
return this._range;
|
|
839
858
|
}
|
|
840
859
|
getName(parseMode) {
|
|
841
860
|
return this.nameExpression.getName(parseMode);
|
|
@@ -858,20 +877,21 @@ class NamespaceStatement extends Statement {
|
|
|
858
877
|
}
|
|
859
878
|
walk(visitor, options) {
|
|
860
879
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
861
|
-
visitors_1.walk(this, 'nameExpression', visitor, options);
|
|
880
|
+
(0, visitors_1.walk)(this, 'nameExpression', visitor, options);
|
|
862
881
|
}
|
|
863
882
|
if (this.body.statements.length > 0 && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
864
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
883
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
865
884
|
}
|
|
866
885
|
}
|
|
867
886
|
}
|
|
868
887
|
exports.NamespaceStatement = NamespaceStatement;
|
|
869
888
|
class ImportStatement extends Statement {
|
|
870
889
|
constructor(importToken, filePathToken) {
|
|
890
|
+
var _a;
|
|
871
891
|
super();
|
|
872
892
|
this.importToken = importToken;
|
|
873
893
|
this.filePathToken = filePathToken;
|
|
874
|
-
this.range = util_1.util.
|
|
894
|
+
this.range = (_a = util_1.util.createBoundingRange(this.importToken, this.filePathToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
875
895
|
if (this.filePathToken) {
|
|
876
896
|
//remove quotes
|
|
877
897
|
this.filePath = this.filePathToken.text.replace(/"/g, '');
|
|
@@ -905,13 +925,198 @@ class ImportStatement extends Statement {
|
|
|
905
925
|
}
|
|
906
926
|
}
|
|
907
927
|
exports.ImportStatement = ImportStatement;
|
|
928
|
+
class InterfaceStatement extends Statement {
|
|
929
|
+
constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
|
|
930
|
+
var _a, _b, _c;
|
|
931
|
+
super();
|
|
932
|
+
this.name = name;
|
|
933
|
+
this.parentInterfaceName = parentInterfaceName;
|
|
934
|
+
this.body = body;
|
|
935
|
+
this.namespaceName = namespaceName;
|
|
936
|
+
this.memberTable = new SymbolTable_1.SymbolTable();
|
|
937
|
+
this.tokens = {};
|
|
938
|
+
this.memberMap = {};
|
|
939
|
+
this.methods = [];
|
|
940
|
+
this.fields = [];
|
|
941
|
+
this.tokens.interface = interfaceToken;
|
|
942
|
+
this.tokens.name = name;
|
|
943
|
+
this.tokens.extends = extendsToken;
|
|
944
|
+
this.tokens.endInterface = endInterfaceToken;
|
|
945
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
946
|
+
for (let statement of this.body) {
|
|
947
|
+
if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
|
|
948
|
+
this.methods.push(statement);
|
|
949
|
+
this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
|
|
950
|
+
}
|
|
951
|
+
else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
|
|
952
|
+
this.fields.push(statement);
|
|
953
|
+
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* The name of the interface WITH its leading namespace (if applicable)
|
|
959
|
+
*/
|
|
960
|
+
getName(parseMode) {
|
|
961
|
+
var _a;
|
|
962
|
+
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
963
|
+
if (name) {
|
|
964
|
+
if (this.namespaceName) {
|
|
965
|
+
let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
|
|
966
|
+
return `${namespaceName}.${name}`;
|
|
967
|
+
}
|
|
968
|
+
else {
|
|
969
|
+
return name;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
else {
|
|
973
|
+
//return undefined which will allow outside callers to know that this interface doesn't have a name
|
|
974
|
+
return undefined;
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
buildSymbolTable(parentIface) {
|
|
978
|
+
var _a, _b;
|
|
979
|
+
this.memberTable.clear();
|
|
980
|
+
if (parentIface) {
|
|
981
|
+
this.memberTable.setParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
|
|
982
|
+
}
|
|
983
|
+
for (const statement of this.methods) {
|
|
984
|
+
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
|
|
985
|
+
this.memberTable.addSymbol((_a = statement === null || statement === void 0 ? void 0 : statement.name) === null || _a === void 0 ? void 0 : _a.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
|
|
986
|
+
}
|
|
987
|
+
for (const statement of this.fields) {
|
|
988
|
+
this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
hasParent() {
|
|
992
|
+
return !!this.parentInterfaceName;
|
|
993
|
+
}
|
|
994
|
+
getParentName() {
|
|
995
|
+
return !!this.parentInterfaceName;
|
|
996
|
+
}
|
|
997
|
+
/**
|
|
998
|
+
* Gets an array of possible parent interface names, taking into account the namespace this interface was created under
|
|
999
|
+
* @returns array of possible parent interface names
|
|
1000
|
+
*/
|
|
1001
|
+
getPossibleFullParentNames() {
|
|
1002
|
+
var _a;
|
|
1003
|
+
if (!this.hasParent()) {
|
|
1004
|
+
return [];
|
|
1005
|
+
}
|
|
1006
|
+
if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
1007
|
+
// The specified parent interface already has a dot, so it must already reference a namespace
|
|
1008
|
+
return [this.parentInterfaceName.getName()];
|
|
1009
|
+
}
|
|
1010
|
+
const names = [];
|
|
1011
|
+
if (this.namespaceName) {
|
|
1012
|
+
// We're under a namespace, so the full parent name MIGHT be with this namespace too
|
|
1013
|
+
names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
|
|
1014
|
+
}
|
|
1015
|
+
names.push(this.parentInterfaceName.getName());
|
|
1016
|
+
return names;
|
|
1017
|
+
}
|
|
1018
|
+
getThisBscType() {
|
|
1019
|
+
return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
1020
|
+
}
|
|
1021
|
+
transpile(state) {
|
|
1022
|
+
//interfaces should completely disappear at runtime
|
|
1023
|
+
return [];
|
|
1024
|
+
}
|
|
1025
|
+
getTypedef(state) {
|
|
1026
|
+
var _a, _b, _c;
|
|
1027
|
+
const result = [];
|
|
1028
|
+
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1029
|
+
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1030
|
+
}
|
|
1031
|
+
result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
|
|
1032
|
+
const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName(Parser_1.ParseMode.BrighterScript);
|
|
1033
|
+
if (parentInterfaceName) {
|
|
1034
|
+
result.push(' extends ', parentInterfaceName);
|
|
1035
|
+
}
|
|
1036
|
+
const body = (_c = this.body) !== null && _c !== void 0 ? _c : [];
|
|
1037
|
+
if (body.length > 0) {
|
|
1038
|
+
state.blockDepth++;
|
|
1039
|
+
}
|
|
1040
|
+
for (const statement of body) {
|
|
1041
|
+
if ((0, reflection_1.isInterfaceMethodStatement)(statement) || (0, reflection_1.isInterfaceFieldStatement)(statement)) {
|
|
1042
|
+
result.push(state.newline, state.indent(), ...statement.getTypedef(state));
|
|
1043
|
+
}
|
|
1044
|
+
else {
|
|
1045
|
+
result.push(state.newline, state.indent(), ...statement.transpile(state));
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
if (body.length > 0) {
|
|
1049
|
+
state.blockDepth--;
|
|
1050
|
+
}
|
|
1051
|
+
result.push(state.newline, state.indent(), 'end interface', state.newline);
|
|
1052
|
+
return result;
|
|
1053
|
+
}
|
|
1054
|
+
walk(visitor, options) {
|
|
1055
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1056
|
+
for (let i = 0; i < this.body.length; i++) {
|
|
1057
|
+
(0, visitors_1.walk)(this.body, i, visitor, options, this);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
exports.InterfaceStatement = InterfaceStatement;
|
|
1063
|
+
class InterfaceFieldStatement extends Statement {
|
|
1064
|
+
constructor(nameToken, asToken, type, namespaceName) {
|
|
1065
|
+
var _a;
|
|
1066
|
+
super();
|
|
1067
|
+
this.type = type;
|
|
1068
|
+
this.namespaceName = namespaceName;
|
|
1069
|
+
this.tokens = {};
|
|
1070
|
+
this.tokens.name = nameToken;
|
|
1071
|
+
this.tokens.as = asToken;
|
|
1072
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1073
|
+
}
|
|
1074
|
+
transpile(state) {
|
|
1075
|
+
throw new Error('Method not implemented.');
|
|
1076
|
+
}
|
|
1077
|
+
getType() {
|
|
1078
|
+
var _a;
|
|
1079
|
+
return (_a = this.type) === null || _a === void 0 ? void 0 : _a.type;
|
|
1080
|
+
}
|
|
1081
|
+
get name() {
|
|
1082
|
+
return this.tokens.name;
|
|
1083
|
+
}
|
|
1084
|
+
walk(visitor, options) {
|
|
1085
|
+
//nothing to walk
|
|
1086
|
+
}
|
|
1087
|
+
getTypedef(state) {
|
|
1088
|
+
var _a;
|
|
1089
|
+
const result = [];
|
|
1090
|
+
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1091
|
+
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1092
|
+
}
|
|
1093
|
+
result.push(this.tokens.name.text);
|
|
1094
|
+
if (this.tokens.as && this.type) {
|
|
1095
|
+
result.push(' as ', ...this.type.transpile(state));
|
|
1096
|
+
}
|
|
1097
|
+
return result;
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
exports.InterfaceFieldStatement = InterfaceFieldStatement;
|
|
1101
|
+
class InterfaceMethodStatement extends FunctionStatement {
|
|
1102
|
+
transpile(state) {
|
|
1103
|
+
throw new Error('Method not implemented.');
|
|
1104
|
+
}
|
|
1105
|
+
constructor(name, func) {
|
|
1106
|
+
super(name, func, undefined);
|
|
1107
|
+
}
|
|
1108
|
+
walk(visitor, options) {
|
|
1109
|
+
//nothing to walk
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
exports.InterfaceMethodStatement = InterfaceMethodStatement;
|
|
908
1113
|
class ClassStatement extends Statement {
|
|
909
1114
|
constructor(classKeyword,
|
|
910
1115
|
/**
|
|
911
1116
|
* The name of the class (without namespace prefix)
|
|
912
1117
|
*/
|
|
913
|
-
name, body, end, extendsKeyword, parentClassName, namespaceName) {
|
|
914
|
-
var _a, _b, _c;
|
|
1118
|
+
name, body, end, extendsKeyword, parentClassName, namespaceName, currentSymbolTable) {
|
|
1119
|
+
var _a, _b, _c, _d;
|
|
915
1120
|
super();
|
|
916
1121
|
this.classKeyword = classKeyword;
|
|
917
1122
|
this.name = name;
|
|
@@ -920,21 +1125,25 @@ class ClassStatement extends Statement {
|
|
|
920
1125
|
this.extendsKeyword = extendsKeyword;
|
|
921
1126
|
this.parentClassName = parentClassName;
|
|
922
1127
|
this.namespaceName = namespaceName;
|
|
1128
|
+
this.currentSymbolTable = currentSymbolTable;
|
|
1129
|
+
this.symbolTable = new SymbolTable_1.SymbolTable();
|
|
1130
|
+
this.memberTable = new SymbolTable_1.SymbolTable();
|
|
923
1131
|
this.memberMap = {};
|
|
924
1132
|
this.methods = [];
|
|
925
1133
|
this.fields = [];
|
|
926
1134
|
this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
|
|
1135
|
+
this.symbolTable.setParent(currentSymbolTable);
|
|
1136
|
+
this.range = (_b = util_1.util.createBoundingRange(this.classKeyword, this.name, this.extendsKeyword, this.parentClassName, ...this.body, this.end)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
927
1137
|
for (let statement of this.body) {
|
|
928
|
-
if (reflection_1.isClassMethodStatement(statement)) {
|
|
1138
|
+
if ((0, reflection_1.isClassMethodStatement)(statement)) {
|
|
929
1139
|
this.methods.push(statement);
|
|
930
|
-
this.memberMap[(
|
|
1140
|
+
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
931
1141
|
}
|
|
932
|
-
else if (reflection_1.isClassFieldStatement(statement)) {
|
|
1142
|
+
else if ((0, reflection_1.isClassFieldStatement)(statement)) {
|
|
933
1143
|
this.fields.push(statement);
|
|
934
|
-
this.memberMap[(
|
|
1144
|
+
this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
|
|
935
1145
|
}
|
|
936
1146
|
}
|
|
937
|
-
this.range = util_1.util.createRangeFromPositions(this.classKeyword.range.start, this.end.range.end);
|
|
938
1147
|
}
|
|
939
1148
|
getName(parseMode) {
|
|
940
1149
|
var _a;
|
|
@@ -954,6 +1163,36 @@ class ClassStatement extends Statement {
|
|
|
954
1163
|
return undefined;
|
|
955
1164
|
}
|
|
956
1165
|
}
|
|
1166
|
+
getThisBscType() {
|
|
1167
|
+
return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
1168
|
+
}
|
|
1169
|
+
getConstructorFunctionType() {
|
|
1170
|
+
var _a;
|
|
1171
|
+
const constructFunc = (_a = this.getConstructorFunction()) !== null && _a !== void 0 ? _a : this.getEmptyNewFunction();
|
|
1172
|
+
const constructorFuncType = constructFunc.func.getFunctionType();
|
|
1173
|
+
constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
|
|
1174
|
+
constructorFuncType.isNew = true;
|
|
1175
|
+
return constructorFuncType;
|
|
1176
|
+
}
|
|
1177
|
+
buildSymbolTable(parentClass) {
|
|
1178
|
+
var _a, _b, _c, _d, _e;
|
|
1179
|
+
this.symbolTable.clear();
|
|
1180
|
+
this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
|
|
1181
|
+
this.memberTable.clear();
|
|
1182
|
+
if ((0, reflection_1.isClassStatement)(parentClass)) {
|
|
1183
|
+
this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
|
|
1184
|
+
this.memberTable.setParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
|
|
1185
|
+
}
|
|
1186
|
+
for (const statement of this.methods) {
|
|
1187
|
+
statement === null || statement === void 0 ? void 0 : statement.func.symbolTable.setParent(this.symbolTable);
|
|
1188
|
+
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
|
|
1189
|
+
funcType.setName(this.getName(Parser_1.ParseMode.BrighterScript) + '.' + ((_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text));
|
|
1190
|
+
this.memberTable.addSymbol((_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
|
|
1191
|
+
}
|
|
1192
|
+
for (const statement of this.fields) {
|
|
1193
|
+
this.memberTable.addSymbol((_e = statement === null || statement === void 0 ? void 0 : statement.name) === null || _e === void 0 ? void 0 : _e.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
957
1196
|
transpile(state) {
|
|
958
1197
|
let result = [];
|
|
959
1198
|
//make the builder
|
|
@@ -965,6 +1204,7 @@ class ClassStatement extends Statement {
|
|
|
965
1204
|
}
|
|
966
1205
|
getTypedef(state) {
|
|
967
1206
|
var _a, _b;
|
|
1207
|
+
this.ensureConstructorFunctionExists();
|
|
968
1208
|
const result = [];
|
|
969
1209
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
970
1210
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
@@ -977,7 +1217,7 @@ class ClassStatement extends Statement {
|
|
|
977
1217
|
result.push(state.newline);
|
|
978
1218
|
state.blockDepth++;
|
|
979
1219
|
for (const member of this.body) {
|
|
980
|
-
if (
|
|
1220
|
+
if ((0, reflection_1.isTypedefProvider)(member)) {
|
|
981
1221
|
result.push(state.indent(), ...member.getTypedef(state), state.newline);
|
|
982
1222
|
}
|
|
983
1223
|
}
|
|
@@ -1006,9 +1246,30 @@ class ClassStatement extends Statement {
|
|
|
1006
1246
|
}
|
|
1007
1247
|
return myIndex - 1;
|
|
1008
1248
|
}
|
|
1009
|
-
|
|
1249
|
+
hasParent() {
|
|
1010
1250
|
return !!this.parentClassName;
|
|
1011
1251
|
}
|
|
1252
|
+
/**
|
|
1253
|
+
* Gets an array of possible parent class names, taking into account the namespace this class was created under
|
|
1254
|
+
* @returns array of possible parent class names
|
|
1255
|
+
*/
|
|
1256
|
+
getPossibleFullParentNames() {
|
|
1257
|
+
var _a;
|
|
1258
|
+
if (!this.hasParent()) {
|
|
1259
|
+
return [];
|
|
1260
|
+
}
|
|
1261
|
+
if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
1262
|
+
// The specified parent class already has a dot, so it must already reference a namespace
|
|
1263
|
+
return [this.parentClassName.getName()];
|
|
1264
|
+
}
|
|
1265
|
+
const names = [];
|
|
1266
|
+
if (this.namespaceName) {
|
|
1267
|
+
// We're under a namespace, so the full parent name MIGHT be with this namespace too
|
|
1268
|
+
names.push(this.namespaceName.getName() + '.' + this.parentClassName.getName());
|
|
1269
|
+
}
|
|
1270
|
+
names.push(this.parentClassName.getName());
|
|
1271
|
+
return names;
|
|
1272
|
+
}
|
|
1012
1273
|
/**
|
|
1013
1274
|
* Get all ancestor classes, in closest-to-furthest order (i.e. 0 is parent, 1 is grandparent, etc...).
|
|
1014
1275
|
* This will return an empty array if no ancestors were found
|
|
@@ -1047,14 +1308,16 @@ class ClassStatement extends Statement {
|
|
|
1047
1308
|
}
|
|
1048
1309
|
}
|
|
1049
1310
|
getEmptyNewFunction() {
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1311
|
+
return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
|
|
1312
|
+
}
|
|
1313
|
+
/**
|
|
1314
|
+
* Create an empty `new` function if class is missing it (simplifies transpile logic)
|
|
1315
|
+
*/
|
|
1316
|
+
ensureConstructorFunctionExists() {
|
|
1317
|
+
if (!this.getConstructorFunction()) {
|
|
1318
|
+
this.memberMap.new = this.getEmptyNewFunction();
|
|
1319
|
+
this.body = [this.memberMap.new, ...this.body];
|
|
1320
|
+
}
|
|
1058
1321
|
}
|
|
1059
1322
|
/**
|
|
1060
1323
|
* Determine if the specified field was declared in one of the ancestor classes
|
|
@@ -1075,6 +1338,7 @@ class ClassStatement extends Statement {
|
|
|
1075
1338
|
*/
|
|
1076
1339
|
getTranspiledBuilder(state) {
|
|
1077
1340
|
var _a;
|
|
1341
|
+
this.ensureConstructorFunctionExists();
|
|
1078
1342
|
let result = [];
|
|
1079
1343
|
result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
|
|
1080
1344
|
state.blockDepth++;
|
|
@@ -1095,19 +1359,14 @@ class ClassStatement extends Statement {
|
|
|
1095
1359
|
}
|
|
1096
1360
|
result.push(state.newline, state.indent());
|
|
1097
1361
|
let parentClassIndex = this.getParentClassIndex(state);
|
|
1098
|
-
//create empty `new` function if class is missing it (simplifies transpile logic)
|
|
1099
|
-
if (!this.getConstructorFunction()) {
|
|
1100
|
-
this.memberMap.new = this.getEmptyNewFunction();
|
|
1101
|
-
this.body = [this.memberMap.new, ...this.body];
|
|
1102
|
-
}
|
|
1103
1362
|
for (let statement of this.body) {
|
|
1104
1363
|
//is field statement
|
|
1105
|
-
if (reflection_1.isClassFieldStatement(statement)) {
|
|
1364
|
+
if ((0, reflection_1.isClassFieldStatement)(statement)) {
|
|
1106
1365
|
//do nothing with class fields in this situation, they are handled elsewhere
|
|
1107
1366
|
continue;
|
|
1108
1367
|
//methods
|
|
1109
1368
|
}
|
|
1110
|
-
else if (reflection_1.isClassMethodStatement(statement)) {
|
|
1369
|
+
else if ((0, reflection_1.isClassMethodStatement)(statement)) {
|
|
1111
1370
|
//store overridden parent methods as super{parentIndex}_{methodName}
|
|
1112
1371
|
if (
|
|
1113
1372
|
//is override method
|
|
@@ -1176,7 +1435,7 @@ class ClassStatement extends Statement {
|
|
|
1176
1435
|
walk(visitor, options) {
|
|
1177
1436
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1178
1437
|
for (let i = 0; i < this.body.length; i++) {
|
|
1179
|
-
visitors_1.walk(this.body, i, visitor, options, this);
|
|
1438
|
+
(0, visitors_1.walk)(this.body, i, visitor, options, this);
|
|
1180
1439
|
}
|
|
1181
1440
|
}
|
|
1182
1441
|
}
|
|
@@ -1184,11 +1443,19 @@ class ClassStatement extends Statement {
|
|
|
1184
1443
|
exports.ClassStatement = ClassStatement;
|
|
1185
1444
|
class ClassMethodStatement extends FunctionStatement {
|
|
1186
1445
|
constructor(accessModifier, name, func, override) {
|
|
1187
|
-
var _a;
|
|
1188
1446
|
super(name, func, undefined);
|
|
1189
1447
|
this.accessModifier = accessModifier;
|
|
1190
1448
|
this.override = override;
|
|
1191
|
-
|
|
1449
|
+
}
|
|
1450
|
+
get range() {
|
|
1451
|
+
return this.cacheRange();
|
|
1452
|
+
}
|
|
1453
|
+
cacheRange() {
|
|
1454
|
+
var _a, _b;
|
|
1455
|
+
if (!this._range) {
|
|
1456
|
+
this._range = (_b = util_1.util.createBoundingRange(this.accessModifier, this.override, (_a = this.func) !== null && _a !== void 0 ? _a : this.name)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
1457
|
+
}
|
|
1458
|
+
return this._range;
|
|
1192
1459
|
}
|
|
1193
1460
|
transpile(state) {
|
|
1194
1461
|
if (this.name.text.toLowerCase() === 'new') {
|
|
@@ -1199,7 +1466,7 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1199
1466
|
//TODO - remove type information from these methods because that doesn't work
|
|
1200
1467
|
//convert the `super` calls into the proper methods
|
|
1201
1468
|
const parentClassIndex = state.classStatement.getParentClassIndex(state);
|
|
1202
|
-
const visitor = visitors_1.createVisitor({
|
|
1469
|
+
const visitor = (0, visitors_1.createVisitor)({
|
|
1203
1470
|
VariableExpression: e => {
|
|
1204
1471
|
if (e.name.text.toLocaleLowerCase() === 'super') {
|
|
1205
1472
|
e.name.text = `m.super${parentClassIndex}_new`;
|
|
@@ -1249,26 +1516,26 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1249
1516
|
let firstStatement = this.func.body.statements[0];
|
|
1250
1517
|
if (
|
|
1251
1518
|
//is a call statement
|
|
1252
|
-
reflection_1.isExpressionStatement(firstStatement) && reflection_1.isCallExpression(firstStatement.expression) &&
|
|
1519
|
+
(0, reflection_1.isExpressionStatement)(firstStatement) && (0, reflection_1.isCallExpression)(firstStatement.expression) &&
|
|
1253
1520
|
//is a call to super
|
|
1254
1521
|
util_1.util.findBeginningVariableExpression(firstStatement === null || firstStatement === void 0 ? void 0 : firstStatement.expression.callee).name.text.toLowerCase() === 'super') {
|
|
1255
1522
|
return;
|
|
1256
1523
|
}
|
|
1257
1524
|
//this is a child class, and the first statement isn't a call to super. Inject one
|
|
1258
1525
|
this.func.body.statements.unshift(new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
|
|
1259
|
-
kind:
|
|
1526
|
+
kind: TokenKind_1.TokenKind.Identifier,
|
|
1260
1527
|
text: 'super',
|
|
1261
1528
|
isReserved: false,
|
|
1262
1529
|
range: state.classStatement.name.range,
|
|
1263
1530
|
leadingWhitespace: ''
|
|
1264
1531
|
}, null), {
|
|
1265
|
-
kind:
|
|
1532
|
+
kind: TokenKind_1.TokenKind.LeftParen,
|
|
1266
1533
|
text: '(',
|
|
1267
1534
|
isReserved: false,
|
|
1268
1535
|
range: state.classStatement.name.range,
|
|
1269
1536
|
leadingWhitespace: ''
|
|
1270
1537
|
}, {
|
|
1271
|
-
kind:
|
|
1538
|
+
kind: TokenKind_1.TokenKind.RightParen,
|
|
1272
1539
|
text: ')',
|
|
1273
1540
|
isReserved: false,
|
|
1274
1541
|
range: state.classStatement.name.range,
|
|
@@ -1279,7 +1546,7 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1279
1546
|
* Inject field initializers at the top of the `new` function (after any present `super()` call)
|
|
1280
1547
|
*/
|
|
1281
1548
|
injectFieldInitializersForConstructor(state) {
|
|
1282
|
-
let startingIndex = state.classStatement.
|
|
1549
|
+
let startingIndex = state.classStatement.hasParent() ? 1 : 0;
|
|
1283
1550
|
let newStatements = [];
|
|
1284
1551
|
//insert the field initializers in order
|
|
1285
1552
|
for (let field of state.classStatement.fields) {
|
|
@@ -1290,21 +1557,21 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1290
1557
|
}
|
|
1291
1558
|
else {
|
|
1292
1559
|
//if there is no initial value, set the initial value to `invalid`
|
|
1293
|
-
newStatements.push(new AssignmentStatement(thisQualifiedName, creators_1.createToken(
|
|
1560
|
+
newStatements.push(new AssignmentStatement(thisQualifiedName, (0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), (0, creators_1.createInvalidLiteral)('invalid', field.name.range), this.func));
|
|
1294
1561
|
}
|
|
1295
1562
|
}
|
|
1296
1563
|
this.func.body.statements.splice(startingIndex, 0, ...newStatements);
|
|
1297
1564
|
}
|
|
1298
1565
|
walk(visitor, options) {
|
|
1299
1566
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1300
|
-
visitors_1.walk(this, 'func', visitor, options);
|
|
1567
|
+
(0, visitors_1.walk)(this, 'func', visitor, options);
|
|
1301
1568
|
}
|
|
1302
1569
|
}
|
|
1303
1570
|
}
|
|
1304
1571
|
exports.ClassMethodStatement = ClassMethodStatement;
|
|
1305
1572
|
class ClassFieldStatement extends Statement {
|
|
1306
|
-
constructor(accessModifier, name, as, type, equal, initialValue) {
|
|
1307
|
-
var _a
|
|
1573
|
+
constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
|
|
1574
|
+
var _a;
|
|
1308
1575
|
super();
|
|
1309
1576
|
this.accessModifier = accessModifier;
|
|
1310
1577
|
this.name = name;
|
|
@@ -1312,17 +1579,18 @@ class ClassFieldStatement extends Statement {
|
|
|
1312
1579
|
this.type = type;
|
|
1313
1580
|
this.equal = equal;
|
|
1314
1581
|
this.initialValue = initialValue;
|
|
1315
|
-
this.
|
|
1582
|
+
this.namespaceName = namespaceName;
|
|
1583
|
+
this.range = (_a = util_1.util.createBoundingRange(this.accessModifier, this.name, this.as, this.type, this.equal, this.initialValue)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1316
1584
|
}
|
|
1317
1585
|
/**
|
|
1318
1586
|
* Derive a ValueKind from the type token, or the initial value.
|
|
1319
1587
|
* Defaults to `DynamicType`
|
|
1320
1588
|
*/
|
|
1321
|
-
getType() {
|
|
1589
|
+
getType(parseMode = Parser_1.ParseMode.BrighterScript) {
|
|
1322
1590
|
if (this.type) {
|
|
1323
|
-
return
|
|
1591
|
+
return this.type.type;
|
|
1324
1592
|
}
|
|
1325
|
-
else if (reflection_1.isLiteralExpression(this.initialValue)) {
|
|
1593
|
+
else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
|
|
1326
1594
|
return this.initialValue.type;
|
|
1327
1595
|
}
|
|
1328
1596
|
else {
|
|
@@ -1339,8 +1607,8 @@ class ClassFieldStatement extends Statement {
|
|
|
1339
1607
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1340
1608
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1341
1609
|
}
|
|
1342
|
-
let type = this.getType();
|
|
1343
|
-
if (reflection_1.isInvalidType(type) || reflection_1.isVoidType(type)) {
|
|
1610
|
+
let type = this.getType(Parser_1.ParseMode.BrightScript);
|
|
1611
|
+
if (!type || (0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
|
|
1344
1612
|
type = new DynamicType_1.DynamicType();
|
|
1345
1613
|
}
|
|
1346
1614
|
result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ', (_d = this.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
|
|
@@ -1348,56 +1616,77 @@ class ClassFieldStatement extends Statement {
|
|
|
1348
1616
|
return result;
|
|
1349
1617
|
}
|
|
1350
1618
|
walk(visitor, options) {
|
|
1351
|
-
if (
|
|
1352
|
-
visitors_1.walk(this, '
|
|
1619
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1620
|
+
(0, visitors_1.walk)(this, 'type', visitor, options);
|
|
1621
|
+
(0, visitors_1.walk)(this, 'initialValue', visitor, options);
|
|
1353
1622
|
}
|
|
1354
1623
|
}
|
|
1355
1624
|
}
|
|
1356
1625
|
exports.ClassFieldStatement = ClassFieldStatement;
|
|
1357
1626
|
class TryCatchStatement extends Statement {
|
|
1358
|
-
constructor(
|
|
1627
|
+
constructor(tokens, tryBranch, catchStatement) {
|
|
1628
|
+
var _a;
|
|
1359
1629
|
super();
|
|
1360
|
-
this.
|
|
1630
|
+
this.tokens = tokens;
|
|
1361
1631
|
this.tryBranch = tryBranch;
|
|
1362
|
-
this.
|
|
1363
|
-
this.
|
|
1364
|
-
this.catchBranch = catchBranch;
|
|
1365
|
-
this.endTryToken = endTryToken;
|
|
1366
|
-
}
|
|
1367
|
-
get range() {
|
|
1368
|
-
var _a, _b, _c, _d, _e;
|
|
1369
|
-
return util_1.util.createRangeFromPositions(this.tryToken.range.start, ((_e = (_d = (_c = (_b = (_a = this.endTryToken) !== null && _a !== void 0 ? _a : this.catchBranch) !== null && _b !== void 0 ? _b : this.exceptionVariable) !== null && _c !== void 0 ? _c : this.catchToken) !== null && _d !== void 0 ? _d : this.tryBranch) !== null && _e !== void 0 ? _e : this.tryToken).range.end);
|
|
1632
|
+
this.catchStatement = catchStatement;
|
|
1633
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.try, this.tryBranch, this.catchStatement, this.tokens.endTry)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1370
1634
|
}
|
|
1371
1635
|
transpile(state) {
|
|
1636
|
+
var _a, _b;
|
|
1372
1637
|
return [
|
|
1373
|
-
state.transpileToken(this.
|
|
1638
|
+
state.transpileToken(this.tokens.try),
|
|
1374
1639
|
...this.tryBranch.transpile(state),
|
|
1375
1640
|
state.newline,
|
|
1376
1641
|
state.indent(),
|
|
1377
|
-
|
|
1378
|
-
' ',
|
|
1379
|
-
state.transpileToken(this.exceptionVariable),
|
|
1380
|
-
...this.catchBranch.transpile(state),
|
|
1642
|
+
...((_b = (_a = this.catchStatement) === null || _a === void 0 ? void 0 : _a.transpile(state)) !== null && _b !== void 0 ? _b : ['catch']),
|
|
1381
1643
|
state.newline,
|
|
1382
1644
|
state.indent(),
|
|
1383
|
-
state.transpileToken(this.
|
|
1645
|
+
state.transpileToken(this.tokens.endTry)
|
|
1384
1646
|
];
|
|
1385
1647
|
}
|
|
1386
1648
|
walk(visitor, options) {
|
|
1387
1649
|
if (this.tryBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1388
|
-
visitors_1.walk(this, 'tryBranch', visitor, options);
|
|
1389
|
-
visitors_1.walk(this, '
|
|
1650
|
+
(0, visitors_1.walk)(this, 'tryBranch', visitor, options);
|
|
1651
|
+
(0, visitors_1.walk)(this, 'catchStatement', visitor, options);
|
|
1390
1652
|
}
|
|
1391
1653
|
}
|
|
1392
1654
|
}
|
|
1393
1655
|
exports.TryCatchStatement = TryCatchStatement;
|
|
1656
|
+
class CatchStatement extends Statement {
|
|
1657
|
+
constructor(tokens, exceptionVariable, catchBranch) {
|
|
1658
|
+
super();
|
|
1659
|
+
this.tokens = tokens;
|
|
1660
|
+
this.exceptionVariable = exceptionVariable;
|
|
1661
|
+
this.catchBranch = catchBranch;
|
|
1662
|
+
}
|
|
1663
|
+
get range() {
|
|
1664
|
+
var _a, _b;
|
|
1665
|
+
return util_1.util.createRangeFromPositions(this.tokens.catch.range.start, ((_b = (_a = this.catchBranch) !== null && _a !== void 0 ? _a : this.exceptionVariable) !== null && _b !== void 0 ? _b : this.tokens.catch).range.end);
|
|
1666
|
+
}
|
|
1667
|
+
transpile(state) {
|
|
1668
|
+
var _a, _b, _c, _d;
|
|
1669
|
+
return [
|
|
1670
|
+
state.transpileToken(this.tokens.catch),
|
|
1671
|
+
' ',
|
|
1672
|
+
(_b = (_a = this.exceptionVariable) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'e',
|
|
1673
|
+
...((_d = (_c = this.catchBranch) === null || _c === void 0 ? void 0 : _c.transpile(state)) !== null && _d !== void 0 ? _d : [])
|
|
1674
|
+
];
|
|
1675
|
+
}
|
|
1676
|
+
walk(visitor, options) {
|
|
1677
|
+
if (this.catchBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1678
|
+
(0, visitors_1.walk)(this, 'catchBranch', visitor, options);
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
exports.CatchStatement = CatchStatement;
|
|
1394
1683
|
class ThrowStatement extends Statement {
|
|
1395
1684
|
constructor(throwToken, expression) {
|
|
1396
1685
|
var _a;
|
|
1397
1686
|
super();
|
|
1398
1687
|
this.throwToken = throwToken;
|
|
1399
1688
|
this.expression = expression;
|
|
1400
|
-
this.range = util_1.util.
|
|
1689
|
+
this.range = (_a = util_1.util.createBoundingRange(this.throwToken, this.expression)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1401
1690
|
}
|
|
1402
1691
|
transpile(state) {
|
|
1403
1692
|
const result = [
|
|
@@ -1416,9 +1705,157 @@ class ThrowStatement extends Statement {
|
|
|
1416
1705
|
}
|
|
1417
1706
|
walk(visitor, options) {
|
|
1418
1707
|
if (this.expression && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1419
|
-
visitors_1.walk(this, 'expression', visitor, options);
|
|
1708
|
+
(0, visitors_1.walk)(this, 'expression', visitor, options);
|
|
1420
1709
|
}
|
|
1421
1710
|
}
|
|
1422
1711
|
}
|
|
1423
1712
|
exports.ThrowStatement = ThrowStatement;
|
|
1713
|
+
class EnumStatement extends Statement {
|
|
1714
|
+
constructor(tokens, body, namespaceName) {
|
|
1715
|
+
var _a, _b;
|
|
1716
|
+
super();
|
|
1717
|
+
this.tokens = tokens;
|
|
1718
|
+
this.body = body;
|
|
1719
|
+
this.namespaceName = namespaceName;
|
|
1720
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1721
|
+
this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
|
|
1722
|
+
}
|
|
1723
|
+
getMembers() {
|
|
1724
|
+
const result = [];
|
|
1725
|
+
for (const statement of this.body) {
|
|
1726
|
+
if ((0, reflection_1.isEnumMemberStatement)(statement)) {
|
|
1727
|
+
result.push(statement);
|
|
1728
|
+
}
|
|
1729
|
+
}
|
|
1730
|
+
return result;
|
|
1731
|
+
}
|
|
1732
|
+
/**
|
|
1733
|
+
* Get a map of member names and their values.
|
|
1734
|
+
* All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
|
|
1735
|
+
*/
|
|
1736
|
+
getMemberValueMap() {
|
|
1737
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
1738
|
+
const result = new Map();
|
|
1739
|
+
const members = this.getMembers();
|
|
1740
|
+
let currentIntValue = 0;
|
|
1741
|
+
for (const member of members) {
|
|
1742
|
+
//if there is no value, assume an integer and increment the int counter
|
|
1743
|
+
if (!member.value) {
|
|
1744
|
+
result.set((_a = member.name) === null || _a === void 0 ? void 0 : _a.toLowerCase(), currentIntValue.toString());
|
|
1745
|
+
currentIntValue++;
|
|
1746
|
+
//if explicit integer value, use it and increment the int counter
|
|
1747
|
+
}
|
|
1748
|
+
else if ((0, reflection_1.isLiteralExpression)(member.value) && member.value.token.kind === TokenKind_1.TokenKind.IntegerLiteral) {
|
|
1749
|
+
//try parsing as integer literal, then as hex integer literal.
|
|
1750
|
+
let tokenIntValue = (_b = util_1.util.parseInt(member.value.token.text)) !== null && _b !== void 0 ? _b : util_1.util.parseInt(member.value.token.text.replace(/&h/i, '0x'));
|
|
1751
|
+
if (tokenIntValue !== undefined) {
|
|
1752
|
+
currentIntValue = tokenIntValue;
|
|
1753
|
+
currentIntValue++;
|
|
1754
|
+
}
|
|
1755
|
+
result.set((_c = member.name) === null || _c === void 0 ? void 0 : _c.toLowerCase(), member.value.token.text);
|
|
1756
|
+
//all other values
|
|
1757
|
+
}
|
|
1758
|
+
else {
|
|
1759
|
+
result.set((_d = member.name) === null || _d === void 0 ? void 0 : _d.toLowerCase(), (_g = (_f = (_e = member.value) === null || _e === void 0 ? void 0 : _e.token) === null || _f === void 0 ? void 0 : _f.text) !== null && _g !== void 0 ? _g : 'invalid');
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
return result;
|
|
1763
|
+
}
|
|
1764
|
+
getMemberValue(name) {
|
|
1765
|
+
return this.getMemberValueMap().get(name.toLowerCase());
|
|
1766
|
+
}
|
|
1767
|
+
/**
|
|
1768
|
+
* The name of the enum (without the namespace prefix)
|
|
1769
|
+
*/
|
|
1770
|
+
get name() {
|
|
1771
|
+
var _a;
|
|
1772
|
+
return (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1773
|
+
}
|
|
1774
|
+
/**
|
|
1775
|
+
* The name of the enum WITH its leading namespace (if applicable)
|
|
1776
|
+
*/
|
|
1777
|
+
get fullName() {
|
|
1778
|
+
var _a;
|
|
1779
|
+
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1780
|
+
if (name) {
|
|
1781
|
+
if (this.namespaceName) {
|
|
1782
|
+
let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
|
|
1783
|
+
return `${namespaceName}.${name}`;
|
|
1784
|
+
}
|
|
1785
|
+
else {
|
|
1786
|
+
return name;
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
else {
|
|
1790
|
+
//return undefined which will allow outside callers to know that this doesn't have a name
|
|
1791
|
+
return undefined;
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
transpile(state) {
|
|
1795
|
+
//enum declarations do not exist at runtime, so don't transpile anything...
|
|
1796
|
+
return [];
|
|
1797
|
+
}
|
|
1798
|
+
getTypedef(state) {
|
|
1799
|
+
var _a, _b, _c;
|
|
1800
|
+
const result = [];
|
|
1801
|
+
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1802
|
+
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1803
|
+
}
|
|
1804
|
+
result.push((_b = this.tokens.enum.text) !== null && _b !== void 0 ? _b : 'enum', ' ', this.tokens.name.text);
|
|
1805
|
+
result.push(state.newline);
|
|
1806
|
+
state.blockDepth++;
|
|
1807
|
+
for (const member of this.body) {
|
|
1808
|
+
if ((0, reflection_1.isTypedefProvider)(member)) {
|
|
1809
|
+
result.push(state.indent(), ...member.getTypedef(state), state.newline);
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1812
|
+
state.blockDepth--;
|
|
1813
|
+
result.push(state.indent(), (_c = this.tokens.endEnum.text) !== null && _c !== void 0 ? _c : 'end enum');
|
|
1814
|
+
return result;
|
|
1815
|
+
}
|
|
1816
|
+
walk(visitor, options) {
|
|
1817
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1818
|
+
for (let i = 0; i < this.body.length; i++) {
|
|
1819
|
+
(0, visitors_1.walk)(this.body, i, visitor, options, this);
|
|
1820
|
+
}
|
|
1821
|
+
}
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
exports.EnumStatement = EnumStatement;
|
|
1825
|
+
class EnumMemberStatement extends Statement {
|
|
1826
|
+
constructor(tokens, value) {
|
|
1827
|
+
var _a;
|
|
1828
|
+
super();
|
|
1829
|
+
this.tokens = tokens;
|
|
1830
|
+
this.value = value;
|
|
1831
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1832
|
+
}
|
|
1833
|
+
/**
|
|
1834
|
+
* The name of the member
|
|
1835
|
+
*/
|
|
1836
|
+
get name() {
|
|
1837
|
+
return this.tokens.name.text;
|
|
1838
|
+
}
|
|
1839
|
+
transpile(state) {
|
|
1840
|
+
return [];
|
|
1841
|
+
}
|
|
1842
|
+
getTypedef(state) {
|
|
1843
|
+
const result = [
|
|
1844
|
+
this.tokens.name.text
|
|
1845
|
+
];
|
|
1846
|
+
if (this.tokens.equal) {
|
|
1847
|
+
result.push(' ', this.tokens.equal.text, ' ');
|
|
1848
|
+
if (this.value) {
|
|
1849
|
+
result.push(...this.value.transpile(state));
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
return result;
|
|
1853
|
+
}
|
|
1854
|
+
walk(visitor, options) {
|
|
1855
|
+
if (this.value && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1856
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
exports.EnumMemberStatement = EnumMemberStatement;
|
|
1424
1861
|
//# sourceMappingURL=Statement.js.map
|