brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +643 -253
- package/README.md +33 -9
- package/bsconfig.schema.json +22 -2
- package/dist/BsConfig.d.ts +9 -0
- package/dist/Cache.d.ts +5 -6
- package/dist/Cache.js +12 -11
- package/dist/Cache.js.map +1 -1
- package/dist/CodeActionUtil.d.ts +11 -2
- package/dist/CodeActionUtil.js +17 -3
- package/dist/CodeActionUtil.js.map +1 -1
- package/dist/CommentFlagProcessor.d.ts +4 -4
- package/dist/CommentFlagProcessor.js +5 -3
- package/dist/CommentFlagProcessor.js.map +1 -1
- package/dist/DependencyGraph.d.ts +2 -2
- package/dist/DependencyGraph.js +20 -7
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticCollection.d.ts +3 -3
- package/dist/DiagnosticCollection.js +11 -11
- package/dist/DiagnosticCollection.js.map +1 -1
- package/dist/DiagnosticFilterer.js +5 -4
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +59 -4
- package/dist/DiagnosticMessages.js +65 -7
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +51 -39
- package/dist/LanguageServer.js +316 -232
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +2 -0
- package/dist/Logger.js +10 -8
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.d.ts +7 -3
- package/dist/PluginInterface.js +9 -0
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +43 -25
- package/dist/Program.js +212 -95
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +4 -0
- package/dist/ProgramBuilder.js +36 -20
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +126 -29
- package/dist/Scope.js +433 -156
- package/dist/Scope.js.map +1 -1
- package/dist/SemanticTokenUtils.d.ts +14 -0
- package/dist/SemanticTokenUtils.js +81 -0
- package/dist/SemanticTokenUtils.js.map +1 -0
- package/dist/SymbolTable.d.ts +10 -4
- package/dist/SymbolTable.js +55 -13
- package/dist/SymbolTable.js.map +1 -1
- package/dist/XmlScope.d.ts +7 -2
- package/dist/XmlScope.js +65 -27
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/AstEditor.d.ts +65 -0
- package/dist/astUtils/AstEditor.js +239 -0
- package/dist/astUtils/AstEditor.js.map +1 -0
- package/dist/{types/FunctionType.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
- package/dist/astUtils/AstEditor.spec.js +254 -0
- package/dist/astUtils/AstEditor.spec.js.map +1 -0
- package/dist/astUtils/creators.d.ts +28 -6
- package/dist/astUtils/creators.js +137 -19
- package/dist/astUtils/creators.js.map +1 -1
- package/dist/astUtils/creators.spec.js +14 -4
- package/dist/astUtils/creators.spec.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +32 -10
- package/dist/astUtils/reflection.js +82 -7
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +130 -119
- package/dist/astUtils/reflection.spec.js.map +1 -1
- package/dist/astUtils/stackedVisitor.js.map +1 -1
- package/dist/astUtils/stackedVisitor.spec.js +13 -13
- package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +76 -51
- package/dist/astUtils/visitors.js +31 -11
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +126 -32
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/astUtils/xml.d.ts +4 -3
- package/dist/astUtils/xml.js +8 -3
- package/dist/astUtils/xml.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +7 -1
- package/dist/bscPlugin/BscPlugin.js +28 -0
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +4 -4
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +26 -26
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +108 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +130 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +52 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +29 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +183 -0
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
- package/dist/cli.js +10 -3
- package/dist/cli.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +1 -0
- package/dist/diagnosticUtils.js +15 -8
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/examples/plugins/removePrint.js +12 -14
- package/dist/examples/plugins/removePrint.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +717 -147
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +70 -30
- package/dist/files/BrsFile.js +719 -353
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +1238 -449
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +6 -5
- package/dist/files/XmlFile.js +38 -30
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +302 -237
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +44 -42
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
- package/dist/files/tests/optionalChaning.spec.js +88 -0
- package/dist/files/tests/optionalChaning.spec.js.map +1 -0
- package/dist/globalCallables.d.ts +3 -1
- package/dist/globalCallables.js +424 -152
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.js +28 -5
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +133 -16
- package/dist/lexer/Lexer.d.ts +19 -1
- package/dist/lexer/Lexer.js +127 -21
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +657 -536
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/Token.d.ts +2 -2
- package/dist/lexer/TokenKind.d.ts +13 -1
- package/dist/lexer/TokenKind.js +60 -3
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/BrsTranspileState.d.ts +9 -0
- package/dist/parser/BrsTranspileState.js +14 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +150 -34
- package/dist/parser/Expression.js +335 -165
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +189 -89
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +153 -30
- package/dist/parser/Parser.js +1100 -503
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +687 -266
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGParser.d.ts +41 -4
- package/dist/parser/SGParser.js +186 -175
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +35 -22
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +206 -38
- package/dist/parser/SGTypes.js +470 -161
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/SGTypes.spec.d.ts +1 -0
- package/dist/parser/SGTypes.spec.js +351 -0
- package/dist/parser/SGTypes.spec.js.map +1 -0
- package/dist/parser/Statement.d.ts +202 -48
- package/dist/parser/Statement.js +648 -193
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +11 -11
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/TranspileState.d.ts +1 -1
- package/dist/parser/TranspileState.js +15 -7
- package/dist/parser/TranspileState.js.map +1 -1
- package/dist/parser/tests/Parser.spec.d.ts +10 -9
- package/dist/parser/tests/Parser.spec.js +15 -11
- package/dist/parser/tests/Parser.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/For.spec.js +60 -60
- package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/ForEach.spec.js +40 -39
- package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/If.spec.js +213 -194
- package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/While.spec.js +37 -37
- package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
- package/dist/parser/tests/expression/Additive.spec.js +30 -30
- package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
- package/dist/parser/tests/expression/ArrayLiterals.spec.js +119 -119
- package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +162 -138
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/Boolean.spec.js +24 -24
- package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
- package/dist/parser/tests/expression/Call.spec.js +41 -40
- package/dist/parser/tests/expression/Call.spec.js.map +1 -1
- package/dist/parser/tests/expression/Exponential.spec.js +17 -17
- package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
- package/dist/parser/tests/expression/Function.spec.js +256 -256
- package/dist/parser/tests/expression/Function.spec.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +87 -87
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/dist/parser/tests/expression/Multiplicative.spec.js +37 -37
- package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +75 -63
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/PrefixUnary.spec.js +41 -41
- package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
- package/dist/parser/tests/expression/Primary.spec.js +41 -41
- package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
- package/dist/parser/tests/expression/Relational.spec.js +43 -43
- package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +9 -9
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +28 -28
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +102 -102
- package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
- package/dist/parser/tests/statement/AssignmentOperators.spec.js +36 -36
- package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
- package/dist/parser/tests/statement/Declaration.spec.js +44 -44
- package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
- package/dist/parser/tests/statement/Dim.spec.js +21 -21
- package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +840 -0
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
- package/dist/parser/tests/statement/For.spec.d.ts +1 -0
- package/dist/parser/tests/statement/For.spec.js +46 -0
- package/dist/parser/tests/statement/For.spec.js.map +1 -0
- package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
- package/dist/parser/tests/statement/ForEach.spec.js +37 -0
- package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
- package/dist/parser/tests/statement/Function.spec.js +198 -197
- package/dist/parser/tests/statement/Function.spec.js.map +1 -1
- package/dist/parser/tests/statement/Goto.spec.js +15 -14
- package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
- package/dist/parser/tests/statement/Increment.spec.js +50 -50
- package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +254 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
- package/dist/parser/tests/statement/LibraryStatement.spec.js +17 -17
- package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Misc.spec.js +108 -106
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +40 -40
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/ReturnStatement.spec.js +46 -46
- package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Set.spec.js +83 -83
- package/dist/parser/tests/statement/Set.spec.js.map +1 -1
- package/dist/parser/tests/statement/Stop.spec.js +12 -11
- package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
- package/dist/parser/tests/statement/Throw.spec.js +5 -5
- package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
- package/dist/parser/tests/statement/TryCatch.spec.js +15 -13
- package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
- package/dist/preprocessor/Chunk.d.ts +1 -1
- package/dist/preprocessor/Chunk.js.map +1 -1
- package/dist/preprocessor/Manifest.d.ts +5 -5
- package/dist/preprocessor/Manifest.js +14 -35
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/preprocessor/Manifest.spec.d.ts +1 -0
- package/dist/preprocessor/Manifest.spec.js +78 -103
- package/dist/preprocessor/Manifest.spec.js.map +1 -1
- package/dist/preprocessor/Preprocessor.d.ts +1 -1
- package/dist/preprocessor/Preprocessor.js +8 -8
- package/dist/preprocessor/Preprocessor.js.map +1 -1
- package/dist/preprocessor/Preprocessor.spec.js +49 -49
- package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
- package/dist/preprocessor/PreprocessorParser.spec.js +72 -72
- package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
- package/dist/roku-types/data.json +21891 -0
- package/dist/roku-types/index.d.ts +6776 -0
- package/dist/roku-types/index.js +11 -0
- package/dist/roku-types/index.js.map +1 -0
- package/dist/types/ArrayType.d.ts +8 -5
- package/dist/types/ArrayType.js +52 -12
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +72 -11
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/BooleanType.d.ts +4 -2
- package/dist/types/BooleanType.js +9 -4
- package/dist/types/BooleanType.js.map +1 -1
- package/dist/types/BooleanType.spec.js +5 -3
- package/dist/types/BooleanType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +20 -5
- package/dist/types/BscType.js +24 -0
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/CustomType.d.ts +8 -6
- package/dist/types/CustomType.js +20 -11
- package/dist/types/CustomType.js.map +1 -1
- package/dist/types/DoubleType.d.ts +2 -0
- package/dist/types/DoubleType.js +14 -9
- package/dist/types/DoubleType.js.map +1 -1
- package/dist/types/DoubleType.spec.js +5 -3
- package/dist/types/DoubleType.spec.js.map +1 -1
- package/dist/types/DynamicType.d.ts +2 -0
- package/dist/types/DynamicType.js +6 -2
- package/dist/types/DynamicType.js.map +1 -1
- package/dist/types/DynamicType.spec.js +2 -2
- package/dist/types/DynamicType.spec.js.map +1 -1
- package/dist/types/EnumType.d.ts +22 -0
- package/dist/types/EnumType.js +55 -0
- package/dist/types/EnumType.js.map +1 -0
- package/dist/types/FloatType.d.ts +2 -0
- package/dist/types/FloatType.js +14 -9
- package/dist/types/FloatType.js.map +1 -1
- package/dist/types/FloatType.spec.js +4 -2
- package/dist/types/FloatType.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +7 -31
- package/dist/types/FunctionType.js +11 -57
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/IntegerType.d.ts +2 -0
- package/dist/types/IntegerType.js +14 -9
- package/dist/types/IntegerType.js.map +1 -1
- package/dist/types/IntegerType.spec.js +5 -3
- package/dist/types/IntegerType.spec.js.map +1 -1
- package/dist/types/InterfaceType.d.ts +13 -4
- package/dist/types/InterfaceType.js +48 -8
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/InterfaceType.spec.d.ts +1 -0
- package/dist/types/InterfaceType.spec.js +194 -0
- package/dist/types/InterfaceType.spec.js.map +1 -0
- package/dist/types/InvalidType.d.ts +4 -2
- package/dist/types/InvalidType.js +10 -5
- package/dist/types/InvalidType.js.map +1 -1
- package/dist/types/InvalidType.spec.js +4 -2
- package/dist/types/InvalidType.spec.js.map +1 -1
- package/dist/types/LazyType.d.ts +8 -7
- package/dist/types/LazyType.js +22 -10
- package/dist/types/LazyType.js.map +1 -1
- package/dist/types/LongIntegerType.d.ts +2 -0
- package/dist/types/LongIntegerType.js +14 -9
- package/dist/types/LongIntegerType.js.map +1 -1
- package/dist/types/LongIntegerType.spec.js +4 -2
- package/dist/types/LongIntegerType.spec.js.map +1 -1
- package/dist/types/ObjectType.d.ts +8 -4
- package/dist/types/ObjectType.js +9 -4
- package/dist/types/ObjectType.js.map +1 -1
- package/dist/types/ObjectType.spec.js +2 -2
- package/dist/types/ObjectType.spec.js.map +1 -1
- package/dist/types/StringType.d.ts +4 -2
- package/dist/types/StringType.js +9 -4
- package/dist/types/StringType.js.map +1 -1
- package/dist/types/StringType.spec.js +4 -2
- package/dist/types/StringType.spec.js.map +1 -1
- package/dist/types/TypedFunctionType.d.ts +28 -0
- package/dist/types/TypedFunctionType.js +88 -0
- package/dist/types/TypedFunctionType.js.map +1 -0
- package/dist/types/TypedFunctionType.spec.d.ts +1 -0
- package/dist/types/TypedFunctionType.spec.js +37 -0
- package/dist/types/TypedFunctionType.spec.js.map +1 -0
- package/dist/types/UninitializedType.js +3 -3
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/VoidType.d.ts +4 -2
- package/dist/types/VoidType.js +8 -4
- package/dist/types/VoidType.js.map +1 -1
- package/dist/types/VoidType.spec.js +2 -2
- package/dist/types/VoidType.spec.js.map +1 -1
- package/dist/types/helpers.d.ts +42 -0
- package/dist/types/helpers.js +118 -0
- package/dist/types/helpers.js.map +1 -0
- package/dist/util.d.ts +91 -21
- package/dist/util.js +364 -114
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +19 -2
- package/dist/validators/ClassValidator.js +164 -103
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +30 -19
- package/dist/astUtils/index.d.ts +0 -7
- package/dist/astUtils/index.js +0 -26
- package/dist/astUtils/index.js.map +0 -1
- package/dist/lexer/index.d.ts +0 -3
- package/dist/lexer/index.js +0 -17
- package/dist/lexer/index.js.map +0 -1
- package/dist/parser/index.d.ts +0 -3
- package/dist/parser/index.js +0 -16
- package/dist/parser/index.js.map +0 -1
- package/dist/preprocessor/index.d.ts +0 -3
- package/dist/preprocessor/index.js +0 -16
- package/dist/preprocessor/index.js.map +0 -1
- package/dist/types/FunctionType.spec.js +0 -23
- package/dist/types/FunctionType.spec.js.map +0 -1
package/dist/parser/Statement.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ThrowStatement = exports.TryCatchStatement = exports.
|
|
4
|
-
const
|
|
3
|
+
exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = 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");
|
|
15
|
+
const EnumType_1 = require("../types/EnumType");
|
|
16
|
+
const FunctionType_1 = require("../types/FunctionType");
|
|
14
17
|
/**
|
|
15
18
|
* A BrightScript statement
|
|
16
19
|
*/
|
|
@@ -45,12 +48,10 @@ exports.EmptyStatement = EmptyStatement;
|
|
|
45
48
|
*/
|
|
46
49
|
class Body extends Statement {
|
|
47
50
|
constructor(statements = []) {
|
|
51
|
+
var _a;
|
|
48
52
|
super();
|
|
49
53
|
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));
|
|
54
|
+
this.range = (_a = util_1.util.createBoundingRange(...this.statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
54
55
|
}
|
|
55
56
|
transpile(state) {
|
|
56
57
|
let result = [];
|
|
@@ -62,15 +63,15 @@ class Body extends Statement {
|
|
|
62
63
|
//this is the first statement. do nothing related to spacing and newlines
|
|
63
64
|
//if comment is on same line as prior sibling
|
|
64
65
|
}
|
|
65
|
-
else if (reflection_1.isCommentStatement(statement) && previousStatement && statement.range.start.line === previousStatement.range.end.line) {
|
|
66
|
+
else if ((0, reflection_1.isCommentStatement)(statement) && previousStatement && statement.range.start.line === previousStatement.range.end.line) {
|
|
66
67
|
result.push(' ');
|
|
67
68
|
//add double newline if this is a comment, and next is a function
|
|
68
69
|
}
|
|
69
|
-
else if (reflection_1.isCommentStatement(statement) && nextStatement && reflection_1.isFunctionStatement(nextStatement)) {
|
|
70
|
+
else if ((0, reflection_1.isCommentStatement)(statement) && nextStatement && (0, reflection_1.isFunctionStatement)(nextStatement)) {
|
|
70
71
|
result.push('\n\n');
|
|
71
72
|
//add double newline if is function not preceeded by a comment
|
|
72
73
|
}
|
|
73
|
-
else if (reflection_1.isFunctionStatement(statement) && previousStatement && !(reflection_1.isCommentStatement(previousStatement))) {
|
|
74
|
+
else if ((0, reflection_1.isFunctionStatement)(statement) && previousStatement && !((0, reflection_1.isCommentStatement)(previousStatement))) {
|
|
74
75
|
result.push('\n\n');
|
|
75
76
|
}
|
|
76
77
|
else {
|
|
@@ -85,7 +86,7 @@ class Body extends Statement {
|
|
|
85
86
|
let result = [];
|
|
86
87
|
for (const statement of this.statements) {
|
|
87
88
|
//if the current statement supports generating typedef, call it
|
|
88
|
-
if (
|
|
89
|
+
if ((0, reflection_1.isTypedefProvider)(statement)) {
|
|
89
90
|
result.push(state.indent(), ...statement.getTypedef(state), state.newline);
|
|
90
91
|
}
|
|
91
92
|
}
|
|
@@ -93,26 +94,25 @@ class Body extends Statement {
|
|
|
93
94
|
}
|
|
94
95
|
walk(visitor, options) {
|
|
95
96
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
96
|
-
|
|
97
|
-
visitors_1.walk(this.statements, i, visitor, options, this);
|
|
98
|
-
}
|
|
97
|
+
(0, visitors_1.walkArray)(this.statements, visitor, options, this);
|
|
99
98
|
}
|
|
100
99
|
}
|
|
101
100
|
}
|
|
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
|
|
@@ -167,25 +166,24 @@ class Block extends Statement {
|
|
|
167
166
|
}
|
|
168
167
|
walk(visitor, options) {
|
|
169
168
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
170
|
-
|
|
171
|
-
visitors_1.walk(this.statements, i, visitor, options, this);
|
|
172
|
-
}
|
|
169
|
+
(0, visitors_1.walkArray)(this.statements, visitor, options, this);
|
|
173
170
|
}
|
|
174
171
|
}
|
|
175
172
|
}
|
|
176
173
|
exports.Block = Block;
|
|
177
174
|
class ExpressionStatement extends Statement {
|
|
178
175
|
constructor(expression) {
|
|
176
|
+
var _a, _b;
|
|
179
177
|
super();
|
|
180
178
|
this.expression = expression;
|
|
181
|
-
this.range = this.expression.range;
|
|
179
|
+
this.range = (_b = (_a = this.expression) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
182
180
|
}
|
|
183
181
|
transpile(state) {
|
|
184
182
|
return this.expression.transpile(state);
|
|
185
183
|
}
|
|
186
184
|
walk(visitor, options) {
|
|
187
185
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
188
|
-
visitors_1.walk(this, 'expression', visitor, options);
|
|
186
|
+
(0, visitors_1.walk)(this, 'expression', visitor, options);
|
|
189
187
|
}
|
|
190
188
|
}
|
|
191
189
|
}
|
|
@@ -195,10 +193,8 @@ class CommentStatement extends Statement {
|
|
|
195
193
|
var _a;
|
|
196
194
|
super();
|
|
197
195
|
this.comments = comments;
|
|
196
|
+
this.range = (_a = util_1.util.createBoundingRange(...this.comments)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
198
197
|
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
198
|
}
|
|
203
199
|
get text() {
|
|
204
200
|
return this.comments.map(x => x.text).join('\n');
|
|
@@ -228,9 +224,10 @@ class CommentStatement extends Statement {
|
|
|
228
224
|
exports.CommentStatement = CommentStatement;
|
|
229
225
|
class ExitForStatement extends Statement {
|
|
230
226
|
constructor(tokens) {
|
|
227
|
+
var _a, _b, _c;
|
|
231
228
|
super();
|
|
232
229
|
this.tokens = tokens;
|
|
233
|
-
this.range = this.tokens.exitFor.range;
|
|
230
|
+
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
231
|
}
|
|
235
232
|
transpile(state) {
|
|
236
233
|
return [
|
|
@@ -244,9 +241,10 @@ class ExitForStatement extends Statement {
|
|
|
244
241
|
exports.ExitForStatement = ExitForStatement;
|
|
245
242
|
class ExitWhileStatement extends Statement {
|
|
246
243
|
constructor(tokens) {
|
|
244
|
+
var _a, _b, _c;
|
|
247
245
|
super();
|
|
248
246
|
this.tokens = tokens;
|
|
249
|
-
this.range = this.tokens.exitWhile.range;
|
|
247
|
+
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
248
|
}
|
|
251
249
|
transpile(state) {
|
|
252
250
|
return [
|
|
@@ -264,7 +262,16 @@ class FunctionStatement extends Statement {
|
|
|
264
262
|
this.name = name;
|
|
265
263
|
this.func = func;
|
|
266
264
|
this.namespaceName = namespaceName;
|
|
267
|
-
|
|
265
|
+
}
|
|
266
|
+
get range() {
|
|
267
|
+
return this.cacheRange();
|
|
268
|
+
}
|
|
269
|
+
cacheRange() {
|
|
270
|
+
var _a, _b;
|
|
271
|
+
if (!this._range) {
|
|
272
|
+
this._range = (_b = (_a = this.func) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : this.name.range;
|
|
273
|
+
}
|
|
274
|
+
return this._range;
|
|
268
275
|
}
|
|
269
276
|
/**
|
|
270
277
|
* Get the name of this expression based on the parse mode
|
|
@@ -295,21 +302,21 @@ class FunctionStatement extends Statement {
|
|
|
295
302
|
}
|
|
296
303
|
walk(visitor, options) {
|
|
297
304
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
298
|
-
visitors_1.walk(this, 'func', visitor, options);
|
|
305
|
+
(0, visitors_1.walk)(this, 'func', visitor, options);
|
|
299
306
|
}
|
|
300
307
|
}
|
|
301
308
|
}
|
|
302
309
|
exports.FunctionStatement = FunctionStatement;
|
|
303
310
|
class IfStatement extends Statement {
|
|
304
311
|
constructor(tokens, condition, thenBranch, elseBranch, isInline) {
|
|
305
|
-
var _a
|
|
312
|
+
var _a;
|
|
306
313
|
super();
|
|
307
314
|
this.tokens = tokens;
|
|
308
315
|
this.condition = condition;
|
|
309
316
|
this.thenBranch = thenBranch;
|
|
310
317
|
this.elseBranch = elseBranch;
|
|
311
318
|
this.isInline = isInline;
|
|
312
|
-
this.range = util_1.util.
|
|
319
|
+
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
320
|
}
|
|
314
321
|
transpile(state) {
|
|
315
322
|
let results = [];
|
|
@@ -318,14 +325,11 @@ class IfStatement extends Statement {
|
|
|
318
325
|
results.push(' ');
|
|
319
326
|
//conditions
|
|
320
327
|
results.push(...this.condition.transpile(state));
|
|
321
|
-
results.push(' ');
|
|
322
328
|
//then
|
|
323
329
|
if (this.tokens.then) {
|
|
330
|
+
results.push(' ');
|
|
324
331
|
results.push(state.transpileToken(this.tokens.then));
|
|
325
332
|
}
|
|
326
|
-
else {
|
|
327
|
-
results.push('then');
|
|
328
|
-
}
|
|
329
333
|
state.lineage.unshift(this);
|
|
330
334
|
//if statement body
|
|
331
335
|
let thenNodes = this.thenBranch.transpile(state);
|
|
@@ -340,13 +344,14 @@ class IfStatement extends Statement {
|
|
|
340
344
|
results.push(state.indent(), state.transpileToken(this.tokens.else));
|
|
341
345
|
}
|
|
342
346
|
if (this.elseBranch) {
|
|
343
|
-
if (reflection_1.isIfStatement(this.elseBranch)) {
|
|
347
|
+
if ((0, reflection_1.isIfStatement)(this.elseBranch)) {
|
|
344
348
|
//chained elseif
|
|
345
349
|
state.lineage.unshift(this.elseBranch);
|
|
346
350
|
let body = this.elseBranch.transpile(state);
|
|
347
351
|
state.lineage.shift();
|
|
348
352
|
if (body.length > 0) {
|
|
349
|
-
|
|
353
|
+
//zero or more spaces between the `else` and the `if`
|
|
354
|
+
results.push(this.elseBranch.tokens.if.leadingWhitespace);
|
|
350
355
|
results.push(...body);
|
|
351
356
|
// stop here because chained if will transpile the rest
|
|
352
357
|
return results;
|
|
@@ -378,23 +383,24 @@ class IfStatement extends Statement {
|
|
|
378
383
|
}
|
|
379
384
|
walk(visitor, options) {
|
|
380
385
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
381
|
-
visitors_1.walk(this, 'condition', visitor, options);
|
|
386
|
+
(0, visitors_1.walk)(this, 'condition', visitor, options);
|
|
382
387
|
}
|
|
383
388
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
384
|
-
visitors_1.walk(this, 'thenBranch', visitor, options);
|
|
389
|
+
(0, visitors_1.walk)(this, 'thenBranch', visitor, options);
|
|
385
390
|
}
|
|
386
391
|
if (this.elseBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
387
|
-
visitors_1.walk(this, 'elseBranch', visitor, options);
|
|
392
|
+
(0, visitors_1.walk)(this, 'elseBranch', visitor, options);
|
|
388
393
|
}
|
|
389
394
|
}
|
|
390
395
|
}
|
|
391
396
|
exports.IfStatement = IfStatement;
|
|
392
397
|
class IncrementStatement extends Statement {
|
|
393
398
|
constructor(value, operator) {
|
|
399
|
+
var _a;
|
|
394
400
|
super();
|
|
395
401
|
this.value = value;
|
|
396
402
|
this.operator = operator;
|
|
397
|
-
this.range = util_1.util.
|
|
403
|
+
this.range = (_a = util_1.util.createBoundingRange(this.value, this.operator)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
398
404
|
}
|
|
399
405
|
transpile(state) {
|
|
400
406
|
return [
|
|
@@ -404,7 +410,7 @@ class IncrementStatement extends Statement {
|
|
|
404
410
|
}
|
|
405
411
|
walk(visitor, options) {
|
|
406
412
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
407
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
413
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
408
414
|
}
|
|
409
415
|
}
|
|
410
416
|
}
|
|
@@ -419,12 +425,11 @@ class PrintStatement extends Statement {
|
|
|
419
425
|
* evaluated and printed.
|
|
420
426
|
*/
|
|
421
427
|
constructor(tokens, expressions) {
|
|
428
|
+
var _a;
|
|
422
429
|
super();
|
|
423
430
|
this.tokens = tokens;
|
|
424
431
|
this.expressions = expressions;
|
|
425
|
-
this.range = util_1.util.
|
|
426
|
-
? this.expressions[this.expressions.length - 1].range.end
|
|
427
|
-
: this.tokens.print.range.end);
|
|
432
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.print, ...this.expressions)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
428
433
|
}
|
|
429
434
|
transpile(state) {
|
|
430
435
|
var _a;
|
|
@@ -449,26 +454,22 @@ class PrintStatement extends Statement {
|
|
|
449
454
|
}
|
|
450
455
|
walk(visitor, options) {
|
|
451
456
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
if (reflection_1.isExpression(this.expressions[i])) {
|
|
455
|
-
visitors_1.walk(this.expressions, i, visitor, options, this);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
457
|
+
//sometimes we have semicolon Tokens in the expressions list (should probably fix that...), so only walk the actual expressions
|
|
458
|
+
(0, visitors_1.walkArray)(this.expressions, visitor, options, this, (item) => (0, reflection_1.isExpression)(item));
|
|
458
459
|
}
|
|
459
460
|
}
|
|
460
461
|
}
|
|
461
462
|
exports.PrintStatement = PrintStatement;
|
|
462
463
|
class DimStatement extends Statement {
|
|
463
464
|
constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
|
|
464
|
-
var _a
|
|
465
|
+
var _a;
|
|
465
466
|
super();
|
|
466
467
|
this.dimToken = dimToken;
|
|
467
468
|
this.identifier = identifier;
|
|
468
469
|
this.openingSquare = openingSquare;
|
|
469
470
|
this.dimensions = dimensions;
|
|
470
471
|
this.closingSquare = closingSquare;
|
|
471
|
-
this.range = util_1.util.
|
|
472
|
+
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
473
|
}
|
|
473
474
|
transpile(state) {
|
|
474
475
|
let result = [
|
|
@@ -489,18 +490,17 @@ class DimStatement extends Statement {
|
|
|
489
490
|
walk(visitor, options) {
|
|
490
491
|
var _a;
|
|
491
492
|
if (((_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) > 0 && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
492
|
-
|
|
493
|
-
visitors_1.walk(this.dimensions, i, visitor, options, this);
|
|
494
|
-
}
|
|
493
|
+
(0, visitors_1.walkArray)(this.dimensions, visitor, options, this);
|
|
495
494
|
}
|
|
496
495
|
}
|
|
497
496
|
}
|
|
498
497
|
exports.DimStatement = DimStatement;
|
|
499
498
|
class GotoStatement extends Statement {
|
|
500
499
|
constructor(tokens) {
|
|
500
|
+
var _a;
|
|
501
501
|
super();
|
|
502
502
|
this.tokens = tokens;
|
|
503
|
-
this.range = util_1.util.
|
|
503
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.goto, this.tokens.label)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
504
504
|
}
|
|
505
505
|
transpile(state) {
|
|
506
506
|
return [
|
|
@@ -516,9 +516,10 @@ class GotoStatement extends Statement {
|
|
|
516
516
|
exports.GotoStatement = GotoStatement;
|
|
517
517
|
class LabelStatement extends Statement {
|
|
518
518
|
constructor(tokens) {
|
|
519
|
+
var _a;
|
|
519
520
|
super();
|
|
520
521
|
this.tokens = tokens;
|
|
521
|
-
this.range = util_1.util.
|
|
522
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.identifier, this.tokens.colon)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
522
523
|
}
|
|
523
524
|
transpile(state) {
|
|
524
525
|
return [
|
|
@@ -537,7 +538,7 @@ class ReturnStatement extends Statement {
|
|
|
537
538
|
super();
|
|
538
539
|
this.tokens = tokens;
|
|
539
540
|
this.value = value;
|
|
540
|
-
this.range = util_1.util.
|
|
541
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.return, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
541
542
|
}
|
|
542
543
|
transpile(state) {
|
|
543
544
|
let result = [];
|
|
@@ -550,16 +551,17 @@ class ReturnStatement extends Statement {
|
|
|
550
551
|
}
|
|
551
552
|
walk(visitor, options) {
|
|
552
553
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
553
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
554
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
554
555
|
}
|
|
555
556
|
}
|
|
556
557
|
}
|
|
557
558
|
exports.ReturnStatement = ReturnStatement;
|
|
558
559
|
class EndStatement extends Statement {
|
|
559
560
|
constructor(tokens) {
|
|
561
|
+
var _a, _b;
|
|
560
562
|
super();
|
|
561
563
|
this.tokens = tokens;
|
|
562
|
-
this.range =
|
|
564
|
+
this.range = (_b = (_a = this.tokens.end) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
563
565
|
}
|
|
564
566
|
transpile(state) {
|
|
565
567
|
return [
|
|
@@ -573,9 +575,10 @@ class EndStatement extends Statement {
|
|
|
573
575
|
exports.EndStatement = EndStatement;
|
|
574
576
|
class StopStatement extends Statement {
|
|
575
577
|
constructor(tokens) {
|
|
578
|
+
var _a, _b;
|
|
576
579
|
super();
|
|
577
580
|
this.tokens = tokens;
|
|
578
|
-
this.range =
|
|
581
|
+
this.range = (_b = (_a = this.tokens.stop) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
|
|
579
582
|
}
|
|
580
583
|
transpile(state) {
|
|
581
584
|
return [
|
|
@@ -589,7 +592,7 @@ class StopStatement extends Statement {
|
|
|
589
592
|
exports.StopStatement = StopStatement;
|
|
590
593
|
class ForStatement extends Statement {
|
|
591
594
|
constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
|
|
592
|
-
var _a
|
|
595
|
+
var _a;
|
|
593
596
|
super();
|
|
594
597
|
this.forToken = forToken;
|
|
595
598
|
this.counterDeclaration = counterDeclaration;
|
|
@@ -599,8 +602,7 @@ class ForStatement extends Statement {
|
|
|
599
602
|
this.endForToken = endForToken;
|
|
600
603
|
this.stepToken = stepToken;
|
|
601
604
|
this.increment = increment;
|
|
602
|
-
|
|
603
|
-
this.range = util_1.util.createRangeFromPositions(this.forToken.range.start, lastRange.end);
|
|
605
|
+
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
606
|
}
|
|
605
607
|
transpile(state) {
|
|
606
608
|
let result = [];
|
|
@@ -620,30 +622,29 @@ class ForStatement extends Statement {
|
|
|
620
622
|
state.lineage.unshift(this);
|
|
621
623
|
result.push(...this.body.transpile(state));
|
|
622
624
|
state.lineage.shift();
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
}
|
|
625
|
+
// add new line before "end for"
|
|
626
|
+
result.push('\n');
|
|
626
627
|
//end for
|
|
627
628
|
result.push(state.indent(), state.transpileToken(this.endForToken));
|
|
628
629
|
return result;
|
|
629
630
|
}
|
|
630
631
|
walk(visitor, options) {
|
|
631
632
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
632
|
-
visitors_1.walk(this, 'counterDeclaration', visitor, options);
|
|
633
|
+
(0, visitors_1.walk)(this, 'counterDeclaration', visitor, options);
|
|
633
634
|
}
|
|
634
635
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
635
|
-
visitors_1.walk(this, 'finalValue', visitor, options);
|
|
636
|
-
visitors_1.walk(this, 'increment', visitor, options);
|
|
636
|
+
(0, visitors_1.walk)(this, 'finalValue', visitor, options);
|
|
637
|
+
(0, visitors_1.walk)(this, 'increment', visitor, options);
|
|
637
638
|
}
|
|
638
639
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
639
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
640
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
640
641
|
}
|
|
641
642
|
}
|
|
642
643
|
}
|
|
643
644
|
exports.ForStatement = ForStatement;
|
|
644
645
|
class ForEachStatement extends Statement {
|
|
645
646
|
constructor(forEachToken, item, inToken, target, body, endForToken) {
|
|
646
|
-
var _a
|
|
647
|
+
var _a;
|
|
647
648
|
super();
|
|
648
649
|
this.forEachToken = forEachToken;
|
|
649
650
|
this.item = item;
|
|
@@ -651,7 +652,7 @@ class ForEachStatement extends Statement {
|
|
|
651
652
|
this.target = target;
|
|
652
653
|
this.body = body;
|
|
653
654
|
this.endForToken = endForToken;
|
|
654
|
-
this.range = util_1.util.
|
|
655
|
+
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
656
|
}
|
|
656
657
|
transpile(state) {
|
|
657
658
|
let result = [];
|
|
@@ -667,32 +668,30 @@ class ForEachStatement extends Statement {
|
|
|
667
668
|
state.lineage.unshift(this);
|
|
668
669
|
result.push(...this.body.transpile(state));
|
|
669
670
|
state.lineage.shift();
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
}
|
|
671
|
+
// add new line before "end for"
|
|
672
|
+
result.push('\n');
|
|
673
673
|
//end for
|
|
674
674
|
result.push(state.indent(), state.transpileToken(this.endForToken));
|
|
675
675
|
return result;
|
|
676
676
|
}
|
|
677
677
|
walk(visitor, options) {
|
|
678
678
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
679
|
-
visitors_1.walk(this, 'target', visitor, options);
|
|
679
|
+
(0, visitors_1.walk)(this, 'target', visitor, options);
|
|
680
680
|
}
|
|
681
681
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
682
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
682
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
683
683
|
}
|
|
684
684
|
}
|
|
685
685
|
}
|
|
686
686
|
exports.ForEachStatement = ForEachStatement;
|
|
687
687
|
class WhileStatement extends Statement {
|
|
688
688
|
constructor(tokens, condition, body) {
|
|
689
|
-
var _a
|
|
689
|
+
var _a;
|
|
690
690
|
super();
|
|
691
691
|
this.tokens = tokens;
|
|
692
692
|
this.condition = condition;
|
|
693
693
|
this.body = body;
|
|
694
|
-
|
|
695
|
-
this.range = util_1.util.createRangeFromPositions(this.tokens.while.range.start, lastRange.end);
|
|
694
|
+
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
695
|
}
|
|
697
696
|
transpile(state) {
|
|
698
697
|
let result = [];
|
|
@@ -712,26 +711,29 @@ class WhileStatement extends Statement {
|
|
|
712
711
|
}
|
|
713
712
|
walk(visitor, options) {
|
|
714
713
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
715
|
-
visitors_1.walk(this, 'condition', visitor, options);
|
|
714
|
+
(0, visitors_1.walk)(this, 'condition', visitor, options);
|
|
716
715
|
}
|
|
717
716
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
718
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
717
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
719
718
|
}
|
|
720
719
|
}
|
|
721
720
|
}
|
|
722
721
|
exports.WhileStatement = WhileStatement;
|
|
723
722
|
class DottedSetStatement extends Statement {
|
|
724
|
-
constructor(obj, name, value) {
|
|
723
|
+
constructor(obj, name, value, dot, operator) {
|
|
724
|
+
var _a;
|
|
725
725
|
super();
|
|
726
726
|
this.obj = obj;
|
|
727
727
|
this.name = name;
|
|
728
728
|
this.value = value;
|
|
729
|
-
this.
|
|
729
|
+
this.dot = dot;
|
|
730
|
+
this.operator = operator;
|
|
731
|
+
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
732
|
}
|
|
731
733
|
transpile(state) {
|
|
732
734
|
var _a, _b;
|
|
733
735
|
//if the value is a compound assignment, don't add the obj, dot, name, or operator...the expression will handle that
|
|
734
|
-
if (
|
|
736
|
+
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
737
|
return this.value.transpile(state);
|
|
736
738
|
}
|
|
737
739
|
else {
|
|
@@ -749,26 +751,28 @@ class DottedSetStatement extends Statement {
|
|
|
749
751
|
}
|
|
750
752
|
walk(visitor, options) {
|
|
751
753
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
752
|
-
visitors_1.walk(this, 'obj', visitor, options);
|
|
753
|
-
visitors_1.walk(this, 'value', visitor, options);
|
|
754
|
+
(0, visitors_1.walk)(this, 'obj', visitor, options);
|
|
755
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
754
756
|
}
|
|
755
757
|
}
|
|
756
758
|
}
|
|
757
759
|
exports.DottedSetStatement = DottedSetStatement;
|
|
758
760
|
class IndexedSetStatement extends Statement {
|
|
759
|
-
constructor(obj, index, value, openingSquare, closingSquare) {
|
|
761
|
+
constructor(obj, index, value, openingSquare, closingSquare, operator) {
|
|
762
|
+
var _a;
|
|
760
763
|
super();
|
|
761
764
|
this.obj = obj;
|
|
762
765
|
this.index = index;
|
|
763
766
|
this.value = value;
|
|
764
767
|
this.openingSquare = openingSquare;
|
|
765
768
|
this.closingSquare = closingSquare;
|
|
766
|
-
this.
|
|
769
|
+
this.operator = operator;
|
|
770
|
+
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
771
|
}
|
|
768
772
|
transpile(state) {
|
|
769
773
|
var _a, _b;
|
|
770
774
|
//if the value is a component assignment, don't add the obj, index or operator...the expression will handle that
|
|
771
|
-
if (
|
|
775
|
+
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
776
|
return this.value.transpile(state);
|
|
773
777
|
}
|
|
774
778
|
else {
|
|
@@ -790,18 +794,19 @@ class IndexedSetStatement extends Statement {
|
|
|
790
794
|
}
|
|
791
795
|
walk(visitor, options) {
|
|
792
796
|
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);
|
|
797
|
+
(0, visitors_1.walk)(this, 'obj', visitor, options);
|
|
798
|
+
(0, visitors_1.walk)(this, 'index', visitor, options);
|
|
799
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
796
800
|
}
|
|
797
801
|
}
|
|
798
802
|
}
|
|
799
803
|
exports.IndexedSetStatement = IndexedSetStatement;
|
|
800
804
|
class LibraryStatement extends Statement {
|
|
801
805
|
constructor(tokens) {
|
|
806
|
+
var _a;
|
|
802
807
|
super();
|
|
803
808
|
this.tokens = tokens;
|
|
804
|
-
this.range = util_1.util.
|
|
809
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
805
810
|
}
|
|
806
811
|
transpile(state) {
|
|
807
812
|
let result = [];
|
|
@@ -834,8 +839,14 @@ class NamespaceStatement extends Statement {
|
|
|
834
839
|
this.symbolTable = new SymbolTable_1.SymbolTable(parentSymbolTable);
|
|
835
840
|
}
|
|
836
841
|
get range() {
|
|
837
|
-
|
|
838
|
-
|
|
842
|
+
return this.cacheRange();
|
|
843
|
+
}
|
|
844
|
+
cacheRange() {
|
|
845
|
+
var _a;
|
|
846
|
+
if (!this._range) {
|
|
847
|
+
this._range = (_a = util_1.util.createBoundingRange(this.keyword, this.nameExpression, this.body, this.endKeyword)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
848
|
+
}
|
|
849
|
+
return this._range;
|
|
839
850
|
}
|
|
840
851
|
getName(parseMode) {
|
|
841
852
|
return this.nameExpression.getName(parseMode);
|
|
@@ -858,20 +869,21 @@ class NamespaceStatement extends Statement {
|
|
|
858
869
|
}
|
|
859
870
|
walk(visitor, options) {
|
|
860
871
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
861
|
-
visitors_1.walk(this, 'nameExpression', visitor, options);
|
|
872
|
+
(0, visitors_1.walk)(this, 'nameExpression', visitor, options);
|
|
862
873
|
}
|
|
863
874
|
if (this.body.statements.length > 0 && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
864
|
-
visitors_1.walk(this, 'body', visitor, options);
|
|
875
|
+
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
865
876
|
}
|
|
866
877
|
}
|
|
867
878
|
}
|
|
868
879
|
exports.NamespaceStatement = NamespaceStatement;
|
|
869
880
|
class ImportStatement extends Statement {
|
|
870
881
|
constructor(importToken, filePathToken) {
|
|
882
|
+
var _a;
|
|
871
883
|
super();
|
|
872
884
|
this.importToken = importToken;
|
|
873
885
|
this.filePathToken = filePathToken;
|
|
874
|
-
this.range = util_1.util.
|
|
886
|
+
this.range = (_a = util_1.util.createBoundingRange(this.importToken, this.filePathToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
875
887
|
if (this.filePathToken) {
|
|
876
888
|
//remove quotes
|
|
877
889
|
this.filePath = this.filePathToken.text.replace(/"/g, '');
|
|
@@ -905,13 +917,196 @@ class ImportStatement extends Statement {
|
|
|
905
917
|
}
|
|
906
918
|
}
|
|
907
919
|
exports.ImportStatement = ImportStatement;
|
|
920
|
+
class InterfaceStatement extends Statement {
|
|
921
|
+
constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
|
|
922
|
+
var _a, _b, _c;
|
|
923
|
+
super();
|
|
924
|
+
this.name = name;
|
|
925
|
+
this.parentInterfaceName = parentInterfaceName;
|
|
926
|
+
this.body = body;
|
|
927
|
+
this.namespaceName = namespaceName;
|
|
928
|
+
this.memberTable = new SymbolTable_1.SymbolTable();
|
|
929
|
+
this.tokens = {};
|
|
930
|
+
this.memberMap = {};
|
|
931
|
+
this.methods = [];
|
|
932
|
+
this.fields = [];
|
|
933
|
+
this.tokens.interface = interfaceToken;
|
|
934
|
+
this.tokens.name = name;
|
|
935
|
+
this.tokens.extends = extendsToken;
|
|
936
|
+
this.tokens.endInterface = endInterfaceToken;
|
|
937
|
+
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;
|
|
938
|
+
for (let statement of this.body) {
|
|
939
|
+
if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
|
|
940
|
+
this.methods.push(statement);
|
|
941
|
+
this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
|
|
942
|
+
}
|
|
943
|
+
else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
|
|
944
|
+
this.fields.push(statement);
|
|
945
|
+
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
buildSymbolTable(parentIface) {
|
|
950
|
+
var _a, _b;
|
|
951
|
+
this.memberTable.clear();
|
|
952
|
+
if (parentIface) {
|
|
953
|
+
this.memberTable.setParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
|
|
954
|
+
}
|
|
955
|
+
for (const statement of this.methods) {
|
|
956
|
+
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
|
|
957
|
+
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);
|
|
958
|
+
}
|
|
959
|
+
for (const statement of this.fields) {
|
|
960
|
+
this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
hasParent() {
|
|
964
|
+
return !!this.parentInterfaceName;
|
|
965
|
+
}
|
|
966
|
+
getParentName() {
|
|
967
|
+
return !!this.parentInterfaceName;
|
|
968
|
+
}
|
|
969
|
+
/**
|
|
970
|
+
* Gets an array of possible parent interface names, taking into account the namespace this interface was created under
|
|
971
|
+
* @returns array of possible parent interface names
|
|
972
|
+
*/
|
|
973
|
+
getPossibleFullParentNames() {
|
|
974
|
+
var _a;
|
|
975
|
+
if (!this.hasParent()) {
|
|
976
|
+
return [];
|
|
977
|
+
}
|
|
978
|
+
if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
979
|
+
// The specified parent interface already has a dot, so it must already reference a namespace
|
|
980
|
+
return [this.parentInterfaceName.getName()];
|
|
981
|
+
}
|
|
982
|
+
const names = [];
|
|
983
|
+
if (this.namespaceName) {
|
|
984
|
+
// We're under a namespace, so the full parent name MIGHT be with this namespace too
|
|
985
|
+
names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
|
|
986
|
+
}
|
|
987
|
+
names.push(this.parentInterfaceName.getName());
|
|
988
|
+
return names;
|
|
989
|
+
}
|
|
990
|
+
getThisBscType() {
|
|
991
|
+
return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
992
|
+
}
|
|
993
|
+
/**
|
|
994
|
+
* The name of the interface WITH its leading namespace (if applicable)
|
|
995
|
+
*/
|
|
996
|
+
getName(parseMode) {
|
|
997
|
+
var _a;
|
|
998
|
+
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
999
|
+
if (name) {
|
|
1000
|
+
if (this.namespaceName) {
|
|
1001
|
+
let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
|
|
1002
|
+
return `${namespaceName}.${name}`;
|
|
1003
|
+
}
|
|
1004
|
+
else {
|
|
1005
|
+
return name;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
else {
|
|
1009
|
+
//return undefined which will allow outside callers to know that this interface doesn't have a name
|
|
1010
|
+
return undefined;
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
transpile(state) {
|
|
1014
|
+
//interfaces should completely disappear at runtime
|
|
1015
|
+
return [];
|
|
1016
|
+
}
|
|
1017
|
+
getTypedef(state) {
|
|
1018
|
+
var _a, _b, _c;
|
|
1019
|
+
const result = [];
|
|
1020
|
+
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1021
|
+
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1022
|
+
}
|
|
1023
|
+
result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
|
|
1024
|
+
const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName(Parser_1.ParseMode.BrighterScript);
|
|
1025
|
+
if (parentInterfaceName) {
|
|
1026
|
+
result.push(' extends ', parentInterfaceName);
|
|
1027
|
+
}
|
|
1028
|
+
const body = (_c = this.body) !== null && _c !== void 0 ? _c : [];
|
|
1029
|
+
if (body.length > 0) {
|
|
1030
|
+
state.blockDepth++;
|
|
1031
|
+
}
|
|
1032
|
+
for (const statement of body) {
|
|
1033
|
+
if ((0, reflection_1.isInterfaceMethodStatement)(statement) || (0, reflection_1.isInterfaceFieldStatement)(statement)) {
|
|
1034
|
+
result.push(state.newline, state.indent(), ...statement.getTypedef(state));
|
|
1035
|
+
}
|
|
1036
|
+
else {
|
|
1037
|
+
result.push(state.newline, state.indent(), ...statement.transpile(state));
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
if (body.length > 0) {
|
|
1041
|
+
state.blockDepth--;
|
|
1042
|
+
}
|
|
1043
|
+
result.push(state.newline, state.indent(), 'end interface', state.newline);
|
|
1044
|
+
return result;
|
|
1045
|
+
}
|
|
1046
|
+
walk(visitor, options) {
|
|
1047
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1048
|
+
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
exports.InterfaceStatement = InterfaceStatement;
|
|
1053
|
+
class InterfaceFieldStatement extends Statement {
|
|
1054
|
+
constructor(nameToken, asToken, type, namespaceName) {
|
|
1055
|
+
var _a;
|
|
1056
|
+
super();
|
|
1057
|
+
this.type = type;
|
|
1058
|
+
this.namespaceName = namespaceName;
|
|
1059
|
+
this.tokens = {};
|
|
1060
|
+
this.tokens.name = nameToken;
|
|
1061
|
+
this.tokens.as = asToken;
|
|
1062
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1063
|
+
}
|
|
1064
|
+
transpile(state) {
|
|
1065
|
+
throw new Error('Method not implemented.');
|
|
1066
|
+
}
|
|
1067
|
+
getType() {
|
|
1068
|
+
var _a;
|
|
1069
|
+
return (_a = this.type) === null || _a === void 0 ? void 0 : _a.type;
|
|
1070
|
+
}
|
|
1071
|
+
get name() {
|
|
1072
|
+
return this.tokens.name;
|
|
1073
|
+
}
|
|
1074
|
+
walk(visitor, options) {
|
|
1075
|
+
//nothing to walk
|
|
1076
|
+
}
|
|
1077
|
+
getTypedef(state) {
|
|
1078
|
+
var _a;
|
|
1079
|
+
const result = [];
|
|
1080
|
+
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1081
|
+
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1082
|
+
}
|
|
1083
|
+
result.push(this.tokens.name.text);
|
|
1084
|
+
if (this.tokens.as && this.type) {
|
|
1085
|
+
result.push(' as ', ...this.type.transpile(state));
|
|
1086
|
+
}
|
|
1087
|
+
return result;
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
exports.InterfaceFieldStatement = InterfaceFieldStatement;
|
|
1091
|
+
class InterfaceMethodStatement extends FunctionStatement {
|
|
1092
|
+
transpile(state) {
|
|
1093
|
+
throw new Error('Method not implemented.');
|
|
1094
|
+
}
|
|
1095
|
+
constructor(name, func) {
|
|
1096
|
+
super(name, func, undefined);
|
|
1097
|
+
}
|
|
1098
|
+
walk(visitor, options) {
|
|
1099
|
+
//nothing to walk
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
exports.InterfaceMethodStatement = InterfaceMethodStatement;
|
|
908
1103
|
class ClassStatement extends Statement {
|
|
909
1104
|
constructor(classKeyword,
|
|
910
1105
|
/**
|
|
911
1106
|
* The name of the class (without namespace prefix)
|
|
912
1107
|
*/
|
|
913
|
-
name, body, end, extendsKeyword, parentClassName, namespaceName) {
|
|
914
|
-
var _a, _b, _c;
|
|
1108
|
+
name, body, end, extendsKeyword, parentClassName, namespaceName, currentSymbolTable) {
|
|
1109
|
+
var _a, _b, _c, _d;
|
|
915
1110
|
super();
|
|
916
1111
|
this.classKeyword = classKeyword;
|
|
917
1112
|
this.name = name;
|
|
@@ -920,21 +1115,25 @@ class ClassStatement extends Statement {
|
|
|
920
1115
|
this.extendsKeyword = extendsKeyword;
|
|
921
1116
|
this.parentClassName = parentClassName;
|
|
922
1117
|
this.namespaceName = namespaceName;
|
|
1118
|
+
this.currentSymbolTable = currentSymbolTable;
|
|
1119
|
+
this.symbolTable = new SymbolTable_1.SymbolTable();
|
|
1120
|
+
this.memberTable = new SymbolTable_1.SymbolTable();
|
|
923
1121
|
this.memberMap = {};
|
|
924
1122
|
this.methods = [];
|
|
925
1123
|
this.fields = [];
|
|
926
1124
|
this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
|
|
1125
|
+
this.symbolTable.setParent(currentSymbolTable);
|
|
1126
|
+
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
1127
|
for (let statement of this.body) {
|
|
928
|
-
if (reflection_1.
|
|
1128
|
+
if ((0, reflection_1.isMethodStatement)(statement)) {
|
|
929
1129
|
this.methods.push(statement);
|
|
930
|
-
this.memberMap[(
|
|
1130
|
+
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
931
1131
|
}
|
|
932
|
-
else if (reflection_1.
|
|
1132
|
+
else if ((0, reflection_1.isFieldStatement)(statement)) {
|
|
933
1133
|
this.fields.push(statement);
|
|
934
|
-
this.memberMap[(
|
|
1134
|
+
this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
|
|
935
1135
|
}
|
|
936
1136
|
}
|
|
937
|
-
this.range = util_1.util.createRangeFromPositions(this.classKeyword.range.start, this.end.range.end);
|
|
938
1137
|
}
|
|
939
1138
|
getName(parseMode) {
|
|
940
1139
|
var _a;
|
|
@@ -954,6 +1153,36 @@ class ClassStatement extends Statement {
|
|
|
954
1153
|
return undefined;
|
|
955
1154
|
}
|
|
956
1155
|
}
|
|
1156
|
+
getThisBscType() {
|
|
1157
|
+
return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
1158
|
+
}
|
|
1159
|
+
getConstructorFunctionType() {
|
|
1160
|
+
var _a, _b;
|
|
1161
|
+
const constructFunc = this.getConstructorFunction();
|
|
1162
|
+
const constructorFuncType = (_b = (_a = constructFunc === null || constructFunc === void 0 ? void 0 : constructFunc.func) === null || _a === void 0 ? void 0 : _a.getFunctionType()) !== null && _b !== void 0 ? _b : new FunctionType_1.FunctionType();
|
|
1163
|
+
constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
|
|
1164
|
+
constructorFuncType.isNew = true;
|
|
1165
|
+
return constructorFuncType;
|
|
1166
|
+
}
|
|
1167
|
+
buildSymbolTable(parentClass) {
|
|
1168
|
+
var _a, _b, _c, _d, _e;
|
|
1169
|
+
this.symbolTable.clear();
|
|
1170
|
+
this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
|
|
1171
|
+
this.memberTable.clear();
|
|
1172
|
+
if ((0, reflection_1.isClassStatement)(parentClass)) {
|
|
1173
|
+
this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
|
|
1174
|
+
this.memberTable.setParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
|
|
1175
|
+
}
|
|
1176
|
+
for (const statement of this.methods) {
|
|
1177
|
+
statement === null || statement === void 0 ? void 0 : statement.func.symbolTable.setParent(this.symbolTable);
|
|
1178
|
+
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
|
|
1179
|
+
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));
|
|
1180
|
+
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);
|
|
1181
|
+
}
|
|
1182
|
+
for (const statement of this.fields) {
|
|
1183
|
+
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());
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
957
1186
|
transpile(state) {
|
|
958
1187
|
let result = [];
|
|
959
1188
|
//make the builder
|
|
@@ -976,8 +1205,16 @@ class ClassStatement extends Statement {
|
|
|
976
1205
|
}
|
|
977
1206
|
result.push(state.newline);
|
|
978
1207
|
state.blockDepth++;
|
|
979
|
-
|
|
980
|
-
|
|
1208
|
+
let body = this.body;
|
|
1209
|
+
//inject an empty "new" method if missing
|
|
1210
|
+
if (!this.getConstructorFunction()) {
|
|
1211
|
+
body = [
|
|
1212
|
+
(0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
|
|
1213
|
+
...this.body
|
|
1214
|
+
];
|
|
1215
|
+
}
|
|
1216
|
+
for (const member of body) {
|
|
1217
|
+
if ((0, reflection_1.isTypedefProvider)(member)) {
|
|
981
1218
|
result.push(state.indent(), ...member.getTypedef(state), state.newline);
|
|
982
1219
|
}
|
|
983
1220
|
}
|
|
@@ -1004,11 +1241,38 @@ class ClassStatement extends Statement {
|
|
|
1004
1241
|
break;
|
|
1005
1242
|
}
|
|
1006
1243
|
}
|
|
1007
|
-
|
|
1244
|
+
const result = myIndex - 1;
|
|
1245
|
+
if (result >= 0) {
|
|
1246
|
+
return result;
|
|
1247
|
+
}
|
|
1248
|
+
else {
|
|
1249
|
+
return null;
|
|
1250
|
+
}
|
|
1008
1251
|
}
|
|
1009
|
-
|
|
1252
|
+
hasParent() {
|
|
1010
1253
|
return !!this.parentClassName;
|
|
1011
1254
|
}
|
|
1255
|
+
/**
|
|
1256
|
+
* Gets an array of possible parent class names, taking into account the namespace this class was created under
|
|
1257
|
+
* @returns array of possible parent class names
|
|
1258
|
+
*/
|
|
1259
|
+
getPossibleFullParentNames() {
|
|
1260
|
+
var _a;
|
|
1261
|
+
if (!this.hasParent()) {
|
|
1262
|
+
return [];
|
|
1263
|
+
}
|
|
1264
|
+
if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
1265
|
+
// The specified parent class already has a dot, so it must already reference a namespace
|
|
1266
|
+
return [this.parentClassName.getName()];
|
|
1267
|
+
}
|
|
1268
|
+
const names = [];
|
|
1269
|
+
if (this.namespaceName) {
|
|
1270
|
+
// We're under a namespace, so the full parent name MIGHT be with this namespace too
|
|
1271
|
+
names.push(this.namespaceName.getName() + '.' + this.parentClassName.getName());
|
|
1272
|
+
}
|
|
1273
|
+
names.push(this.parentClassName.getName());
|
|
1274
|
+
return names;
|
|
1275
|
+
}
|
|
1012
1276
|
/**
|
|
1013
1277
|
* Get all ancestor classes, in closest-to-furthest order (i.e. 0 is parent, 1 is grandparent, etc...).
|
|
1014
1278
|
* This will return an empty array if no ancestors were found
|
|
@@ -1038,23 +1302,10 @@ class ClassStatement extends Statement {
|
|
|
1038
1302
|
* Get the constructor function for this class (if exists), or undefined if not exist
|
|
1039
1303
|
*/
|
|
1040
1304
|
getConstructorFunction() {
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
return member;
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
getEmptyNewFunction() {
|
|
1050
|
-
let stmt = Parser_1.Parser.parse(`
|
|
1051
|
-
class UtilClass
|
|
1052
|
-
sub new()
|
|
1053
|
-
end sub
|
|
1054
|
-
end class
|
|
1055
|
-
`, { mode: Parser_1.ParseMode.BrighterScript }).statements[0].memberMap.new;
|
|
1056
|
-
//TODO make locations point to 0,0 (might not matter?)
|
|
1057
|
-
return stmt;
|
|
1305
|
+
return this.body.find((stmt) => {
|
|
1306
|
+
var _a, _b;
|
|
1307
|
+
return ((_b = (_a = stmt === null || stmt === void 0 ? void 0 : stmt.name) === null || _a === void 0 ? void 0 : _a.text) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'new';
|
|
1308
|
+
});
|
|
1058
1309
|
}
|
|
1059
1310
|
/**
|
|
1060
1311
|
* Determine if the specified field was declared in one of the ancestor classes
|
|
@@ -1095,19 +1346,22 @@ class ClassStatement extends Statement {
|
|
|
1095
1346
|
}
|
|
1096
1347
|
result.push(state.newline, state.indent());
|
|
1097
1348
|
let parentClassIndex = this.getParentClassIndex(state);
|
|
1098
|
-
|
|
1349
|
+
let body = this.body;
|
|
1350
|
+
//inject an empty "new" method if missing
|
|
1099
1351
|
if (!this.getConstructorFunction()) {
|
|
1100
|
-
|
|
1101
|
-
|
|
1352
|
+
body = [
|
|
1353
|
+
(0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
|
|
1354
|
+
...this.body
|
|
1355
|
+
];
|
|
1102
1356
|
}
|
|
1103
|
-
for (let statement of
|
|
1357
|
+
for (let statement of body) {
|
|
1104
1358
|
//is field statement
|
|
1105
|
-
if (reflection_1.
|
|
1359
|
+
if ((0, reflection_1.isFieldStatement)(statement)) {
|
|
1106
1360
|
//do nothing with class fields in this situation, they are handled elsewhere
|
|
1107
1361
|
continue;
|
|
1108
1362
|
//methods
|
|
1109
1363
|
}
|
|
1110
|
-
else if (reflection_1.
|
|
1364
|
+
else if ((0, reflection_1.isMethodStatement)(statement)) {
|
|
1111
1365
|
//store overridden parent methods as super{parentIndex}_{methodName}
|
|
1112
1366
|
if (
|
|
1113
1367
|
//is override method
|
|
@@ -1175,20 +1429,42 @@ class ClassStatement extends Statement {
|
|
|
1175
1429
|
}
|
|
1176
1430
|
walk(visitor, options) {
|
|
1177
1431
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1178
|
-
|
|
1179
|
-
visitors_1.walk(this.body, i, visitor, options, this);
|
|
1180
|
-
}
|
|
1432
|
+
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1181
1433
|
}
|
|
1182
1434
|
}
|
|
1183
1435
|
}
|
|
1184
1436
|
exports.ClassStatement = ClassStatement;
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1437
|
+
const accessModifiers = [
|
|
1438
|
+
TokenKind_1.TokenKind.Public,
|
|
1439
|
+
TokenKind_1.TokenKind.Protected,
|
|
1440
|
+
TokenKind_1.TokenKind.Private
|
|
1441
|
+
];
|
|
1442
|
+
class MethodStatement extends FunctionStatement {
|
|
1443
|
+
constructor(modifiers, name, func, override) {
|
|
1188
1444
|
super(name, func, undefined);
|
|
1189
|
-
this.accessModifier = accessModifier;
|
|
1190
1445
|
this.override = override;
|
|
1191
|
-
this.
|
|
1446
|
+
this.modifiers = [];
|
|
1447
|
+
if (modifiers) {
|
|
1448
|
+
if (Array.isArray(modifiers)) {
|
|
1449
|
+
this.modifiers.push(...modifiers);
|
|
1450
|
+
}
|
|
1451
|
+
else {
|
|
1452
|
+
this.modifiers.push(modifiers);
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
get accessModifier() {
|
|
1457
|
+
return this.modifiers.find(x => accessModifiers.includes(x.kind));
|
|
1458
|
+
}
|
|
1459
|
+
get range() {
|
|
1460
|
+
return this.cacheRange();
|
|
1461
|
+
}
|
|
1462
|
+
cacheRange() {
|
|
1463
|
+
var _a, _b;
|
|
1464
|
+
if (!this._range) {
|
|
1465
|
+
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;
|
|
1466
|
+
}
|
|
1467
|
+
return this._range;
|
|
1192
1468
|
}
|
|
1193
1469
|
transpile(state) {
|
|
1194
1470
|
if (this.name.text.toLowerCase() === 'new') {
|
|
@@ -1199,10 +1475,10 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1199
1475
|
//TODO - remove type information from these methods because that doesn't work
|
|
1200
1476
|
//convert the `super` calls into the proper methods
|
|
1201
1477
|
const parentClassIndex = state.classStatement.getParentClassIndex(state);
|
|
1202
|
-
const visitor = visitors_1.createVisitor({
|
|
1478
|
+
const visitor = (0, visitors_1.createVisitor)({
|
|
1203
1479
|
VariableExpression: e => {
|
|
1204
1480
|
if (e.name.text.toLocaleLowerCase() === 'super') {
|
|
1205
|
-
e.name
|
|
1481
|
+
state.editor.setProperty(e.name, 'text', `m.super${parentClassIndex}_new`);
|
|
1206
1482
|
}
|
|
1207
1483
|
},
|
|
1208
1484
|
DottedGetExpression: e => {
|
|
@@ -1210,7 +1486,7 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1210
1486
|
const lowerName = beginningVariable === null || beginningVariable === void 0 ? void 0 : beginningVariable.getName(Parser_1.ParseMode.BrighterScript).toLowerCase();
|
|
1211
1487
|
if (lowerName === 'super') {
|
|
1212
1488
|
beginningVariable.name.text = 'm';
|
|
1213
|
-
e.name
|
|
1489
|
+
state.editor.setProperty(e.name, 'text', `super${parentClassIndex}_${e.name.text}`);
|
|
1214
1490
|
}
|
|
1215
1491
|
}
|
|
1216
1492
|
});
|
|
@@ -1249,37 +1525,38 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1249
1525
|
let firstStatement = this.func.body.statements[0];
|
|
1250
1526
|
if (
|
|
1251
1527
|
//is a call statement
|
|
1252
|
-
reflection_1.isExpressionStatement(firstStatement) && reflection_1.isCallExpression(firstStatement.expression) &&
|
|
1528
|
+
(0, reflection_1.isExpressionStatement)(firstStatement) && (0, reflection_1.isCallExpression)(firstStatement.expression) &&
|
|
1253
1529
|
//is a call to super
|
|
1254
1530
|
util_1.util.findBeginningVariableExpression(firstStatement === null || firstStatement === void 0 ? void 0 : firstStatement.expression.callee).name.text.toLowerCase() === 'super') {
|
|
1255
1531
|
return;
|
|
1256
1532
|
}
|
|
1257
1533
|
//this is a child class, and the first statement isn't a call to super. Inject one
|
|
1258
|
-
|
|
1259
|
-
kind:
|
|
1534
|
+
const superCall = new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
|
|
1535
|
+
kind: TokenKind_1.TokenKind.Identifier,
|
|
1260
1536
|
text: 'super',
|
|
1261
1537
|
isReserved: false,
|
|
1262
1538
|
range: state.classStatement.name.range,
|
|
1263
1539
|
leadingWhitespace: ''
|
|
1264
1540
|
}, null), {
|
|
1265
|
-
kind:
|
|
1541
|
+
kind: TokenKind_1.TokenKind.LeftParen,
|
|
1266
1542
|
text: '(',
|
|
1267
1543
|
isReserved: false,
|
|
1268
1544
|
range: state.classStatement.name.range,
|
|
1269
1545
|
leadingWhitespace: ''
|
|
1270
1546
|
}, {
|
|
1271
|
-
kind:
|
|
1547
|
+
kind: TokenKind_1.TokenKind.RightParen,
|
|
1272
1548
|
text: ')',
|
|
1273
1549
|
isReserved: false,
|
|
1274
1550
|
range: state.classStatement.name.range,
|
|
1275
1551
|
leadingWhitespace: ''
|
|
1276
|
-
}, [], null))
|
|
1552
|
+
}, [], null));
|
|
1553
|
+
state.editor.arrayUnshift(this.func.body.statements, superCall);
|
|
1277
1554
|
}
|
|
1278
1555
|
/**
|
|
1279
1556
|
* Inject field initializers at the top of the `new` function (after any present `super()` call)
|
|
1280
1557
|
*/
|
|
1281
1558
|
injectFieldInitializersForConstructor(state) {
|
|
1282
|
-
let startingIndex = state.classStatement.
|
|
1559
|
+
let startingIndex = state.classStatement.hasParent() ? 1 : 0;
|
|
1283
1560
|
let newStatements = [];
|
|
1284
1561
|
//insert the field initializers in order
|
|
1285
1562
|
for (let field of state.classStatement.fields) {
|
|
@@ -1290,21 +1567,21 @@ class ClassMethodStatement extends FunctionStatement {
|
|
|
1290
1567
|
}
|
|
1291
1568
|
else {
|
|
1292
1569
|
//if there is no initial value, set the initial value to `invalid`
|
|
1293
|
-
newStatements.push(new AssignmentStatement(thisQualifiedName, creators_1.createToken(
|
|
1570
|
+
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
1571
|
}
|
|
1295
1572
|
}
|
|
1296
|
-
this.func.body.statements
|
|
1573
|
+
state.editor.arraySplice(this.func.body.statements, startingIndex, 0, ...newStatements);
|
|
1297
1574
|
}
|
|
1298
1575
|
walk(visitor, options) {
|
|
1299
1576
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1300
|
-
visitors_1.walk(this, 'func', visitor, options);
|
|
1577
|
+
(0, visitors_1.walk)(this, 'func', visitor, options);
|
|
1301
1578
|
}
|
|
1302
1579
|
}
|
|
1303
1580
|
}
|
|
1304
|
-
exports.
|
|
1305
|
-
class
|
|
1306
|
-
constructor(accessModifier, name, as, type, equal, initialValue) {
|
|
1307
|
-
var _a
|
|
1581
|
+
exports.MethodStatement = MethodStatement;
|
|
1582
|
+
class FieldStatement extends Statement {
|
|
1583
|
+
constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
|
|
1584
|
+
var _a;
|
|
1308
1585
|
super();
|
|
1309
1586
|
this.accessModifier = accessModifier;
|
|
1310
1587
|
this.name = name;
|
|
@@ -1312,17 +1589,18 @@ class ClassFieldStatement extends Statement {
|
|
|
1312
1589
|
this.type = type;
|
|
1313
1590
|
this.equal = equal;
|
|
1314
1591
|
this.initialValue = initialValue;
|
|
1315
|
-
this.
|
|
1592
|
+
this.namespaceName = namespaceName;
|
|
1593
|
+
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
1594
|
}
|
|
1317
1595
|
/**
|
|
1318
1596
|
* Derive a ValueKind from the type token, or the initial value.
|
|
1319
1597
|
* Defaults to `DynamicType`
|
|
1320
1598
|
*/
|
|
1321
|
-
getType() {
|
|
1599
|
+
getType(parseMode = Parser_1.ParseMode.BrighterScript) {
|
|
1322
1600
|
if (this.type) {
|
|
1323
|
-
return
|
|
1601
|
+
return this.type.type;
|
|
1324
1602
|
}
|
|
1325
|
-
else if (reflection_1.isLiteralExpression(this.initialValue)) {
|
|
1603
|
+
else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
|
|
1326
1604
|
return this.initialValue.type;
|
|
1327
1605
|
}
|
|
1328
1606
|
else {
|
|
@@ -1339,8 +1617,8 @@ class ClassFieldStatement extends Statement {
|
|
|
1339
1617
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1340
1618
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1341
1619
|
}
|
|
1342
|
-
let type = this.getType();
|
|
1343
|
-
if (reflection_1.isInvalidType(type) || reflection_1.isVoidType(type)) {
|
|
1620
|
+
let type = this.getType(Parser_1.ParseMode.BrightScript);
|
|
1621
|
+
if (!type || (0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
|
|
1344
1622
|
type = new DynamicType_1.DynamicType();
|
|
1345
1623
|
}
|
|
1346
1624
|
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 +1626,77 @@ class ClassFieldStatement extends Statement {
|
|
|
1348
1626
|
return result;
|
|
1349
1627
|
}
|
|
1350
1628
|
walk(visitor, options) {
|
|
1351
|
-
if (
|
|
1352
|
-
visitors_1.walk(this, '
|
|
1629
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1630
|
+
(0, visitors_1.walk)(this, 'type', visitor, options);
|
|
1631
|
+
(0, visitors_1.walk)(this, 'initialValue', visitor, options);
|
|
1353
1632
|
}
|
|
1354
1633
|
}
|
|
1355
1634
|
}
|
|
1356
|
-
exports.
|
|
1635
|
+
exports.FieldStatement = FieldStatement;
|
|
1357
1636
|
class TryCatchStatement extends Statement {
|
|
1358
|
-
constructor(
|
|
1637
|
+
constructor(tokens, tryBranch, catchStatement) {
|
|
1638
|
+
var _a;
|
|
1359
1639
|
super();
|
|
1360
|
-
this.
|
|
1640
|
+
this.tokens = tokens;
|
|
1361
1641
|
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);
|
|
1642
|
+
this.catchStatement = catchStatement;
|
|
1643
|
+
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
1644
|
}
|
|
1371
1645
|
transpile(state) {
|
|
1646
|
+
var _a, _b;
|
|
1372
1647
|
return [
|
|
1373
|
-
state.transpileToken(this.
|
|
1648
|
+
state.transpileToken(this.tokens.try),
|
|
1374
1649
|
...this.tryBranch.transpile(state),
|
|
1375
1650
|
state.newline,
|
|
1376
1651
|
state.indent(),
|
|
1377
|
-
|
|
1378
|
-
' ',
|
|
1379
|
-
state.transpileToken(this.exceptionVariable),
|
|
1380
|
-
...this.catchBranch.transpile(state),
|
|
1652
|
+
...((_b = (_a = this.catchStatement) === null || _a === void 0 ? void 0 : _a.transpile(state)) !== null && _b !== void 0 ? _b : ['catch']),
|
|
1381
1653
|
state.newline,
|
|
1382
1654
|
state.indent(),
|
|
1383
|
-
state.transpileToken(this.
|
|
1655
|
+
state.transpileToken(this.tokens.endTry)
|
|
1384
1656
|
];
|
|
1385
1657
|
}
|
|
1386
1658
|
walk(visitor, options) {
|
|
1387
1659
|
if (this.tryBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1388
|
-
visitors_1.walk(this, 'tryBranch', visitor, options);
|
|
1389
|
-
visitors_1.walk(this, '
|
|
1660
|
+
(0, visitors_1.walk)(this, 'tryBranch', visitor, options);
|
|
1661
|
+
(0, visitors_1.walk)(this, 'catchStatement', visitor, options);
|
|
1390
1662
|
}
|
|
1391
1663
|
}
|
|
1392
1664
|
}
|
|
1393
1665
|
exports.TryCatchStatement = TryCatchStatement;
|
|
1666
|
+
class CatchStatement extends Statement {
|
|
1667
|
+
constructor(tokens, exceptionVariable, catchBranch) {
|
|
1668
|
+
super();
|
|
1669
|
+
this.tokens = tokens;
|
|
1670
|
+
this.exceptionVariable = exceptionVariable;
|
|
1671
|
+
this.catchBranch = catchBranch;
|
|
1672
|
+
}
|
|
1673
|
+
get range() {
|
|
1674
|
+
var _a, _b;
|
|
1675
|
+
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);
|
|
1676
|
+
}
|
|
1677
|
+
transpile(state) {
|
|
1678
|
+
var _a, _b, _c, _d;
|
|
1679
|
+
return [
|
|
1680
|
+
state.transpileToken(this.tokens.catch),
|
|
1681
|
+
' ',
|
|
1682
|
+
(_b = (_a = this.exceptionVariable) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'e',
|
|
1683
|
+
...((_d = (_c = this.catchBranch) === null || _c === void 0 ? void 0 : _c.transpile(state)) !== null && _d !== void 0 ? _d : [])
|
|
1684
|
+
];
|
|
1685
|
+
}
|
|
1686
|
+
walk(visitor, options) {
|
|
1687
|
+
if (this.catchBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1688
|
+
(0, visitors_1.walk)(this, 'catchBranch', visitor, options);
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
exports.CatchStatement = CatchStatement;
|
|
1394
1693
|
class ThrowStatement extends Statement {
|
|
1395
1694
|
constructor(throwToken, expression) {
|
|
1396
1695
|
var _a;
|
|
1397
1696
|
super();
|
|
1398
1697
|
this.throwToken = throwToken;
|
|
1399
1698
|
this.expression = expression;
|
|
1400
|
-
this.range = util_1.util.
|
|
1699
|
+
this.range = (_a = util_1.util.createBoundingRange(this.throwToken, this.expression)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1401
1700
|
}
|
|
1402
1701
|
transpile(state) {
|
|
1403
1702
|
const result = [
|
|
@@ -1416,9 +1715,165 @@ class ThrowStatement extends Statement {
|
|
|
1416
1715
|
}
|
|
1417
1716
|
walk(visitor, options) {
|
|
1418
1717
|
if (this.expression && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1419
|
-
visitors_1.walk(this, 'expression', visitor, options);
|
|
1718
|
+
(0, visitors_1.walk)(this, 'expression', visitor, options);
|
|
1420
1719
|
}
|
|
1421
1720
|
}
|
|
1422
1721
|
}
|
|
1423
1722
|
exports.ThrowStatement = ThrowStatement;
|
|
1723
|
+
class EnumStatement extends Statement {
|
|
1724
|
+
constructor(tokens, body, namespaceName) {
|
|
1725
|
+
var _a, _b;
|
|
1726
|
+
super();
|
|
1727
|
+
this.tokens = tokens;
|
|
1728
|
+
this.body = body;
|
|
1729
|
+
this.namespaceName = namespaceName;
|
|
1730
|
+
this.symbolTable = new SymbolTable_1.SymbolTable();
|
|
1731
|
+
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;
|
|
1732
|
+
this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
|
|
1733
|
+
}
|
|
1734
|
+
getMembers() {
|
|
1735
|
+
const result = [];
|
|
1736
|
+
for (const statement of this.body) {
|
|
1737
|
+
if ((0, reflection_1.isEnumMemberStatement)(statement)) {
|
|
1738
|
+
result.push(statement);
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
return result;
|
|
1742
|
+
}
|
|
1743
|
+
/**
|
|
1744
|
+
* Get a map of member names and their values.
|
|
1745
|
+
* All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
|
|
1746
|
+
*/
|
|
1747
|
+
getMemberValueMap() {
|
|
1748
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
1749
|
+
const result = new Map();
|
|
1750
|
+
const members = this.getMembers();
|
|
1751
|
+
let currentIntValue = 0;
|
|
1752
|
+
for (const member of members) {
|
|
1753
|
+
//if there is no value, assume an integer and increment the int counter
|
|
1754
|
+
if (!member.value) {
|
|
1755
|
+
result.set((_a = member.name) === null || _a === void 0 ? void 0 : _a.toLowerCase(), currentIntValue.toString());
|
|
1756
|
+
currentIntValue++;
|
|
1757
|
+
//if explicit integer value, use it and increment the int counter
|
|
1758
|
+
}
|
|
1759
|
+
else if ((0, reflection_1.isLiteralExpression)(member.value) && member.value.token.kind === TokenKind_1.TokenKind.IntegerLiteral) {
|
|
1760
|
+
//try parsing as integer literal, then as hex integer literal.
|
|
1761
|
+
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'));
|
|
1762
|
+
if (tokenIntValue !== undefined) {
|
|
1763
|
+
currentIntValue = tokenIntValue;
|
|
1764
|
+
currentIntValue++;
|
|
1765
|
+
}
|
|
1766
|
+
result.set((_c = member.name) === null || _c === void 0 ? void 0 : _c.toLowerCase(), member.value.token.text);
|
|
1767
|
+
//all other values
|
|
1768
|
+
}
|
|
1769
|
+
else {
|
|
1770
|
+
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');
|
|
1771
|
+
}
|
|
1772
|
+
}
|
|
1773
|
+
return result;
|
|
1774
|
+
}
|
|
1775
|
+
getMemberValue(name) {
|
|
1776
|
+
return this.getMemberValueMap().get(name.toLowerCase());
|
|
1777
|
+
}
|
|
1778
|
+
buildSymbolTable() {
|
|
1779
|
+
this.symbolTable.clear();
|
|
1780
|
+
for (const member of this.getMembers()) {
|
|
1781
|
+
this.symbolTable.addSymbol(member === null || member === void 0 ? void 0 : member.name, member === null || member === void 0 ? void 0 : member.range, new EnumType_1.EnumMemberType(this.fullName, member === null || member === void 0 ? void 0 : member.name));
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
/**
|
|
1785
|
+
* The name of the enum (without the namespace prefix)
|
|
1786
|
+
*/
|
|
1787
|
+
get name() {
|
|
1788
|
+
var _a;
|
|
1789
|
+
return (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1790
|
+
}
|
|
1791
|
+
/**
|
|
1792
|
+
* The name of the enum WITH its leading namespace (if applicable)
|
|
1793
|
+
*/
|
|
1794
|
+
get fullName() {
|
|
1795
|
+
var _a;
|
|
1796
|
+
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1797
|
+
if (name) {
|
|
1798
|
+
if (this.namespaceName) {
|
|
1799
|
+
let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
|
|
1800
|
+
return `${namespaceName}.${name}`;
|
|
1801
|
+
}
|
|
1802
|
+
else {
|
|
1803
|
+
return name;
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
else {
|
|
1807
|
+
//return undefined which will allow outside callers to know that this doesn't have a name
|
|
1808
|
+
return undefined;
|
|
1809
|
+
}
|
|
1810
|
+
}
|
|
1811
|
+
getThisBscType() {
|
|
1812
|
+
return new EnumType_1.EnumType(this.fullName, this.symbolTable);
|
|
1813
|
+
}
|
|
1814
|
+
transpile(state) {
|
|
1815
|
+
//enum declarations do not exist at runtime, so don't transpile anything...
|
|
1816
|
+
return [];
|
|
1817
|
+
}
|
|
1818
|
+
getTypedef(state) {
|
|
1819
|
+
var _a, _b, _c;
|
|
1820
|
+
const result = [];
|
|
1821
|
+
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1822
|
+
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1823
|
+
}
|
|
1824
|
+
result.push((_b = this.tokens.enum.text) !== null && _b !== void 0 ? _b : 'enum', ' ', this.tokens.name.text);
|
|
1825
|
+
result.push(state.newline);
|
|
1826
|
+
state.blockDepth++;
|
|
1827
|
+
for (const member of this.body) {
|
|
1828
|
+
if ((0, reflection_1.isTypedefProvider)(member)) {
|
|
1829
|
+
result.push(state.indent(), ...member.getTypedef(state), state.newline);
|
|
1830
|
+
}
|
|
1831
|
+
}
|
|
1832
|
+
state.blockDepth--;
|
|
1833
|
+
result.push(state.indent(), (_c = this.tokens.endEnum.text) !== null && _c !== void 0 ? _c : 'end enum');
|
|
1834
|
+
return result;
|
|
1835
|
+
}
|
|
1836
|
+
walk(visitor, options) {
|
|
1837
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1838
|
+
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1839
|
+
}
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
exports.EnumStatement = EnumStatement;
|
|
1843
|
+
class EnumMemberStatement extends Statement {
|
|
1844
|
+
constructor(tokens, value) {
|
|
1845
|
+
var _a;
|
|
1846
|
+
super();
|
|
1847
|
+
this.tokens = tokens;
|
|
1848
|
+
this.value = value;
|
|
1849
|
+
this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
|
|
1850
|
+
}
|
|
1851
|
+
/**
|
|
1852
|
+
* The name of the member
|
|
1853
|
+
*/
|
|
1854
|
+
get name() {
|
|
1855
|
+
return this.tokens.name.text;
|
|
1856
|
+
}
|
|
1857
|
+
transpile(state) {
|
|
1858
|
+
return [];
|
|
1859
|
+
}
|
|
1860
|
+
getTypedef(state) {
|
|
1861
|
+
const result = [
|
|
1862
|
+
this.tokens.name.text
|
|
1863
|
+
];
|
|
1864
|
+
if (this.tokens.equal) {
|
|
1865
|
+
result.push(' ', this.tokens.equal.text, ' ');
|
|
1866
|
+
if (this.value) {
|
|
1867
|
+
result.push(...this.value.transpile(state));
|
|
1868
|
+
}
|
|
1869
|
+
}
|
|
1870
|
+
return result;
|
|
1871
|
+
}
|
|
1872
|
+
walk(visitor, options) {
|
|
1873
|
+
if (this.value && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1874
|
+
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
exports.EnumMemberStatement = EnumMemberStatement;
|
|
1424
1879
|
//# sourceMappingURL=Statement.js.map
|