brighterscript 1.0.0-alpha.5 → 1.0.0-alpha.50
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/README.md +76 -138
- package/bsconfig.schema.json +121 -5
- 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 +45 -0
- package/dist/AstValidationSegmenter.js +322 -0
- package/dist/AstValidationSegmenter.js.map +1 -0
- package/dist/BsConfig.d.ts +72 -39
- package/dist/BusyStatusTracker.d.ts +61 -0
- package/dist/BusyStatusTracker.js +148 -0
- package/dist/BusyStatusTracker.js.map +1 -0
- package/dist/Cache.d.ts +3 -8
- package/dist/Cache.js +9 -14
- 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 +12 -4
- package/dist/CodeActionUtil.js +22 -5
- package/dist/CodeActionUtil.js.map +1 -1
- package/dist/CommentFlagProcessor.d.ts +7 -6
- package/dist/CommentFlagProcessor.js +11 -8
- package/dist/CommentFlagProcessor.js.map +1 -1
- package/dist/CrossScopeValidator.d.ts +68 -0
- package/dist/CrossScopeValidator.js +642 -0
- package/dist/CrossScopeValidator.js.map +1 -0
- package/dist/DependencyGraph.d.ts +8 -3
- package/dist/DependencyGraph.js +49 -16
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticCollection.d.ts +21 -5
- package/dist/DiagnosticCollection.js +77 -24
- package/dist/DiagnosticCollection.js.map +1 -1
- package/dist/DiagnosticFilterer.d.ts +27 -6
- package/dist/DiagnosticFilterer.js +273 -60
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticManager.d.ts +82 -0
- package/dist/DiagnosticManager.js +406 -0
- package/dist/DiagnosticManager.js.map +1 -0
- package/dist/DiagnosticMessages.d.ts +558 -196
- package/dist/DiagnosticMessages.js +870 -340
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/DiagnosticSeverityAdjuster.d.ts +7 -0
- package/dist/DiagnosticSeverityAdjuster.js +45 -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 +100 -105
- package/dist/LanguageServer.js +444 -745
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +17 -13
- package/dist/Logger.js +64 -34
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.d.ts +32 -10
- package/dist/PluginInterface.js +117 -7
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +241 -98
- package/dist/Program.js +1432 -717
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +47 -23
- package/dist/ProgramBuilder.js +224 -178
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +149 -109
- package/dist/Scope.js +557 -550
- package/dist/Scope.js.map +1 -1
- package/dist/SemanticTokenUtils.js +5 -1
- package/dist/SemanticTokenUtils.js.map +1 -1
- package/dist/Stopwatch.d.ts +4 -0
- package/dist/Stopwatch.js +8 -1
- package/dist/Stopwatch.js.map +1 -1
- package/dist/SymbolTable.d.ts +136 -24
- package/dist/SymbolTable.js +565 -64
- package/dist/SymbolTable.js.map +1 -1
- package/dist/SymbolTypeFlag.d.ts +9 -0
- package/dist/SymbolTypeFlag.js +14 -0
- package/dist/SymbolTypeFlag.js.map +1 -0
- 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 +5 -15
- package/dist/XmlScope.js +34 -90
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/CachedLookups.d.ts +50 -0
- package/dist/astUtils/CachedLookups.js +334 -0
- package/dist/astUtils/CachedLookups.js.map +1 -0
- package/dist/astUtils/CachedLookups.spec.js +39 -0
- package/dist/astUtils/CachedLookups.spec.js.map +1 -0
- package/dist/astUtils/Editor.d.ts +69 -0
- package/dist/astUtils/Editor.js +245 -0
- package/dist/astUtils/Editor.js.map +1 -0
- package/dist/astUtils/Editor.spec.js +258 -0
- package/dist/astUtils/Editor.spec.js.map +1 -0
- package/dist/astUtils/creators.d.ts +54 -19
- package/dist/astUtils/creators.js +242 -42
- 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 +196 -85
- package/dist/astUtils/reflection.js +497 -144
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +267 -167
- package/dist/astUtils/reflection.spec.js.map +1 -1
- package/dist/astUtils/stackedVisitor.js.map +1 -1
- package/dist/astUtils/stackedVisitor.spec.js +14 -14
- package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +116 -53
- package/dist/astUtils/visitors.js +95 -15
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +629 -51
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/astUtils/xml.d.ts +9 -8
- package/dist/astUtils/xml.js +12 -7
- package/dist/astUtils/xml.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +24 -4
- package/dist/bscPlugin/BscPlugin.js +88 -4
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
- package/dist/bscPlugin/CallExpressionInfo.js +143 -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 +137 -0
- package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +6 -5
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +173 -27
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +138 -21
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +65 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.js +633 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +2512 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/definition/DefinitionProvider.d.ts +13 -0
- package/dist/bscPlugin/definition/DefinitionProvider.js +212 -0
- package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
- package/dist/bscPlugin/definition/DefinitionProvider.spec.js +87 -0
- package/dist/bscPlugin/definition/DefinitionProvider.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 +18 -0
- package/dist/bscPlugin/hover/HoverProcessor.js +230 -0
- package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.js +991 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/references/ReferencesProvider.d.ts +12 -0
- package/dist/bscPlugin/references/ReferencesProvider.js +57 -0
- package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -0
- package/dist/bscPlugin/references/ReferencesProvider.spec.d.ts +1 -0
- package/dist/bscPlugin/references/ReferencesProvider.spec.js +51 -0
- package/dist/bscPlugin/references/ReferencesProvider.spec.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +14 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +164 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +564 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/serialize/BslibInjector.spec.d.ts +1 -0
- package/dist/bscPlugin/serialize/BslibInjector.spec.js +33 -0
- package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
- package/dist/bscPlugin/serialize/BslibManager.d.ts +12 -0
- package/dist/bscPlugin/serialize/BslibManager.js +46 -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 +75 -0
- package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
- package/dist/bscPlugin/symbols/DocumentSymbolProcessor.d.ts +7 -0
- package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js +22 -0
- package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js.map +1 -0
- package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js +291 -0
- package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.d.ts +7 -0
- package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js +26 -0
- package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js.map +1 -0
- package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js +245 -0
- package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/symbols/symbolUtils.d.ts +5 -0
- package/dist/bscPlugin/symbols/symbolUtils.js +141 -0
- package/dist/bscPlugin/symbols/symbolUtils.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +27 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +418 -0
- 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 +75 -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/BrsFileAfterValidator.d.ts +7 -0
- package/dist/bscPlugin/validation/BrsFileAfterValidator.js +18 -0
- package/dist/bscPlugin/validation/BrsFileAfterValidator.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +37 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js +638 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.spec.js +1517 -0
- package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -0
- package/dist/bscPlugin/validation/ProgramValidator.d.ts +11 -0
- package/dist/bscPlugin/validation/ProgramValidator.js +33 -0
- package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +141 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +1323 -0
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.spec.js +6135 -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 +36 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
- package/dist/cli.js +126 -27
- package/dist/cli.js.map +1 -1
- package/dist/common/Sequencer.d.ts +53 -0
- package/dist/common/Sequencer.js +233 -0
- package/dist/common/Sequencer.js.map +1 -0
- package/dist/common/Sequencer.spec.d.ts +1 -0
- package/dist/common/Sequencer.spec.js +75 -0
- package/dist/common/Sequencer.spec.js.map +1 -0
- package/dist/deferred.d.ts +5 -3
- package/dist/deferred.js +10 -0
- package/dist/deferred.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +10 -3
- package/dist/diagnosticUtils.js +64 -25
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/examples/plugins/removePrint.d.ts +2 -2
- package/dist/examples/plugins/removePrint.js +8 -12
- package/dist/examples/plugins/removePrint.js.map +1 -1
- package/dist/files/AssetFile.d.ts +24 -0
- package/dist/files/AssetFile.js +25 -0
- package/dist/files/AssetFile.js.map +1 -0
- package/dist/files/BrsFile.Class.spec.js +1213 -259
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +145 -87
- package/dist/files/BrsFile.js +836 -934
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +4226 -902
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/BscFile.d.ts +102 -0
- package/dist/files/BscFile.js +15 -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 +21 -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 +80 -41
- package/dist/files/XmlFile.js +161 -137
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +444 -336
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +62 -52
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
- package/dist/files/tests/optionalChaning.spec.js +152 -0
- package/dist/files/tests/optionalChaning.spec.js.map +1 -0
- package/dist/globalCallables.d.ts +3 -1
- package/dist/globalCallables.js +424 -184
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +32 -4
- package/dist/index.js +54 -7
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +942 -125
- package/dist/interfaces.js +21 -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 +51 -12
- package/dist/lexer/Lexer.js +215 -65
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +812 -568
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/Token.d.ts +27 -11
- package/dist/lexer/Token.js +10 -2
- package/dist/lexer/Token.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +40 -2
- package/dist/lexer/TokenKind.js +147 -10
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/logging.d.ts +14 -0
- package/dist/logging.js +29 -0
- package/dist/logging.js.map +1 -0
- package/dist/lsp/ActionQueue.d.ts +35 -0
- package/dist/lsp/ActionQueue.js +115 -0
- package/dist/lsp/ActionQueue.js.map +1 -0
- package/dist/lsp/ActionQueue.spec.d.ts +1 -0
- package/dist/lsp/ActionQueue.spec.js +80 -0
- package/dist/lsp/ActionQueue.spec.js.map +1 -0
- package/dist/lsp/DocumentManager.d.ts +63 -0
- package/dist/lsp/DocumentManager.js +122 -0
- package/dist/lsp/DocumentManager.js.map +1 -0
- package/dist/lsp/DocumentManager.spec.d.ts +1 -0
- package/dist/lsp/DocumentManager.spec.js +103 -0
- package/dist/lsp/DocumentManager.spec.js.map +1 -0
- package/dist/lsp/LspProject.d.ts +239 -0
- package/dist/lsp/LspProject.js +3 -0
- package/dist/lsp/LspProject.js.map +1 -0
- package/dist/lsp/PathFilterer.d.ts +75 -0
- package/dist/lsp/PathFilterer.js +196 -0
- package/dist/lsp/PathFilterer.js.map +1 -0
- package/dist/lsp/PathFilterer.spec.d.ts +1 -0
- package/dist/lsp/PathFilterer.spec.js +182 -0
- package/dist/lsp/PathFilterer.spec.js.map +1 -0
- package/dist/lsp/Project.d.ts +168 -0
- package/dist/lsp/Project.js +437 -0
- package/dist/lsp/Project.js.map +1 -0
- package/dist/lsp/Project.spec.d.ts +1 -0
- package/dist/lsp/Project.spec.js +267 -0
- package/dist/lsp/Project.spec.js.map +1 -0
- package/dist/lsp/ProjectManager.d.ts +242 -0
- package/dist/lsp/ProjectManager.js +824 -0
- package/dist/lsp/ProjectManager.js.map +1 -0
- package/dist/lsp/ProjectManager.spec.d.ts +1 -0
- package/dist/lsp/ProjectManager.spec.js +913 -0
- package/dist/lsp/ProjectManager.spec.js.map +1 -0
- package/dist/lsp/ReaderWriterManager.d.ts +21 -0
- package/dist/lsp/ReaderWriterManager.js +60 -0
- package/dist/lsp/ReaderWriterManager.js.map +1 -0
- package/dist/lsp/worker/MessageHandler.d.ts +99 -0
- package/dist/lsp/worker/MessageHandler.js +138 -0
- package/dist/lsp/worker/MessageHandler.js.map +1 -0
- package/dist/lsp/worker/MessageHandler.spec.d.ts +1 -0
- package/dist/lsp/worker/MessageHandler.spec.js +64 -0
- package/dist/lsp/worker/MessageHandler.spec.js.map +1 -0
- package/dist/lsp/worker/WorkerPool.d.ts +38 -0
- package/dist/lsp/worker/WorkerPool.js +78 -0
- package/dist/lsp/worker/WorkerPool.js.map +1 -0
- package/dist/lsp/worker/WorkerPool.spec.d.ts +1 -0
- package/dist/lsp/worker/WorkerPool.spec.js +59 -0
- package/dist/lsp/worker/WorkerPool.spec.js.map +1 -0
- package/dist/lsp/worker/WorkerThreadProject.d.ts +143 -0
- package/dist/lsp/worker/WorkerThreadProject.js +189 -0
- package/dist/lsp/worker/WorkerThreadProject.js.map +1 -0
- package/dist/lsp/worker/WorkerThreadProject.spec.d.ts +2 -0
- package/dist/lsp/worker/WorkerThreadProject.spec.js +71 -0
- package/dist/lsp/worker/WorkerThreadProject.spec.js.map +1 -0
- package/dist/lsp/worker/WorkerThreadProjectRunner.d.ts +15 -0
- package/dist/lsp/worker/WorkerThreadProjectRunner.js +58 -0
- package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -0
- package/dist/lsp/worker/run.d.ts +1 -0
- package/dist/lsp/worker/run.js +14 -0
- package/dist/lsp/worker/run.js.map +1 -0
- package/dist/parser/AstNode.d.ts +203 -0
- package/dist/parser/AstNode.js +303 -0
- package/dist/parser/AstNode.js.map +1 -0
- package/dist/parser/AstNode.spec.d.ts +1 -0
- package/dist/parser/AstNode.spec.js +1455 -0
- package/dist/parser/AstNode.spec.js.map +1 -0
- package/dist/parser/BrightScriptDocParser.d.ts +56 -0
- package/dist/parser/BrightScriptDocParser.js +294 -0
- package/dist/parser/BrightScriptDocParser.js.map +1 -0
- package/dist/parser/BrightScriptDocParser.spec.d.ts +1 -0
- package/dist/parser/BrightScriptDocParser.spec.js +310 -0
- package/dist/parser/BrightScriptDocParser.spec.js.map +1 -0
- package/dist/parser/BrsTranspileState.d.ts +22 -3
- package/dist/parser/BrsTranspileState.js +19 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +553 -221
- package/dist/parser/Expression.js +1414 -505
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Expression.spec.d.ts +1 -0
- package/dist/parser/Expression.spec.js +40 -0
- package/dist/parser/Expression.spec.js.map +1 -0
- package/dist/parser/Parser.Class.spec.js +255 -125
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +117 -124
- package/dist/parser/Parser.js +1669 -982
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.d.ts +3 -1
- package/dist/parser/Parser.spec.js +2111 -525
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGParser.d.ts +29 -13
- package/dist/parser/SGParser.js +85 -56
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +30 -45
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +134 -46
- package/dist/parser/SGTypes.js +206 -115
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/Statement.d.ts +849 -267
- package/dist/parser/Statement.js +2412 -625
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +133 -36
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/TranspileState.d.ts +26 -12
- package/dist/parser/TranspileState.js +115 -24
- package/dist/parser/TranspileState.js.map +1 -1
- package/dist/parser/tests/Parser.spec.d.ts +3 -9
- package/dist/parser/tests/Parser.spec.js +7 -13
- package/dist/parser/tests/Parser.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/For.spec.js +83 -75
- package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/ForEach.spec.js +85 -51
- package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/If.spec.js +382 -239
- package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/While.spec.js +52 -45
- package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
- package/dist/parser/tests/expression/Additive.spec.js +51 -43
- package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
- package/dist/parser/tests/expression/ArrayLiterals.spec.js +192 -142
- package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +236 -160
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/Boolean.spec.js +41 -34
- package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
- package/dist/parser/tests/expression/Call.spec.js +173 -55
- package/dist/parser/tests/expression/Call.spec.js.map +1 -1
- package/dist/parser/tests/expression/Exponential.spec.js +20 -20
- package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
- package/dist/parser/tests/expression/Function.spec.js +291 -282
- package/dist/parser/tests/expression/Function.spec.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +193 -110
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/dist/parser/tests/expression/Multiplicative.spec.js +42 -42
- package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +260 -115
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/PrefixUnary.spec.js +58 -52
- package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
- package/dist/parser/tests/expression/Primary.spec.js +76 -60
- package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
- package/dist/parser/tests/expression/Relational.spec.js +50 -50
- package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +31 -31
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +281 -94
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +747 -192
- 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 +126 -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 +44 -44
- package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
- package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
- package/dist/parser/tests/statement/ConstStatement.spec.js +500 -0
- package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
- 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 +61 -55
- package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
- package/dist/parser/tests/statement/Dim.spec.js +29 -22
- package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +744 -0
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
- package/dist/parser/tests/statement/For.spec.d.ts +1 -0
- package/dist/parser/tests/statement/For.spec.js +45 -0
- package/dist/parser/tests/statement/For.spec.js.map +1 -0
- package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
- package/dist/parser/tests/statement/ForEach.spec.js +36 -0
- package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
- package/dist/parser/tests/statement/Function.spec.js +226 -215
- package/dist/parser/tests/statement/Function.spec.js.map +1 -1
- package/dist/parser/tests/statement/Goto.spec.js +16 -15
- package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
- package/dist/parser/tests/statement/Increment.spec.js +64 -61
- package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +110 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
- package/dist/parser/tests/statement/LibraryStatement.spec.js +22 -22
- package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Misc.spec.js +127 -168
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +133 -114
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/ReturnStatement.spec.js +57 -54
- package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Set.spec.js +131 -117
- package/dist/parser/tests/statement/Set.spec.js.map +1 -1
- package/dist/parser/tests/statement/Stop.spec.js +14 -13
- package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
- package/dist/parser/tests/statement/Throw.spec.js +11 -8
- package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
- package/dist/parser/tests/statement/TryCatch.spec.js +26 -15
- package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
- package/dist/preprocessor/Manifest.d.ts +6 -6
- package/dist/preprocessor/Manifest.js +17 -38
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/preprocessor/Manifest.spec.d.ts +1 -0
- package/dist/preprocessor/Manifest.spec.js +78 -103
- package/dist/preprocessor/Manifest.spec.js.map +1 -1
- package/dist/roku-types/data.json +20347 -0
- package/dist/roku-types/index.d.ts +5726 -0
- package/dist/roku-types/index.js +11 -0
- package/dist/roku-types/index.js.map +1 -0
- package/dist/types/ArrayType.d.ts +12 -5
- package/dist/types/ArrayType.js +89 -24
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +39 -11
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/AssociativeArrayType.d.ts +15 -0
- package/dist/types/AssociativeArrayType.js +64 -0
- package/dist/types/AssociativeArrayType.js.map +1 -0
- package/dist/types/BaseFunctionType.d.ts +10 -0
- package/dist/types/BaseFunctionType.js +26 -0
- package/dist/types/BaseFunctionType.js.map +1 -0
- package/dist/types/BooleanType.d.ts +9 -5
- package/dist/types/BooleanType.js +19 -8
- package/dist/types/BooleanType.js.map +1 -1
- package/dist/types/BooleanType.spec.js +10 -4
- package/dist/types/BooleanType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +41 -3
- package/dist/types/BscType.js +152 -0
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/BscTypeKind.d.ts +28 -0
- package/dist/types/BscTypeKind.js +33 -0
- package/dist/types/BscTypeKind.js.map +1 -0
- package/dist/types/BuiltInInterfaceAdder.d.ts +28 -0
- package/dist/types/BuiltInInterfaceAdder.js +212 -0
- package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
- package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
- package/dist/types/BuiltInInterfaceAdder.spec.js +115 -0
- package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
- package/dist/types/CallFuncableType.d.ts +24 -0
- package/dist/types/CallFuncableType.js +91 -0
- package/dist/types/CallFuncableType.js.map +1 -0
- package/dist/types/ClassType.d.ts +17 -0
- package/dist/types/ClassType.js +60 -0
- package/dist/types/ClassType.js.map +1 -0
- package/dist/types/ClassType.spec.d.ts +1 -0
- package/dist/types/ClassType.spec.js +76 -0
- package/dist/types/ClassType.spec.js.map +1 -0
- package/dist/types/ComponentType.d.ts +22 -0
- package/dist/types/ComponentType.js +107 -0
- package/dist/types/ComponentType.js.map +1 -0
- package/dist/types/DoubleType.d.ts +10 -5
- package/dist/types/DoubleType.js +21 -17
- package/dist/types/DoubleType.js.map +1 -1
- package/dist/types/DoubleType.spec.js +12 -4
- package/dist/types/DoubleType.spec.js.map +1 -1
- package/dist/types/DynamicType.d.ts +13 -5
- package/dist/types/DynamicType.js +26 -5
- 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 +42 -0
- package/dist/types/EnumType.js +98 -0
- package/dist/types/EnumType.js.map +1 -0
- 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 +10 -5
- package/dist/types/FloatType.js +21 -17
- package/dist/types/FloatType.js.map +1 -1
- package/dist/types/FloatType.spec.js +4 -4
- package/dist/types/FloatType.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +8 -22
- package/dist/types/FunctionType.js +25 -63
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/InheritableType.d.ts +29 -0
- package/dist/types/InheritableType.js +173 -0
- package/dist/types/InheritableType.js.map +1 -0
- package/dist/types/InlineInterfaceType.d.ts +5 -0
- package/dist/types/InlineInterfaceType.js +17 -0
- package/dist/types/InlineInterfaceType.js.map +1 -0
- package/dist/types/IntegerType.d.ts +10 -5
- package/dist/types/IntegerType.js +21 -17
- package/dist/types/IntegerType.js.map +1 -1
- package/dist/types/IntegerType.spec.js +8 -4
- package/dist/types/IntegerType.spec.js.map +1 -1
- package/dist/types/InterfaceType.d.ts +14 -6
- package/dist/types/InterfaceType.js +30 -15
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/InterfaceType.spec.d.ts +1 -0
- package/dist/types/InterfaceType.spec.js +227 -0
- package/dist/types/InterfaceType.spec.js.map +1 -0
- package/dist/types/IntersectionType.d.ts +29 -0
- package/dist/types/IntersectionType.js +253 -0
- package/dist/types/IntersectionType.js.map +1 -0
- package/dist/types/IntersectionType.spec.d.ts +1 -0
- package/dist/types/IntersectionType.spec.js +150 -0
- package/dist/types/IntersectionType.spec.js.map +1 -0
- package/dist/types/InvalidType.d.ts +10 -5
- package/dist/types/InvalidType.js +21 -9
- package/dist/types/InvalidType.js.map +1 -1
- package/dist/types/InvalidType.spec.js +8 -4
- package/dist/types/InvalidType.spec.js.map +1 -1
- package/dist/types/LongIntegerType.d.ts +10 -5
- package/dist/types/LongIntegerType.js +21 -17
- package/dist/types/LongIntegerType.js.map +1 -1
- package/dist/types/LongIntegerType.spec.js +10 -4
- 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 +12 -5
- package/dist/types/ObjectType.js +25 -8
- 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 +123 -0
- package/dist/types/ReferenceType.js +720 -0
- package/dist/types/ReferenceType.js.map +1 -0
- package/dist/types/ReferenceType.spec.d.ts +1 -0
- package/dist/types/ReferenceType.spec.js +151 -0
- package/dist/types/ReferenceType.spec.js.map +1 -0
- package/dist/types/StringType.d.ts +12 -5
- package/dist/types/StringType.js +23 -8
- package/dist/types/StringType.js.map +1 -1
- package/dist/types/StringType.spec.js +3 -3
- package/dist/types/StringType.spec.js.map +1 -1
- package/dist/types/TypeStatementType.d.ts +18 -0
- package/dist/types/TypeStatementType.js +45 -0
- package/dist/types/TypeStatementType.js.map +1 -0
- package/dist/types/TypedFunctionType.d.ts +34 -0
- package/dist/types/TypedFunctionType.js +147 -0
- package/dist/types/TypedFunctionType.js.map +1 -0
- package/dist/types/TypedFunctionType.spec.d.ts +1 -0
- package/dist/types/TypedFunctionType.spec.js +122 -0
- package/dist/types/TypedFunctionType.spec.js.map +1 -0
- package/dist/types/UninitializedType.d.ts +11 -6
- package/dist/types/UninitializedType.js +20 -11
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/UnionType.d.ts +27 -0
- package/dist/types/UnionType.js +193 -0
- package/dist/types/UnionType.js.map +1 -0
- package/dist/types/UnionType.spec.d.ts +1 -0
- package/dist/types/UnionType.spec.js +205 -0
- package/dist/types/UnionType.spec.js.map +1 -0
- package/dist/types/VoidType.d.ts +11 -5
- package/dist/types/VoidType.js +22 -8
- 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 +174 -0
- package/dist/types/helper.spec.js.map +1 -0
- package/dist/types/helpers.d.ts +51 -0
- package/dist/types/helpers.js +323 -0
- package/dist/types/helpers.js.map +1 -0
- 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/types/roFunctionType.d.ts +11 -0
- package/dist/types/roFunctionType.js +37 -0
- package/dist/types/roFunctionType.js.map +1 -0
- package/dist/types/roFunctionType.spec.d.ts +1 -0
- package/dist/types/roFunctionType.spec.js +20 -0
- package/dist/types/roFunctionType.spec.js.map +1 -0
- package/dist/util.d.ts +288 -187
- package/dist/util.js +2018 -575
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +9 -15
- package/dist/validators/ClassValidator.js +93 -138
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +185 -138
- package/CHANGELOG.md +0 -1188
- package/dist/astUtils/index.d.ts +0 -7
- package/dist/astUtils/index.js +0 -26
- package/dist/astUtils/index.js.map +0 -1
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js +0 -45
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
- package/dist/lexer/index.d.ts +0 -3
- package/dist/lexer/index.js +0 -17
- package/dist/lexer/index.js.map +0 -1
- package/dist/parser/SGTypes.spec.js +0 -351
- package/dist/parser/SGTypes.spec.js.map +0 -1
- package/dist/parser/index.d.ts +0 -3
- package/dist/parser/index.js +0 -16
- package/dist/parser/index.js.map +0 -1
- package/dist/preprocessor/Chunk.d.ts +0 -82
- package/dist/preprocessor/Chunk.js +0 -77
- package/dist/preprocessor/Chunk.js.map +0 -1
- package/dist/preprocessor/Preprocessor.d.ts +0 -60
- package/dist/preprocessor/Preprocessor.js +0 -156
- package/dist/preprocessor/Preprocessor.js.map +0 -1
- package/dist/preprocessor/Preprocessor.spec.js +0 -152
- package/dist/preprocessor/Preprocessor.spec.js.map +0 -1
- package/dist/preprocessor/PreprocessorParser.d.ts +0 -61
- package/dist/preprocessor/PreprocessorParser.js +0 -194
- package/dist/preprocessor/PreprocessorParser.js.map +0 -1
- package/dist/preprocessor/PreprocessorParser.spec.js +0 -116
- package/dist/preprocessor/PreprocessorParser.spec.js.map +0 -1
- package/dist/preprocessor/index.d.ts +0 -3
- package/dist/preprocessor/index.js +0 -16
- package/dist/preprocessor/index.js.map +0 -1
- package/dist/types/CustomType.d.ts +0 -10
- package/dist/types/CustomType.js +0 -35
- package/dist/types/CustomType.js.map +0 -1
- package/dist/types/FunctionType.spec.js +0 -29
- package/dist/types/FunctionType.spec.js.map +0 -1
- package/dist/types/LazyType.d.ts +0 -15
- package/dist/types/LazyType.js +0 -32
- package/dist/types/LazyType.js.map +0 -1
- /package/dist/{bscPlugin/semanticTokens/SemanticTokensProcessor.spec.d.ts → astUtils/CachedLookups.spec.d.ts} +0 -0
- /package/dist/{parser/SGTypes.spec.d.ts → astUtils/Editor.spec.d.ts} +0 -0
- /package/dist/{preprocessor/Preprocessor.spec.d.ts → bscPlugin/completions/CompletionsProcessor.spec.d.ts} +0 -0
- /package/dist/{preprocessor/PreprocessorParser.spec.d.ts → bscPlugin/definition/DefinitionProvider.spec.d.ts} +0 -0
- /package/dist/{types/FunctionType.spec.d.ts → bscPlugin/hover/HoverProcessor.spec.d.ts} +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const sinonImport = require("sinon");
|
|
4
4
|
const Program_1 = require("../Program");
|
|
5
|
-
const
|
|
5
|
+
const chai_config_spec_1 = require("../chai-config.spec");
|
|
6
6
|
const DiagnosticMessages_1 = require("../DiagnosticMessages");
|
|
7
7
|
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
8
8
|
const Parser_1 = require("../parser/Parser");
|
|
@@ -11,28 +11,29 @@ const util_1 = require("../util");
|
|
|
11
11
|
const fsExtra = require("fs-extra");
|
|
12
12
|
const BrsTranspileState_1 = require("../parser/BrsTranspileState");
|
|
13
13
|
const assert_1 = require("assert");
|
|
14
|
+
const testHelpers_spec_2 = require("../testHelpers.spec");
|
|
15
|
+
const reflection_1 = require("../astUtils/reflection");
|
|
16
|
+
const visitors_1 = require("../astUtils/visitors");
|
|
14
17
|
let sinon = sinonImport.createSandbox();
|
|
15
18
|
describe('BrsFile BrighterScript classes', () => {
|
|
16
|
-
let tmpPath = util_1.standardizePath `${process.cwd()}/.tmp`;
|
|
17
|
-
let rootDir = util_1.standardizePath `${tmpPath}/rootDir`;
|
|
18
19
|
let program;
|
|
19
|
-
let testTranspile = testHelpers_spec_1.getTestTranspile(() => [program, rootDir]);
|
|
20
|
+
let testTranspile = (0, testHelpers_spec_1.getTestTranspile)(() => [program, testHelpers_spec_2.rootDir]);
|
|
20
21
|
beforeEach(() => {
|
|
21
|
-
fsExtra.ensureDirSync(rootDir);
|
|
22
|
-
fsExtra.emptyDirSync(
|
|
23
|
-
program = new Program_1.Program({ rootDir: rootDir });
|
|
22
|
+
fsExtra.ensureDirSync(testHelpers_spec_2.rootDir);
|
|
23
|
+
fsExtra.emptyDirSync(testHelpers_spec_2.tempDir);
|
|
24
|
+
program = new Program_1.Program({ rootDir: testHelpers_spec_2.rootDir, outDir: testHelpers_spec_2.outDir });
|
|
24
25
|
});
|
|
25
26
|
afterEach(() => {
|
|
26
27
|
sinon.restore();
|
|
27
28
|
program.dispose();
|
|
28
|
-
fsExtra.ensureDirSync(
|
|
29
|
-
fsExtra.emptyDirSync(
|
|
29
|
+
fsExtra.ensureDirSync(testHelpers_spec_2.tempDir);
|
|
30
|
+
fsExtra.emptyDirSync(testHelpers_spec_2.tempDir);
|
|
30
31
|
});
|
|
31
32
|
function addFile(relativePath, text) {
|
|
32
|
-
return program.setFile({ src: `${rootDir}/${relativePath}`, dest: relativePath }, text);
|
|
33
|
+
return program.setFile({ src: `${testHelpers_spec_2.rootDir}/${relativePath}`, dest: relativePath }, text);
|
|
33
34
|
}
|
|
34
35
|
it('detects all classes after parse', () => {
|
|
35
|
-
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
36
|
+
let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
36
37
|
class Animal
|
|
37
38
|
end class
|
|
38
39
|
class Duck
|
|
@@ -40,18 +41,18 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
40
41
|
|
|
41
42
|
end class
|
|
42
43
|
`);
|
|
43
|
-
|
|
44
|
+
const classStatements = file.ast.findChildren(reflection_1.isClassStatement);
|
|
45
|
+
(0, chai_config_spec_1.expect)(classStatements.map(x => x.getName(Parser_1.ParseMode.BrighterScript)).sort()).to.eql(['Animal', 'Duck']);
|
|
44
46
|
});
|
|
45
47
|
it('does not cause errors with incomplete class statement', () => {
|
|
46
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
48
|
+
program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
47
49
|
class
|
|
48
50
|
`);
|
|
49
51
|
program.validate();
|
|
50
52
|
//if no exception was thrown, this test passes
|
|
51
53
|
});
|
|
52
54
|
it('catches child class missing super call in constructor', () => {
|
|
53
|
-
|
|
54
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
55
|
+
program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
55
56
|
class Person
|
|
56
57
|
sub new()
|
|
57
58
|
end sub
|
|
@@ -62,11 +63,33 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
62
63
|
end class
|
|
63
64
|
`);
|
|
64
65
|
program.validate();
|
|
65
|
-
|
|
66
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
67
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
it('allows class named `optional`', () => {
|
|
71
|
+
program.setFile('source/main.bs', `
|
|
72
|
+
class optional
|
|
73
|
+
thing = 1
|
|
74
|
+
end class
|
|
75
|
+
`);
|
|
76
|
+
program.validate();
|
|
77
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
78
|
+
});
|
|
79
|
+
it('supports optional fields', () => {
|
|
80
|
+
program.setFile('source/main.bs', `
|
|
81
|
+
class Movie
|
|
82
|
+
name as string
|
|
83
|
+
optional subtitles as string
|
|
84
|
+
public optional isRepeatEnabled as boolean
|
|
85
|
+
private optional wasPlayed
|
|
86
|
+
end class
|
|
87
|
+
`);
|
|
88
|
+
program.validate();
|
|
89
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
66
90
|
});
|
|
67
91
|
it('access modifier is option for override', () => {
|
|
68
|
-
|
|
69
|
-
let file = program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
92
|
+
let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
70
93
|
class Animal
|
|
71
94
|
sub move()
|
|
72
95
|
end sub
|
|
@@ -78,14 +101,13 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
78
101
|
end class
|
|
79
102
|
`);
|
|
80
103
|
program.validate();
|
|
81
|
-
|
|
82
|
-
let duckClass = file.
|
|
83
|
-
|
|
84
|
-
|
|
104
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
105
|
+
let duckClass = file.ast.findChildren(reflection_1.isClassStatement, { walkMode: visitors_1.WalkMode.visitStatements }).find(x => x.tokens.name.text.toLowerCase() === 'duck');
|
|
106
|
+
(0, chai_config_spec_1.expect)(duckClass).to.exist;
|
|
107
|
+
(0, chai_config_spec_1.expect)(duckClass.memberMap['move']).to.exist;
|
|
85
108
|
});
|
|
86
109
|
it('supports various namespace configurations', () => {
|
|
87
|
-
|
|
88
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
110
|
+
program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
89
111
|
class Animal
|
|
90
112
|
sub new()
|
|
91
113
|
bigBird = new Birds.Bird()
|
|
@@ -105,11 +127,10 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
105
127
|
end namespace
|
|
106
128
|
`);
|
|
107
129
|
program.validate();
|
|
108
|
-
|
|
130
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
109
131
|
});
|
|
110
132
|
describe('super', () => {
|
|
111
133
|
it('always requires super call in child constructor', () => {
|
|
112
|
-
var _a;
|
|
113
134
|
program.setFile('source/main.bs', `
|
|
114
135
|
class Bird
|
|
115
136
|
end class
|
|
@@ -119,10 +140,11 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
119
140
|
end class
|
|
120
141
|
`);
|
|
121
142
|
program.validate();
|
|
122
|
-
|
|
143
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
144
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
145
|
+
]);
|
|
123
146
|
});
|
|
124
147
|
it('requires super call in child when parent has own `new` method', () => {
|
|
125
|
-
var _a;
|
|
126
148
|
program.setFile('source/main.bs', `
|
|
127
149
|
class Bird
|
|
128
150
|
sub new()
|
|
@@ -134,17 +156,18 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
134
156
|
end class
|
|
135
157
|
`);
|
|
136
158
|
program.validate();
|
|
137
|
-
|
|
159
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
160
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
161
|
+
]);
|
|
138
162
|
});
|
|
139
163
|
it('allows non-`m` expressions and statements before the super call', () => {
|
|
140
|
-
var _a;
|
|
141
164
|
program.setFile('source/main.bs', `
|
|
142
165
|
class Bird
|
|
143
166
|
sub new(name)
|
|
144
167
|
end sub
|
|
145
168
|
end class
|
|
146
169
|
class Duck extends Bird
|
|
147
|
-
sub new()
|
|
170
|
+
sub new(name)
|
|
148
171
|
thing = { m: "m"}
|
|
149
172
|
print thing.m
|
|
150
173
|
name = "Donald" + "Duck"
|
|
@@ -153,54 +176,107 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
153
176
|
end class
|
|
154
177
|
`);
|
|
155
178
|
program.validate();
|
|
156
|
-
|
|
179
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
157
180
|
});
|
|
158
181
|
it('allows non-`m` expressions and statements before the super call', () => {
|
|
159
182
|
program.setFile('source/main.bs', `
|
|
160
183
|
class Bird
|
|
161
|
-
|
|
184
|
+
name as string
|
|
185
|
+
sub new(name as string)
|
|
186
|
+
m.name = name
|
|
162
187
|
end sub
|
|
163
188
|
end class
|
|
164
189
|
class Duck extends Bird
|
|
165
190
|
sub new()
|
|
166
191
|
m.name = m.name + "Duck"
|
|
167
|
-
super()
|
|
192
|
+
super("Flappy")
|
|
168
193
|
end sub
|
|
169
194
|
end class
|
|
170
195
|
`);
|
|
171
196
|
program.validate();
|
|
172
|
-
|
|
173
|
-
message: DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall().message,
|
|
174
|
-
range: vscode_languageserver_1.Range.create(7, 24, 7, 25)
|
|
175
|
-
}, {
|
|
176
|
-
message: DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall().message,
|
|
177
|
-
range: vscode_languageserver_1.Range.create(7, 33, 7, 34)
|
|
178
|
-
}]);
|
|
197
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { location: { range: vscode_languageserver_1.Range.create(9, 24, 9, 25) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { location: { range: vscode_languageserver_1.Range.create(9, 33, 9, 34) } })]);
|
|
179
198
|
});
|
|
180
199
|
});
|
|
181
200
|
describe('transpile', () => {
|
|
182
|
-
it('
|
|
183
|
-
|
|
201
|
+
it('does not mess with AST when injecting `super()` call', async () => {
|
|
202
|
+
const file = program.setFile('source/classes.bs', `
|
|
203
|
+
class Parent
|
|
204
|
+
end class
|
|
205
|
+
|
|
206
|
+
class Child extends parent
|
|
207
|
+
sub new()
|
|
208
|
+
super()
|
|
209
|
+
end sub
|
|
210
|
+
end class
|
|
211
|
+
`);
|
|
212
|
+
(0, chai_config_spec_1.expect)(file.ast.statements[1].body[0].func.body.statements[0].expression.callee.tokens.name.text).to.eql('super');
|
|
213
|
+
await program.getTranspiledFileContents(file.srcPath);
|
|
214
|
+
(0, chai_config_spec_1.expect)(file.ast.statements[1].body[0].func.body.statements[0].expression.callee.tokens.name.text).to.eql('super');
|
|
215
|
+
});
|
|
216
|
+
it('follows correct sequence for property initializers', async () => {
|
|
217
|
+
await testTranspile(`
|
|
184
218
|
class Animal
|
|
185
219
|
species1 = "Animal"
|
|
186
220
|
sub new()
|
|
187
|
-
print "From Animal: " + m.
|
|
221
|
+
print "From Animal: " + m.species1
|
|
188
222
|
end sub
|
|
189
223
|
end class
|
|
190
224
|
class Duck extends Animal
|
|
191
225
|
species2 = "Duck"
|
|
192
226
|
sub new()
|
|
193
227
|
super()
|
|
194
|
-
print "From Duck: " + m.
|
|
228
|
+
print "From Duck: " + m.species2
|
|
195
229
|
end sub
|
|
196
230
|
end class
|
|
197
231
|
`, `
|
|
232
|
+
sub __Animal_method_new()
|
|
233
|
+
m.species1 = "Animal"
|
|
234
|
+
print "From Animal: " + m.species1
|
|
235
|
+
end sub
|
|
198
236
|
function __Animal_builder()
|
|
199
237
|
instance = {}
|
|
200
|
-
instance.new =
|
|
201
|
-
|
|
202
|
-
|
|
238
|
+
instance.new = __Animal_method_new
|
|
239
|
+
return instance
|
|
240
|
+
end function
|
|
241
|
+
function Animal()
|
|
242
|
+
instance = __Animal_builder()
|
|
243
|
+
instance.new()
|
|
244
|
+
return instance
|
|
245
|
+
end function
|
|
246
|
+
sub __Duck_method_new()
|
|
247
|
+
m.super0_new()
|
|
248
|
+
m.species2 = "Duck"
|
|
249
|
+
print "From Duck: " + m.species2
|
|
250
|
+
end sub
|
|
251
|
+
function __Duck_builder()
|
|
252
|
+
instance = __Animal_builder()
|
|
253
|
+
instance.super0_new = instance.new
|
|
254
|
+
instance.new = __Duck_method_new
|
|
255
|
+
return instance
|
|
256
|
+
end function
|
|
257
|
+
function Duck()
|
|
258
|
+
instance = __Duck_builder()
|
|
259
|
+
instance.new()
|
|
260
|
+
return instance
|
|
261
|
+
end function
|
|
262
|
+
`, 'trim', 'source/main.bs');
|
|
263
|
+
});
|
|
264
|
+
it('allows comments as first line of constructor', async () => {
|
|
265
|
+
await testTranspile(`
|
|
266
|
+
class Animal
|
|
267
|
+
end class
|
|
268
|
+
class Duck extends Animal
|
|
269
|
+
sub new()
|
|
270
|
+
'comment should not cause double super call
|
|
271
|
+
super()
|
|
203
272
|
end sub
|
|
273
|
+
end class
|
|
274
|
+
`, `
|
|
275
|
+
sub __Animal_method_new()
|
|
276
|
+
end sub
|
|
277
|
+
function __Animal_builder()
|
|
278
|
+
instance = {}
|
|
279
|
+
instance.new = __Animal_method_new
|
|
204
280
|
return instance
|
|
205
281
|
end function
|
|
206
282
|
function Animal()
|
|
@@ -208,14 +284,54 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
208
284
|
instance.new()
|
|
209
285
|
return instance
|
|
210
286
|
end function
|
|
287
|
+
sub __Duck_method_new()
|
|
288
|
+
'comment should not cause double super call
|
|
289
|
+
m.super0_new()
|
|
290
|
+
end sub
|
|
211
291
|
function __Duck_builder()
|
|
212
292
|
instance = __Animal_builder()
|
|
213
293
|
instance.super0_new = instance.new
|
|
214
|
-
instance.new =
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
294
|
+
instance.new = __Duck_method_new
|
|
295
|
+
return instance
|
|
296
|
+
end function
|
|
297
|
+
function Duck()
|
|
298
|
+
instance = __Duck_builder()
|
|
299
|
+
instance.new()
|
|
300
|
+
return instance
|
|
301
|
+
end function
|
|
302
|
+
`);
|
|
303
|
+
});
|
|
304
|
+
it('does not inject a call to super if one exists', async () => {
|
|
305
|
+
await testTranspile(`
|
|
306
|
+
class Animal
|
|
307
|
+
end class
|
|
308
|
+
class Duck extends Animal
|
|
309
|
+
sub new()
|
|
310
|
+
print "I am a statement which does not use m"
|
|
311
|
+
super()
|
|
218
312
|
end sub
|
|
313
|
+
end class
|
|
314
|
+
`, `
|
|
315
|
+
sub __Animal_method_new()
|
|
316
|
+
end sub
|
|
317
|
+
function __Animal_builder()
|
|
318
|
+
instance = {}
|
|
319
|
+
instance.new = __Animal_method_new
|
|
320
|
+
return instance
|
|
321
|
+
end function
|
|
322
|
+
function Animal()
|
|
323
|
+
instance = __Animal_builder()
|
|
324
|
+
instance.new()
|
|
325
|
+
return instance
|
|
326
|
+
end function
|
|
327
|
+
sub __Duck_method_new()
|
|
328
|
+
print "I am a statement which does not use m"
|
|
329
|
+
m.super0_new()
|
|
330
|
+
end sub
|
|
331
|
+
function __Duck_builder()
|
|
332
|
+
instance = __Animal_builder()
|
|
333
|
+
instance.super0_new = instance.new
|
|
334
|
+
instance.new = __Duck_method_new
|
|
219
335
|
return instance
|
|
220
336
|
end function
|
|
221
337
|
function Duck()
|
|
@@ -223,10 +339,10 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
223
339
|
instance.new()
|
|
224
340
|
return instance
|
|
225
341
|
end function
|
|
226
|
-
|
|
342
|
+
`);
|
|
227
343
|
});
|
|
228
|
-
it('handles class inheritance inferred constructor calls', () => {
|
|
229
|
-
testTranspile(`
|
|
344
|
+
it('handles class inheritance inferred constructor calls', async () => {
|
|
345
|
+
await testTranspile(`
|
|
230
346
|
class Animal
|
|
231
347
|
className1 = "Animal"
|
|
232
348
|
end class
|
|
@@ -237,11 +353,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
237
353
|
className3 = "BabyDuck"
|
|
238
354
|
end class
|
|
239
355
|
`, `
|
|
356
|
+
sub __Animal_method_new()
|
|
357
|
+
m.className1 = "Animal"
|
|
358
|
+
end sub
|
|
240
359
|
function __Animal_builder()
|
|
241
360
|
instance = {}
|
|
242
|
-
instance.new =
|
|
243
|
-
m.className1 = "Animal"
|
|
244
|
-
end sub
|
|
361
|
+
instance.new = __Animal_method_new
|
|
245
362
|
return instance
|
|
246
363
|
end function
|
|
247
364
|
function Animal()
|
|
@@ -249,13 +366,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
249
366
|
instance.new()
|
|
250
367
|
return instance
|
|
251
368
|
end function
|
|
369
|
+
sub __Duck_method_new()
|
|
370
|
+
m.super0_new()
|
|
371
|
+
m.className2 = "Duck"
|
|
372
|
+
end sub
|
|
252
373
|
function __Duck_builder()
|
|
253
374
|
instance = __Animal_builder()
|
|
254
375
|
instance.super0_new = instance.new
|
|
255
|
-
instance.new =
|
|
256
|
-
m.super0_new()
|
|
257
|
-
m.className2 = "Duck"
|
|
258
|
-
end sub
|
|
376
|
+
instance.new = __Duck_method_new
|
|
259
377
|
return instance
|
|
260
378
|
end function
|
|
261
379
|
function Duck()
|
|
@@ -263,13 +381,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
263
381
|
instance.new()
|
|
264
382
|
return instance
|
|
265
383
|
end function
|
|
384
|
+
sub __BabyDuck_method_new()
|
|
385
|
+
m.super1_new()
|
|
386
|
+
m.className3 = "BabyDuck"
|
|
387
|
+
end sub
|
|
266
388
|
function __BabyDuck_builder()
|
|
267
389
|
instance = __Duck_builder()
|
|
268
390
|
instance.super1_new = instance.new
|
|
269
|
-
instance.new =
|
|
270
|
-
m.super1_new()
|
|
271
|
-
m.className3 = "BabyDuck"
|
|
272
|
-
end sub
|
|
391
|
+
instance.new = __BabyDuck_method_new
|
|
273
392
|
return instance
|
|
274
393
|
end function
|
|
275
394
|
function BabyDuck()
|
|
@@ -279,8 +398,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
279
398
|
end function
|
|
280
399
|
`, undefined, 'source/main.bs');
|
|
281
400
|
});
|
|
282
|
-
it('works with namespaces', () => {
|
|
283
|
-
testTranspile(`
|
|
401
|
+
it('works with namespaces', async () => {
|
|
402
|
+
await testTranspile(`
|
|
284
403
|
namespace Birds.WaterFowl
|
|
285
404
|
class Duck
|
|
286
405
|
end class
|
|
@@ -288,10 +407,11 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
288
407
|
end class
|
|
289
408
|
end namespace
|
|
290
409
|
`, `
|
|
410
|
+
sub __Birds_WaterFowl_Duck_method_new()
|
|
411
|
+
end sub
|
|
291
412
|
function __Birds_WaterFowl_Duck_builder()
|
|
292
413
|
instance = {}
|
|
293
|
-
instance.new =
|
|
294
|
-
end sub
|
|
414
|
+
instance.new = __Birds_WaterFowl_Duck_method_new
|
|
295
415
|
return instance
|
|
296
416
|
end function
|
|
297
417
|
function Birds_WaterFowl_Duck()
|
|
@@ -299,12 +419,13 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
299
419
|
instance.new()
|
|
300
420
|
return instance
|
|
301
421
|
end function
|
|
422
|
+
sub __Birds_WaterFowl_BabyDuck_method_new()
|
|
423
|
+
m.super0_new()
|
|
424
|
+
end sub
|
|
302
425
|
function __Birds_WaterFowl_BabyDuck_builder()
|
|
303
426
|
instance = __Birds_WaterFowl_Duck_builder()
|
|
304
427
|
instance.super0_new = instance.new
|
|
305
|
-
instance.new =
|
|
306
|
-
m.super0_new()
|
|
307
|
-
end sub
|
|
428
|
+
instance.new = __Birds_WaterFowl_BabyDuck_method_new
|
|
308
429
|
return instance
|
|
309
430
|
end function
|
|
310
431
|
function Birds_WaterFowl_BabyDuck()
|
|
@@ -314,15 +435,16 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
314
435
|
end function
|
|
315
436
|
`, undefined, 'source/main.bs');
|
|
316
437
|
});
|
|
317
|
-
it('works for simple
|
|
318
|
-
testTranspile(`
|
|
438
|
+
it('works for simple class', async () => {
|
|
439
|
+
await testTranspile(`
|
|
319
440
|
class Duck
|
|
320
441
|
end class
|
|
321
442
|
`, `
|
|
443
|
+
sub __Duck_method_new()
|
|
444
|
+
end sub
|
|
322
445
|
function __Duck_builder()
|
|
323
446
|
instance = {}
|
|
324
|
-
instance.new =
|
|
325
|
-
end sub
|
|
447
|
+
instance.new = __Duck_method_new
|
|
326
448
|
return instance
|
|
327
449
|
end function
|
|
328
450
|
function Duck()
|
|
@@ -332,17 +454,94 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
332
454
|
end function
|
|
333
455
|
`, undefined, 'source/main.bs');
|
|
334
456
|
});
|
|
335
|
-
it('
|
|
336
|
-
testTranspile(`
|
|
457
|
+
it('inherits the parameters of the last known constructor', async () => {
|
|
458
|
+
await testTranspile(`
|
|
459
|
+
class Animal
|
|
460
|
+
sub new(p1)
|
|
461
|
+
end sub
|
|
462
|
+
end class
|
|
463
|
+
class Bird extends Animal
|
|
464
|
+
end class
|
|
465
|
+
class Duck extends Bird
|
|
466
|
+
sub new(p1, p2)
|
|
467
|
+
super(p1)
|
|
468
|
+
m.p2 = p2
|
|
469
|
+
end sub
|
|
470
|
+
private p2 as dynamic
|
|
471
|
+
end class
|
|
472
|
+
class BabyDuck extends Duck
|
|
473
|
+
end class
|
|
474
|
+
`, `
|
|
475
|
+
sub __Animal_method_new(p1)
|
|
476
|
+
end sub
|
|
477
|
+
function __Animal_builder()
|
|
478
|
+
instance = {}
|
|
479
|
+
instance.new = __Animal_method_new
|
|
480
|
+
return instance
|
|
481
|
+
end function
|
|
482
|
+
function Animal(p1)
|
|
483
|
+
instance = __Animal_builder()
|
|
484
|
+
instance.new(p1)
|
|
485
|
+
return instance
|
|
486
|
+
end function
|
|
487
|
+
sub __Bird_method_new(p1)
|
|
488
|
+
m.super0_new(p1)
|
|
489
|
+
end sub
|
|
490
|
+
function __Bird_builder()
|
|
491
|
+
instance = __Animal_builder()
|
|
492
|
+
instance.super0_new = instance.new
|
|
493
|
+
instance.new = __Bird_method_new
|
|
494
|
+
return instance
|
|
495
|
+
end function
|
|
496
|
+
function Bird(p1)
|
|
497
|
+
instance = __Bird_builder()
|
|
498
|
+
instance.new(p1)
|
|
499
|
+
return instance
|
|
500
|
+
end function
|
|
501
|
+
sub __Duck_method_new(p1, p2)
|
|
502
|
+
m.super1_new(p1)
|
|
503
|
+
m.p2 = invalid
|
|
504
|
+
m.p2 = p2
|
|
505
|
+
end sub
|
|
506
|
+
function __Duck_builder()
|
|
507
|
+
instance = __Bird_builder()
|
|
508
|
+
instance.super1_new = instance.new
|
|
509
|
+
instance.new = __Duck_method_new
|
|
510
|
+
return instance
|
|
511
|
+
end function
|
|
512
|
+
function Duck(p1, p2)
|
|
513
|
+
instance = __Duck_builder()
|
|
514
|
+
instance.new(p1, p2)
|
|
515
|
+
return instance
|
|
516
|
+
end function
|
|
517
|
+
sub __BabyDuck_method_new(p1, p2)
|
|
518
|
+
m.super2_new(p1, p2)
|
|
519
|
+
end sub
|
|
520
|
+
function __BabyDuck_builder()
|
|
521
|
+
instance = __Duck_builder()
|
|
522
|
+
instance.super2_new = instance.new
|
|
523
|
+
instance.new = __BabyDuck_method_new
|
|
524
|
+
return instance
|
|
525
|
+
end function
|
|
526
|
+
function BabyDuck(p1, p2)
|
|
527
|
+
instance = __BabyDuck_builder()
|
|
528
|
+
instance.new(p1, p2)
|
|
529
|
+
return instance
|
|
530
|
+
end function
|
|
531
|
+
`);
|
|
532
|
+
});
|
|
533
|
+
it('registers the constructor and properly handles its parameters', async () => {
|
|
534
|
+
await testTranspile(`
|
|
337
535
|
class Duck
|
|
338
536
|
sub new(name as string, age as integer)
|
|
339
537
|
end sub
|
|
340
538
|
end class
|
|
341
539
|
`, `
|
|
540
|
+
sub __Duck_method_new(name as string, age as integer)
|
|
541
|
+
end sub
|
|
342
542
|
function __Duck_builder()
|
|
343
543
|
instance = {}
|
|
344
|
-
instance.new =
|
|
345
|
-
end sub
|
|
544
|
+
instance.new = __Duck_method_new
|
|
346
545
|
return instance
|
|
347
546
|
end function
|
|
348
547
|
function Duck(name as string, age as integer)
|
|
@@ -352,11 +551,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
352
551
|
end function
|
|
353
552
|
`, undefined, 'source/main.bs');
|
|
354
553
|
});
|
|
355
|
-
it('properly handles child class constructor override and super calls', () => {
|
|
356
|
-
testTranspile(`
|
|
554
|
+
it('properly handles child class constructor override and super calls', async () => {
|
|
555
|
+
await testTranspile(`
|
|
357
556
|
class Animal
|
|
358
557
|
sub new(name as string)
|
|
359
558
|
end sub
|
|
559
|
+
|
|
560
|
+
sub DoSomething()
|
|
561
|
+
end sub
|
|
360
562
|
end class
|
|
361
563
|
|
|
362
564
|
class Duck extends Animal
|
|
@@ -366,10 +568,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
366
568
|
end sub
|
|
367
569
|
end class
|
|
368
570
|
`, `
|
|
571
|
+
sub __Animal_method_new(name as string)
|
|
572
|
+
end sub
|
|
573
|
+
sub __Animal_method_DoSomething()
|
|
574
|
+
end sub
|
|
369
575
|
function __Animal_builder()
|
|
370
576
|
instance = {}
|
|
371
|
-
instance.new =
|
|
372
|
-
|
|
577
|
+
instance.new = __Animal_method_new
|
|
578
|
+
instance.DoSomething = __Animal_method_DoSomething
|
|
373
579
|
return instance
|
|
374
580
|
end function
|
|
375
581
|
function Animal(name as string)
|
|
@@ -377,13 +583,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
377
583
|
instance.new(name)
|
|
378
584
|
return instance
|
|
379
585
|
end function
|
|
586
|
+
sub __Duck_method_new(name as string, age as integer)
|
|
587
|
+
m.super0_new(name)
|
|
588
|
+
m.super0_DoSomething()
|
|
589
|
+
end sub
|
|
380
590
|
function __Duck_builder()
|
|
381
591
|
instance = __Animal_builder()
|
|
382
592
|
instance.super0_new = instance.new
|
|
383
|
-
instance.new =
|
|
384
|
-
m.super0_new(name)
|
|
385
|
-
m.super0_DoSomething()
|
|
386
|
-
end sub
|
|
593
|
+
instance.new = __Duck_method_new
|
|
387
594
|
return instance
|
|
388
595
|
end function
|
|
389
596
|
function Duck(name as string, age as integer)
|
|
@@ -393,8 +600,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
393
600
|
end function
|
|
394
601
|
`, undefined, 'source/main.bs');
|
|
395
602
|
});
|
|
396
|
-
it('transpiles super in nested blocks', () => {
|
|
397
|
-
testTranspile(`
|
|
603
|
+
it('transpiles super in nested blocks', async () => {
|
|
604
|
+
await testTranspile(`
|
|
398
605
|
class Creature
|
|
399
606
|
sub new(name as string)
|
|
400
607
|
end sub
|
|
@@ -412,13 +619,15 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
412
619
|
end function
|
|
413
620
|
end class
|
|
414
621
|
`, `
|
|
622
|
+
sub __Creature_method_new(name as string)
|
|
623
|
+
end sub
|
|
624
|
+
function __Creature_method_sayHello(text)
|
|
625
|
+
? text
|
|
626
|
+
end function
|
|
415
627
|
function __Creature_builder()
|
|
416
628
|
instance = {}
|
|
417
|
-
instance.new =
|
|
418
|
-
|
|
419
|
-
instance.sayHello = function(text)
|
|
420
|
-
? text
|
|
421
|
-
end function
|
|
629
|
+
instance.new = __Creature_method_new
|
|
630
|
+
instance.sayHello = __Creature_method_sayHello
|
|
422
631
|
return instance
|
|
423
632
|
end function
|
|
424
633
|
function Creature(name as string)
|
|
@@ -426,29 +635,31 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
426
635
|
instance.new(name)
|
|
427
636
|
return instance
|
|
428
637
|
end function
|
|
638
|
+
sub __Duck_method_new(name as string)
|
|
639
|
+
m.super0_new(name)
|
|
640
|
+
end sub
|
|
641
|
+
function __Duck_method_sayHello(text)
|
|
642
|
+
text = "The duck says " + text
|
|
643
|
+
if text <> invalid
|
|
644
|
+
m.super0_sayHello(text)
|
|
645
|
+
end if
|
|
646
|
+
end function
|
|
429
647
|
function __Duck_builder()
|
|
430
648
|
instance = __Creature_builder()
|
|
431
649
|
instance.super0_new = instance.new
|
|
432
|
-
instance.new =
|
|
433
|
-
m.super0_new()
|
|
434
|
-
end sub
|
|
650
|
+
instance.new = __Duck_method_new
|
|
435
651
|
instance.super0_sayHello = instance.sayHello
|
|
436
|
-
instance.sayHello =
|
|
437
|
-
text = "The duck says " + text
|
|
438
|
-
if text <> invalid then
|
|
439
|
-
m.super0_sayHello(text)
|
|
440
|
-
end if
|
|
441
|
-
end function
|
|
652
|
+
instance.sayHello = __Duck_method_sayHello
|
|
442
653
|
return instance
|
|
443
654
|
end function
|
|
444
|
-
function Duck()
|
|
655
|
+
function Duck(name as string)
|
|
445
656
|
instance = __Duck_builder()
|
|
446
|
-
instance.new()
|
|
657
|
+
instance.new(name)
|
|
447
658
|
return instance
|
|
448
659
|
end function
|
|
449
660
|
`, 'trim', 'source/main.bs');
|
|
450
661
|
});
|
|
451
|
-
it('properly transpiles classes from outside current namespace', () => {
|
|
662
|
+
it('properly transpiles classes from outside current namespace', async () => {
|
|
452
663
|
addFile('source/Animals.bs', `
|
|
453
664
|
namespace Animals
|
|
454
665
|
class Duck
|
|
@@ -457,7 +668,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
457
668
|
class Bird
|
|
458
669
|
end class
|
|
459
670
|
`);
|
|
460
|
-
testTranspile(`
|
|
671
|
+
await testTranspile(`
|
|
461
672
|
namespace Animals
|
|
462
673
|
sub init()
|
|
463
674
|
donaldDuck = new Duck()
|
|
@@ -473,8 +684,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
473
684
|
end sub
|
|
474
685
|
`, undefined, 'source/main.bs');
|
|
475
686
|
});
|
|
476
|
-
it('properly transpiles new statement for missing class ', () => {
|
|
477
|
-
testTranspile(`
|
|
687
|
+
it('properly transpiles new statement for missing class ', async () => {
|
|
688
|
+
await testTranspile(`
|
|
478
689
|
sub main()
|
|
479
690
|
bob = new Human()
|
|
480
691
|
end sub
|
|
@@ -484,14 +695,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
484
695
|
end sub
|
|
485
696
|
`, undefined, 'source/main.bs', false);
|
|
486
697
|
});
|
|
487
|
-
it('new keyword transpiles correctly', () => {
|
|
698
|
+
it('new keyword transpiles correctly', async () => {
|
|
488
699
|
addFile('source/Animal.bs', `
|
|
489
700
|
class Animal
|
|
490
701
|
sub new(name as string)
|
|
491
702
|
end sub
|
|
492
703
|
end class
|
|
493
704
|
`);
|
|
494
|
-
testTranspile(`
|
|
705
|
+
await testTranspile(`
|
|
495
706
|
sub main()
|
|
496
707
|
a = new Animal("donald")
|
|
497
708
|
end sub
|
|
@@ -501,8 +712,76 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
501
712
|
end sub
|
|
502
713
|
`, undefined, 'source/main.bs');
|
|
503
714
|
});
|
|
504
|
-
it('
|
|
505
|
-
testTranspile(`
|
|
715
|
+
it('calls super ', async () => {
|
|
716
|
+
const { file } = await testTranspile(`
|
|
717
|
+
class Parent
|
|
718
|
+
sub new()
|
|
719
|
+
end sub
|
|
720
|
+
end class
|
|
721
|
+
class Child extends Parent
|
|
722
|
+
sub new()
|
|
723
|
+
end sub
|
|
724
|
+
end class
|
|
725
|
+
`, `
|
|
726
|
+
sub __Parent_method_new()
|
|
727
|
+
end sub
|
|
728
|
+
function __Parent_builder()
|
|
729
|
+
instance = {}
|
|
730
|
+
instance.new = __Parent_method_new
|
|
731
|
+
return instance
|
|
732
|
+
end function
|
|
733
|
+
function Parent()
|
|
734
|
+
instance = __Parent_builder()
|
|
735
|
+
instance.new()
|
|
736
|
+
return instance
|
|
737
|
+
end function
|
|
738
|
+
sub __Child_method_new()
|
|
739
|
+
m.super0_new()
|
|
740
|
+
end sub
|
|
741
|
+
function __Child_builder()
|
|
742
|
+
instance = __Parent_builder()
|
|
743
|
+
instance.super0_new = instance.new
|
|
744
|
+
instance.new = __Child_method_new
|
|
745
|
+
return instance
|
|
746
|
+
end function
|
|
747
|
+
function Child()
|
|
748
|
+
instance = __Child_builder()
|
|
749
|
+
instance.new()
|
|
750
|
+
return instance
|
|
751
|
+
end function
|
|
752
|
+
`, undefined, undefined, false);
|
|
753
|
+
//the AST should not be permanently modified
|
|
754
|
+
const constructor = file.ast.statements[0].body[0];
|
|
755
|
+
(0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
|
|
756
|
+
});
|
|
757
|
+
it('adds field initializers', async () => {
|
|
758
|
+
const { file } = await testTranspile(`
|
|
759
|
+
class Person
|
|
760
|
+
sub new()
|
|
761
|
+
end sub
|
|
762
|
+
name = "Bob"
|
|
763
|
+
end class
|
|
764
|
+
`, `
|
|
765
|
+
sub __Person_method_new()
|
|
766
|
+
m.name = "Bob"
|
|
767
|
+
end sub
|
|
768
|
+
function __Person_builder()
|
|
769
|
+
instance = {}
|
|
770
|
+
instance.new = __Person_method_new
|
|
771
|
+
return instance
|
|
772
|
+
end function
|
|
773
|
+
function Person()
|
|
774
|
+
instance = __Person_builder()
|
|
775
|
+
instance.new()
|
|
776
|
+
return instance
|
|
777
|
+
end function
|
|
778
|
+
`);
|
|
779
|
+
//the AST should not be permanently modified
|
|
780
|
+
const constructor = file.ast.statements[0].body[0];
|
|
781
|
+
(0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
|
|
782
|
+
});
|
|
783
|
+
it('does not screw up local variable references', async () => {
|
|
784
|
+
await testTranspile(`
|
|
506
785
|
class Animal
|
|
507
786
|
sub new(name as string)
|
|
508
787
|
m.name = name
|
|
@@ -543,15 +822,17 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
543
822
|
'> Waddling...\\nDewey moved 2 meters\\nFell over...I'm new at this
|
|
544
823
|
end sub
|
|
545
824
|
`, `
|
|
825
|
+
sub __Animal_method_new(name as string)
|
|
826
|
+
m.name = invalid
|
|
827
|
+
m.name = name
|
|
828
|
+
end sub
|
|
829
|
+
sub __Animal_method_move(distanceInMeters as integer)
|
|
830
|
+
print m.name + " moved " + distanceInMeters.ToStr() + " meters"
|
|
831
|
+
end sub
|
|
546
832
|
function __Animal_builder()
|
|
547
833
|
instance = {}
|
|
548
|
-
instance.new =
|
|
549
|
-
|
|
550
|
-
m.name = name
|
|
551
|
-
end sub
|
|
552
|
-
instance.move = sub(distanceInMeters as integer)
|
|
553
|
-
print m.name + " moved " + distanceInMeters.ToStr() + " meters"
|
|
554
|
-
end sub
|
|
834
|
+
instance.new = __Animal_method_new
|
|
835
|
+
instance.move = __Animal_method_move
|
|
555
836
|
return instance
|
|
556
837
|
end function
|
|
557
838
|
function Animal(name as string)
|
|
@@ -559,40 +840,44 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
559
840
|
instance.new(name)
|
|
560
841
|
return instance
|
|
561
842
|
end function
|
|
843
|
+
sub __Duck_method_new(name as string)
|
|
844
|
+
m.super0_new(name)
|
|
845
|
+
end sub
|
|
846
|
+
sub __Duck_method_move(distanceInMeters as integer)
|
|
847
|
+
print "Waddling..."
|
|
848
|
+
m.super0_move(distanceInMeters)
|
|
849
|
+
end sub
|
|
562
850
|
function __Duck_builder()
|
|
563
851
|
instance = __Animal_builder()
|
|
564
852
|
instance.super0_new = instance.new
|
|
565
|
-
instance.new =
|
|
566
|
-
m.super0_new()
|
|
567
|
-
end sub
|
|
853
|
+
instance.new = __Duck_method_new
|
|
568
854
|
instance.super0_move = instance.move
|
|
569
|
-
instance.move =
|
|
570
|
-
print "Waddling..."
|
|
571
|
-
m.super0_move(distanceInMeters)
|
|
572
|
-
end sub
|
|
855
|
+
instance.move = __Duck_method_move
|
|
573
856
|
return instance
|
|
574
857
|
end function
|
|
575
|
-
function Duck()
|
|
858
|
+
function Duck(name as string)
|
|
576
859
|
instance = __Duck_builder()
|
|
577
|
-
instance.new()
|
|
860
|
+
instance.new(name)
|
|
578
861
|
return instance
|
|
579
862
|
end function
|
|
863
|
+
sub __BabyDuck_method_new(name as string)
|
|
864
|
+
m.super1_new(name)
|
|
865
|
+
end sub
|
|
866
|
+
sub __BabyDuck_method_move(distanceInMeters as integer)
|
|
867
|
+
m.super1_move(distanceInMeters)
|
|
868
|
+
print "Fell over...I'm new at this"
|
|
869
|
+
end sub
|
|
580
870
|
function __BabyDuck_builder()
|
|
581
871
|
instance = __Duck_builder()
|
|
582
872
|
instance.super1_new = instance.new
|
|
583
|
-
instance.new =
|
|
584
|
-
m.super1_new()
|
|
585
|
-
end sub
|
|
873
|
+
instance.new = __BabyDuck_method_new
|
|
586
874
|
instance.super1_move = instance.move
|
|
587
|
-
instance.move =
|
|
588
|
-
m.super1_move(distanceInMeters)
|
|
589
|
-
print "Fell over...I'm new at this"
|
|
590
|
-
end sub
|
|
875
|
+
instance.move = __BabyDuck_method_move
|
|
591
876
|
return instance
|
|
592
877
|
end function
|
|
593
|
-
function BabyDuck()
|
|
878
|
+
function BabyDuck(name as string)
|
|
594
879
|
instance = __BabyDuck_builder()
|
|
595
|
-
instance.new()
|
|
880
|
+
instance.new(name)
|
|
596
881
|
return instance
|
|
597
882
|
end function
|
|
598
883
|
|
|
@@ -600,17 +885,19 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
600
885
|
smokey = Animal("Smokey")
|
|
601
886
|
smokey.move(1)
|
|
602
887
|
'> Bear moved 1 meters
|
|
888
|
+
|
|
603
889
|
donald = Duck("Donald")
|
|
604
890
|
donald.move(2)
|
|
605
891
|
'> Waddling...\\nDonald moved 2 meters
|
|
892
|
+
|
|
606
893
|
dewey = BabyDuck("Dewey")
|
|
607
894
|
dewey.move(3)
|
|
608
895
|
'> Waddling...\\nDewey moved 2 meters\\nFell over...I'm new at this
|
|
609
896
|
end sub
|
|
610
897
|
`, 'trim', 'source/main.bs');
|
|
611
898
|
});
|
|
612
|
-
it('calculates the proper super index', () => {
|
|
613
|
-
testTranspile(`
|
|
899
|
+
it('calculates the proper super index', async () => {
|
|
900
|
+
await testTranspile(`
|
|
614
901
|
class Duck
|
|
615
902
|
public sub walk(meters as integer)
|
|
616
903
|
print "Walked " + meters.ToStr() + " meters"
|
|
@@ -624,13 +911,15 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
624
911
|
end sub
|
|
625
912
|
end class
|
|
626
913
|
`, `
|
|
914
|
+
sub __Duck_method_new()
|
|
915
|
+
end sub
|
|
916
|
+
sub __Duck_method_walk(meters as integer)
|
|
917
|
+
print "Walked " + meters.ToStr() + " meters"
|
|
918
|
+
end sub
|
|
627
919
|
function __Duck_builder()
|
|
628
920
|
instance = {}
|
|
629
|
-
instance.new =
|
|
630
|
-
|
|
631
|
-
instance.walk = sub(meters as integer)
|
|
632
|
-
print "Walked " + meters.ToStr() + " meters"
|
|
633
|
-
end sub
|
|
921
|
+
instance.new = __Duck_method_new
|
|
922
|
+
instance.walk = __Duck_method_walk
|
|
634
923
|
return instance
|
|
635
924
|
end function
|
|
636
925
|
function Duck()
|
|
@@ -638,17 +927,19 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
638
927
|
instance.new()
|
|
639
928
|
return instance
|
|
640
929
|
end function
|
|
930
|
+
sub __BabyDuck_method_new()
|
|
931
|
+
m.super0_new()
|
|
932
|
+
end sub
|
|
933
|
+
sub __BabyDuck_method_walk(meters as integer)
|
|
934
|
+
print "Tripped"
|
|
935
|
+
m.super0_walk(meters)
|
|
936
|
+
end sub
|
|
641
937
|
function __BabyDuck_builder()
|
|
642
938
|
instance = __Duck_builder()
|
|
643
939
|
instance.super0_new = instance.new
|
|
644
|
-
instance.new =
|
|
645
|
-
m.super0_new()
|
|
646
|
-
end sub
|
|
940
|
+
instance.new = __BabyDuck_method_new
|
|
647
941
|
instance.super0_walk = instance.walk
|
|
648
|
-
instance.walk =
|
|
649
|
-
print "Tripped"
|
|
650
|
-
m.super0_walk(meters)
|
|
651
|
-
end sub
|
|
942
|
+
instance.walk = __BabyDuck_method_walk
|
|
652
943
|
return instance
|
|
653
944
|
end function
|
|
654
945
|
function BabyDuck()
|
|
@@ -658,22 +949,391 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
658
949
|
end function
|
|
659
950
|
`, 'trim', 'source/main.bs');
|
|
660
951
|
});
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
952
|
+
it('adds namespacing to constructors on field definitions', async () => {
|
|
953
|
+
await testTranspile(`
|
|
954
|
+
namespace MyNS
|
|
955
|
+
class KlassOne
|
|
956
|
+
other = new KlassTwo()
|
|
957
|
+
end class
|
|
958
|
+
|
|
959
|
+
class KlassTwo
|
|
960
|
+
end class
|
|
961
|
+
end namespace
|
|
962
|
+
`, `
|
|
963
|
+
sub __MyNS_KlassOne_method_new()
|
|
964
|
+
m.other = MyNS_KlassTwo()
|
|
965
|
+
end sub
|
|
966
|
+
function __MyNS_KlassOne_builder()
|
|
967
|
+
instance = {}
|
|
968
|
+
instance.new = __MyNS_KlassOne_method_new
|
|
969
|
+
return instance
|
|
970
|
+
end function
|
|
971
|
+
function MyNS_KlassOne()
|
|
972
|
+
instance = __MyNS_KlassOne_builder()
|
|
973
|
+
instance.new()
|
|
974
|
+
return instance
|
|
975
|
+
end function
|
|
976
|
+
sub __MyNS_KlassTwo_method_new()
|
|
977
|
+
end sub
|
|
978
|
+
function __MyNS_KlassTwo_builder()
|
|
979
|
+
instance = {}
|
|
980
|
+
instance.new = __MyNS_KlassTwo_method_new
|
|
981
|
+
return instance
|
|
982
|
+
end function
|
|
983
|
+
function MyNS_KlassTwo()
|
|
984
|
+
instance = __MyNS_KlassTwo_builder()
|
|
985
|
+
instance.new()
|
|
986
|
+
return instance
|
|
987
|
+
end function
|
|
988
|
+
`, 'trim', 'source/main.bs');
|
|
989
|
+
});
|
|
990
|
+
it('works with enums as field initial values inside a namespace', async () => {
|
|
991
|
+
await testTranspile(`
|
|
992
|
+
namespace MyNS
|
|
993
|
+
class HasEnumKlass
|
|
994
|
+
enumValue = MyEnum.A
|
|
995
|
+
end class
|
|
996
|
+
enum MyEnum
|
|
997
|
+
A = "A"
|
|
998
|
+
B = "B"
|
|
999
|
+
end enum
|
|
1000
|
+
end namespace
|
|
1001
|
+
`, `
|
|
1002
|
+
sub __MyNS_HasEnumKlass_method_new()
|
|
1003
|
+
m.enumValue = "A"
|
|
1004
|
+
end sub
|
|
1005
|
+
function __MyNS_HasEnumKlass_builder()
|
|
1006
|
+
instance = {}
|
|
1007
|
+
instance.new = __MyNS_HasEnumKlass_method_new
|
|
1008
|
+
return instance
|
|
1009
|
+
end function
|
|
1010
|
+
function MyNS_HasEnumKlass()
|
|
1011
|
+
instance = __MyNS_HasEnumKlass_builder()
|
|
1012
|
+
instance.new()
|
|
1013
|
+
return instance
|
|
1014
|
+
end function
|
|
1015
|
+
`, 'trim', 'source/main.bs');
|
|
1016
|
+
});
|
|
1017
|
+
it('allows enums as super args inside a namespace', async () => {
|
|
1018
|
+
await testTranspile(`
|
|
1019
|
+
namespace MyNS
|
|
1020
|
+
class SubKlass extends SuperKlass
|
|
1021
|
+
sub new()
|
|
1022
|
+
super(MyEnum.B)
|
|
1023
|
+
end sub
|
|
1024
|
+
end class
|
|
1025
|
+
|
|
1026
|
+
class SuperKlass
|
|
1027
|
+
sub new(enumVal as MyEnum)
|
|
1028
|
+
print enumVal
|
|
1029
|
+
end sub
|
|
1030
|
+
end class
|
|
1031
|
+
|
|
1032
|
+
enum MyEnum
|
|
1033
|
+
A = "A"
|
|
1034
|
+
B = "B"
|
|
1035
|
+
end enum
|
|
1036
|
+
end namespace
|
|
1037
|
+
`, `
|
|
1038
|
+
sub __MyNS_SubKlass_method_new()
|
|
1039
|
+
m.super0_new("B")
|
|
1040
|
+
end sub
|
|
1041
|
+
function __MyNS_SubKlass_builder()
|
|
1042
|
+
instance = __MyNS_SuperKlass_builder()
|
|
1043
|
+
instance.super0_new = instance.new
|
|
1044
|
+
instance.new = __MyNS_SubKlass_method_new
|
|
1045
|
+
return instance
|
|
1046
|
+
end function
|
|
1047
|
+
function MyNS_SubKlass()
|
|
1048
|
+
instance = __MyNS_SubKlass_builder()
|
|
1049
|
+
instance.new()
|
|
1050
|
+
return instance
|
|
1051
|
+
end function
|
|
1052
|
+
sub __MyNS_SuperKlass_method_new(enumVal as dynamic)
|
|
1053
|
+
print enumVal
|
|
1054
|
+
end sub
|
|
1055
|
+
function __MyNS_SuperKlass_builder()
|
|
1056
|
+
instance = {}
|
|
1057
|
+
instance.new = __MyNS_SuperKlass_method_new
|
|
1058
|
+
return instance
|
|
1059
|
+
end function
|
|
1060
|
+
function MyNS_SuperKlass(enumVal as dynamic)
|
|
1061
|
+
instance = __MyNS_SuperKlass_builder()
|
|
1062
|
+
instance.new(enumVal)
|
|
1063
|
+
return instance
|
|
1064
|
+
end function
|
|
1065
|
+
`, 'trim', 'source/main.bs');
|
|
1066
|
+
});
|
|
1067
|
+
it('works with enums as values referenced in a namespace directly', async () => {
|
|
1068
|
+
await testTranspile(`
|
|
1069
|
+
namespace MyNS
|
|
1070
|
+
class HasEnumKlass
|
|
1071
|
+
myArray = [true, true] as boolean[]
|
|
1072
|
+
sub new()
|
|
1073
|
+
m.myArray[MyEnum.A] = true
|
|
1074
|
+
m.myArray[MyEnum.B] = false
|
|
1075
|
+
end sub
|
|
1076
|
+
end class
|
|
1077
|
+
enum MyEnum
|
|
1078
|
+
A = 0
|
|
1079
|
+
B = 1
|
|
1080
|
+
end enum
|
|
1081
|
+
end namespace
|
|
1082
|
+
`, `
|
|
1083
|
+
sub __MyNS_HasEnumKlass_method_new()
|
|
1084
|
+
m.myArray = [
|
|
1085
|
+
true
|
|
1086
|
+
true
|
|
1087
|
+
]
|
|
1088
|
+
m.myArray[0] = true
|
|
1089
|
+
m.myArray[1] = false
|
|
1090
|
+
end sub
|
|
1091
|
+
function __MyNS_HasEnumKlass_builder()
|
|
1092
|
+
instance = {}
|
|
1093
|
+
instance.new = __MyNS_HasEnumKlass_method_new
|
|
1094
|
+
return instance
|
|
1095
|
+
end function
|
|
1096
|
+
function MyNS_HasEnumKlass()
|
|
1097
|
+
instance = __MyNS_HasEnumKlass_builder()
|
|
1098
|
+
instance.new()
|
|
1099
|
+
return instance
|
|
1100
|
+
end function
|
|
1101
|
+
`, 'trim', 'source/main.bs');
|
|
1102
|
+
});
|
|
1103
|
+
it('works with enums as values referenced in a namespace with namespace', async () => {
|
|
1104
|
+
await testTranspile(`
|
|
1105
|
+
namespace MyNS
|
|
1106
|
+
class HasEnumKlass
|
|
1107
|
+
myArray = [true, true] as boolean[]
|
|
1108
|
+
sub new()
|
|
1109
|
+
m.myArray[MyNS.MyEnum.A] = true
|
|
1110
|
+
m.myArray[MyNS.MyEnum.B] = false
|
|
1111
|
+
end sub
|
|
1112
|
+
end class
|
|
1113
|
+
enum MyEnum
|
|
1114
|
+
A = 0
|
|
1115
|
+
B = 1
|
|
1116
|
+
end enum
|
|
1117
|
+
end namespace
|
|
1118
|
+
`, `
|
|
1119
|
+
sub __MyNS_HasEnumKlass_method_new()
|
|
1120
|
+
m.myArray = [
|
|
1121
|
+
true
|
|
1122
|
+
true
|
|
1123
|
+
]
|
|
1124
|
+
m.myArray[0] = true
|
|
1125
|
+
m.myArray[1] = false
|
|
1126
|
+
end sub
|
|
1127
|
+
function __MyNS_HasEnumKlass_builder()
|
|
1128
|
+
instance = {}
|
|
1129
|
+
instance.new = __MyNS_HasEnumKlass_method_new
|
|
1130
|
+
return instance
|
|
1131
|
+
end function
|
|
1132
|
+
function MyNS_HasEnumKlass()
|
|
1133
|
+
instance = __MyNS_HasEnumKlass_builder()
|
|
1134
|
+
instance.new()
|
|
1135
|
+
return instance
|
|
1136
|
+
end function
|
|
1137
|
+
`, 'trim', 'source/main.bs');
|
|
1138
|
+
});
|
|
1139
|
+
it('allows namespaced class function as function parameters', async () => {
|
|
1140
|
+
await testTranspile(`
|
|
1141
|
+
namespace Alpha
|
|
1142
|
+
function foo()
|
|
1143
|
+
return 1
|
|
1144
|
+
end function
|
|
1145
|
+
|
|
1146
|
+
function callSomeFunc(f as function)
|
|
1147
|
+
return f()
|
|
1148
|
+
end function
|
|
1149
|
+
|
|
1150
|
+
sub callFoo()
|
|
1151
|
+
callSomeFunc(foo)
|
|
1152
|
+
end sub
|
|
1153
|
+
end namespace
|
|
1154
|
+
`, `
|
|
1155
|
+
function Alpha_foo()
|
|
1156
|
+
return 1
|
|
1157
|
+
end function
|
|
1158
|
+
|
|
1159
|
+
function Alpha_callSomeFunc(f as function)
|
|
1160
|
+
return f()
|
|
1161
|
+
end function
|
|
1162
|
+
|
|
1163
|
+
sub Alpha_callFoo()
|
|
1164
|
+
Alpha_callSomeFunc(Alpha_foo)
|
|
1165
|
+
end sub
|
|
1166
|
+
`, 'trim', 'source/main.bs');
|
|
1167
|
+
});
|
|
1168
|
+
it('allows namespaced class constructors as function parameters', async () => {
|
|
1169
|
+
await testTranspile(`
|
|
1170
|
+
namespace Alpha
|
|
1171
|
+
class Button
|
|
1172
|
+
end class
|
|
1173
|
+
|
|
1174
|
+
function callSomeFunc(f as function)
|
|
1175
|
+
return f()
|
|
1176
|
+
end function
|
|
1177
|
+
|
|
1178
|
+
sub makeButton()
|
|
1179
|
+
callSomeFunc(Button)
|
|
1180
|
+
end sub
|
|
1181
|
+
end namespace
|
|
1182
|
+
`, `
|
|
1183
|
+
sub __Alpha_Button_method_new()
|
|
1184
|
+
end sub
|
|
1185
|
+
function __Alpha_Button_builder()
|
|
1186
|
+
instance = {}
|
|
1187
|
+
instance.new = __Alpha_Button_method_new
|
|
1188
|
+
return instance
|
|
1189
|
+
end function
|
|
1190
|
+
function Alpha_Button()
|
|
1191
|
+
instance = __Alpha_Button_builder()
|
|
1192
|
+
instance.new()
|
|
1193
|
+
return instance
|
|
1194
|
+
end function
|
|
1195
|
+
|
|
1196
|
+
function Alpha_callSomeFunc(f as function)
|
|
1197
|
+
return f()
|
|
1198
|
+
end function
|
|
1199
|
+
|
|
1200
|
+
sub Alpha_makeButton()
|
|
1201
|
+
Alpha_callSomeFunc(Alpha_Button)
|
|
1202
|
+
end sub
|
|
1203
|
+
`, 'trim', 'source/main.bs');
|
|
1204
|
+
});
|
|
1205
|
+
it('allows class constructors as functions in array', async () => {
|
|
1206
|
+
await testTranspile(`
|
|
1207
|
+
namespace Alpha
|
|
1208
|
+
class Button
|
|
1209
|
+
end class
|
|
1210
|
+
|
|
1211
|
+
class ButtonContainer
|
|
1212
|
+
private button = new Alpha.Button()
|
|
1213
|
+
|
|
1214
|
+
sub new()
|
|
1215
|
+
m.init()
|
|
1216
|
+
end sub
|
|
1217
|
+
|
|
1218
|
+
sub init()
|
|
1219
|
+
button = new Alpha.Button()
|
|
1220
|
+
items = [m.button, button, Alpha.Button]
|
|
1221
|
+
end sub
|
|
1222
|
+
end class
|
|
1223
|
+
end namespace
|
|
1224
|
+
`, `
|
|
1225
|
+
sub __Alpha_Button_method_new()
|
|
1226
|
+
end sub
|
|
1227
|
+
function __Alpha_Button_builder()
|
|
1228
|
+
instance = {}
|
|
1229
|
+
instance.new = __Alpha_Button_method_new
|
|
1230
|
+
return instance
|
|
1231
|
+
end function
|
|
1232
|
+
function Alpha_Button()
|
|
1233
|
+
instance = __Alpha_Button_builder()
|
|
1234
|
+
instance.new()
|
|
1235
|
+
return instance
|
|
1236
|
+
end function
|
|
1237
|
+
sub __Alpha_ButtonContainer_method_new()
|
|
1238
|
+
m.button = Alpha_Button()
|
|
1239
|
+
m.init()
|
|
1240
|
+
end sub
|
|
1241
|
+
sub __Alpha_ButtonContainer_method_init()
|
|
1242
|
+
button = Alpha_Button()
|
|
1243
|
+
items = [
|
|
1244
|
+
m.button
|
|
1245
|
+
button
|
|
1246
|
+
Alpha_Button
|
|
1247
|
+
]
|
|
1248
|
+
end sub
|
|
1249
|
+
function __Alpha_ButtonContainer_builder()
|
|
1250
|
+
instance = {}
|
|
1251
|
+
instance.new = __Alpha_ButtonContainer_method_new
|
|
1252
|
+
instance.init = __Alpha_ButtonContainer_method_init
|
|
1253
|
+
return instance
|
|
1254
|
+
end function
|
|
1255
|
+
function Alpha_ButtonContainer()
|
|
1256
|
+
instance = __Alpha_ButtonContainer_builder()
|
|
1257
|
+
instance.new()
|
|
1258
|
+
return instance
|
|
1259
|
+
end function
|
|
1260
|
+
`, 'trim', 'source/main.bs');
|
|
1261
|
+
});
|
|
1262
|
+
it('puts leading comments from methods in correct place', async () => {
|
|
1263
|
+
await testTranspile(`
|
|
1264
|
+
class Duck
|
|
1265
|
+
' hatch from egg
|
|
1266
|
+
sub new()
|
|
1267
|
+
end sub
|
|
1268
|
+
' it must be a duck
|
|
1269
|
+
sub quack()
|
|
1270
|
+
' what does a duck say?
|
|
1271
|
+
print "quack"
|
|
1272
|
+
end sub
|
|
1273
|
+
end class
|
|
1274
|
+
`, `
|
|
1275
|
+
' hatch from egg
|
|
1276
|
+
sub __Duck_method_new()
|
|
1277
|
+
end sub
|
|
1278
|
+
' it must be a duck
|
|
1279
|
+
sub __Duck_method_quack()
|
|
1280
|
+
' what does a duck say?
|
|
1281
|
+
print "quack"
|
|
1282
|
+
end sub
|
|
1283
|
+
function __Duck_builder()
|
|
1284
|
+
instance = {}
|
|
1285
|
+
' hatch from egg
|
|
1286
|
+
instance.new = __Duck_method_new
|
|
1287
|
+
' it must be a duck
|
|
1288
|
+
instance.quack = __Duck_method_quack
|
|
1289
|
+
return instance
|
|
1290
|
+
end function
|
|
1291
|
+
function Duck()
|
|
1292
|
+
instance = __Duck_builder()
|
|
1293
|
+
instance.new()
|
|
1294
|
+
return instance
|
|
1295
|
+
end function
|
|
1296
|
+
`, undefined, 'source/main.bs');
|
|
1297
|
+
});
|
|
1298
|
+
it('puts leading comments from fields in correct place', async () => {
|
|
1299
|
+
await testTranspile(`
|
|
1300
|
+
class Duck
|
|
1301
|
+
' what kind of duck?
|
|
1302
|
+
type as string = "mallard"
|
|
1303
|
+
end class
|
|
1304
|
+
`, `
|
|
1305
|
+
sub __Duck_method_new()
|
|
1306
|
+
' what kind of duck?
|
|
1307
|
+
m.type = "mallard"
|
|
1308
|
+
end sub
|
|
1309
|
+
function __Duck_builder()
|
|
1310
|
+
instance = {}
|
|
1311
|
+
instance.new = __Duck_method_new
|
|
1312
|
+
return instance
|
|
1313
|
+
end function
|
|
1314
|
+
function Duck()
|
|
1315
|
+
instance = __Duck_builder()
|
|
1316
|
+
instance.new()
|
|
1317
|
+
return instance
|
|
1318
|
+
end function
|
|
1319
|
+
`, undefined, 'source/main.bs');
|
|
1320
|
+
});
|
|
1321
|
+
});
|
|
1322
|
+
it('detects using `new` keyword on non-classes', () => {
|
|
1323
|
+
program.setFile('source/main.bs', `
|
|
1324
|
+
sub quack()
|
|
1325
|
+
end sub
|
|
1326
|
+
sub main()
|
|
1327
|
+
duck = new quack()
|
|
1328
|
+
end sub
|
|
1329
|
+
`);
|
|
1330
|
+
program.validate();
|
|
1331
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1332
|
+
DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('quack')
|
|
1333
|
+
]);
|
|
1334
|
+
});
|
|
1335
|
+
it('detects missing call to super', () => {
|
|
1336
|
+
program.setFile('source/main.bs', `
|
|
677
1337
|
class Animal
|
|
678
1338
|
sub new()
|
|
679
1339
|
end sub
|
|
@@ -684,22 +1344,100 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
684
1344
|
end class
|
|
685
1345
|
`);
|
|
686
1346
|
program.validate();
|
|
687
|
-
|
|
1347
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1348
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
1349
|
+
]);
|
|
688
1350
|
});
|
|
689
|
-
it
|
|
690
|
-
|
|
691
|
-
program.setFile(
|
|
692
|
-
class
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
1351
|
+
it('detects direct circular extends', () => {
|
|
1352
|
+
//direct
|
|
1353
|
+
program.setFile('source/Direct.bs', `
|
|
1354
|
+
class Parent extends Child
|
|
1355
|
+
end class
|
|
1356
|
+
|
|
1357
|
+
class Child extends Parent
|
|
1358
|
+
end class
|
|
1359
|
+
`);
|
|
1360
|
+
program.validate();
|
|
1361
|
+
(0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
|
|
1362
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Child']).message,
|
|
1363
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Child', 'Parent']).message
|
|
1364
|
+
]);
|
|
1365
|
+
});
|
|
1366
|
+
it('detects indirect circular extends', () => {
|
|
1367
|
+
//direct
|
|
1368
|
+
program.setFile('source/Indirect.bs', `
|
|
1369
|
+
class Parent extends Grandchild
|
|
1370
|
+
end class
|
|
1371
|
+
|
|
1372
|
+
class Child extends Parent
|
|
1373
|
+
end class
|
|
1374
|
+
|
|
1375
|
+
class Grandchild extends Child
|
|
696
1376
|
end class
|
|
697
1377
|
`);
|
|
698
1378
|
program.validate();
|
|
699
|
-
|
|
1379
|
+
(0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
|
|
1380
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Grandchild', 'Child']).message,
|
|
1381
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Grandchild', 'Child', 'Parent', 'Grandchild']).message,
|
|
1382
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Grandchild', 'Child', 'Parent']).message
|
|
1383
|
+
]);
|
|
1384
|
+
});
|
|
1385
|
+
it('transpiles super method calls twice', async () => {
|
|
1386
|
+
program.setFile('source/lib.bs', `
|
|
1387
|
+
class Being
|
|
1388
|
+
function think()
|
|
1389
|
+
print "thinking..."
|
|
1390
|
+
end function
|
|
1391
|
+
end class
|
|
1392
|
+
|
|
1393
|
+
class Human extends Being
|
|
1394
|
+
function think()
|
|
1395
|
+
super.think()
|
|
1396
|
+
end function
|
|
1397
|
+
end class
|
|
1398
|
+
`);
|
|
1399
|
+
await program.build({ outDir: testHelpers_spec_2.outDir });
|
|
1400
|
+
fsExtra.emptyDirSync(testHelpers_spec_2.outDir);
|
|
1401
|
+
await program.build({ outDir: testHelpers_spec_2.outDir });
|
|
1402
|
+
(0, chai_config_spec_1.expect)(fsExtra.readFileSync((0, util_1.standardizePath) `${testHelpers_spec_2.outDir}/source/lib.brs`).toString().trimEnd()).to.eql((0, testHelpers_spec_1.trim) `
|
|
1403
|
+
sub __Being_method_new()
|
|
1404
|
+
end sub
|
|
1405
|
+
function __Being_method_think()
|
|
1406
|
+
print "thinking..."
|
|
1407
|
+
end function
|
|
1408
|
+
function __Being_builder()
|
|
1409
|
+
instance = {}
|
|
1410
|
+
instance.new = __Being_method_new
|
|
1411
|
+
instance.think = __Being_method_think
|
|
1412
|
+
return instance
|
|
1413
|
+
end function
|
|
1414
|
+
function Being()
|
|
1415
|
+
instance = __Being_builder()
|
|
1416
|
+
instance.new()
|
|
1417
|
+
return instance
|
|
1418
|
+
end function
|
|
1419
|
+
sub __Human_method_new()
|
|
1420
|
+
m.super0_new()
|
|
1421
|
+
end sub
|
|
1422
|
+
function __Human_method_think()
|
|
1423
|
+
m.super0_think()
|
|
1424
|
+
end function
|
|
1425
|
+
function __Human_builder()
|
|
1426
|
+
instance = __Being_builder()
|
|
1427
|
+
instance.super0_new = instance.new
|
|
1428
|
+
instance.new = __Human_method_new
|
|
1429
|
+
instance.think = __Human_method_think
|
|
1430
|
+
return instance
|
|
1431
|
+
end function
|
|
1432
|
+
function Human()
|
|
1433
|
+
instance = __Human_builder()
|
|
1434
|
+
instance.new()
|
|
1435
|
+
return instance
|
|
1436
|
+
end function
|
|
1437
|
+
`);
|
|
700
1438
|
});
|
|
701
1439
|
it('detects duplicate member names', () => {
|
|
702
|
-
program.setFile(
|
|
1440
|
+
program.setFile('source/main.bs', `
|
|
703
1441
|
class Animal
|
|
704
1442
|
public name
|
|
705
1443
|
public name
|
|
@@ -713,32 +1451,26 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
713
1451
|
end class
|
|
714
1452
|
`);
|
|
715
1453
|
program.validate();
|
|
716
|
-
|
|
717
|
-
return {
|
|
718
|
-
code: x.code,
|
|
719
|
-
message: x.message,
|
|
720
|
-
range: x.range,
|
|
721
|
-
severity: vscode_languageserver_1.DiagnosticSeverity.Error
|
|
722
|
-
};
|
|
723
|
-
});
|
|
724
|
-
chai_1.expect(diagnostics).to.eql([Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(3, 23, 3, 27) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(4, 27, 4, 31) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(8, 27, 8, 30) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(10, 23, 10, 26) })]);
|
|
1454
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { location: { range: vscode_languageserver_1.Range.create(3, 23, 3, 27) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { location: { range: vscode_languageserver_1.Range.create(4, 27, 4, 31) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { location: { range: vscode_languageserver_1.Range.create(8, 27, 8, 30) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { location: { range: vscode_languageserver_1.Range.create(10, 23, 10, 26) } })]);
|
|
725
1455
|
});
|
|
726
1456
|
it('detects mismatched member type in child class', () => {
|
|
727
|
-
program.setFile(
|
|
1457
|
+
program.setFile('source/main.bs', `
|
|
728
1458
|
class Animal
|
|
729
1459
|
public name
|
|
730
1460
|
end class
|
|
731
1461
|
class Duck extends Animal
|
|
732
|
-
public function name()
|
|
1462
|
+
public override function name()
|
|
733
1463
|
return "Donald"
|
|
734
1464
|
end function
|
|
735
1465
|
end class
|
|
736
1466
|
`);
|
|
737
1467
|
program.validate();
|
|
738
|
-
|
|
1468
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1469
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Animal', 'name', 'function name() as dynamic', 'dynamic')
|
|
1470
|
+
]);
|
|
739
1471
|
});
|
|
740
1472
|
it('allows untyped overridden field in child class', () => {
|
|
741
|
-
program.setFile(
|
|
1473
|
+
program.setFile('source/main.bs', `
|
|
742
1474
|
class Animal
|
|
743
1475
|
public name
|
|
744
1476
|
end class
|
|
@@ -747,7 +1479,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
747
1479
|
end class
|
|
748
1480
|
`);
|
|
749
1481
|
program.validate();
|
|
750
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
1482
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
751
1483
|
});
|
|
752
1484
|
it('allows overridden property name in child class', () => {
|
|
753
1485
|
program.setFile('source/main.bs', `
|
|
@@ -759,7 +1491,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
759
1491
|
end class
|
|
760
1492
|
`);
|
|
761
1493
|
program.validate();
|
|
762
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
1494
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
763
1495
|
});
|
|
764
1496
|
it('flags incompatible child field type changes', () => {
|
|
765
1497
|
program.setFile('source/main.bs', `
|
|
@@ -769,21 +1501,20 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
769
1501
|
public owner as Person
|
|
770
1502
|
end class
|
|
771
1503
|
class Duck extends Bird
|
|
772
|
-
public age = 12.2 'should be integer but
|
|
1504
|
+
public age = 12.2 'should be integer, but a float can be assigned to an int
|
|
773
1505
|
public name = 12 'should be string but is integer
|
|
774
1506
|
public owner as string
|
|
775
1507
|
end class
|
|
776
1508
|
`);
|
|
777
1509
|
program.validate();
|
|
778
|
-
|
|
779
|
-
DiagnosticMessages_1.DiagnosticMessages.
|
|
780
|
-
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', '
|
|
781
|
-
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', '
|
|
782
|
-
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person').message
|
|
1510
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1511
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Person'),
|
|
1512
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string'),
|
|
1513
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person')
|
|
783
1514
|
]);
|
|
784
1515
|
});
|
|
785
1516
|
it('detects overridden methods without override keyword', () => {
|
|
786
|
-
program.setFile(
|
|
1517
|
+
program.setFile('source/main.bs', `
|
|
787
1518
|
class Animal
|
|
788
1519
|
sub speak()
|
|
789
1520
|
end sub
|
|
@@ -794,10 +1525,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
794
1525
|
end class
|
|
795
1526
|
`);
|
|
796
1527
|
program.validate();
|
|
797
|
-
|
|
1528
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1529
|
+
DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')
|
|
1530
|
+
]);
|
|
798
1531
|
});
|
|
799
1532
|
it('detects overridden methods with different visibility', () => {
|
|
800
|
-
program.setFile(
|
|
1533
|
+
program.setFile('source/main.bs', `
|
|
801
1534
|
class Animal
|
|
802
1535
|
sub speakInPublic()
|
|
803
1536
|
end sub
|
|
@@ -816,12 +1549,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
816
1549
|
end class
|
|
817
1550
|
`);
|
|
818
1551
|
program.validate();
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
1552
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1553
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakInPublic', 'private', 'public', 'Animal'),
|
|
1554
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFriends', 'public', 'protected', 'Animal'),
|
|
1555
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFamily', 'public', 'private', 'Animal')
|
|
1556
|
+
]);
|
|
822
1557
|
});
|
|
823
1558
|
it('allows overridden methods with matching visibility', () => {
|
|
824
|
-
program.setFile(
|
|
1559
|
+
program.setFile('source/main.bs', `
|
|
825
1560
|
class Animal
|
|
826
1561
|
sub speakInPublic()
|
|
827
1562
|
end sub
|
|
@@ -840,20 +1575,93 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
840
1575
|
end class
|
|
841
1576
|
`);
|
|
842
1577
|
program.validate();
|
|
843
|
-
|
|
1578
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
844
1579
|
});
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
1580
|
+
describe('detects unknown parent class', () => {
|
|
1581
|
+
it('non-namespaced parent from outside namespace', () => {
|
|
1582
|
+
program.setFile('source/main.bs', `
|
|
1583
|
+
class Duck extends Animal
|
|
1584
|
+
sub speak()
|
|
1585
|
+
end sub
|
|
1586
|
+
end class
|
|
1587
|
+
|
|
1588
|
+
namespace Vertibrates
|
|
1589
|
+
class Animal
|
|
1590
|
+
end class
|
|
1591
|
+
end namespace
|
|
1592
|
+
`);
|
|
1593
|
+
program.validate();
|
|
1594
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')), { location: { range: vscode_languageserver_1.Range.create(1, 35, 1, 41) } })]);
|
|
1595
|
+
});
|
|
1596
|
+
it('non-namespaced parent from within namespace', () => {
|
|
1597
|
+
program.setFile('source/main.bs', `
|
|
1598
|
+
namespace Vertibrates
|
|
1599
|
+
class Duck extends Animal
|
|
1600
|
+
sub speak()
|
|
1601
|
+
end sub
|
|
1602
|
+
end class
|
|
1603
|
+
end namespace
|
|
1604
|
+
`);
|
|
1605
|
+
program.validate();
|
|
1606
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1607
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
|
|
1608
|
+
]);
|
|
1609
|
+
});
|
|
1610
|
+
it('non-namespaced name from outside namespace alongside existing namespace', () => {
|
|
1611
|
+
program.setFile('source/main.bs', `
|
|
1612
|
+
namespace Vertibrates
|
|
1613
|
+
class Animal
|
|
1614
|
+
end class
|
|
1615
|
+
end namespace
|
|
1616
|
+
|
|
1617
|
+
class Duck extends Animal
|
|
1618
|
+
sub speak()
|
|
1619
|
+
end sub
|
|
1620
|
+
end class
|
|
1621
|
+
`);
|
|
1622
|
+
program.validate();
|
|
1623
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1624
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
|
|
1625
|
+
]);
|
|
1626
|
+
});
|
|
1627
|
+
it('namespaced parent class from outside namespace', () => {
|
|
1628
|
+
program.setFile('source/vertibrates.bs', `
|
|
1629
|
+
namespace Vertibrates
|
|
1630
|
+
class Bird
|
|
1631
|
+
end class
|
|
1632
|
+
end namespace
|
|
1633
|
+
`);
|
|
1634
|
+
program.setFile('source/Duck.bs', `
|
|
1635
|
+
class Duck extends Vertibrates.GroundedBird
|
|
1636
|
+
sub speak()
|
|
1637
|
+
end sub
|
|
1638
|
+
end class
|
|
1639
|
+
`);
|
|
1640
|
+
program.validate();
|
|
1641
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace'))]);
|
|
1642
|
+
});
|
|
1643
|
+
it('namespaced parent class from inside namespace', () => {
|
|
1644
|
+
program.setFile('source/vertibrates.bs', `
|
|
1645
|
+
namespace Vertibrates
|
|
1646
|
+
class Bird
|
|
1647
|
+
end class
|
|
1648
|
+
end namespace
|
|
1649
|
+
`);
|
|
1650
|
+
program.setFile('source/Duck.bs', `
|
|
1651
|
+
namespace Birdies
|
|
1652
|
+
class Duck extends Vertibrates.GroundedBird
|
|
1653
|
+
sub speak()
|
|
1654
|
+
end sub
|
|
1655
|
+
end class
|
|
1656
|
+
end namespace
|
|
1657
|
+
`);
|
|
1658
|
+
program.validate();
|
|
1659
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1660
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace').message
|
|
1661
|
+
]);
|
|
1662
|
+
});
|
|
854
1663
|
});
|
|
855
1664
|
it('catches newable class without namespace name', () => {
|
|
856
|
-
var _a;
|
|
857
1665
|
program.setFile('source/main.bs', `
|
|
858
1666
|
namespace NameA.NameB
|
|
859
1667
|
class Duck
|
|
@@ -865,11 +1673,13 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
865
1673
|
end sub
|
|
866
1674
|
`);
|
|
867
1675
|
program.validate();
|
|
868
|
-
|
|
1676
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1677
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindFunction('Duck').message,
|
|
1678
|
+
DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('Duck')
|
|
1679
|
+
]);
|
|
869
1680
|
});
|
|
870
1681
|
it('supports newable class namespace inference', () => {
|
|
871
|
-
|
|
872
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1682
|
+
program.setFile('source/main.bs', `
|
|
873
1683
|
namespace NameA.NameB
|
|
874
1684
|
class Duck
|
|
875
1685
|
end class
|
|
@@ -879,24 +1689,24 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
879
1689
|
end namespace
|
|
880
1690
|
`);
|
|
881
1691
|
program.validate();
|
|
882
|
-
|
|
1692
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
883
1693
|
});
|
|
884
1694
|
it('catches extending unknown namespaced class', () => {
|
|
885
|
-
|
|
886
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1695
|
+
program.setFile('source/main.bs', `
|
|
887
1696
|
namespace NameA.NameB
|
|
888
1697
|
class Animal
|
|
889
1698
|
end class
|
|
890
|
-
class Duck extends NameA.NameB.
|
|
1699
|
+
class Duck extends NameA.NameB.AnimalNotDefined
|
|
891
1700
|
end class
|
|
892
1701
|
end namespace
|
|
893
1702
|
`);
|
|
894
1703
|
program.validate();
|
|
895
|
-
|
|
1704
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1705
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('AnimalNotDefined', 'NameA.NameB.AnimalNotDefined', 'NameA.NameB', 'namespace')
|
|
1706
|
+
]);
|
|
896
1707
|
});
|
|
897
1708
|
it('supports omitting namespace prefix for items in same namespace', () => {
|
|
898
|
-
|
|
899
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1709
|
+
program.setFile('source/main.bs', `
|
|
900
1710
|
namespace NameA.NameB
|
|
901
1711
|
class Animal
|
|
902
1712
|
end class
|
|
@@ -905,45 +1715,54 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
905
1715
|
end namespace
|
|
906
1716
|
`);
|
|
907
1717
|
program.validate();
|
|
908
|
-
|
|
1718
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
909
1719
|
});
|
|
910
1720
|
it('catches duplicate root-level class declarations', () => {
|
|
911
|
-
|
|
912
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1721
|
+
program.setFile('source/main.bs', `
|
|
913
1722
|
class Animal
|
|
914
1723
|
end class
|
|
915
1724
|
class Animal
|
|
1725
|
+
end class
|
|
916
1726
|
`);
|
|
917
1727
|
program.validate();
|
|
918
|
-
|
|
1728
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1729
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'Animal')
|
|
1730
|
+
]);
|
|
919
1731
|
});
|
|
920
1732
|
it('catches duplicate namespace-level class declarations', () => {
|
|
921
|
-
|
|
922
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1733
|
+
program.setFile('source/main.bs', `
|
|
923
1734
|
namespace NameA.NameB
|
|
924
1735
|
class Animal
|
|
925
1736
|
end class
|
|
926
1737
|
class Animal
|
|
1738
|
+
end class
|
|
927
1739
|
end namespace
|
|
928
1740
|
`);
|
|
929
1741
|
program.validate();
|
|
930
|
-
|
|
1742
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1743
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'NameA.NameB.Animal').message
|
|
1744
|
+
]);
|
|
931
1745
|
});
|
|
932
|
-
it('
|
|
933
|
-
|
|
934
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1746
|
+
it('allows namespaced class name which is the same as a global class', () => {
|
|
1747
|
+
program.setFile('source/main.bs', `
|
|
935
1748
|
namespace NameA.NameB
|
|
936
1749
|
class Animal
|
|
1750
|
+
name as string
|
|
937
1751
|
end class
|
|
1752
|
+
|
|
1753
|
+
sub printThisAnimalName(ani as Animal) ' this refers to NameA.NameB.Animal
|
|
1754
|
+
print ani.name
|
|
1755
|
+
end sub
|
|
938
1756
|
end namespace
|
|
1757
|
+
|
|
939
1758
|
class Animal
|
|
1759
|
+
doesNotHaveName as string
|
|
940
1760
|
end class
|
|
941
1761
|
`);
|
|
942
1762
|
program.validate();
|
|
943
|
-
|
|
1763
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
944
1764
|
});
|
|
945
1765
|
it('catches class with same name as function', () => {
|
|
946
|
-
var _a;
|
|
947
1766
|
program.setFile('source/main.bs', `
|
|
948
1767
|
class Animal
|
|
949
1768
|
end class
|
|
@@ -951,10 +1770,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
951
1770
|
end sub
|
|
952
1771
|
`);
|
|
953
1772
|
program.validate();
|
|
954
|
-
|
|
1773
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1774
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Function', 'Animal').message,
|
|
1775
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Function', 'Class', 'Animal').message
|
|
1776
|
+
]);
|
|
955
1777
|
});
|
|
956
1778
|
it('catches class with same name (but different case) as function', () => {
|
|
957
|
-
var _a;
|
|
958
1779
|
program.setFile('source/main.bs', `
|
|
959
1780
|
class ANIMAL
|
|
960
1781
|
end class
|
|
@@ -962,10 +1783,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
962
1783
|
end sub
|
|
963
1784
|
`);
|
|
964
1785
|
program.validate();
|
|
965
|
-
|
|
1786
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1787
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Function', 'animal').message,
|
|
1788
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Function', 'Class', 'ANIMAL').message
|
|
1789
|
+
]);
|
|
966
1790
|
});
|
|
967
1791
|
it('catches variable with same name as class', () => {
|
|
968
|
-
var _a;
|
|
969
1792
|
program.setFile('source/main.bs', `
|
|
970
1793
|
class Animal
|
|
971
1794
|
end class
|
|
@@ -974,7 +1797,9 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
974
1797
|
end sub
|
|
975
1798
|
`);
|
|
976
1799
|
program.validate();
|
|
977
|
-
|
|
1800
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1801
|
+
DiagnosticMessages_1.DiagnosticMessages.localVarShadowedByScopedFunction().message
|
|
1802
|
+
]);
|
|
978
1803
|
});
|
|
979
1804
|
it('allows extending classes with more than one dot in the filename', () => {
|
|
980
1805
|
program.setFile('source/testclass.bs', `
|
|
@@ -1002,9 +1827,9 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1002
1827
|
end class
|
|
1003
1828
|
`);
|
|
1004
1829
|
program.validate();
|
|
1005
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
1830
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
1006
1831
|
});
|
|
1007
|
-
it('computes correct super index for grandchild class', () => {
|
|
1832
|
+
it('computes correct super index for grandchild class', async () => {
|
|
1008
1833
|
program.setFile('source/main.bs', `
|
|
1009
1834
|
sub Main()
|
|
1010
1835
|
c = new App.ClassC()
|
|
@@ -1018,7 +1843,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1018
1843
|
end class
|
|
1019
1844
|
end namespace
|
|
1020
1845
|
`);
|
|
1021
|
-
testTranspile(`
|
|
1846
|
+
await testTranspile(`
|
|
1022
1847
|
namespace App
|
|
1023
1848
|
class ClassC extends ClassB
|
|
1024
1849
|
sub new()
|
|
@@ -1027,12 +1852,13 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1027
1852
|
end class
|
|
1028
1853
|
end namespace
|
|
1029
1854
|
`, `
|
|
1855
|
+
sub __App_ClassC_method_new()
|
|
1856
|
+
m.super1_new()
|
|
1857
|
+
end sub
|
|
1030
1858
|
function __App_ClassC_builder()
|
|
1031
1859
|
instance = __App_ClassB_builder()
|
|
1032
1860
|
instance.super1_new = instance.new
|
|
1033
|
-
instance.new =
|
|
1034
|
-
m.super1_new()
|
|
1035
|
-
end sub
|
|
1861
|
+
instance.new = __App_ClassC_method_new
|
|
1036
1862
|
return instance
|
|
1037
1863
|
end function
|
|
1038
1864
|
function App_ClassC()
|
|
@@ -1042,23 +1868,24 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1042
1868
|
end function
|
|
1043
1869
|
`, 'trim', 'source/App.ClassC.bs');
|
|
1044
1870
|
});
|
|
1045
|
-
it('computes correct super index for namespaced child class and global parent class', () => {
|
|
1871
|
+
it('computes correct super index for namespaced child class and global parent class', async () => {
|
|
1046
1872
|
program.setFile('source/ClassA.bs', `
|
|
1047
1873
|
class ClassA
|
|
1048
1874
|
end class
|
|
1049
1875
|
`);
|
|
1050
|
-
testTranspile(`
|
|
1876
|
+
await testTranspile(`
|
|
1051
1877
|
namespace App
|
|
1052
1878
|
class ClassB extends ClassA
|
|
1053
1879
|
end class
|
|
1054
1880
|
end namespace
|
|
1055
1881
|
`, `
|
|
1882
|
+
sub __App_ClassB_method_new()
|
|
1883
|
+
m.super0_new()
|
|
1884
|
+
end sub
|
|
1056
1885
|
function __App_ClassB_builder()
|
|
1057
1886
|
instance = __ClassA_builder()
|
|
1058
1887
|
instance.super0_new = instance.new
|
|
1059
|
-
instance.new =
|
|
1060
|
-
m.super0_new()
|
|
1061
|
-
end sub
|
|
1888
|
+
instance.new = __App_ClassB_method_new
|
|
1062
1889
|
return instance
|
|
1063
1890
|
end function
|
|
1064
1891
|
function App_ClassB()
|
|
@@ -1073,9 +1900,136 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1073
1900
|
class ClassB extends ClassA
|
|
1074
1901
|
end class
|
|
1075
1902
|
`);
|
|
1076
|
-
assert_1.doesNotThrow(() => {
|
|
1077
|
-
file.
|
|
1903
|
+
(0, assert_1.doesNotThrow)(() => {
|
|
1904
|
+
const classStatements = file.ast.findChildren(reflection_1.isClassStatement);
|
|
1905
|
+
classStatements[0]['getParentClassIndex'](new BrsTranspileState_1.BrsTranspileState(file));
|
|
1078
1906
|
});
|
|
1079
1907
|
});
|
|
1908
|
+
it('does not crash when child has field with same name as sub in parent', () => {
|
|
1909
|
+
program.setFile('source/main.bs', `
|
|
1910
|
+
class Parent
|
|
1911
|
+
public function helloWorld()
|
|
1912
|
+
end function
|
|
1913
|
+
end class
|
|
1914
|
+
class Child extends Parent
|
|
1915
|
+
public helloWorld as string
|
|
1916
|
+
end class
|
|
1917
|
+
`);
|
|
1918
|
+
program.validate();
|
|
1919
|
+
});
|
|
1920
|
+
it('does not crash when child has method with same name as field in parent', () => {
|
|
1921
|
+
program.setFile('source/main.bs', `
|
|
1922
|
+
class Parent
|
|
1923
|
+
public helloWorld as string
|
|
1924
|
+
end class
|
|
1925
|
+
class Child extends Parent
|
|
1926
|
+
public function helloWorld()
|
|
1927
|
+
end function
|
|
1928
|
+
end class
|
|
1929
|
+
`);
|
|
1930
|
+
program.validate();
|
|
1931
|
+
});
|
|
1932
|
+
it('extending namespaced class transpiles properly', async () => {
|
|
1933
|
+
await testTranspile(`
|
|
1934
|
+
namespace App
|
|
1935
|
+
class CoreClass
|
|
1936
|
+
sub new()
|
|
1937
|
+
print "CoreClass.new()"
|
|
1938
|
+
end sub
|
|
1939
|
+
end class
|
|
1940
|
+
end namespace
|
|
1941
|
+
namespace App.Logic
|
|
1942
|
+
class FirstClass extends App.CoreClass
|
|
1943
|
+
end class
|
|
1944
|
+
class SecondClass extends FirstClass
|
|
1945
|
+
end class
|
|
1946
|
+
end namespace
|
|
1947
|
+
namespace App.OtherLogic
|
|
1948
|
+
class FinalClass extends App.Logic.SecondClass
|
|
1949
|
+
end class
|
|
1950
|
+
end namespace
|
|
1951
|
+
`, `
|
|
1952
|
+
sub __App_CoreClass_method_new()
|
|
1953
|
+
print "CoreClass.new()"
|
|
1954
|
+
end sub
|
|
1955
|
+
function __App_CoreClass_builder()
|
|
1956
|
+
instance = {}
|
|
1957
|
+
instance.new = __App_CoreClass_method_new
|
|
1958
|
+
return instance
|
|
1959
|
+
end function
|
|
1960
|
+
function App_CoreClass()
|
|
1961
|
+
instance = __App_CoreClass_builder()
|
|
1962
|
+
instance.new()
|
|
1963
|
+
return instance
|
|
1964
|
+
end function
|
|
1965
|
+
sub __App_Logic_FirstClass_method_new()
|
|
1966
|
+
m.super0_new()
|
|
1967
|
+
end sub
|
|
1968
|
+
function __App_Logic_FirstClass_builder()
|
|
1969
|
+
instance = __App_CoreClass_builder()
|
|
1970
|
+
instance.super0_new = instance.new
|
|
1971
|
+
instance.new = __App_Logic_FirstClass_method_new
|
|
1972
|
+
return instance
|
|
1973
|
+
end function
|
|
1974
|
+
function App_Logic_FirstClass()
|
|
1975
|
+
instance = __App_Logic_FirstClass_builder()
|
|
1976
|
+
instance.new()
|
|
1977
|
+
return instance
|
|
1978
|
+
end function
|
|
1979
|
+
sub __App_Logic_SecondClass_method_new()
|
|
1980
|
+
m.super1_new()
|
|
1981
|
+
end sub
|
|
1982
|
+
function __App_Logic_SecondClass_builder()
|
|
1983
|
+
instance = __App_Logic_FirstClass_builder()
|
|
1984
|
+
instance.super1_new = instance.new
|
|
1985
|
+
instance.new = __App_Logic_SecondClass_method_new
|
|
1986
|
+
return instance
|
|
1987
|
+
end function
|
|
1988
|
+
function App_Logic_SecondClass()
|
|
1989
|
+
instance = __App_Logic_SecondClass_builder()
|
|
1990
|
+
instance.new()
|
|
1991
|
+
return instance
|
|
1992
|
+
end function
|
|
1993
|
+
sub __App_OtherLogic_FinalClass_method_new()
|
|
1994
|
+
m.super2_new()
|
|
1995
|
+
end sub
|
|
1996
|
+
function __App_OtherLogic_FinalClass_builder()
|
|
1997
|
+
instance = __App_Logic_SecondClass_builder()
|
|
1998
|
+
instance.super2_new = instance.new
|
|
1999
|
+
instance.new = __App_OtherLogic_FinalClass_method_new
|
|
2000
|
+
return instance
|
|
2001
|
+
end function
|
|
2002
|
+
function App_OtherLogic_FinalClass()
|
|
2003
|
+
instance = __App_OtherLogic_FinalClass_builder()
|
|
2004
|
+
instance.new()
|
|
2005
|
+
return instance
|
|
2006
|
+
end function
|
|
2007
|
+
`);
|
|
2008
|
+
});
|
|
2009
|
+
it('detects calling class constructors with too many parameters', () => {
|
|
2010
|
+
program.setFile('source/main.bs', `
|
|
2011
|
+
class Parameterless
|
|
2012
|
+
sub new()
|
|
2013
|
+
end sub
|
|
2014
|
+
end class
|
|
2015
|
+
|
|
2016
|
+
class OneParam
|
|
2017
|
+
sub new(param1)
|
|
2018
|
+
end sub
|
|
2019
|
+
end class
|
|
2020
|
+
|
|
2021
|
+
sub main()
|
|
2022
|
+
c1 = new Parameterless(1)
|
|
2023
|
+
c2 = new OneParam(1, 2)
|
|
2024
|
+
c2 = new OneParam()
|
|
2025
|
+
end sub
|
|
2026
|
+
`);
|
|
2027
|
+
program.validate();
|
|
2028
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
2029
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(0, 1),
|
|
2030
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 2),
|
|
2031
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 0)
|
|
2032
|
+
]);
|
|
2033
|
+
});
|
|
1080
2034
|
});
|
|
1081
2035
|
//# sourceMappingURL=BrsFile.Class.spec.js.map
|