brighterscript 1.0.0-alpha.24 → 1.0.0-alpha.25
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 +493 -233
- package/README.md +45 -139
- package/bsconfig.schema.json +41 -0
- package/dist/ActionPipeline.d.ts +10 -0
- package/dist/ActionPipeline.js +40 -0
- package/dist/ActionPipeline.js.map +1 -0
- package/dist/AstValidationSegmenter.d.ts +25 -0
- package/dist/AstValidationSegmenter.js +152 -0
- package/dist/AstValidationSegmenter.js.map +1 -0
- package/dist/BsConfig.d.ts +39 -4
- package/dist/BusyStatusTracker.d.ts +31 -0
- package/dist/BusyStatusTracker.js +83 -0
- package/dist/BusyStatusTracker.js.map +1 -0
- package/dist/Cache.js +3 -3
- package/dist/Cache.js.map +1 -1
- package/dist/CacheVerifier.d.ts +7 -0
- package/dist/CacheVerifier.js +20 -0
- package/dist/CacheVerifier.js.map +1 -0
- package/dist/CodeActionUtil.d.ts +3 -3
- package/dist/CodeActionUtil.js.map +1 -1
- package/dist/CommentFlagProcessor.d.ts +3 -2
- package/dist/CommentFlagProcessor.js +5 -4
- package/dist/CommentFlagProcessor.js.map +1 -1
- package/dist/DependencyGraph.d.ts +3 -2
- package/dist/DependencyGraph.js +11 -10
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticCollection.js +9 -5
- package/dist/DiagnosticCollection.js.map +1 -1
- package/dist/DiagnosticFilterer.d.ts +1 -0
- package/dist/DiagnosticFilterer.js +5 -3
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +61 -13
- package/dist/DiagnosticMessages.js +116 -19
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/DiagnosticSeverityAdjuster.d.ts +7 -0
- package/dist/DiagnosticSeverityAdjuster.js +41 -0
- package/dist/DiagnosticSeverityAdjuster.js.map +1 -0
- package/dist/FunctionScope.d.ts +28 -0
- package/dist/FunctionScope.js +52 -0
- package/dist/FunctionScope.js.map +1 -0
- package/dist/KeyedThrottler.d.ts +3 -3
- package/dist/KeyedThrottler.js +3 -3
- package/dist/KeyedThrottler.js.map +1 -1
- package/dist/LanguageServer.d.ts +23 -11
- package/dist/LanguageServer.js +150 -69
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +3 -2
- package/dist/Logger.js +11 -3
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.d.ts +21 -3
- package/dist/PluginInterface.js +74 -6
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +158 -79
- package/dist/Program.js +831 -695
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +22 -12
- package/dist/ProgramBuilder.js +130 -103
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +87 -133
- package/dist/Scope.js +450 -510
- package/dist/Scope.js.map +1 -1
- package/dist/Stopwatch.js +1 -1
- package/dist/Stopwatch.js.map +1 -1
- package/dist/SymbolTable.d.ts +89 -34
- package/dist/SymbolTable.js +239 -114
- package/dist/SymbolTable.js.map +1 -1
- package/dist/Throttler.d.ts +12 -0
- package/dist/Throttler.js +39 -0
- package/dist/Throttler.js.map +1 -1
- package/dist/Watcher.d.ts +0 -3
- package/dist/Watcher.js +0 -3
- package/dist/Watcher.js.map +1 -1
- package/dist/XmlScope.d.ts +4 -6
- package/dist/XmlScope.js +74 -69
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/CachedLookups.d.ts +48 -0
- package/dist/astUtils/CachedLookups.js +323 -0
- package/dist/astUtils/CachedLookups.js.map +1 -0
- package/dist/astUtils/{AstEditor.d.ts → Editor.d.ts} +9 -5
- package/dist/astUtils/{AstEditor.js → Editor.js} +10 -4
- package/dist/astUtils/Editor.js.map +1 -0
- package/dist/astUtils/{AstEditor.spec.js → Editor.spec.js} +68 -64
- package/dist/astUtils/Editor.spec.js.map +1 -0
- package/dist/astUtils/creators.d.ts +10 -10
- package/dist/astUtils/creators.js +26 -16
- package/dist/astUtils/creators.js.map +1 -1
- package/dist/astUtils/creators.spec.js +5 -5
- package/dist/astUtils/creators.spec.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +132 -104
- package/dist/astUtils/reflection.js +220 -174
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +208 -126
- package/dist/astUtils/reflection.spec.js.map +1 -1
- package/dist/astUtils/stackedVisitor.spec.js +12 -12
- package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +53 -35
- package/dist/astUtils/visitors.js +29 -3
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +178 -33
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/astUtils/xml.d.ts +9 -9
- package/dist/astUtils/xml.js +9 -9
- package/dist/astUtils/xml.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +10 -2
- package/dist/bscPlugin/BscPlugin.js +33 -3
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
- package/dist/bscPlugin/CallExpressionInfo.js +131 -0
- package/dist/bscPlugin/CallExpressionInfo.js.map +1 -0
- package/dist/bscPlugin/FileWriter.d.ts +6 -0
- package/dist/bscPlugin/FileWriter.js +24 -0
- package/dist/bscPlugin/FileWriter.js.map +1 -0
- package/dist/bscPlugin/SignatureHelpUtil.d.ts +10 -0
- package/dist/bscPlugin/SignatureHelpUtil.js +135 -0
- package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +14 -11
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +16 -16
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +52 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.js +517 -26
- package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +1909 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
- package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
- package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.d.ts +7 -7
- package/dist/bscPlugin/hover/HoverProcessor.js +123 -125
- package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
- package/dist/bscPlugin/hover/HoverProcessor.spec.js +371 -53
- package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +2 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +85 -23
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +83 -6
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/serialize/BslibInjector.spec.js +19 -0
- package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
- package/dist/bscPlugin/serialize/BslibManager.d.ts +9 -0
- package/dist/bscPlugin/serialize/BslibManager.js +40 -0
- package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
- package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
- package/dist/bscPlugin/serialize/FileSerializer.js +72 -0
- package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
- package/dist/bscPlugin/transpile/{BrsFilePreTranspileProcessor.d.ts → BrsFileTranspileProcessor.d.ts} +4 -2
- package/dist/bscPlugin/transpile/{BrsFilePreTranspileProcessor.js → BrsFileTranspileProcessor.js} +33 -9
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +41 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
- package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
- package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +13 -5
- package/dist/bscPlugin/validation/BrsFileValidator.js +259 -49
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
- package/dist/bscPlugin/validation/BrsFileValidator.spec.js +230 -14
- package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -1
- package/dist/bscPlugin/validation/ProgramValidator.d.ts +10 -0
- package/dist/bscPlugin/validation/ProgramValidator.js +32 -0
- package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +54 -27
- package/dist/bscPlugin/validation/ScopeValidator.js +483 -286
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
- package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.spec.js +2454 -0
- package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
- package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js +44 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
- package/dist/cli.js +104 -13
- package/dist/cli.js.map +1 -1
- package/dist/deferred.d.ts +3 -3
- package/dist/deferred.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +8 -2
- package/dist/diagnosticUtils.js +47 -17
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/examples/plugins/removePrint.js +8 -10
- package/dist/examples/plugins/removePrint.js.map +1 -1
- package/dist/files/AssetFile.d.ts +26 -0
- package/dist/files/AssetFile.js +26 -0
- package/dist/files/AssetFile.js.map +1 -0
- package/dist/files/BrsFile.Class.spec.js +523 -493
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +112 -111
- package/dist/files/BrsFile.js +741 -1032
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +1728 -1232
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/BscFile.d.ts +104 -0
- package/dist/files/BscFile.js +16 -0
- package/dist/files/BscFile.js.map +1 -0
- package/dist/files/Factory.d.ts +25 -0
- package/dist/files/Factory.js +22 -0
- package/dist/files/Factory.js.map +1 -0
- package/dist/files/LazyFileData.d.ts +20 -0
- package/dist/files/LazyFileData.js +54 -0
- package/dist/files/LazyFileData.js.map +1 -0
- package/dist/files/LazyFileData.spec.d.ts +1 -0
- package/dist/files/LazyFileData.spec.js +27 -0
- package/dist/files/LazyFileData.spec.js.map +1 -0
- package/dist/files/XmlFile.d.ts +70 -32
- package/dist/files/XmlFile.js +106 -118
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +325 -262
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +48 -40
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/files/tests/optionalChaning.spec.js +84 -24
- package/dist/files/tests/optionalChaning.spec.js.map +1 -1
- package/dist/globalCallables.js +16 -21
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +389 -161
- package/dist/interfaces.js +27 -0
- package/dist/interfaces.js.map +1 -1
- package/dist/lexer/Character.spec.js +5 -5
- package/dist/lexer/Character.spec.js.map +1 -1
- package/dist/lexer/Lexer.d.ts +12 -5
- package/dist/lexer/Lexer.js +28 -13
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +181 -135
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/Token.d.ts +9 -1
- package/dist/lexer/Token.js +9 -1
- package/dist/lexer/Token.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +8 -0
- package/dist/lexer/TokenKind.js +24 -4
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/AstNode.d.ts +162 -0
- package/dist/parser/AstNode.js +225 -0
- package/dist/parser/AstNode.js.map +1 -0
- package/dist/parser/AstNode.spec.d.ts +1 -0
- package/dist/parser/AstNode.spec.js +165 -0
- package/dist/parser/AstNode.spec.js.map +1 -0
- package/dist/parser/BrsTranspileState.d.ts +4 -7
- package/dist/parser/BrsTranspileState.js +4 -12
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +126 -176
- package/dist/parser/Expression.js +523 -405
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +151 -145
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +43 -201
- package/dist/parser/Parser.js +446 -962
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.d.ts +3 -1
- package/dist/parser/Parser.spec.js +1002 -846
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGParser.d.ts +9 -8
- package/dist/parser/SGParser.js +10 -8
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +27 -38
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +98 -35
- package/dist/parser/SGTypes.js +169 -99
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/Statement.d.ts +183 -131
- package/dist/parser/Statement.js +549 -387
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +45 -21
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/TranspileState.d.ts +1 -1
- package/dist/parser/TranspileState.js +7 -12
- package/dist/parser/TranspileState.js.map +1 -1
- package/dist/parser/tests/Parser.spec.js +3 -2
- package/dist/parser/tests/Parser.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/For.spec.js +33 -23
- package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/ForEach.spec.js +25 -20
- package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/If.spec.js +96 -94
- package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/While.spec.js +22 -16
- package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
- package/dist/parser/tests/expression/Additive.spec.js +8 -8
- package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
- package/dist/parser/tests/expression/ArrayLiterals.spec.js +58 -21
- package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +61 -20
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/Boolean.spec.js +8 -8
- package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
- package/dist/parser/tests/expression/Call.spec.js +129 -21
- package/dist/parser/tests/expression/Call.spec.js.map +1 -1
- package/dist/parser/tests/expression/Exponential.spec.js +5 -5
- package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
- package/dist/parser/tests/expression/Function.spec.js +36 -36
- package/dist/parser/tests/expression/Function.spec.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +67 -22
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/dist/parser/tests/expression/Multiplicative.spec.js +9 -9
- package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +59 -59
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/PrefixUnary.spec.js +12 -12
- package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
- package/dist/parser/tests/expression/Primary.spec.js +12 -12
- package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +10 -10
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/Relational.spec.js +13 -13
- package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +24 -24
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +96 -57
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +89 -89
- package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
- package/dist/parser/tests/expression/TypeExpression.spec.js +127 -0
- package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
- package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +1 -0
- package/dist/parser/tests/expression/UnaryExpression.spec.js +52 -0
- package/dist/parser/tests/expression/UnaryExpression.spec.js.map +1 -0
- package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
- package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
- package/dist/parser/tests/statement/ConstStatement.spec.js +82 -33
- package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Continue.spec.js +119 -0
- package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
- package/dist/parser/tests/statement/Declaration.spec.js +19 -19
- package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
- package/dist/parser/tests/statement/Dim.spec.js +22 -22
- package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.js +98 -302
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
- package/dist/parser/tests/statement/For.spec.js +9 -10
- package/dist/parser/tests/statement/For.spec.js.map +1 -1
- package/dist/parser/tests/statement/ForEach.spec.js +8 -9
- package/dist/parser/tests/statement/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/statement/Function.spec.js +44 -35
- package/dist/parser/tests/statement/Function.spec.js.map +1 -1
- package/dist/parser/tests/statement/Goto.spec.js +5 -5
- package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
- package/dist/parser/tests/statement/Increment.spec.js +20 -20
- package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +30 -196
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/LibraryStatement.spec.js +11 -11
- package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Misc.spec.js +16 -78
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +35 -33
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/ReturnStatement.spec.js +14 -12
- package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Set.spec.js +48 -35
- package/dist/parser/tests/statement/Set.spec.js.map +1 -1
- package/dist/parser/tests/statement/Stop.spec.js +6 -6
- package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
- package/dist/parser/tests/statement/Throw.spec.js +6 -6
- package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
- package/dist/parser/tests/statement/TryCatch.spec.js +18 -16
- package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
- package/dist/preprocessor/Manifest.d.ts +1 -1
- package/dist/preprocessor/Manifest.js +2 -2
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/preprocessor/Manifest.spec.js +8 -8
- package/dist/preprocessor/Manifest.spec.js.map +1 -1
- package/dist/preprocessor/Preprocessor.d.ts +5 -6
- package/dist/preprocessor/Preprocessor.js +5 -5
- package/dist/preprocessor/Preprocessor.js.map +1 -1
- package/dist/preprocessor/Preprocessor.spec.js +25 -25
- package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
- package/dist/preprocessor/PreprocessorParser.d.ts +1 -1
- package/dist/preprocessor/PreprocessorParser.js +7 -1
- package/dist/preprocessor/PreprocessorParser.js.map +1 -1
- package/dist/preprocessor/PreprocessorParser.spec.js +13 -13
- package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
- package/dist/roku-types/data.json +5892 -10081
- package/dist/roku-types/index.d.ts +622 -1719
- package/dist/types/ArrayType.d.ts +10 -9
- package/dist/types/ArrayType.js +65 -60
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +36 -68
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/AssociativeArrayType.d.ts +11 -0
- package/dist/types/AssociativeArrayType.js +52 -0
- package/dist/types/AssociativeArrayType.js.map +1 -0
- package/dist/types/BaseFunctionType.d.ts +9 -0
- package/dist/types/BaseFunctionType.js +25 -0
- package/dist/types/BaseFunctionType.js.map +1 -0
- package/dist/types/BooleanType.d.ts +8 -5
- package/dist/types/BooleanType.js +14 -7
- package/dist/types/BooleanType.js.map +1 -1
- package/dist/types/BooleanType.spec.js +10 -6
- package/dist/types/BooleanType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +32 -21
- package/dist/types/BscType.js +118 -21
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/BscTypeKind.d.ts +25 -0
- package/dist/types/BscTypeKind.js +30 -0
- package/dist/types/BscTypeKind.js.map +1 -0
- package/dist/types/BuiltInInterfaceAdder.d.ts +23 -0
- package/dist/types/BuiltInInterfaceAdder.js +164 -0
- package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
- package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
- package/dist/types/BuiltInInterfaceAdder.spec.js +116 -0
- package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
- package/dist/types/ClassType.d.ts +17 -0
- package/dist/types/ClassType.js +58 -0
- package/dist/types/ClassType.js.map +1 -0
- package/dist/types/ClassType.spec.d.ts +1 -0
- package/dist/types/ClassType.spec.js +77 -0
- package/dist/types/ClassType.spec.js.map +1 -0
- package/dist/types/ComponentType.d.ts +26 -0
- package/dist/types/ComponentType.js +83 -0
- package/dist/types/ComponentType.js.map +1 -0
- package/dist/types/DoubleType.d.ts +8 -5
- package/dist/types/DoubleType.js +18 -16
- package/dist/types/DoubleType.js.map +1 -1
- package/dist/types/DoubleType.spec.js +12 -6
- package/dist/types/DoubleType.spec.js.map +1 -1
- package/dist/types/DynamicType.d.ts +9 -5
- package/dist/types/DynamicType.js +15 -4
- package/dist/types/DynamicType.js.map +1 -1
- package/dist/types/DynamicType.spec.js +16 -5
- package/dist/types/DynamicType.spec.js.map +1 -1
- package/dist/types/EnumType.d.ts +30 -12
- package/dist/types/EnumType.js +43 -17
- package/dist/types/EnumType.js.map +1 -1
- package/dist/types/EnumType.spec.d.ts +1 -0
- package/dist/types/EnumType.spec.js +33 -0
- package/dist/types/EnumType.spec.js.map +1 -0
- package/dist/types/FloatType.d.ts +8 -5
- package/dist/types/FloatType.js +18 -16
- package/dist/types/FloatType.js.map +1 -1
- package/dist/types/FloatType.spec.js +4 -6
- package/dist/types/FloatType.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +13 -8
- package/dist/types/FunctionType.js +30 -14
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/InheritableType.d.ts +28 -0
- package/dist/types/InheritableType.js +152 -0
- package/dist/types/InheritableType.js.map +1 -0
- package/dist/types/IntegerType.d.ts +8 -5
- package/dist/types/IntegerType.js +18 -16
- package/dist/types/IntegerType.js.map +1 -1
- package/dist/types/IntegerType.spec.js +8 -6
- package/dist/types/IntegerType.spec.js.map +1 -1
- package/dist/types/InterfaceType.d.ts +12 -13
- package/dist/types/InterfaceType.js +20 -48
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/InterfaceType.spec.js +90 -56
- package/dist/types/InterfaceType.spec.js.map +1 -1
- package/dist/types/InvalidType.d.ts +7 -5
- package/dist/types/InvalidType.js +13 -7
- package/dist/types/InvalidType.js.map +1 -1
- package/dist/types/InvalidType.spec.js +8 -6
- package/dist/types/InvalidType.spec.js.map +1 -1
- package/dist/types/LongIntegerType.d.ts +8 -5
- package/dist/types/LongIntegerType.js +17 -15
- package/dist/types/LongIntegerType.js.map +1 -1
- package/dist/types/LongIntegerType.spec.js +10 -6
- package/dist/types/LongIntegerType.spec.js.map +1 -1
- package/dist/types/NamespaceType.d.ts +12 -0
- package/dist/types/NamespaceType.js +28 -0
- package/dist/types/NamespaceType.js.map +1 -0
- package/dist/types/ObjectType.d.ts +9 -8
- package/dist/types/ObjectType.js +21 -11
- package/dist/types/ObjectType.js.map +1 -1
- package/dist/types/ObjectType.spec.js +3 -3
- package/dist/types/ObjectType.spec.js.map +1 -1
- package/dist/types/ReferenceType.d.ts +63 -0
- package/dist/types/ReferenceType.js +423 -0
- package/dist/types/ReferenceType.js.map +1 -0
- package/dist/types/ReferenceType.spec.d.ts +1 -0
- package/dist/types/ReferenceType.spec.js +137 -0
- package/dist/types/ReferenceType.spec.js.map +1 -0
- package/dist/types/StringType.d.ts +11 -5
- package/dist/types/StringType.js +18 -7
- package/dist/types/StringType.js.map +1 -1
- package/dist/types/StringType.spec.js +3 -5
- package/dist/types/StringType.spec.js.map +1 -1
- package/dist/types/TypedFunctionType.d.ts +22 -17
- package/dist/types/TypedFunctionType.js +78 -60
- package/dist/types/TypedFunctionType.js.map +1 -1
- package/dist/types/TypedFunctionType.spec.js +105 -20
- package/dist/types/TypedFunctionType.spec.js.map +1 -1
- package/dist/types/UninitializedType.d.ts +8 -6
- package/dist/types/UninitializedType.js +13 -7
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/UnionType.d.ts +20 -0
- package/dist/types/UnionType.js +123 -0
- package/dist/types/UnionType.js.map +1 -0
- package/dist/types/UnionType.spec.d.ts +1 -0
- package/dist/types/UnionType.spec.js +130 -0
- package/dist/types/UnionType.spec.js.map +1 -0
- package/dist/types/VoidType.d.ts +8 -5
- package/dist/types/VoidType.js +14 -7
- package/dist/types/VoidType.js.map +1 -1
- package/dist/types/VoidType.spec.js +3 -3
- package/dist/types/VoidType.spec.js.map +1 -1
- package/dist/types/helper.spec.d.ts +1 -0
- package/dist/types/helper.spec.js +145 -0
- package/dist/types/helper.spec.js.map +1 -0
- package/dist/types/helpers.d.ts +19 -37
- package/dist/types/helpers.js +159 -99
- package/dist/types/helpers.js.map +1 -1
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.js +39 -0
- package/dist/types/index.js.map +1 -0
- package/dist/util.d.ts +132 -137
- package/dist/util.js +796 -362
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +8 -25
- package/dist/validators/ClassValidator.js +96 -176
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +165 -152
- package/dist/astUtils/AstEditor.js.map +0 -1
- package/dist/astUtils/AstEditor.spec.js.map +0 -1
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +0 -1
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +0 -32
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +0 -1
- package/dist/parser/SGTypes.spec.js +0 -351
- package/dist/parser/SGTypes.spec.js.map +0 -1
- package/dist/types/CustomType.d.ts +0 -12
- package/dist/types/CustomType.js +0 -44
- package/dist/types/CustomType.js.map +0 -1
- package/dist/types/LazyType.d.ts +0 -16
- package/dist/types/LazyType.js +0 -44
- package/dist/types/LazyType.js.map +0 -1
- /package/dist/astUtils/{AstEditor.spec.d.ts → Editor.spec.d.ts} +0 -0
- /package/dist/bscPlugin/{transpile/BrsFilePreTranspileProcessor.spec.d.ts → completions/CompletionsProcessor.spec.d.ts} +0 -0
- /package/dist/{parser/SGTypes.spec.d.ts → bscPlugin/serialize/BslibInjector.spec.d.ts} +0 -0
package/dist/parser/Statement.js
CHANGED
|
@@ -1,39 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ConstStatement = 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 =
|
|
3
|
+
exports.ContinueStatement = exports.ConstStatement = 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 = void 0;
|
|
4
4
|
const TokenKind_1 = require("../lexer/TokenKind");
|
|
5
5
|
const Expression_1 = require("./Expression");
|
|
6
6
|
const util_1 = require("../util");
|
|
7
7
|
const Parser_1 = require("./Parser");
|
|
8
8
|
const visitors_1 = require("../astUtils/visitors");
|
|
9
9
|
const reflection_1 = require("../astUtils/reflection");
|
|
10
|
+
const interfaces_1 = require("../interfaces");
|
|
11
|
+
const SymbolTable_1 = require("../SymbolTable");
|
|
10
12
|
const creators_1 = require("../astUtils/creators");
|
|
11
13
|
const DynamicType_1 = require("../types/DynamicType");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
+
const SymbolTable_2 = require("../SymbolTable");
|
|
15
|
+
const AstNode_1 = require("./AstNode");
|
|
16
|
+
const AstNode_2 = require("./AstNode");
|
|
17
|
+
const ClassType_1 = require("../types/ClassType");
|
|
14
18
|
const EnumType_1 = require("../types/EnumType");
|
|
15
|
-
const
|
|
19
|
+
const NamespaceType_1 = require("../types/NamespaceType");
|
|
16
20
|
const InterfaceType_1 = require("../types/InterfaceType");
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class Statement {
|
|
21
|
-
constructor() {
|
|
22
|
-
/**
|
|
23
|
-
* When being considered by the walk visitor, this describes what type of element the current class is.
|
|
24
|
-
*/
|
|
25
|
-
this.visitMode = visitors_1.InternalWalkMode.visitStatements;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Get the closest symbol table for this node. Should be overridden in children that directly contain a symbol table
|
|
29
|
-
*/
|
|
30
|
-
getSymbolTable() {
|
|
31
|
-
var _a;
|
|
32
|
-
return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
exports.Statement = Statement;
|
|
36
|
-
class EmptyStatement extends Statement {
|
|
21
|
+
const VoidType_1 = require("../types/VoidType");
|
|
22
|
+
const TypedFunctionType_1 = require("../types/TypedFunctionType");
|
|
23
|
+
class EmptyStatement extends AstNode_2.Statement {
|
|
37
24
|
constructor(
|
|
38
25
|
/**
|
|
39
26
|
* Create a negative range to indicate this is an interpolated location
|
|
@@ -41,6 +28,7 @@ class EmptyStatement extends Statement {
|
|
|
41
28
|
range = creators_1.interpolatedRange) {
|
|
42
29
|
super();
|
|
43
30
|
this.range = range;
|
|
31
|
+
this.kind = AstNode_1.AstNodeKind.EmptyStatement;
|
|
44
32
|
}
|
|
45
33
|
transpile(state) {
|
|
46
34
|
return [];
|
|
@@ -53,18 +41,17 @@ exports.EmptyStatement = EmptyStatement;
|
|
|
53
41
|
/**
|
|
54
42
|
* This is a top-level statement. Consider this the root of the AST
|
|
55
43
|
*/
|
|
56
|
-
class Body extends Statement {
|
|
57
|
-
constructor(statements = []
|
|
44
|
+
class Body extends AstNode_2.Statement {
|
|
45
|
+
constructor(statements = []) {
|
|
58
46
|
super();
|
|
59
47
|
this.statements = statements;
|
|
60
|
-
this.
|
|
61
|
-
|
|
62
|
-
getSymbolTable() {
|
|
63
|
-
return this.symbolTable;
|
|
48
|
+
this.kind = AstNode_1.AstNodeKind.Body;
|
|
49
|
+
this.symbolTable = new SymbolTable_2.SymbolTable('Body', () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
|
|
64
50
|
}
|
|
65
51
|
get range() {
|
|
66
|
-
var _a
|
|
67
|
-
|
|
52
|
+
var _a;
|
|
53
|
+
//this needs to be a getter because the body has its statements pushed to it after being constructed
|
|
54
|
+
return util_1.util.createBoundingRange(...((_a = this.statements) !== null && _a !== void 0 ? _a : []));
|
|
68
55
|
}
|
|
69
56
|
transpile(state) {
|
|
70
57
|
let result = [];
|
|
@@ -112,15 +99,16 @@ class Body extends Statement {
|
|
|
112
99
|
}
|
|
113
100
|
}
|
|
114
101
|
exports.Body = Body;
|
|
115
|
-
class AssignmentStatement extends Statement {
|
|
116
|
-
constructor(
|
|
117
|
-
var _a;
|
|
102
|
+
class AssignmentStatement extends AstNode_2.Statement {
|
|
103
|
+
constructor(equals, name, value, asToken, typeExpression) {
|
|
118
104
|
super();
|
|
119
|
-
this.name = name;
|
|
120
105
|
this.equals = equals;
|
|
106
|
+
this.name = name;
|
|
121
107
|
this.value = value;
|
|
122
|
-
this.
|
|
123
|
-
this.
|
|
108
|
+
this.asToken = asToken;
|
|
109
|
+
this.typeExpression = typeExpression;
|
|
110
|
+
this.kind = AstNode_1.AstNodeKind.AssignmentStatement;
|
|
111
|
+
this.range = util_1.util.createBoundingRange(name, equals, value);
|
|
124
112
|
}
|
|
125
113
|
transpile(state) {
|
|
126
114
|
var _a, _b;
|
|
@@ -140,18 +128,28 @@ class AssignmentStatement extends Statement {
|
|
|
140
128
|
}
|
|
141
129
|
walk(visitor, options) {
|
|
142
130
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
131
|
+
//TODO: Walk TypeExpression. We need to decide how to implement types on assignments
|
|
143
132
|
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
144
133
|
}
|
|
145
134
|
}
|
|
135
|
+
getType(options) {
|
|
136
|
+
// TODO: Do we still need this.typeExpression?
|
|
137
|
+
var _a;
|
|
138
|
+
// Note: compound assignments (eg. +=) are internally dealt with via the RHS being a BinaryExpression
|
|
139
|
+
// so this.value will be a BinaryExpression, and BinaryExpressions can figure out their own types
|
|
140
|
+
const rhs = this.value.getType(Object.assign(Object.assign({}, options), { typeChain: undefined }));
|
|
141
|
+
(_a = options.typeChain) === null || _a === void 0 ? void 0 : _a.push(new interfaces_1.TypeChainEntry(this.name.text, rhs, options.data, this.name.range));
|
|
142
|
+
return rhs;
|
|
143
|
+
}
|
|
146
144
|
}
|
|
147
145
|
exports.AssignmentStatement = AssignmentStatement;
|
|
148
|
-
class Block extends Statement {
|
|
146
|
+
class Block extends AstNode_2.Statement {
|
|
149
147
|
constructor(statements, startingRange) {
|
|
150
|
-
var _a;
|
|
151
148
|
super();
|
|
152
149
|
this.statements = statements;
|
|
153
150
|
this.startingRange = startingRange;
|
|
154
|
-
this.
|
|
151
|
+
this.kind = AstNode_1.AstNodeKind.Block;
|
|
152
|
+
this.range = util_1.util.createBoundingRange({ range: this.startingRange }, ...(statements !== null && statements !== void 0 ? statements : []));
|
|
155
153
|
}
|
|
156
154
|
transpile(state) {
|
|
157
155
|
state.blockDepth++;
|
|
@@ -184,12 +182,12 @@ class Block extends Statement {
|
|
|
184
182
|
}
|
|
185
183
|
}
|
|
186
184
|
exports.Block = Block;
|
|
187
|
-
class ExpressionStatement extends Statement {
|
|
185
|
+
class ExpressionStatement extends AstNode_2.Statement {
|
|
188
186
|
constructor(expression) {
|
|
189
|
-
var _a, _b;
|
|
190
187
|
super();
|
|
191
188
|
this.expression = expression;
|
|
192
|
-
this.
|
|
189
|
+
this.kind = AstNode_1.AstNodeKind.ExpressionStatement;
|
|
190
|
+
this.range = this.expression.range;
|
|
193
191
|
}
|
|
194
192
|
transpile(state) {
|
|
195
193
|
return this.expression.transpile(state);
|
|
@@ -201,13 +199,16 @@ class ExpressionStatement extends Statement {
|
|
|
201
199
|
}
|
|
202
200
|
}
|
|
203
201
|
exports.ExpressionStatement = ExpressionStatement;
|
|
204
|
-
class CommentStatement extends Statement {
|
|
202
|
+
class CommentStatement extends AstNode_2.Statement {
|
|
205
203
|
constructor(comments) {
|
|
206
204
|
var _a;
|
|
207
205
|
super();
|
|
208
206
|
this.comments = comments;
|
|
209
|
-
this.
|
|
207
|
+
this.kind = AstNode_1.AstNodeKind.CommentStatement;
|
|
210
208
|
this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
|
|
209
|
+
if (((_a = this.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
210
|
+
this.range = util_1.util.createBoundingRange(...this.comments);
|
|
211
|
+
}
|
|
211
212
|
}
|
|
212
213
|
get text() {
|
|
213
214
|
return this.comments.map(x => x.text).join('\n');
|
|
@@ -235,12 +236,12 @@ class CommentStatement extends Statement {
|
|
|
235
236
|
}
|
|
236
237
|
}
|
|
237
238
|
exports.CommentStatement = CommentStatement;
|
|
238
|
-
class ExitForStatement extends Statement {
|
|
239
|
+
class ExitForStatement extends AstNode_2.Statement {
|
|
239
240
|
constructor(tokens) {
|
|
240
|
-
var _a, _b, _c;
|
|
241
241
|
super();
|
|
242
242
|
this.tokens = tokens;
|
|
243
|
-
this.
|
|
243
|
+
this.kind = AstNode_1.AstNodeKind.ExitForStatement;
|
|
244
|
+
this.range = this.tokens.exitFor.range;
|
|
244
245
|
}
|
|
245
246
|
transpile(state) {
|
|
246
247
|
return [
|
|
@@ -252,12 +253,12 @@ class ExitForStatement extends Statement {
|
|
|
252
253
|
}
|
|
253
254
|
}
|
|
254
255
|
exports.ExitForStatement = ExitForStatement;
|
|
255
|
-
class ExitWhileStatement extends Statement {
|
|
256
|
+
class ExitWhileStatement extends AstNode_2.Statement {
|
|
256
257
|
constructor(tokens) {
|
|
257
|
-
var _a, _b, _c;
|
|
258
258
|
super();
|
|
259
259
|
this.tokens = tokens;
|
|
260
|
-
this.
|
|
260
|
+
this.kind = AstNode_1.AstNodeKind.ExitWhileStatement;
|
|
261
|
+
this.range = this.tokens.exitWhile.range;
|
|
261
262
|
}
|
|
262
263
|
transpile(state) {
|
|
263
264
|
return [
|
|
@@ -269,36 +270,32 @@ class ExitWhileStatement extends Statement {
|
|
|
269
270
|
}
|
|
270
271
|
}
|
|
271
272
|
exports.ExitWhileStatement = ExitWhileStatement;
|
|
272
|
-
class FunctionStatement extends Statement {
|
|
273
|
-
constructor(name, func
|
|
273
|
+
class FunctionStatement extends AstNode_2.Statement {
|
|
274
|
+
constructor(name, func) {
|
|
274
275
|
super();
|
|
275
276
|
this.name = name;
|
|
276
277
|
this.func = func;
|
|
277
|
-
this.
|
|
278
|
-
|
|
279
|
-
get range() {
|
|
280
|
-
return this.cacheRange();
|
|
281
|
-
}
|
|
282
|
-
cacheRange() {
|
|
283
|
-
var _a, _b;
|
|
284
|
-
if (!this._range) {
|
|
285
|
-
this._range = (_b = (_a = this.func) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : this.name.range;
|
|
286
|
-
}
|
|
287
|
-
return this._range;
|
|
278
|
+
this.kind = AstNode_1.AstNodeKind.FunctionStatement;
|
|
279
|
+
this.range = this.func.range;
|
|
288
280
|
}
|
|
289
281
|
/**
|
|
290
282
|
* Get the name of this expression based on the parse mode
|
|
291
283
|
*/
|
|
292
284
|
getName(parseMode) {
|
|
293
|
-
|
|
285
|
+
var _a;
|
|
286
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
287
|
+
if (namespace) {
|
|
294
288
|
let delimiter = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
|
|
295
|
-
let namespaceName =
|
|
296
|
-
return namespaceName + delimiter + this.name.text;
|
|
289
|
+
let namespaceName = namespace.getName(parseMode);
|
|
290
|
+
return namespaceName + delimiter + ((_a = this.name) === null || _a === void 0 ? void 0 : _a.text);
|
|
297
291
|
}
|
|
298
292
|
else {
|
|
299
293
|
return this.name.text;
|
|
300
294
|
}
|
|
301
295
|
}
|
|
296
|
+
getLeadingTrivia() {
|
|
297
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
|
|
298
|
+
}
|
|
302
299
|
transpile(state) {
|
|
303
300
|
//create a fake token using the full transpiled name
|
|
304
301
|
let nameToken = Object.assign(Object.assign({}, this.name), { text: this.getName(Parser_1.ParseMode.BrightScript) });
|
|
@@ -310,7 +307,7 @@ class FunctionStatement extends Statement {
|
|
|
310
307
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
311
308
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
312
309
|
}
|
|
313
|
-
result.push(...this.func.getTypedef(state
|
|
310
|
+
result.push(...this.func.getTypedef(state));
|
|
314
311
|
return result;
|
|
315
312
|
}
|
|
316
313
|
walk(visitor, options) {
|
|
@@ -318,18 +315,24 @@ class FunctionStatement extends Statement {
|
|
|
318
315
|
(0, visitors_1.walk)(this, 'func', visitor, options);
|
|
319
316
|
}
|
|
320
317
|
}
|
|
318
|
+
getType(options) {
|
|
319
|
+
var _a;
|
|
320
|
+
const funcExprType = this.func.getType(options);
|
|
321
|
+
funcExprType.setName((_a = this.name) === null || _a === void 0 ? void 0 : _a.text);
|
|
322
|
+
return funcExprType;
|
|
323
|
+
}
|
|
321
324
|
}
|
|
322
325
|
exports.FunctionStatement = FunctionStatement;
|
|
323
|
-
class IfStatement extends Statement {
|
|
326
|
+
class IfStatement extends AstNode_2.Statement {
|
|
324
327
|
constructor(tokens, condition, thenBranch, elseBranch, isInline) {
|
|
325
|
-
var _a;
|
|
326
328
|
super();
|
|
327
329
|
this.tokens = tokens;
|
|
328
330
|
this.condition = condition;
|
|
329
331
|
this.thenBranch = thenBranch;
|
|
330
332
|
this.elseBranch = elseBranch;
|
|
331
333
|
this.isInline = isInline;
|
|
332
|
-
this.
|
|
334
|
+
this.kind = AstNode_1.AstNodeKind.IfStatement;
|
|
335
|
+
this.range = util_1.util.createBoundingRange(tokens.if, condition, tokens.then, thenBranch, tokens.else, elseBranch, tokens.endIf);
|
|
333
336
|
}
|
|
334
337
|
transpile(state) {
|
|
335
338
|
let results = [];
|
|
@@ -375,7 +378,7 @@ class IfStatement extends Statement {
|
|
|
375
378
|
}
|
|
376
379
|
else {
|
|
377
380
|
//else body
|
|
378
|
-
state.lineage.unshift(this.
|
|
381
|
+
state.lineage.unshift(this.tokens.else);
|
|
379
382
|
let body = this.elseBranch.transpile(state);
|
|
380
383
|
state.lineage.shift();
|
|
381
384
|
if (body.length > 0) {
|
|
@@ -407,13 +410,13 @@ class IfStatement extends Statement {
|
|
|
407
410
|
}
|
|
408
411
|
}
|
|
409
412
|
exports.IfStatement = IfStatement;
|
|
410
|
-
class IncrementStatement extends Statement {
|
|
413
|
+
class IncrementStatement extends AstNode_2.Statement {
|
|
411
414
|
constructor(value, operator) {
|
|
412
|
-
var _a;
|
|
413
415
|
super();
|
|
414
416
|
this.value = value;
|
|
415
417
|
this.operator = operator;
|
|
416
|
-
this.
|
|
418
|
+
this.kind = AstNode_1.AstNodeKind.IncrementStatement;
|
|
419
|
+
this.range = util_1.util.createBoundingRange(value, operator);
|
|
417
420
|
}
|
|
418
421
|
transpile(state) {
|
|
419
422
|
return [
|
|
@@ -431,18 +434,19 @@ exports.IncrementStatement = IncrementStatement;
|
|
|
431
434
|
/**
|
|
432
435
|
* Represents a `print` statement within BrightScript.
|
|
433
436
|
*/
|
|
434
|
-
class PrintStatement extends Statement {
|
|
437
|
+
class PrintStatement extends AstNode_2.Statement {
|
|
435
438
|
/**
|
|
436
439
|
* Creates a new internal representation of a BrightScript `print` statement.
|
|
437
|
-
* @param
|
|
438
|
-
*
|
|
440
|
+
* @param tokens the tokens for this statement
|
|
441
|
+
* @param tokens.print a print token
|
|
442
|
+
* @param expressions an array of expressions or `PrintSeparator`s to be evaluated and printed.
|
|
439
443
|
*/
|
|
440
444
|
constructor(tokens, expressions) {
|
|
441
|
-
var _a;
|
|
442
445
|
super();
|
|
443
446
|
this.tokens = tokens;
|
|
444
447
|
this.expressions = expressions;
|
|
445
|
-
this.
|
|
448
|
+
this.kind = AstNode_1.AstNodeKind.PrintStatement;
|
|
449
|
+
this.range = util_1.util.createBoundingRange(tokens.print, ...(expressions !== null && expressions !== void 0 ? expressions : []));
|
|
446
450
|
}
|
|
447
451
|
transpile(state) {
|
|
448
452
|
var _a;
|
|
@@ -473,16 +477,16 @@ class PrintStatement extends Statement {
|
|
|
473
477
|
}
|
|
474
478
|
}
|
|
475
479
|
exports.PrintStatement = PrintStatement;
|
|
476
|
-
class DimStatement extends Statement {
|
|
480
|
+
class DimStatement extends AstNode_2.Statement {
|
|
477
481
|
constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
|
|
478
|
-
var _a;
|
|
479
482
|
super();
|
|
480
483
|
this.dimToken = dimToken;
|
|
481
484
|
this.identifier = identifier;
|
|
482
485
|
this.openingSquare = openingSquare;
|
|
483
486
|
this.dimensions = dimensions;
|
|
484
487
|
this.closingSquare = closingSquare;
|
|
485
|
-
this.
|
|
488
|
+
this.kind = AstNode_1.AstNodeKind.DimStatement;
|
|
489
|
+
this.range = util_1.util.createBoundingRange(dimToken, identifier, openingSquare, ...(dimensions !== null && dimensions !== void 0 ? dimensions : []), closingSquare);
|
|
486
490
|
}
|
|
487
491
|
transpile(state) {
|
|
488
492
|
let result = [
|
|
@@ -508,12 +512,12 @@ class DimStatement extends Statement {
|
|
|
508
512
|
}
|
|
509
513
|
}
|
|
510
514
|
exports.DimStatement = DimStatement;
|
|
511
|
-
class GotoStatement extends Statement {
|
|
515
|
+
class GotoStatement extends AstNode_2.Statement {
|
|
512
516
|
constructor(tokens) {
|
|
513
|
-
var _a;
|
|
514
517
|
super();
|
|
515
518
|
this.tokens = tokens;
|
|
516
|
-
this.
|
|
519
|
+
this.kind = AstNode_1.AstNodeKind.GotoStatement;
|
|
520
|
+
this.range = util_1.util.createBoundingRange(tokens.goto, tokens.label);
|
|
517
521
|
}
|
|
518
522
|
transpile(state) {
|
|
519
523
|
return [
|
|
@@ -527,12 +531,15 @@ class GotoStatement extends Statement {
|
|
|
527
531
|
}
|
|
528
532
|
}
|
|
529
533
|
exports.GotoStatement = GotoStatement;
|
|
530
|
-
class LabelStatement extends Statement {
|
|
534
|
+
class LabelStatement extends AstNode_2.Statement {
|
|
531
535
|
constructor(tokens) {
|
|
532
|
-
var _a;
|
|
533
536
|
super();
|
|
534
537
|
this.tokens = tokens;
|
|
535
|
-
this.
|
|
538
|
+
this.kind = AstNode_1.AstNodeKind.LabelStatement;
|
|
539
|
+
this.range = util_1.util.createBoundingRange(tokens.identifier, tokens.colon);
|
|
540
|
+
}
|
|
541
|
+
getLeadingTrivia() {
|
|
542
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.identifier.leadingTrivia);
|
|
536
543
|
}
|
|
537
544
|
transpile(state) {
|
|
538
545
|
return [
|
|
@@ -545,13 +552,13 @@ class LabelStatement extends Statement {
|
|
|
545
552
|
}
|
|
546
553
|
}
|
|
547
554
|
exports.LabelStatement = LabelStatement;
|
|
548
|
-
class ReturnStatement extends Statement {
|
|
555
|
+
class ReturnStatement extends AstNode_2.Statement {
|
|
549
556
|
constructor(tokens, value) {
|
|
550
|
-
var _a;
|
|
551
557
|
super();
|
|
552
558
|
this.tokens = tokens;
|
|
553
559
|
this.value = value;
|
|
554
|
-
this.
|
|
560
|
+
this.kind = AstNode_1.AstNodeKind.ReturnStatement;
|
|
561
|
+
this.range = util_1.util.createBoundingRange(tokens.return, value);
|
|
555
562
|
}
|
|
556
563
|
transpile(state) {
|
|
557
564
|
let result = [];
|
|
@@ -569,12 +576,12 @@ class ReturnStatement extends Statement {
|
|
|
569
576
|
}
|
|
570
577
|
}
|
|
571
578
|
exports.ReturnStatement = ReturnStatement;
|
|
572
|
-
class EndStatement extends Statement {
|
|
579
|
+
class EndStatement extends AstNode_2.Statement {
|
|
573
580
|
constructor(tokens) {
|
|
574
|
-
var _a, _b;
|
|
575
581
|
super();
|
|
576
582
|
this.tokens = tokens;
|
|
577
|
-
this.
|
|
583
|
+
this.kind = AstNode_1.AstNodeKind.EndStatement;
|
|
584
|
+
this.range = tokens.end.range;
|
|
578
585
|
}
|
|
579
586
|
transpile(state) {
|
|
580
587
|
return [
|
|
@@ -586,12 +593,13 @@ class EndStatement extends Statement {
|
|
|
586
593
|
}
|
|
587
594
|
}
|
|
588
595
|
exports.EndStatement = EndStatement;
|
|
589
|
-
class StopStatement extends Statement {
|
|
596
|
+
class StopStatement extends AstNode_2.Statement {
|
|
590
597
|
constructor(tokens) {
|
|
591
|
-
var _a
|
|
598
|
+
var _a;
|
|
592
599
|
super();
|
|
593
600
|
this.tokens = tokens;
|
|
594
|
-
this.
|
|
601
|
+
this.kind = AstNode_1.AstNodeKind.StopStatement;
|
|
602
|
+
this.range = (_a = tokens === null || tokens === void 0 ? void 0 : tokens.stop) === null || _a === void 0 ? void 0 : _a.range;
|
|
595
603
|
}
|
|
596
604
|
transpile(state) {
|
|
597
605
|
return [
|
|
@@ -603,9 +611,8 @@ class StopStatement extends Statement {
|
|
|
603
611
|
}
|
|
604
612
|
}
|
|
605
613
|
exports.StopStatement = StopStatement;
|
|
606
|
-
class ForStatement extends Statement {
|
|
614
|
+
class ForStatement extends AstNode_2.Statement {
|
|
607
615
|
constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
|
|
608
|
-
var _a;
|
|
609
616
|
super();
|
|
610
617
|
this.forToken = forToken;
|
|
611
618
|
this.counterDeclaration = counterDeclaration;
|
|
@@ -615,7 +622,8 @@ class ForStatement extends Statement {
|
|
|
615
622
|
this.endForToken = endForToken;
|
|
616
623
|
this.stepToken = stepToken;
|
|
617
624
|
this.increment = increment;
|
|
618
|
-
this.
|
|
625
|
+
this.kind = AstNode_1.AstNodeKind.ForStatement;
|
|
626
|
+
this.range = util_1.util.createBoundingRange(forToken, counterDeclaration, toToken, finalValue, stepToken, increment, body, endForToken);
|
|
619
627
|
}
|
|
620
628
|
transpile(state) {
|
|
621
629
|
let result = [];
|
|
@@ -655,26 +663,24 @@ class ForStatement extends Statement {
|
|
|
655
663
|
}
|
|
656
664
|
}
|
|
657
665
|
exports.ForStatement = ForStatement;
|
|
658
|
-
class ForEachStatement extends Statement {
|
|
659
|
-
constructor(
|
|
660
|
-
var _a;
|
|
666
|
+
class ForEachStatement extends AstNode_2.Statement {
|
|
667
|
+
constructor(tokens, item, target, body) {
|
|
661
668
|
super();
|
|
662
|
-
this.
|
|
669
|
+
this.tokens = tokens;
|
|
663
670
|
this.item = item;
|
|
664
|
-
this.inToken = inToken;
|
|
665
671
|
this.target = target;
|
|
666
672
|
this.body = body;
|
|
667
|
-
this.
|
|
668
|
-
this.range =
|
|
673
|
+
this.kind = AstNode_1.AstNodeKind.ForEachStatement;
|
|
674
|
+
this.range = util_1.util.createBoundingRange(tokens.forEach, item, tokens.in, target, body, tokens.endFor);
|
|
669
675
|
}
|
|
670
676
|
transpile(state) {
|
|
671
677
|
let result = [];
|
|
672
678
|
//for each
|
|
673
|
-
result.push(state.transpileToken(this.
|
|
679
|
+
result.push(state.transpileToken(this.tokens.forEach), ' ');
|
|
674
680
|
//item
|
|
675
681
|
result.push(state.transpileToken(this.item), ' ');
|
|
676
682
|
//in
|
|
677
|
-
result.push(state.transpileToken(this.
|
|
683
|
+
result.push(state.transpileToken(this.tokens.in), ' ');
|
|
678
684
|
//target
|
|
679
685
|
result.push(...this.target.transpile(state));
|
|
680
686
|
//body
|
|
@@ -684,7 +690,7 @@ class ForEachStatement extends Statement {
|
|
|
684
690
|
// add new line before "end for"
|
|
685
691
|
result.push('\n');
|
|
686
692
|
//end for
|
|
687
|
-
result.push(state.indent(), state.transpileToken(this.
|
|
693
|
+
result.push(state.indent(), state.transpileToken(this.tokens.endFor));
|
|
688
694
|
return result;
|
|
689
695
|
}
|
|
690
696
|
walk(visitor, options) {
|
|
@@ -697,14 +703,14 @@ class ForEachStatement extends Statement {
|
|
|
697
703
|
}
|
|
698
704
|
}
|
|
699
705
|
exports.ForEachStatement = ForEachStatement;
|
|
700
|
-
class WhileStatement extends Statement {
|
|
706
|
+
class WhileStatement extends AstNode_2.Statement {
|
|
701
707
|
constructor(tokens, condition, body) {
|
|
702
|
-
var _a;
|
|
703
708
|
super();
|
|
704
709
|
this.tokens = tokens;
|
|
705
710
|
this.condition = condition;
|
|
706
711
|
this.body = body;
|
|
707
|
-
this.
|
|
712
|
+
this.kind = AstNode_1.AstNodeKind.WhileStatement;
|
|
713
|
+
this.range = util_1.util.createBoundingRange(tokens.while, condition, body, tokens.endWhile);
|
|
708
714
|
}
|
|
709
715
|
transpile(state) {
|
|
710
716
|
let result = [];
|
|
@@ -732,16 +738,15 @@ class WhileStatement extends Statement {
|
|
|
732
738
|
}
|
|
733
739
|
}
|
|
734
740
|
exports.WhileStatement = WhileStatement;
|
|
735
|
-
class DottedSetStatement extends Statement {
|
|
736
|
-
constructor(obj, name, value, dot
|
|
737
|
-
var _a;
|
|
741
|
+
class DottedSetStatement extends AstNode_2.Statement {
|
|
742
|
+
constructor(obj, name, value, dot) {
|
|
738
743
|
super();
|
|
739
744
|
this.obj = obj;
|
|
740
745
|
this.name = name;
|
|
741
746
|
this.value = value;
|
|
742
747
|
this.dot = dot;
|
|
743
|
-
this.
|
|
744
|
-
this.range =
|
|
748
|
+
this.kind = AstNode_1.AstNodeKind.DottedSetStatement;
|
|
749
|
+
this.range = util_1.util.createBoundingRange(obj, dot, name, value);
|
|
745
750
|
}
|
|
746
751
|
transpile(state) {
|
|
747
752
|
var _a, _b;
|
|
@@ -753,7 +758,7 @@ class DottedSetStatement extends Statement {
|
|
|
753
758
|
return [
|
|
754
759
|
//object
|
|
755
760
|
...this.obj.transpile(state),
|
|
756
|
-
'.',
|
|
761
|
+
this.dot ? state.tokenToSourceNode(this.dot) : '.',
|
|
757
762
|
//name
|
|
758
763
|
state.transpileToken(this.name),
|
|
759
764
|
' = ',
|
|
@@ -768,19 +773,25 @@ class DottedSetStatement extends Statement {
|
|
|
768
773
|
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
769
774
|
}
|
|
770
775
|
}
|
|
776
|
+
getType(options) {
|
|
777
|
+
var _a, _b, _c, _d, _e, _f;
|
|
778
|
+
const objType = (_a = this.obj) === null || _a === void 0 ? void 0 : _a.getType(options);
|
|
779
|
+
const result = objType === null || objType === void 0 ? void 0 : objType.getMemberType((_b = this.name) === null || _b === void 0 ? void 0 : _b.text, options);
|
|
780
|
+
(_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry((_d = this.name) === null || _d === void 0 ? void 0 : _d.text, result, options.data, (_f = (_e = this.name) === null || _e === void 0 ? void 0 : _e.range) !== null && _f !== void 0 ? _f : this.range));
|
|
781
|
+
return result;
|
|
782
|
+
}
|
|
771
783
|
}
|
|
772
784
|
exports.DottedSetStatement = DottedSetStatement;
|
|
773
|
-
class IndexedSetStatement extends Statement {
|
|
774
|
-
constructor(obj, index, value, openingSquare, closingSquare
|
|
775
|
-
var _a;
|
|
785
|
+
class IndexedSetStatement extends AstNode_2.Statement {
|
|
786
|
+
constructor(obj, index, value, openingSquare, closingSquare) {
|
|
776
787
|
super();
|
|
777
788
|
this.obj = obj;
|
|
778
789
|
this.index = index;
|
|
779
790
|
this.value = value;
|
|
780
791
|
this.openingSquare = openingSquare;
|
|
781
792
|
this.closingSquare = closingSquare;
|
|
782
|
-
this.
|
|
783
|
-
this.range =
|
|
793
|
+
this.kind = AstNode_1.AstNodeKind.IndexedSetStatement;
|
|
794
|
+
this.range = util_1.util.createBoundingRange(obj, openingSquare, index, closingSquare, value);
|
|
784
795
|
}
|
|
785
796
|
transpile(state) {
|
|
786
797
|
var _a, _b;
|
|
@@ -814,12 +825,12 @@ class IndexedSetStatement extends Statement {
|
|
|
814
825
|
}
|
|
815
826
|
}
|
|
816
827
|
exports.IndexedSetStatement = IndexedSetStatement;
|
|
817
|
-
class LibraryStatement extends Statement {
|
|
828
|
+
class LibraryStatement extends AstNode_2.Statement {
|
|
818
829
|
constructor(tokens) {
|
|
819
|
-
var _a;
|
|
820
830
|
super();
|
|
821
831
|
this.tokens = tokens;
|
|
822
|
-
this.
|
|
832
|
+
this.kind = AstNode_1.AstNodeKind.LibraryStatement;
|
|
833
|
+
this.range = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath);
|
|
823
834
|
}
|
|
824
835
|
transpile(state) {
|
|
825
836
|
let result = [];
|
|
@@ -838,21 +849,16 @@ class LibraryStatement extends Statement {
|
|
|
838
849
|
}
|
|
839
850
|
}
|
|
840
851
|
exports.LibraryStatement = LibraryStatement;
|
|
841
|
-
class NamespaceStatement extends Statement {
|
|
842
|
-
constructor(keyword,
|
|
843
|
-
//this should technically only be a VariableExpression or DottedGetExpression, but that can be enforced elsewhere
|
|
844
|
-
nameExpression, body, endKeyword, parentSymbolTable) {
|
|
852
|
+
class NamespaceStatement extends AstNode_2.Statement {
|
|
853
|
+
constructor(keyword, nameExpression, body, endKeyword) {
|
|
845
854
|
super();
|
|
846
855
|
this.keyword = keyword;
|
|
847
856
|
this.nameExpression = nameExpression;
|
|
848
857
|
this.body = body;
|
|
849
858
|
this.endKeyword = endKeyword;
|
|
850
|
-
this.
|
|
851
|
-
this.name = this.
|
|
852
|
-
this.symbolTable = new
|
|
853
|
-
}
|
|
854
|
-
getSymbolTable() {
|
|
855
|
-
return this.symbolTable;
|
|
859
|
+
this.kind = AstNode_1.AstNodeKind.NamespaceStatement;
|
|
860
|
+
this.name = this.getName(Parser_1.ParseMode.BrighterScript);
|
|
861
|
+
this.symbolTable = new SymbolTable_2.SymbolTable(`NamespaceStatement: '${this.name}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
|
|
856
862
|
}
|
|
857
863
|
get range() {
|
|
858
864
|
return this.cacheRange();
|
|
@@ -865,7 +871,24 @@ class NamespaceStatement extends Statement {
|
|
|
865
871
|
return this._range;
|
|
866
872
|
}
|
|
867
873
|
getName(parseMode) {
|
|
868
|
-
|
|
874
|
+
var _a, _b;
|
|
875
|
+
const sep = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
|
|
876
|
+
let name = util_1.util.getAllDottedGetPartsAsString(this.nameExpression, parseMode);
|
|
877
|
+
if (((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.kind) === AstNode_1.AstNodeKind.NamespaceStatement) {
|
|
878
|
+
name = this.parent.parent.getName(parseMode) + sep + name;
|
|
879
|
+
}
|
|
880
|
+
return name;
|
|
881
|
+
}
|
|
882
|
+
getLeadingTrivia() {
|
|
883
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.keyword.leadingTrivia);
|
|
884
|
+
}
|
|
885
|
+
getNameParts() {
|
|
886
|
+
var _a, _b;
|
|
887
|
+
let parts = util_1.util.getAllDottedGetParts(this.nameExpression);
|
|
888
|
+
if (((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.kind) === AstNode_1.AstNodeKind.NamespaceStatement) {
|
|
889
|
+
parts = this.parent.parent.getNameParts().concat(parts);
|
|
890
|
+
}
|
|
891
|
+
return parts;
|
|
869
892
|
}
|
|
870
893
|
transpile(state) {
|
|
871
894
|
//namespaces don't actually have any real content, so just transpile their bodies
|
|
@@ -874,7 +897,7 @@ class NamespaceStatement extends Statement {
|
|
|
874
897
|
getTypedef(state) {
|
|
875
898
|
let result = [
|
|
876
899
|
'namespace ',
|
|
877
|
-
...this.
|
|
900
|
+
...this.getName(Parser_1.ParseMode.BrighterScript),
|
|
878
901
|
state.newline
|
|
879
902
|
];
|
|
880
903
|
state.blockDepth++;
|
|
@@ -891,15 +914,19 @@ class NamespaceStatement extends Statement {
|
|
|
891
914
|
(0, visitors_1.walk)(this, 'body', visitor, options);
|
|
892
915
|
}
|
|
893
916
|
}
|
|
917
|
+
getType(options) {
|
|
918
|
+
const resultType = new NamespaceType_1.NamespaceType(this.name);
|
|
919
|
+
return resultType;
|
|
920
|
+
}
|
|
894
921
|
}
|
|
895
922
|
exports.NamespaceStatement = NamespaceStatement;
|
|
896
|
-
class ImportStatement extends Statement {
|
|
923
|
+
class ImportStatement extends AstNode_2.Statement {
|
|
897
924
|
constructor(importToken, filePathToken) {
|
|
898
|
-
var _a;
|
|
899
925
|
super();
|
|
900
926
|
this.importToken = importToken;
|
|
901
927
|
this.filePathToken = filePathToken;
|
|
902
|
-
this.
|
|
928
|
+
this.kind = AstNode_1.AstNodeKind.ImportStatement;
|
|
929
|
+
this.range = util_1.util.createBoundingRange(importToken, filePathToken);
|
|
903
930
|
if (this.filePathToken) {
|
|
904
931
|
//remove quotes
|
|
905
932
|
this.filePath = this.filePathToken.text.replace(/"/g, '');
|
|
@@ -933,89 +960,41 @@ class ImportStatement extends Statement {
|
|
|
933
960
|
}
|
|
934
961
|
}
|
|
935
962
|
exports.ImportStatement = ImportStatement;
|
|
936
|
-
class InterfaceStatement extends Statement {
|
|
937
|
-
constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken
|
|
938
|
-
var _a, _b, _c;
|
|
963
|
+
class InterfaceStatement extends AstNode_2.Statement {
|
|
964
|
+
constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken) {
|
|
939
965
|
super();
|
|
940
|
-
this.name = name;
|
|
941
966
|
this.parentInterfaceName = parentInterfaceName;
|
|
942
967
|
this.body = body;
|
|
943
|
-
this.
|
|
944
|
-
this.memberTable = new SymbolTable_1.SymbolTable();
|
|
968
|
+
this.kind = AstNode_1.AstNodeKind.InterfaceStatement;
|
|
945
969
|
this.tokens = {};
|
|
946
|
-
this.memberMap = {};
|
|
947
|
-
this.methods = [];
|
|
948
|
-
this.fields = [];
|
|
949
970
|
this.tokens.interface = interfaceToken;
|
|
950
971
|
this.tokens.name = name;
|
|
951
972
|
this.tokens.extends = extendsToken;
|
|
952
973
|
this.tokens.endInterface = endInterfaceToken;
|
|
953
|
-
this.range =
|
|
954
|
-
for (let statement of this.body) {
|
|
955
|
-
if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
|
|
956
|
-
this.methods.push(statement);
|
|
957
|
-
this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
|
|
958
|
-
}
|
|
959
|
-
else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
|
|
960
|
-
this.fields.push(statement);
|
|
961
|
-
this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
this.memberTable.name = `Interface ${name === null || name === void 0 ? void 0 : name.text} (members)`;
|
|
974
|
+
this.range = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface);
|
|
965
975
|
}
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
this.memberTable.clear();
|
|
969
|
-
if (parentIface) {
|
|
970
|
-
this.memberTable.pushParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
|
|
971
|
-
}
|
|
972
|
-
for (const statement of this.methods) {
|
|
973
|
-
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
|
|
974
|
-
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);
|
|
975
|
-
}
|
|
976
|
-
for (const statement of this.fields) {
|
|
977
|
-
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());
|
|
978
|
-
}
|
|
976
|
+
get fields() {
|
|
977
|
+
return this.body.filter(x => (0, reflection_1.isInterfaceFieldStatement)(x));
|
|
979
978
|
}
|
|
980
|
-
|
|
981
|
-
return
|
|
979
|
+
get methods() {
|
|
980
|
+
return this.body.filter(x => (0, reflection_1.isInterfaceMethodStatement)(x));
|
|
982
981
|
}
|
|
983
|
-
|
|
982
|
+
hasParentInterface() {
|
|
984
983
|
return !!this.parentInterfaceName;
|
|
985
984
|
}
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
* @returns array of possible parent interface names
|
|
989
|
-
*/
|
|
990
|
-
getPossibleFullParentNames() {
|
|
991
|
-
var _a;
|
|
992
|
-
if (!this.hasParent()) {
|
|
993
|
-
return [];
|
|
994
|
-
}
|
|
995
|
-
if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
996
|
-
// The specified parent interface already has a dot, so it must already reference a namespace
|
|
997
|
-
return [this.parentInterfaceName.getName()];
|
|
998
|
-
}
|
|
999
|
-
const names = [];
|
|
1000
|
-
if (this.namespaceName) {
|
|
1001
|
-
// We're under a namespace, so the full parent name MIGHT be with this namespace too
|
|
1002
|
-
names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
|
|
1003
|
-
}
|
|
1004
|
-
names.push(this.parentInterfaceName.getName());
|
|
1005
|
-
return names;
|
|
1006
|
-
}
|
|
1007
|
-
getThisBscType() {
|
|
1008
|
-
return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
|
|
985
|
+
getLeadingTrivia() {
|
|
986
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.interface.leadingTrivia);
|
|
1009
987
|
}
|
|
1010
988
|
/**
|
|
1011
989
|
* The name of the interface WITH its leading namespace (if applicable)
|
|
1012
990
|
*/
|
|
1013
|
-
|
|
991
|
+
get fullName() {
|
|
1014
992
|
var _a;
|
|
1015
993
|
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1016
994
|
if (name) {
|
|
1017
|
-
|
|
1018
|
-
|
|
995
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
996
|
+
if (namespace) {
|
|
997
|
+
let namespaceName = namespace.getName(Parser_1.ParseMode.BrighterScript);
|
|
1019
998
|
return `${namespaceName}.${name}`;
|
|
1020
999
|
}
|
|
1021
1000
|
else {
|
|
@@ -1027,6 +1006,27 @@ class InterfaceStatement extends Statement {
|
|
|
1027
1006
|
return undefined;
|
|
1028
1007
|
}
|
|
1029
1008
|
}
|
|
1009
|
+
/**
|
|
1010
|
+
* The name of the interface (without the namespace prefix)
|
|
1011
|
+
*/
|
|
1012
|
+
get name() {
|
|
1013
|
+
var _a;
|
|
1014
|
+
return (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1015
|
+
}
|
|
1016
|
+
/**
|
|
1017
|
+
* Get the name of this expression based on the parse mode
|
|
1018
|
+
*/
|
|
1019
|
+
getName(parseMode) {
|
|
1020
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
1021
|
+
if (namespace) {
|
|
1022
|
+
let delimiter = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
|
|
1023
|
+
let namespaceName = namespace.getName(parseMode);
|
|
1024
|
+
return namespaceName + delimiter + this.name;
|
|
1025
|
+
}
|
|
1026
|
+
else {
|
|
1027
|
+
return this.name;
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
1030
|
transpile(state) {
|
|
1031
1031
|
//interfaces should completely disappear at runtime
|
|
1032
1032
|
return [];
|
|
@@ -1038,7 +1038,7 @@ class InterfaceStatement extends Statement {
|
|
|
1038
1038
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1039
1039
|
}
|
|
1040
1040
|
result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
|
|
1041
|
-
const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName(
|
|
1041
|
+
const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName();
|
|
1042
1042
|
if (parentInterfaceName) {
|
|
1043
1043
|
result.push(' extends ', parentInterfaceName);
|
|
1044
1044
|
}
|
|
@@ -1061,35 +1061,59 @@ class InterfaceStatement extends Statement {
|
|
|
1061
1061
|
return result;
|
|
1062
1062
|
}
|
|
1063
1063
|
walk(visitor, options) {
|
|
1064
|
+
//visitor-less walk function to do parent linking
|
|
1065
|
+
(0, visitors_1.walk)(this, 'parentInterfaceName', null, options);
|
|
1064
1066
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1065
1067
|
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1066
1068
|
}
|
|
1067
1069
|
}
|
|
1070
|
+
getType(options) {
|
|
1071
|
+
var _a, _b, _c, _d;
|
|
1072
|
+
const superIface = (_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getType(options);
|
|
1073
|
+
const resultType = new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), superIface);
|
|
1074
|
+
for (const statement of this.methods) {
|
|
1075
|
+
const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
|
|
1076
|
+
const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
|
|
1077
|
+
resultType.addMember((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, { definingNode: statement }, memberType, flag);
|
|
1078
|
+
}
|
|
1079
|
+
for (const statement of this.fields) {
|
|
1080
|
+
const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
|
|
1081
|
+
const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
|
|
1082
|
+
resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, memberType, flag);
|
|
1083
|
+
}
|
|
1084
|
+
(_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry(this.getName(Parser_1.ParseMode.BrighterScript), resultType, options.data, this.range));
|
|
1085
|
+
return resultType;
|
|
1086
|
+
}
|
|
1068
1087
|
}
|
|
1069
1088
|
exports.InterfaceStatement = InterfaceStatement;
|
|
1070
|
-
class InterfaceFieldStatement extends Statement {
|
|
1071
|
-
constructor(nameToken, asToken,
|
|
1072
|
-
var _a;
|
|
1089
|
+
class InterfaceFieldStatement extends AstNode_2.Statement {
|
|
1090
|
+
constructor(nameToken, asToken, typeExpression, optionalToken) {
|
|
1073
1091
|
super();
|
|
1074
|
-
this.
|
|
1075
|
-
this.
|
|
1092
|
+
this.typeExpression = typeExpression;
|
|
1093
|
+
this.kind = AstNode_1.AstNodeKind.InterfaceFieldStatement;
|
|
1076
1094
|
this.tokens = {};
|
|
1095
|
+
this.tokens.optional = optionalToken;
|
|
1077
1096
|
this.tokens.name = nameToken;
|
|
1078
1097
|
this.tokens.as = asToken;
|
|
1079
|
-
this.range =
|
|
1098
|
+
this.range = util_1.util.createBoundingRange(this.tokens.optional, this.tokens.name, this.tokens.as, this.typeExpression);
|
|
1080
1099
|
}
|
|
1081
1100
|
transpile(state) {
|
|
1082
1101
|
throw new Error('Method not implemented.');
|
|
1083
1102
|
}
|
|
1084
|
-
|
|
1085
|
-
var _a;
|
|
1086
|
-
return (_a = this.
|
|
1103
|
+
getLeadingTrivia() {
|
|
1104
|
+
var _a, _b;
|
|
1105
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, (_b = (_a = this.tokens.optional) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : this.tokens.name.leadingTrivia);
|
|
1087
1106
|
}
|
|
1088
1107
|
get name() {
|
|
1089
|
-
return this.tokens.name;
|
|
1108
|
+
return this.tokens.name.text;
|
|
1109
|
+
}
|
|
1110
|
+
get isOptional() {
|
|
1111
|
+
return !!this.tokens.optional;
|
|
1090
1112
|
}
|
|
1091
1113
|
walk(visitor, options) {
|
|
1092
|
-
|
|
1114
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1115
|
+
(0, visitors_1.walk)(this, 'typeExpression', visitor, options);
|
|
1116
|
+
}
|
|
1093
1117
|
}
|
|
1094
1118
|
getTypedef(state) {
|
|
1095
1119
|
var _a;
|
|
@@ -1097,32 +1121,120 @@ class InterfaceFieldStatement extends Statement {
|
|
|
1097
1121
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1098
1122
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1099
1123
|
}
|
|
1124
|
+
if (this.isOptional) {
|
|
1125
|
+
result.push(this.tokens.optional.text, ' ');
|
|
1126
|
+
}
|
|
1100
1127
|
result.push(this.tokens.name.text);
|
|
1101
|
-
if (this.
|
|
1102
|
-
result.push(' as ', ...this.
|
|
1128
|
+
if (this.typeExpression) {
|
|
1129
|
+
result.push(' as ', ...this.typeExpression.getTypedef(state));
|
|
1103
1130
|
}
|
|
1104
1131
|
return result;
|
|
1105
1132
|
}
|
|
1133
|
+
getType(options) {
|
|
1134
|
+
var _a, _b;
|
|
1135
|
+
return (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(options)) !== null && _b !== void 0 ? _b : DynamicType_1.DynamicType.instance;
|
|
1136
|
+
}
|
|
1106
1137
|
}
|
|
1107
1138
|
exports.InterfaceFieldStatement = InterfaceFieldStatement;
|
|
1108
|
-
|
|
1139
|
+
//TODO: there is much that is similar with this and FunctionExpression.
|
|
1140
|
+
//It would be nice to refactor this so there is less duplicated code
|
|
1141
|
+
class InterfaceMethodStatement extends AstNode_2.Statement {
|
|
1142
|
+
constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeExpression, optionalToken) {
|
|
1143
|
+
super();
|
|
1144
|
+
this.params = params;
|
|
1145
|
+
this.returnTypeExpression = returnTypeExpression;
|
|
1146
|
+
this.kind = AstNode_1.AstNodeKind.InterfaceMethodStatement;
|
|
1147
|
+
this.tokens = {};
|
|
1148
|
+
this.tokens.optional = optionalToken;
|
|
1149
|
+
this.tokens.functionType = functionTypeToken;
|
|
1150
|
+
this.tokens.name = nameToken;
|
|
1151
|
+
this.tokens.leftParen = leftParen;
|
|
1152
|
+
this.tokens.rightParen = rightParen;
|
|
1153
|
+
this.tokens.as = asToken;
|
|
1154
|
+
}
|
|
1109
1155
|
transpile(state) {
|
|
1110
1156
|
throw new Error('Method not implemented.');
|
|
1111
1157
|
}
|
|
1112
|
-
|
|
1113
|
-
|
|
1158
|
+
get range() {
|
|
1159
|
+
var _a;
|
|
1160
|
+
return util_1.util.createBoundingRange(this.tokens.optional, this.tokens.functionType, this.tokens.name, this.tokens.leftParen, ...((_a = this.params) !== null && _a !== void 0 ? _a : []), this.tokens.rightParen, this.tokens.as, this.returnTypeExpression);
|
|
1161
|
+
}
|
|
1162
|
+
/**
|
|
1163
|
+
* Get the name of this method.
|
|
1164
|
+
*/
|
|
1165
|
+
getName(parseMode) {
|
|
1166
|
+
return this.tokens.name.text;
|
|
1167
|
+
}
|
|
1168
|
+
get isOptional() {
|
|
1169
|
+
return !!this.tokens.optional;
|
|
1170
|
+
}
|
|
1171
|
+
getLeadingTrivia() {
|
|
1172
|
+
var _a, _b;
|
|
1173
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, (_b = (_a = this.tokens.optional) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : this.tokens.functionType.leadingTrivia);
|
|
1114
1174
|
}
|
|
1115
1175
|
walk(visitor, options) {
|
|
1116
|
-
|
|
1176
|
+
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1177
|
+
(0, visitors_1.walk)(this, 'returnTypeExpression', visitor, options);
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
getTypedef(state) {
|
|
1181
|
+
var _a, _b;
|
|
1182
|
+
const result = [];
|
|
1183
|
+
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1184
|
+
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1185
|
+
}
|
|
1186
|
+
if (this.isOptional) {
|
|
1187
|
+
result.push(this.tokens.optional.text, ' ');
|
|
1188
|
+
}
|
|
1189
|
+
result.push(this.tokens.functionType.text, ' ', this.tokens.name.text, '(');
|
|
1190
|
+
const params = (_b = this.params) !== null && _b !== void 0 ? _b : [];
|
|
1191
|
+
for (let i = 0; i < params.length; i++) {
|
|
1192
|
+
if (i > 0) {
|
|
1193
|
+
result.push(', ');
|
|
1194
|
+
}
|
|
1195
|
+
const param = params[i];
|
|
1196
|
+
result.push(param.name.text);
|
|
1197
|
+
if (param.typeExpression) {
|
|
1198
|
+
result.push(' as ', ...param.typeExpression.getTypedef(state));
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
result.push(')');
|
|
1202
|
+
if (this.returnTypeExpression) {
|
|
1203
|
+
result.push(' as ', ...this.returnTypeExpression.getTypedef(state));
|
|
1204
|
+
}
|
|
1205
|
+
return result;
|
|
1206
|
+
}
|
|
1207
|
+
getType(options) {
|
|
1208
|
+
var _a, _b, _c;
|
|
1209
|
+
//if there's a defined return type, use that
|
|
1210
|
+
let returnType = (_a = this.returnTypeExpression) === null || _a === void 0 ? void 0 : _a.getType(options);
|
|
1211
|
+
const isSub = this.tokens.functionType.kind === TokenKind_1.TokenKind.Sub;
|
|
1212
|
+
//if we don't have a return type and this is a sub, set the return type to `void`. else use `dynamic`
|
|
1213
|
+
if (!returnType) {
|
|
1214
|
+
returnType = isSub ? VoidType_1.VoidType.instance : DynamicType_1.DynamicType.instance;
|
|
1215
|
+
}
|
|
1216
|
+
const resultType = new TypedFunctionType_1.TypedFunctionType(returnType);
|
|
1217
|
+
resultType.isSub = isSub;
|
|
1218
|
+
for (let param of this.params) {
|
|
1219
|
+
resultType.addParameter(param.name.text, param.getType(options), !!param.defaultValue);
|
|
1220
|
+
}
|
|
1221
|
+
if (options.typeChain) {
|
|
1222
|
+
// need Interface type for type chain
|
|
1223
|
+
(_b = this.parent) === null || _b === void 0 ? void 0 : _b.getType(options);
|
|
1224
|
+
}
|
|
1225
|
+
let funcName = this.getName(Parser_1.ParseMode.BrighterScript);
|
|
1226
|
+
resultType.setName(funcName);
|
|
1227
|
+
(_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.data, this.range));
|
|
1228
|
+
return resultType;
|
|
1117
1229
|
}
|
|
1118
1230
|
}
|
|
1119
1231
|
exports.InterfaceMethodStatement = InterfaceMethodStatement;
|
|
1120
|
-
class ClassStatement extends Statement {
|
|
1232
|
+
class ClassStatement extends AstNode_2.Statement {
|
|
1121
1233
|
constructor(classKeyword,
|
|
1122
1234
|
/**
|
|
1123
1235
|
* The name of the class (without namespace prefix)
|
|
1124
1236
|
*/
|
|
1125
|
-
name, body, end, extendsKeyword, parentClassName
|
|
1237
|
+
name, body, end, extendsKeyword, parentClassName) {
|
|
1126
1238
|
var _a, _b, _c, _d;
|
|
1127
1239
|
super();
|
|
1128
1240
|
this.classKeyword = classKeyword;
|
|
@@ -1131,16 +1243,12 @@ class ClassStatement extends Statement {
|
|
|
1131
1243
|
this.end = end;
|
|
1132
1244
|
this.extendsKeyword = extendsKeyword;
|
|
1133
1245
|
this.parentClassName = parentClassName;
|
|
1134
|
-
this.
|
|
1135
|
-
this.currentSymbolTable = currentSymbolTable;
|
|
1136
|
-
this.symbolTable = new SymbolTable_1.SymbolTable();
|
|
1137
|
-
this.memberTable = new SymbolTable_1.SymbolTable();
|
|
1246
|
+
this.kind = AstNode_1.AstNodeKind.ClassStatement;
|
|
1138
1247
|
this.memberMap = {};
|
|
1139
1248
|
this.methods = [];
|
|
1140
1249
|
this.fields = [];
|
|
1141
1250
|
this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
|
|
1142
|
-
this.symbolTable.
|
|
1143
|
-
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;
|
|
1251
|
+
this.symbolTable = new SymbolTable_2.SymbolTable(`ClassStatement: '${(_b = this.name) === null || _b === void 0 ? void 0 : _b.text}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
|
|
1144
1252
|
for (let statement of this.body) {
|
|
1145
1253
|
if ((0, reflection_1.isMethodStatement)(statement)) {
|
|
1146
1254
|
this.methods.push(statement);
|
|
@@ -1151,15 +1259,15 @@ class ClassStatement extends Statement {
|
|
|
1151
1259
|
this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
|
|
1152
1260
|
}
|
|
1153
1261
|
}
|
|
1154
|
-
this.
|
|
1155
|
-
this.memberTable.name = `Class ${name === null || name === void 0 ? void 0 : name.text} (members)`;
|
|
1262
|
+
this.range = util_1.util.createBoundingRange(classKeyword, name, extendsKeyword, parentClassName, ...(body !== null && body !== void 0 ? body : []), end);
|
|
1156
1263
|
}
|
|
1157
1264
|
getName(parseMode) {
|
|
1158
1265
|
var _a;
|
|
1159
1266
|
const name = (_a = this.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1160
1267
|
if (name) {
|
|
1161
|
-
|
|
1162
|
-
|
|
1268
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
1269
|
+
if (namespace) {
|
|
1270
|
+
let namespaceName = namespace.getName(parseMode);
|
|
1163
1271
|
let separator = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
|
|
1164
1272
|
return namespaceName + separator + name;
|
|
1165
1273
|
}
|
|
@@ -1172,35 +1280,8 @@ class ClassStatement extends Statement {
|
|
|
1172
1280
|
return undefined;
|
|
1173
1281
|
}
|
|
1174
1282
|
}
|
|
1175
|
-
|
|
1176
|
-
return
|
|
1177
|
-
}
|
|
1178
|
-
getConstructorFunctionType() {
|
|
1179
|
-
var _a, _b;
|
|
1180
|
-
const constructFunc = this.getConstructorFunction();
|
|
1181
|
-
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();
|
|
1182
|
-
constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
|
|
1183
|
-
constructorFuncType.isNew = true;
|
|
1184
|
-
return constructorFuncType;
|
|
1185
|
-
}
|
|
1186
|
-
buildSymbolTable(parentClass) {
|
|
1187
|
-
var _a, _b, _c, _d, _e;
|
|
1188
|
-
this.symbolTable.clear();
|
|
1189
|
-
this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
|
|
1190
|
-
this.memberTable.clear();
|
|
1191
|
-
if ((0, reflection_1.isClassStatement)(parentClass)) {
|
|
1192
|
-
this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
|
|
1193
|
-
this.memberTable.pushParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
|
|
1194
|
-
}
|
|
1195
|
-
for (const statement of this.methods) {
|
|
1196
|
-
statement === null || statement === void 0 ? void 0 : statement.func.symbolTable.pushParent(this.symbolTable);
|
|
1197
|
-
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
|
|
1198
|
-
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));
|
|
1199
|
-
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);
|
|
1200
|
-
}
|
|
1201
|
-
for (const statement of this.fields) {
|
|
1202
|
-
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());
|
|
1203
|
-
}
|
|
1283
|
+
getLeadingTrivia() {
|
|
1284
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.classKeyword.leadingTrivia);
|
|
1204
1285
|
}
|
|
1205
1286
|
transpile(state) {
|
|
1206
1287
|
let result = [];
|
|
@@ -1212,14 +1293,15 @@ class ClassStatement extends Statement {
|
|
|
1212
1293
|
return result;
|
|
1213
1294
|
}
|
|
1214
1295
|
getTypedef(state) {
|
|
1215
|
-
var _a
|
|
1296
|
+
var _a;
|
|
1216
1297
|
const result = [];
|
|
1217
1298
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1218
1299
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1219
1300
|
}
|
|
1220
1301
|
result.push('class ', this.name.text);
|
|
1221
1302
|
if (this.extendsKeyword && this.parentClassName) {
|
|
1222
|
-
const
|
|
1303
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
1304
|
+
const fqName = util_1.util.getFullyQualifiedClassName(this.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript));
|
|
1223
1305
|
result.push(` extends ${fqName}`);
|
|
1224
1306
|
}
|
|
1225
1307
|
result.push(state.newline);
|
|
@@ -1227,8 +1309,12 @@ class ClassStatement extends Statement {
|
|
|
1227
1309
|
let body = this.body;
|
|
1228
1310
|
//inject an empty "new" method if missing
|
|
1229
1311
|
if (!this.getConstructorFunction()) {
|
|
1312
|
+
const constructor = (0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub);
|
|
1313
|
+
constructor.parent = this;
|
|
1314
|
+
//walk the constructor to set up parent links
|
|
1315
|
+
constructor.link();
|
|
1230
1316
|
body = [
|
|
1231
|
-
|
|
1317
|
+
constructor,
|
|
1232
1318
|
...this.body
|
|
1233
1319
|
];
|
|
1234
1320
|
}
|
|
@@ -1247,13 +1333,14 @@ class ClassStatement extends Statement {
|
|
|
1247
1333
|
* The base class is index 0, its child is index 1, and so on.
|
|
1248
1334
|
*/
|
|
1249
1335
|
getParentClassIndex(state) {
|
|
1250
|
-
var _a
|
|
1336
|
+
var _a;
|
|
1251
1337
|
let myIndex = 0;
|
|
1252
1338
|
let stmt = this;
|
|
1253
1339
|
while (stmt) {
|
|
1254
1340
|
if (stmt.parentClassName) {
|
|
1341
|
+
const namespace = stmt.findAncestor(reflection_1.isNamespaceStatement);
|
|
1255
1342
|
//find the parent class
|
|
1256
|
-
stmt = (
|
|
1343
|
+
stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
|
|
1257
1344
|
myIndex++;
|
|
1258
1345
|
}
|
|
1259
1346
|
else {
|
|
@@ -1268,41 +1355,21 @@ class ClassStatement extends Statement {
|
|
|
1268
1355
|
return null;
|
|
1269
1356
|
}
|
|
1270
1357
|
}
|
|
1271
|
-
|
|
1358
|
+
hasParentClass() {
|
|
1272
1359
|
return !!this.parentClassName;
|
|
1273
1360
|
}
|
|
1274
|
-
/**
|
|
1275
|
-
* Gets an array of possible parent class names, taking into account the namespace this class was created under
|
|
1276
|
-
* @returns array of possible parent class names
|
|
1277
|
-
*/
|
|
1278
|
-
getPossibleFullParentNames() {
|
|
1279
|
-
var _a;
|
|
1280
|
-
if (!this.hasParent()) {
|
|
1281
|
-
return [];
|
|
1282
|
-
}
|
|
1283
|
-
if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
|
|
1284
|
-
// The specified parent class already has a dot, so it must already reference a namespace
|
|
1285
|
-
return [this.parentClassName.getName()];
|
|
1286
|
-
}
|
|
1287
|
-
const names = [];
|
|
1288
|
-
if (this.namespaceName) {
|
|
1289
|
-
// We're under a namespace, so the full parent name MIGHT be with this namespace too
|
|
1290
|
-
names.push(this.namespaceName.getName() + '.' + this.parentClassName.getName());
|
|
1291
|
-
}
|
|
1292
|
-
names.push(this.parentClassName.getName());
|
|
1293
|
-
return names;
|
|
1294
|
-
}
|
|
1295
1361
|
/**
|
|
1296
1362
|
* Get all ancestor classes, in closest-to-furthest order (i.e. 0 is parent, 1 is grandparent, etc...).
|
|
1297
1363
|
* This will return an empty array if no ancestors were found
|
|
1298
1364
|
*/
|
|
1299
1365
|
getAncestors(state) {
|
|
1300
|
-
var _a
|
|
1366
|
+
var _a;
|
|
1301
1367
|
let ancestors = [];
|
|
1302
1368
|
let stmt = this;
|
|
1303
1369
|
while (stmt) {
|
|
1304
1370
|
if (stmt.parentClassName) {
|
|
1305
|
-
|
|
1371
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
1372
|
+
stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
|
|
1306
1373
|
ancestors.push(stmt);
|
|
1307
1374
|
}
|
|
1308
1375
|
else {
|
|
@@ -1317,6 +1384,12 @@ class ClassStatement extends Statement {
|
|
|
1317
1384
|
}
|
|
1318
1385
|
return `__${name}_builder`;
|
|
1319
1386
|
}
|
|
1387
|
+
getConstructorType() {
|
|
1388
|
+
var _a, _b;
|
|
1389
|
+
const constructorType = (_b = (_a = this.getConstructorFunction()) === null || _a === void 0 ? void 0 : _a.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime })) !== null && _b !== void 0 ? _b : new TypedFunctionType_1.TypedFunctionType(null);
|
|
1390
|
+
constructorType.returnType = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
|
|
1391
|
+
return constructorType;
|
|
1392
|
+
}
|
|
1320
1393
|
/**
|
|
1321
1394
|
* Get the constructor function for this class (if exists), or undefined if not exist
|
|
1322
1395
|
*/
|
|
@@ -1344,7 +1417,6 @@ class ClassStatement extends Statement {
|
|
|
1344
1417
|
* without instantiating the parent constructor at that point in time.
|
|
1345
1418
|
*/
|
|
1346
1419
|
getTranspiledBuilder(state) {
|
|
1347
|
-
var _a;
|
|
1348
1420
|
let result = [];
|
|
1349
1421
|
result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
|
|
1350
1422
|
state.blockDepth++;
|
|
@@ -1356,7 +1428,8 @@ class ClassStatement extends Statement {
|
|
|
1356
1428
|
let ancestors = this.getAncestors(state);
|
|
1357
1429
|
//construct parent class or empty object
|
|
1358
1430
|
if (ancestors[0]) {
|
|
1359
|
-
|
|
1431
|
+
const ancestorNamespace = ancestors[0].findAncestor(reflection_1.isNamespaceStatement);
|
|
1432
|
+
let fullyQualifiedClassName = util_1.util.getFullyQualifiedClassName(ancestors[0].getName(Parser_1.ParseMode.BrighterScript), ancestorNamespace === null || ancestorNamespace === void 0 ? void 0 : ancestorNamespace.getName(Parser_1.ParseMode.BrighterScript));
|
|
1360
1433
|
result.push('instance = ', this.getBuilderName(fullyQualifiedClassName), '()');
|
|
1361
1434
|
}
|
|
1362
1435
|
else {
|
|
@@ -1447,10 +1520,44 @@ class ClassStatement extends Statement {
|
|
|
1447
1520
|
return result;
|
|
1448
1521
|
}
|
|
1449
1522
|
walk(visitor, options) {
|
|
1523
|
+
//visitor-less walk function to do parent linking
|
|
1524
|
+
(0, visitors_1.walk)(this, 'parentClassName', null, options);
|
|
1450
1525
|
if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
|
|
1451
1526
|
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1452
1527
|
}
|
|
1453
1528
|
}
|
|
1529
|
+
getType(options) {
|
|
1530
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1531
|
+
const superClass = (_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getType(options);
|
|
1532
|
+
const resultType = new ClassType_1.ClassType(this.getName(Parser_1.ParseMode.BrighterScript), superClass);
|
|
1533
|
+
for (const statement of this.methods) {
|
|
1534
|
+
const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
|
|
1535
|
+
let flag = SymbolTable_1.SymbolTypeFlag.runtime;
|
|
1536
|
+
if (((_b = statement.accessModifier) === null || _b === void 0 ? void 0 : _b.kind) === TokenKind_1.TokenKind.Private) {
|
|
1537
|
+
flag |= SymbolTable_1.SymbolTypeFlag.private;
|
|
1538
|
+
}
|
|
1539
|
+
if (((_c = statement.accessModifier) === null || _c === void 0 ? void 0 : _c.kind) === TokenKind_1.TokenKind.Protected) {
|
|
1540
|
+
flag |= SymbolTable_1.SymbolTypeFlag.protected;
|
|
1541
|
+
}
|
|
1542
|
+
resultType.addMember((_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text, { definingNode: statement }, funcType, flag);
|
|
1543
|
+
}
|
|
1544
|
+
for (const statement of this.fields) {
|
|
1545
|
+
const fieldType = statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
|
|
1546
|
+
let flag = SymbolTable_1.SymbolTypeFlag.runtime;
|
|
1547
|
+
if (statement.isOptional) {
|
|
1548
|
+
flag |= SymbolTable_1.SymbolTypeFlag.optional;
|
|
1549
|
+
}
|
|
1550
|
+
if (((_e = statement.accessModifier) === null || _e === void 0 ? void 0 : _e.kind) === TokenKind_1.TokenKind.Private) {
|
|
1551
|
+
flag |= SymbolTable_1.SymbolTypeFlag.private;
|
|
1552
|
+
}
|
|
1553
|
+
if (((_f = statement.accessModifier) === null || _f === void 0 ? void 0 : _f.kind) === TokenKind_1.TokenKind.Protected) {
|
|
1554
|
+
flag |= SymbolTable_1.SymbolTypeFlag.protected;
|
|
1555
|
+
}
|
|
1556
|
+
resultType.addMember((_g = statement === null || statement === void 0 ? void 0 : statement.name) === null || _g === void 0 ? void 0 : _g.text, { definingNode: statement }, fieldType, flag);
|
|
1557
|
+
}
|
|
1558
|
+
(_h = options.typeChain) === null || _h === void 0 ? void 0 : _h.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.data, this.range));
|
|
1559
|
+
return resultType;
|
|
1560
|
+
}
|
|
1454
1561
|
}
|
|
1455
1562
|
exports.ClassStatement = ClassStatement;
|
|
1456
1563
|
const accessModifiers = [
|
|
@@ -1460,8 +1567,9 @@ const accessModifiers = [
|
|
|
1460
1567
|
];
|
|
1461
1568
|
class MethodStatement extends FunctionStatement {
|
|
1462
1569
|
constructor(modifiers, name, func, override) {
|
|
1463
|
-
super(name, func
|
|
1570
|
+
super(name, func);
|
|
1464
1571
|
this.override = override;
|
|
1572
|
+
this.kind = AstNode_1.AstNodeKind.MethodStatement;
|
|
1465
1573
|
this.modifiers = [];
|
|
1466
1574
|
if (modifiers) {
|
|
1467
1575
|
if (Array.isArray(modifiers)) {
|
|
@@ -1471,19 +1579,19 @@ class MethodStatement extends FunctionStatement {
|
|
|
1471
1579
|
this.modifiers.push(modifiers);
|
|
1472
1580
|
}
|
|
1473
1581
|
}
|
|
1582
|
+
this.range = util_1.util.createBoundingRange(...(this.modifiers), override, func);
|
|
1474
1583
|
}
|
|
1475
1584
|
get accessModifier() {
|
|
1476
1585
|
return this.modifiers.find(x => accessModifiers.includes(x.kind));
|
|
1477
1586
|
}
|
|
1478
|
-
|
|
1479
|
-
|
|
1587
|
+
/**
|
|
1588
|
+
* Get the name of this method.
|
|
1589
|
+
*/
|
|
1590
|
+
getName(parseMode) {
|
|
1591
|
+
return this.name.text;
|
|
1480
1592
|
}
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
if (!this._range) {
|
|
1484
|
-
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;
|
|
1485
|
-
}
|
|
1486
|
-
return this._range;
|
|
1593
|
+
getLeadingTrivia() {
|
|
1594
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
|
|
1487
1595
|
}
|
|
1488
1596
|
transpile(state) {
|
|
1489
1597
|
if (this.name.text.toLowerCase() === 'new') {
|
|
@@ -1528,7 +1636,7 @@ class MethodStatement extends FunctionStatement {
|
|
|
1528
1636
|
if (this.override) {
|
|
1529
1637
|
result.push('override ');
|
|
1530
1638
|
}
|
|
1531
|
-
result.push(...this.func.getTypedef(state
|
|
1639
|
+
result.push(...this.func.getTypedef(state));
|
|
1532
1640
|
return result;
|
|
1533
1641
|
}
|
|
1534
1642
|
/**
|
|
@@ -1540,54 +1648,60 @@ class MethodStatement extends FunctionStatement {
|
|
|
1540
1648
|
if (state.classStatement.getAncestors(state).length === 0) {
|
|
1541
1649
|
return;
|
|
1542
1650
|
}
|
|
1543
|
-
//
|
|
1544
|
-
let
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1651
|
+
//check whether any calls to super exist
|
|
1652
|
+
let containsSuperCall = this.func.body.statements.findIndex((x) => {
|
|
1653
|
+
//is a call statement
|
|
1654
|
+
return (0, reflection_1.isExpressionStatement)(x) && (0, reflection_1.isCallExpression)(x.expression) &&
|
|
1655
|
+
//is a call to super
|
|
1656
|
+
util_1.util.findBeginningVariableExpression(x.expression.callee).name.text.toLowerCase() === 'super';
|
|
1657
|
+
}) !== -1;
|
|
1658
|
+
//if a call to super exists, quit here
|
|
1659
|
+
if (containsSuperCall) {
|
|
1550
1660
|
return;
|
|
1551
1661
|
}
|
|
1552
|
-
//this is a child class, and the
|
|
1662
|
+
//this is a child class, and the constructor doesn't contain a call to super. Inject one
|
|
1553
1663
|
const superCall = new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
|
|
1554
1664
|
kind: TokenKind_1.TokenKind.Identifier,
|
|
1555
1665
|
text: 'super',
|
|
1556
1666
|
isReserved: false,
|
|
1557
1667
|
range: state.classStatement.name.range,
|
|
1558
|
-
leadingWhitespace: ''
|
|
1559
|
-
|
|
1668
|
+
leadingWhitespace: '',
|
|
1669
|
+
leadingTrivia: []
|
|
1670
|
+
}), {
|
|
1560
1671
|
kind: TokenKind_1.TokenKind.LeftParen,
|
|
1561
1672
|
text: '(',
|
|
1562
1673
|
isReserved: false,
|
|
1563
1674
|
range: state.classStatement.name.range,
|
|
1564
|
-
leadingWhitespace: ''
|
|
1675
|
+
leadingWhitespace: '',
|
|
1676
|
+
leadingTrivia: []
|
|
1565
1677
|
}, {
|
|
1566
1678
|
kind: TokenKind_1.TokenKind.RightParen,
|
|
1567
1679
|
text: ')',
|
|
1568
1680
|
isReserved: false,
|
|
1569
1681
|
range: state.classStatement.name.range,
|
|
1570
|
-
leadingWhitespace: ''
|
|
1571
|
-
|
|
1682
|
+
leadingWhitespace: '',
|
|
1683
|
+
leadingTrivia: []
|
|
1684
|
+
}, []));
|
|
1572
1685
|
state.editor.arrayUnshift(this.func.body.statements, superCall);
|
|
1573
1686
|
}
|
|
1574
1687
|
/**
|
|
1575
1688
|
* Inject field initializers at the top of the `new` function (after any present `super()` call)
|
|
1576
1689
|
*/
|
|
1577
1690
|
injectFieldInitializersForConstructor(state) {
|
|
1578
|
-
let startingIndex = state.classStatement.
|
|
1691
|
+
let startingIndex = state.classStatement.hasParentClass() ? 1 : 0;
|
|
1579
1692
|
let newStatements = [];
|
|
1580
1693
|
//insert the field initializers in order
|
|
1581
1694
|
for (let field of state.classStatement.fields) {
|
|
1582
1695
|
let thisQualifiedName = Object.assign({}, field.name);
|
|
1583
1696
|
thisQualifiedName.text = 'm.' + field.name.text;
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
else {
|
|
1697
|
+
const fieldAssignment = field.initialValue
|
|
1698
|
+
? new AssignmentStatement(field.equal, thisQualifiedName, field.initialValue)
|
|
1699
|
+
: new AssignmentStatement((0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), thisQualifiedName,
|
|
1588
1700
|
//if there is no initial value, set the initial value to `invalid`
|
|
1589
|
-
|
|
1590
|
-
|
|
1701
|
+
(0, creators_1.createInvalidLiteral)('invalid', field.name.range));
|
|
1702
|
+
// Add parent so namespace lookups work
|
|
1703
|
+
fieldAssignment.parent = state.classStatement;
|
|
1704
|
+
newStatements.push(fieldAssignment);
|
|
1591
1705
|
}
|
|
1592
1706
|
state.editor.arraySplice(this.func.body.statements, startingIndex, 0, ...newStatements);
|
|
1593
1707
|
}
|
|
@@ -1598,33 +1712,33 @@ class MethodStatement extends FunctionStatement {
|
|
|
1598
1712
|
}
|
|
1599
1713
|
}
|
|
1600
1714
|
exports.MethodStatement = MethodStatement;
|
|
1601
|
-
class FieldStatement extends Statement {
|
|
1602
|
-
constructor(accessModifier, name, as,
|
|
1603
|
-
var _a;
|
|
1715
|
+
class FieldStatement extends AstNode_2.Statement {
|
|
1716
|
+
constructor(accessModifier, name, as, typeExpression, equal, initialValue, optional) {
|
|
1604
1717
|
super();
|
|
1605
1718
|
this.accessModifier = accessModifier;
|
|
1606
1719
|
this.name = name;
|
|
1607
1720
|
this.as = as;
|
|
1608
|
-
this.
|
|
1721
|
+
this.typeExpression = typeExpression;
|
|
1609
1722
|
this.equal = equal;
|
|
1610
1723
|
this.initialValue = initialValue;
|
|
1611
|
-
this.
|
|
1612
|
-
this.
|
|
1724
|
+
this.optional = optional;
|
|
1725
|
+
this.kind = AstNode_1.AstNodeKind.FieldStatement;
|
|
1726
|
+
this.range = util_1.util.createBoundingRange(accessModifier, optional, name, as, typeExpression, equal, initialValue);
|
|
1613
1727
|
}
|
|
1614
1728
|
/**
|
|
1615
1729
|
* Derive a ValueKind from the type token, or the initial value.
|
|
1616
1730
|
* Defaults to `DynamicType`
|
|
1617
1731
|
*/
|
|
1618
|
-
getType(
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1732
|
+
getType(options) {
|
|
1733
|
+
var _a, _b, _c, _d;
|
|
1734
|
+
return (_d = (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.typetime }))) !== null && _b !== void 0 ? _b : (_c = this.initialValue) === null || _c === void 0 ? void 0 : _c.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.runtime }))) !== null && _d !== void 0 ? _d : DynamicType_1.DynamicType.instance;
|
|
1735
|
+
}
|
|
1736
|
+
getLeadingTrivia() {
|
|
1737
|
+
var _a, _b, _c, _d, _e, _f;
|
|
1738
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, (_f = (_d = (_b = (_a = this.accessModifier) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : (_c = this.optional) === null || _c === void 0 ? void 0 : _c.leadingTrivia) !== null && _d !== void 0 ? _d : (_e = this.name) === null || _e === void 0 ? void 0 : _e.leadingTrivia) !== null && _f !== void 0 ? _f : []);
|
|
1739
|
+
}
|
|
1740
|
+
get isOptional() {
|
|
1741
|
+
return !!this.optional;
|
|
1628
1742
|
}
|
|
1629
1743
|
transpile(state) {
|
|
1630
1744
|
throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
|
|
@@ -1636,30 +1750,34 @@ class FieldStatement extends Statement {
|
|
|
1636
1750
|
for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
|
|
1637
1751
|
result.push(...annotation.getTypedef(state), state.newline, state.indent());
|
|
1638
1752
|
}
|
|
1639
|
-
let type = this.getType(
|
|
1640
|
-
if (
|
|
1753
|
+
let type = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.typetime });
|
|
1754
|
+
if ((0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
|
|
1641
1755
|
type = new DynamicType_1.DynamicType();
|
|
1642
1756
|
}
|
|
1643
|
-
result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' '
|
|
1757
|
+
result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ');
|
|
1758
|
+
if (this.isOptional) {
|
|
1759
|
+
result.push(this.optional.text, ' ');
|
|
1760
|
+
}
|
|
1761
|
+
result.push((_d = this.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
|
|
1644
1762
|
}
|
|
1645
1763
|
return result;
|
|
1646
1764
|
}
|
|
1647
1765
|
walk(visitor, options) {
|
|
1648
1766
|
if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
|
|
1649
|
-
(0, visitors_1.walk)(this, '
|
|
1767
|
+
(0, visitors_1.walk)(this, 'typeExpression', visitor, options);
|
|
1650
1768
|
(0, visitors_1.walk)(this, 'initialValue', visitor, options);
|
|
1651
1769
|
}
|
|
1652
1770
|
}
|
|
1653
1771
|
}
|
|
1654
1772
|
exports.FieldStatement = FieldStatement;
|
|
1655
|
-
class TryCatchStatement extends Statement {
|
|
1773
|
+
class TryCatchStatement extends AstNode_2.Statement {
|
|
1656
1774
|
constructor(tokens, tryBranch, catchStatement) {
|
|
1657
|
-
var _a;
|
|
1658
1775
|
super();
|
|
1659
1776
|
this.tokens = tokens;
|
|
1660
1777
|
this.tryBranch = tryBranch;
|
|
1661
1778
|
this.catchStatement = catchStatement;
|
|
1662
|
-
this.
|
|
1779
|
+
this.kind = AstNode_1.AstNodeKind.TryCatchStatement;
|
|
1780
|
+
this.range = util_1.util.createBoundingRange(tokens.try, tryBranch, catchStatement, tokens.endTry);
|
|
1663
1781
|
}
|
|
1664
1782
|
transpile(state) {
|
|
1665
1783
|
var _a, _b;
|
|
@@ -1682,16 +1800,14 @@ class TryCatchStatement extends Statement {
|
|
|
1682
1800
|
}
|
|
1683
1801
|
}
|
|
1684
1802
|
exports.TryCatchStatement = TryCatchStatement;
|
|
1685
|
-
class CatchStatement extends Statement {
|
|
1803
|
+
class CatchStatement extends AstNode_2.Statement {
|
|
1686
1804
|
constructor(tokens, exceptionVariable, catchBranch) {
|
|
1687
1805
|
super();
|
|
1688
1806
|
this.tokens = tokens;
|
|
1689
1807
|
this.exceptionVariable = exceptionVariable;
|
|
1690
1808
|
this.catchBranch = catchBranch;
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
var _a, _b;
|
|
1694
|
-
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);
|
|
1809
|
+
this.kind = AstNode_1.AstNodeKind.CatchStatement;
|
|
1810
|
+
this.range = util_1.util.createBoundingRange(tokens.catch, exceptionVariable, catchBranch);
|
|
1695
1811
|
}
|
|
1696
1812
|
transpile(state) {
|
|
1697
1813
|
var _a, _b, _c, _d;
|
|
@@ -1709,13 +1825,13 @@ class CatchStatement extends Statement {
|
|
|
1709
1825
|
}
|
|
1710
1826
|
}
|
|
1711
1827
|
exports.CatchStatement = CatchStatement;
|
|
1712
|
-
class ThrowStatement extends Statement {
|
|
1828
|
+
class ThrowStatement extends AstNode_2.Statement {
|
|
1713
1829
|
constructor(throwToken, expression) {
|
|
1714
|
-
var _a;
|
|
1715
1830
|
super();
|
|
1716
1831
|
this.throwToken = throwToken;
|
|
1717
1832
|
this.expression = expression;
|
|
1718
|
-
this.
|
|
1833
|
+
this.kind = AstNode_1.AstNodeKind.ThrowStatement;
|
|
1834
|
+
this.range = util_1.util.createBoundingRange(throwToken, expression);
|
|
1719
1835
|
}
|
|
1720
1836
|
transpile(state) {
|
|
1721
1837
|
const result = [
|
|
@@ -1739,17 +1855,18 @@ class ThrowStatement extends Statement {
|
|
|
1739
1855
|
}
|
|
1740
1856
|
}
|
|
1741
1857
|
exports.ThrowStatement = ThrowStatement;
|
|
1742
|
-
class EnumStatement extends Statement {
|
|
1743
|
-
constructor(tokens, body
|
|
1744
|
-
var _a
|
|
1858
|
+
class EnumStatement extends AstNode_2.Statement {
|
|
1859
|
+
constructor(tokens, body) {
|
|
1860
|
+
var _a;
|
|
1745
1861
|
super();
|
|
1746
1862
|
this.tokens = tokens;
|
|
1747
1863
|
this.body = body;
|
|
1748
|
-
this.
|
|
1749
|
-
this.symbolTable = new
|
|
1750
|
-
this.
|
|
1751
|
-
|
|
1752
|
-
|
|
1864
|
+
this.kind = AstNode_1.AstNodeKind.EnumStatement;
|
|
1865
|
+
this.symbolTable = new SymbolTable_2.SymbolTable('Enum');
|
|
1866
|
+
this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
|
|
1867
|
+
}
|
|
1868
|
+
get range() {
|
|
1869
|
+
return util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum);
|
|
1753
1870
|
}
|
|
1754
1871
|
getMembers() {
|
|
1755
1872
|
const result = [];
|
|
@@ -1760,12 +1877,15 @@ class EnumStatement extends Statement {
|
|
|
1760
1877
|
}
|
|
1761
1878
|
return result;
|
|
1762
1879
|
}
|
|
1880
|
+
getLeadingTrivia() {
|
|
1881
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.enum.leadingTrivia);
|
|
1882
|
+
}
|
|
1763
1883
|
/**
|
|
1764
1884
|
* Get a map of member names and their values.
|
|
1765
1885
|
* All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
|
|
1766
1886
|
*/
|
|
1767
1887
|
getMemberValueMap() {
|
|
1768
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
1888
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1769
1889
|
const result = new Map();
|
|
1770
1890
|
const members = this.getMembers();
|
|
1771
1891
|
let currentIntValue = 0;
|
|
@@ -1784,10 +1904,14 @@ class EnumStatement extends Statement {
|
|
|
1784
1904
|
currentIntValue++;
|
|
1785
1905
|
}
|
|
1786
1906
|
result.set((_c = member.name) === null || _c === void 0 ? void 0 : _c.toLowerCase(), member.value.token.text);
|
|
1907
|
+
//simple unary expressions (like `-1`)
|
|
1908
|
+
}
|
|
1909
|
+
else if ((0, reflection_1.isUnaryExpression)(member.value) && (0, reflection_1.isLiteralExpression)(member.value.right)) {
|
|
1910
|
+
result.set((_d = member.name) === null || _d === void 0 ? void 0 : _d.toLowerCase(), member.value.operator.text + member.value.right.token.text);
|
|
1787
1911
|
//all other values
|
|
1788
1912
|
}
|
|
1789
1913
|
else {
|
|
1790
|
-
result.set((
|
|
1914
|
+
result.set((_e = member.name) === null || _e === void 0 ? void 0 : _e.toLowerCase(), (_h = (_g = (_f = member.value) === null || _f === void 0 ? void 0 : _f.token) === null || _g === void 0 ? void 0 : _g.text) !== null && _h !== void 0 ? _h : 'invalid');
|
|
1791
1915
|
}
|
|
1792
1916
|
}
|
|
1793
1917
|
return result;
|
|
@@ -1795,12 +1919,6 @@ class EnumStatement extends Statement {
|
|
|
1795
1919
|
getMemberValue(name) {
|
|
1796
1920
|
return this.getMemberValueMap().get(name.toLowerCase());
|
|
1797
1921
|
}
|
|
1798
|
-
buildSymbolTable() {
|
|
1799
|
-
this.symbolTable.clear();
|
|
1800
|
-
for (const member of this.getMembers()) {
|
|
1801
|
-
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));
|
|
1802
|
-
}
|
|
1803
|
-
}
|
|
1804
1922
|
/**
|
|
1805
1923
|
* The name of the enum (without the namespace prefix)
|
|
1806
1924
|
*/
|
|
@@ -1815,8 +1933,9 @@ class EnumStatement extends Statement {
|
|
|
1815
1933
|
var _a;
|
|
1816
1934
|
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1817
1935
|
if (name) {
|
|
1818
|
-
|
|
1819
|
-
|
|
1936
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
1937
|
+
if (namespace) {
|
|
1938
|
+
let namespaceName = namespace.getName(Parser_1.ParseMode.BrighterScript);
|
|
1820
1939
|
return `${namespaceName}.${name}`;
|
|
1821
1940
|
}
|
|
1822
1941
|
else {
|
|
@@ -1828,9 +1947,6 @@ class EnumStatement extends Statement {
|
|
|
1828
1947
|
return undefined;
|
|
1829
1948
|
}
|
|
1830
1949
|
}
|
|
1831
|
-
getThisBscType() {
|
|
1832
|
-
return new EnumType_1.EnumType(this.fullName, this.symbolTable);
|
|
1833
|
-
}
|
|
1834
1950
|
transpile(state) {
|
|
1835
1951
|
//enum declarations do not exist at runtime, so don't transpile anything...
|
|
1836
1952
|
return [];
|
|
@@ -1858,15 +1974,27 @@ class EnumStatement extends Statement {
|
|
|
1858
1974
|
(0, visitors_1.walkArray)(this.body, visitor, options, this);
|
|
1859
1975
|
}
|
|
1860
1976
|
}
|
|
1977
|
+
getType(options) {
|
|
1978
|
+
var _a, _b, _c;
|
|
1979
|
+
const members = this.getMembers();
|
|
1980
|
+
const resultType = new EnumType_1.EnumType(this.fullName, (_a = members[0]) === null || _a === void 0 ? void 0 : _a.getType(options).underlyingType);
|
|
1981
|
+
resultType.pushMemberProvider(() => this.getSymbolTable());
|
|
1982
|
+
for (const statement of members) {
|
|
1983
|
+
resultType.addMember((_c = (_b = statement === null || statement === void 0 ? void 0 : statement.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
|
|
1984
|
+
}
|
|
1985
|
+
return resultType;
|
|
1986
|
+
}
|
|
1861
1987
|
}
|
|
1862
1988
|
exports.EnumStatement = EnumStatement;
|
|
1863
|
-
class EnumMemberStatement extends Statement {
|
|
1989
|
+
class EnumMemberStatement extends AstNode_2.Statement {
|
|
1864
1990
|
constructor(tokens, value) {
|
|
1865
|
-
var _a;
|
|
1866
1991
|
super();
|
|
1867
1992
|
this.tokens = tokens;
|
|
1868
1993
|
this.value = value;
|
|
1869
|
-
this.
|
|
1994
|
+
this.kind = AstNode_1.AstNodeKind.EnumMemberStatement;
|
|
1995
|
+
}
|
|
1996
|
+
get range() {
|
|
1997
|
+
return util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value);
|
|
1870
1998
|
}
|
|
1871
1999
|
/**
|
|
1872
2000
|
* The name of the member
|
|
@@ -1874,6 +2002,9 @@ class EnumMemberStatement extends Statement {
|
|
|
1874
2002
|
get name() {
|
|
1875
2003
|
return this.tokens.name.text;
|
|
1876
2004
|
}
|
|
2005
|
+
getLeadingTrivia() {
|
|
2006
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.name.leadingTrivia);
|
|
2007
|
+
}
|
|
1877
2008
|
transpile(state) {
|
|
1878
2009
|
return [];
|
|
1879
2010
|
}
|
|
@@ -1894,19 +2025,26 @@ class EnumMemberStatement extends Statement {
|
|
|
1894
2025
|
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
1895
2026
|
}
|
|
1896
2027
|
}
|
|
2028
|
+
getType(options) {
|
|
2029
|
+
var _a, _b, _c, _d;
|
|
2030
|
+
return new EnumType_1.EnumMemberType((_a = this.parent) === null || _a === void 0 ? void 0 : _a.fullName, (_c = (_b = this.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, (_d = this.value) === null || _d === void 0 ? void 0 : _d.getType(options));
|
|
2031
|
+
}
|
|
1897
2032
|
}
|
|
1898
2033
|
exports.EnumMemberStatement = EnumMemberStatement;
|
|
1899
|
-
class ConstStatement extends Statement {
|
|
1900
|
-
constructor(tokens, value
|
|
2034
|
+
class ConstStatement extends AstNode_2.Statement {
|
|
2035
|
+
constructor(tokens, value) {
|
|
1901
2036
|
super();
|
|
1902
2037
|
this.tokens = tokens;
|
|
1903
2038
|
this.value = value;
|
|
1904
|
-
this.
|
|
2039
|
+
this.kind = AstNode_1.AstNodeKind.ConstStatement;
|
|
1905
2040
|
this.range = util_1.util.createBoundingRange(this.tokens.const, this.tokens.name, this.tokens.equals, this.value);
|
|
1906
2041
|
}
|
|
1907
2042
|
get name() {
|
|
1908
2043
|
return this.tokens.name.text;
|
|
1909
2044
|
}
|
|
2045
|
+
getLeadingTrivia() {
|
|
2046
|
+
return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.const.leadingTrivia);
|
|
2047
|
+
}
|
|
1910
2048
|
/**
|
|
1911
2049
|
* The name of the statement WITH its leading namespace (if applicable)
|
|
1912
2050
|
*/
|
|
@@ -1914,8 +2052,9 @@ class ConstStatement extends Statement {
|
|
|
1914
2052
|
var _a;
|
|
1915
2053
|
const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
|
|
1916
2054
|
if (name) {
|
|
1917
|
-
|
|
1918
|
-
|
|
2055
|
+
const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
|
|
2056
|
+
if (namespace) {
|
|
2057
|
+
let namespaceName = namespace.getName(Parser_1.ParseMode.BrighterScript);
|
|
1919
2058
|
return `${namespaceName}.${name}`;
|
|
1920
2059
|
}
|
|
1921
2060
|
else {
|
|
@@ -1947,6 +2086,29 @@ class ConstStatement extends Statement {
|
|
|
1947
2086
|
(0, visitors_1.walk)(this, 'value', visitor, options);
|
|
1948
2087
|
}
|
|
1949
2088
|
}
|
|
2089
|
+
getType(options) {
|
|
2090
|
+
return this.value.getType(options);
|
|
2091
|
+
}
|
|
1950
2092
|
}
|
|
1951
2093
|
exports.ConstStatement = ConstStatement;
|
|
2094
|
+
class ContinueStatement extends AstNode_2.Statement {
|
|
2095
|
+
constructor(tokens) {
|
|
2096
|
+
super();
|
|
2097
|
+
this.tokens = tokens;
|
|
2098
|
+
this.kind = AstNode_1.AstNodeKind.ContinueStatement;
|
|
2099
|
+
this.range = util_1.util.createBoundingRange(tokens.continue, tokens.loopType);
|
|
2100
|
+
}
|
|
2101
|
+
transpile(state) {
|
|
2102
|
+
var _a, _b, _c, _d, _e;
|
|
2103
|
+
return [
|
|
2104
|
+
state.sourceNode(this.tokens.continue, (_b = (_a = this.tokens.continue) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'continue'),
|
|
2105
|
+
(_d = (_c = this.tokens.loopType) === null || _c === void 0 ? void 0 : _c.leadingWhitespace) !== null && _d !== void 0 ? _d : ' ',
|
|
2106
|
+
state.sourceNode(this.tokens.continue, (_e = this.tokens.loopType) === null || _e === void 0 ? void 0 : _e.text)
|
|
2107
|
+
];
|
|
2108
|
+
}
|
|
2109
|
+
walk(visitor, options) {
|
|
2110
|
+
//nothing to walk
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
exports.ContinueStatement = ContinueStatement;
|
|
1952
2114
|
//# sourceMappingURL=Statement.js.map
|