brighterscript 1.0.0-alpha.3 → 1.0.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1230 -285
- package/README.md +61 -131
- package/bsconfig.schema.json +68 -2
- 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 +35 -0
- package/dist/AstValidationSegmenter.js +209 -0
- package/dist/AstValidationSegmenter.js.map +1 -0
- package/dist/BsConfig.d.ts +51 -6
- package/dist/BusyStatusTracker.d.ts +31 -0
- package/dist/BusyStatusTracker.js +83 -0
- package/dist/BusyStatusTracker.js.map +1 -0
- package/dist/Cache.d.ts +5 -6
- package/dist/Cache.js +12 -11
- 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 +11 -2
- package/dist/CodeActionUtil.js +17 -3
- package/dist/CodeActionUtil.js.map +1 -1
- package/dist/CommentFlagProcessor.d.ts +7 -6
- package/dist/CommentFlagProcessor.js +10 -7
- package/dist/CommentFlagProcessor.js.map +1 -1
- 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 +5 -3
- package/dist/DiagnosticCollection.js +18 -16
- package/dist/DiagnosticCollection.js.map +1 -1
- package/dist/DiagnosticFilterer.d.ts +8 -4
- package/dist/DiagnosticFilterer.js +77 -44
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticManager.d.ts +55 -0
- package/dist/DiagnosticManager.js +214 -0
- package/dist/DiagnosticManager.js.map +1 -0
- package/dist/DiagnosticMessages.d.ts +184 -17
- package/dist/DiagnosticMessages.js +242 -24
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/DiagnosticSeverityAdjuster.d.ts +7 -0
- package/dist/DiagnosticSeverityAdjuster.js +41 -0
- package/dist/DiagnosticSeverityAdjuster.js.map +1 -0
- package/dist/FunctionScope.d.ts +28 -0
- package/dist/FunctionScope.js +52 -0
- package/dist/FunctionScope.js.map +1 -0
- package/dist/KeyedThrottler.d.ts +3 -3
- package/dist/KeyedThrottler.js +3 -3
- package/dist/KeyedThrottler.js.map +1 -1
- package/dist/LanguageServer.d.ts +72 -47
- package/dist/LanguageServer.js +544 -312
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +9 -10
- package/dist/Logger.js +36 -30
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.d.ts +29 -7
- package/dist/PluginInterface.js +90 -7
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +204 -99
- package/dist/Program.js +1060 -699
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +29 -18
- package/dist/ProgramBuilder.js +170 -132
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +144 -109
- package/dist/Scope.js +538 -551
- package/dist/Scope.js.map +1 -1
- package/dist/SemanticTokenUtils.d.ts +14 -0
- package/dist/SemanticTokenUtils.js +81 -0
- package/dist/SemanticTokenUtils.js.map +1 -0
- package/dist/Stopwatch.d.ts +4 -0
- package/dist/Stopwatch.js +8 -1
- package/dist/Stopwatch.js.map +1 -1
- package/dist/SymbolTable.d.ts +91 -24
- package/dist/SymbolTable.js +286 -63
- package/dist/SymbolTable.js.map +1 -1
- package/dist/SymbolTypeFlag.d.ts +8 -0
- package/dist/SymbolTypeFlag.js +13 -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 +35 -87
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/CachedLookups.d.ts +49 -0
- package/dist/astUtils/CachedLookups.js +324 -0
- package/dist/astUtils/CachedLookups.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 +33 -10
- package/dist/astUtils/creators.js +224 -30
- 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 +145 -82
- package/dist/astUtils/reflection.js +304 -132
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +267 -162
- 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 +114 -53
- package/dist/astUtils/visitors.js +70 -13
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +465 -51
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/astUtils/xml.d.ts +9 -8
- package/dist/astUtils/xml.js +10 -5
- package/dist/astUtils/xml.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +22 -1
- package/dist/bscPlugin/BscPlugin.js +88 -0
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
- package/dist/bscPlugin/CallExpressionInfo.js +131 -0
- package/dist/bscPlugin/CallExpressionInfo.js.map +1 -0
- package/dist/bscPlugin/FileWriter.d.ts +6 -0
- package/dist/bscPlugin/FileWriter.js +24 -0
- package/dist/bscPlugin/FileWriter.js.map +1 -0
- package/dist/bscPlugin/SignatureHelpUtil.d.ts +10 -0
- package/dist/bscPlugin/SignatureHelpUtil.js +137 -0
- package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +26 -17
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +94 -20
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +60 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.js +601 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
- package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +2139 -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 +210 -0
- package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
- package/dist/bscPlugin/definition/DefinitionProvider.spec.js +88 -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 +218 -0
- package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/hover/HoverProcessor.spec.js +737 -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 +56 -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 +138 -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 +491 -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 +19 -0
- package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
- package/dist/bscPlugin/serialize/BslibManager.d.ts +9 -0
- package/dist/bscPlugin/serialize/BslibManager.js +40 -0
- package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
- package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
- package/dist/bscPlugin/serialize/FileSerializer.js +72 -0
- package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
- package/dist/bscPlugin/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 +140 -0
- package/dist/bscPlugin/symbols/symbolUtils.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +21 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +202 -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 +41 -0
- package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
- package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
- package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileAfterValidatior.d.ts +7 -0
- package/dist/bscPlugin/validation/BrsFileAfterValidatior.js +18 -0
- package/dist/bscPlugin/validation/BrsFileAfterValidatior.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +34 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js +462 -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 +758 -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 +131 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +1097 -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 +2796 -0
- package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
- package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js +44 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
- package/dist/cli.js +117 -11
- package/dist/cli.js.map +1 -1
- package/dist/deferred.d.ts +3 -3
- package/dist/deferred.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +10 -3
- package/dist/diagnosticUtils.js +58 -21
- package/dist/diagnosticUtils.js.map +1 -1
- 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 +858 -153
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +144 -82
- package/dist/files/BrsFile.js +847 -911
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +2928 -834
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/BscFile.d.ts +101 -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 +20 -0
- package/dist/files/LazyFileData.js +54 -0
- package/dist/files/LazyFileData.js.map +1 -0
- package/dist/files/LazyFileData.spec.d.ts +1 -0
- package/dist/files/LazyFileData.spec.js +27 -0
- package/dist/files/LazyFileData.spec.js.map +1 -0
- package/dist/files/XmlFile.d.ts +73 -41
- package/dist/files/XmlFile.js +126 -138
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +450 -318
- 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 +416 -162
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +25 -3
- package/dist/index.js +42 -5
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +722 -119
- package/dist/interfaces.js +31 -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 +40 -9
- package/dist/lexer/Lexer.js +191 -49
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +775 -563
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/Token.d.ts +11 -3
- package/dist/lexer/Token.js +10 -2
- package/dist/lexer/Token.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +27 -1
- package/dist/lexer/TokenKind.js +112 -5
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/logging.d.ts +9 -0
- package/dist/logging.js +16 -0
- package/dist/logging.js.map +1 -0
- package/dist/parser/AstNode.d.ts +180 -0
- package/dist/parser/AstNode.js +245 -0
- package/dist/parser/AstNode.js.map +1 -0
- package/dist/parser/AstNode.spec.d.ts +1 -0
- package/dist/parser/AstNode.spec.js +165 -0
- package/dist/parser/AstNode.spec.js.map +1 -0
- package/dist/parser/BrsTranspileState.d.ts +12 -2
- package/dist/parser/BrsTranspileState.js +6 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +454 -210
- package/dist/parser/Expression.js +953 -498
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +200 -95
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +105 -120
- package/dist/parser/Parser.js +1406 -912
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.d.ts +3 -1
- package/dist/parser/Parser.spec.js +1383 -456
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGParser.d.ts +44 -6
- package/dist/parser/SGParser.js +212 -185
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +30 -28
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +293 -50
- package/dist/parser/SGTypes.js +540 -187
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/Statement.d.ts +734 -244
- package/dist/parser/Statement.js +1758 -611
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +45 -34
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/TranspileState.d.ts +17 -8
- package/dist/parser/TranspileState.js +73 -11
- package/dist/parser/TranspileState.js.map +1 -1
- package/dist/parser/tests/Parser.spec.d.ts +10 -9
- package/dist/parser/tests/Parser.spec.js +18 -14
- package/dist/parser/tests/Parser.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/For.spec.js +79 -69
- package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/ForEach.spec.js +53 -47
- package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/If.spec.js +217 -196
- package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/While.spec.js +48 -42
- package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
- package/dist/parser/tests/expression/Additive.spec.js +31 -31
- package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
- package/dist/parser/tests/expression/ArrayLiterals.spec.js +157 -120
- package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +202 -139
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/Boolean.spec.js +25 -25
- package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
- package/dist/parser/tests/expression/Call.spec.js +150 -41
- package/dist/parser/tests/expression/Call.spec.js.map +1 -1
- package/dist/parser/tests/expression/Exponential.spec.js +18 -18
- package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
- package/dist/parser/tests/expression/Function.spec.js +257 -257
- package/dist/parser/tests/expression/Function.spec.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +160 -90
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/dist/parser/tests/expression/Multiplicative.spec.js +38 -38
- package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +196 -98
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/PrefixUnary.spec.js +42 -42
- package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
- package/dist/parser/tests/expression/Primary.spec.js +42 -42
- 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 +44 -44
- 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 +230 -90
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +377 -148
- 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 +37 -37
- 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 +262 -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 +45 -45
- package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
- package/dist/parser/tests/statement/Dim.spec.js +22 -22
- package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +684 -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 +208 -198
- 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 +51 -51
- 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 +109 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
- package/dist/parser/tests/statement/LibraryStatement.spec.js +18 -18
- package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Misc.spec.js +123 -163
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +125 -108
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/ReturnStatement.spec.js +51 -49
- package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Set.spec.js +110 -97
- package/dist/parser/tests/statement/Set.spec.js.map +1 -1
- package/dist/parser/tests/statement/Stop.spec.js +13 -12
- package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
- package/dist/parser/tests/statement/Throw.spec.js +6 -6
- package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
- package/dist/parser/tests/statement/TryCatch.spec.js +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 +19351 -0
- package/dist/roku-types/index.d.ts +5483 -0
- package/dist/roku-types/index.js +11 -0
- package/dist/roku-types/index.js.map +1 -0
- package/dist/types/ArrayType.d.ts +9 -5
- package/dist/types/ArrayType.js +68 -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 +14 -0
- package/dist/types/AssociativeArrayType.js +60 -0
- package/dist/types/AssociativeArrayType.js.map +1 -0
- package/dist/types/BaseFunctionType.d.ts +9 -0
- package/dist/types/BaseFunctionType.js +25 -0
- package/dist/types/BaseFunctionType.js.map +1 -0
- package/dist/types/BooleanType.d.ts +10 -5
- package/dist/types/BooleanType.js +21 -9
- 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 +29 -3
- package/dist/types/BscType.js +121 -0
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/BscTypeKind.d.ts +25 -0
- package/dist/types/BscTypeKind.js +30 -0
- package/dist/types/BscTypeKind.js.map +1 -0
- package/dist/types/BuiltInInterfaceAdder.d.ts +23 -0
- package/dist/types/BuiltInInterfaceAdder.js +174 -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/ClassType.d.ts +17 -0
- package/dist/types/ClassType.js +58 -0
- package/dist/types/ClassType.js.map +1 -0
- package/dist/types/ClassType.spec.d.ts +1 -0
- package/dist/types/ClassType.spec.js +76 -0
- package/dist/types/ClassType.spec.js.map +1 -0
- package/dist/types/ComponentType.d.ts +27 -0
- package/dist/types/ComponentType.js +83 -0
- package/dist/types/ComponentType.js.map +1 -0
- package/dist/types/DoubleType.d.ts +10 -5
- package/dist/types/DoubleType.js +25 -18
- 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 +12 -5
- package/dist/types/DynamicType.js +22 -6
- 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 +40 -0
- package/dist/types/EnumType.js +80 -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 +25 -18
- 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 +10 -22
- package/dist/types/FunctionType.js +26 -63
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/InheritableType.d.ts +28 -0
- package/dist/types/InheritableType.js +157 -0
- package/dist/types/InheritableType.js.map +1 -0
- package/dist/types/IntegerType.d.ts +10 -5
- package/dist/types/IntegerType.js +25 -18
- 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 +26 -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/InvalidType.d.ts +9 -5
- package/dist/types/InvalidType.js +20 -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 +25 -18
- 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 +10 -5
- package/dist/types/ObjectType.js +23 -9
- 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 +71 -0
- package/dist/types/ReferenceType.js +467 -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 +13 -5
- package/dist/types/StringType.js +25 -9
- 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/TypedFunctionType.d.ts +33 -0
- package/dist/types/TypedFunctionType.js +106 -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 +8 -6
- package/dist/types/UninitializedType.js +15 -9
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/UnionType.d.ts +20 -0
- package/dist/types/UnionType.js +127 -0
- package/dist/types/UnionType.js.map +1 -0
- package/dist/types/UnionType.spec.d.ts +1 -0
- package/dist/types/UnionType.spec.js +129 -0
- package/dist/types/UnionType.spec.js.map +1 -0
- package/dist/types/VoidType.d.ts +10 -5
- package/dist/types/VoidType.js +20 -9
- 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 +144 -0
- package/dist/types/helper.spec.js.map +1 -0
- package/dist/types/helpers.d.ts +24 -0
- package/dist/types/helpers.js +178 -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/util.d.ts +216 -106
- package/dist/util.js +1289 -319
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +9 -15
- package/dist/validators/ClassValidator.js +81 -134
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +169 -138
- package/dist/astUtils/index.d.ts +0 -7
- package/dist/astUtils/index.js +0 -26
- package/dist/astUtils/index.js.map +0 -1
- package/dist/lexer/index.d.ts +0 -3
- package/dist/lexer/index.js +0 -17
- package/dist/lexer/index.js.map +0 -1
- package/dist/parser/index.d.ts +0 -3
- package/dist/parser/index.js +0 -16
- package/dist/parser/index.js.map +0 -1
- package/dist/preprocessor/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/{preprocessor/Preprocessor.spec.d.ts → astUtils/Editor.spec.d.ts} +0 -0
- /package/dist/{preprocessor/PreprocessorParser.spec.d.ts → bscPlugin/completions/CompletionsProcessor.spec.d.ts} +0 -0
- /package/dist/{types/FunctionType.spec.d.ts → bscPlugin/definition/DefinitionProvider.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, stagingDir: testHelpers_spec_2.stagingDir });
|
|
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,45 +176,56 @@ 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()), { range: vscode_languageserver_1.Range.create(9, 24, 9, 25) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { 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
|
`, `
|
|
@@ -199,7 +233,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
199
233
|
instance = {}
|
|
200
234
|
instance.new = sub()
|
|
201
235
|
m.species1 = "Animal"
|
|
202
|
-
print "From Animal: " + m.
|
|
236
|
+
print "From Animal: " + m.species1
|
|
203
237
|
end sub
|
|
204
238
|
return instance
|
|
205
239
|
end function
|
|
@@ -214,7 +248,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
214
248
|
instance.new = sub()
|
|
215
249
|
m.super0_new()
|
|
216
250
|
m.species2 = "Duck"
|
|
217
|
-
print "From Duck: " + m.
|
|
251
|
+
print "From Duck: " + m.species2
|
|
218
252
|
end sub
|
|
219
253
|
return instance
|
|
220
254
|
end function
|
|
@@ -225,8 +259,84 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
225
259
|
end function
|
|
226
260
|
`, 'trim', 'source/main.bs');
|
|
227
261
|
});
|
|
228
|
-
it('
|
|
229
|
-
testTranspile(`
|
|
262
|
+
it('allows comments as first line of constructor', async () => {
|
|
263
|
+
await testTranspile(`
|
|
264
|
+
class Animal
|
|
265
|
+
end class
|
|
266
|
+
class Duck extends Animal
|
|
267
|
+
sub new()
|
|
268
|
+
'comment should not cause double super call
|
|
269
|
+
super()
|
|
270
|
+
end sub
|
|
271
|
+
end class
|
|
272
|
+
`, `
|
|
273
|
+
function __Animal_builder()
|
|
274
|
+
instance = {}
|
|
275
|
+
instance.new = sub()
|
|
276
|
+
end sub
|
|
277
|
+
return instance
|
|
278
|
+
end function
|
|
279
|
+
function Animal()
|
|
280
|
+
instance = __Animal_builder()
|
|
281
|
+
instance.new()
|
|
282
|
+
return instance
|
|
283
|
+
end function
|
|
284
|
+
function __Duck_builder()
|
|
285
|
+
instance = __Animal_builder()
|
|
286
|
+
instance.super0_new = instance.new
|
|
287
|
+
instance.new = sub()
|
|
288
|
+
'comment should not cause double super call
|
|
289
|
+
m.super0_new()
|
|
290
|
+
end sub
|
|
291
|
+
return instance
|
|
292
|
+
end function
|
|
293
|
+
function Duck()
|
|
294
|
+
instance = __Duck_builder()
|
|
295
|
+
instance.new()
|
|
296
|
+
return instance
|
|
297
|
+
end function
|
|
298
|
+
`);
|
|
299
|
+
});
|
|
300
|
+
it('does not inject a call to super if one exists', async () => {
|
|
301
|
+
await testTranspile(`
|
|
302
|
+
class Animal
|
|
303
|
+
end class
|
|
304
|
+
class Duck extends Animal
|
|
305
|
+
sub new()
|
|
306
|
+
print "I am a statement which does not use m"
|
|
307
|
+
super()
|
|
308
|
+
end sub
|
|
309
|
+
end class
|
|
310
|
+
`, `
|
|
311
|
+
function __Animal_builder()
|
|
312
|
+
instance = {}
|
|
313
|
+
instance.new = sub()
|
|
314
|
+
end sub
|
|
315
|
+
return instance
|
|
316
|
+
end function
|
|
317
|
+
function Animal()
|
|
318
|
+
instance = __Animal_builder()
|
|
319
|
+
instance.new()
|
|
320
|
+
return instance
|
|
321
|
+
end function
|
|
322
|
+
function __Duck_builder()
|
|
323
|
+
instance = __Animal_builder()
|
|
324
|
+
instance.super0_new = instance.new
|
|
325
|
+
instance.new = sub()
|
|
326
|
+
print "I am a statement which does not use m"
|
|
327
|
+
m.super0_new()
|
|
328
|
+
end sub
|
|
329
|
+
return instance
|
|
330
|
+
end function
|
|
331
|
+
function Duck()
|
|
332
|
+
instance = __Duck_builder()
|
|
333
|
+
instance.new()
|
|
334
|
+
return instance
|
|
335
|
+
end function
|
|
336
|
+
`);
|
|
337
|
+
});
|
|
338
|
+
it('handles class inheritance inferred constructor calls', async () => {
|
|
339
|
+
await testTranspile(`
|
|
230
340
|
class Animal
|
|
231
341
|
className1 = "Animal"
|
|
232
342
|
end class
|
|
@@ -279,8 +389,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
279
389
|
end function
|
|
280
390
|
`, undefined, 'source/main.bs');
|
|
281
391
|
});
|
|
282
|
-
it('works with namespaces', () => {
|
|
283
|
-
testTranspile(`
|
|
392
|
+
it('works with namespaces', async () => {
|
|
393
|
+
await testTranspile(`
|
|
284
394
|
namespace Birds.WaterFowl
|
|
285
395
|
class Duck
|
|
286
396
|
end class
|
|
@@ -314,8 +424,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
314
424
|
end function
|
|
315
425
|
`, undefined, 'source/main.bs');
|
|
316
426
|
});
|
|
317
|
-
it('works for simple class', () => {
|
|
318
|
-
testTranspile(`
|
|
427
|
+
it('works for simple class', async () => {
|
|
428
|
+
await testTranspile(`
|
|
319
429
|
class Duck
|
|
320
430
|
end class
|
|
321
431
|
`, `
|
|
@@ -332,8 +442,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
332
442
|
end function
|
|
333
443
|
`, undefined, 'source/main.bs');
|
|
334
444
|
});
|
|
335
|
-
it('registers the constructor and properly handles its parameters', () => {
|
|
336
|
-
testTranspile(`
|
|
445
|
+
it('registers the constructor and properly handles its parameters', async () => {
|
|
446
|
+
await testTranspile(`
|
|
337
447
|
class Duck
|
|
338
448
|
sub new(name as string, age as integer)
|
|
339
449
|
end sub
|
|
@@ -352,11 +462,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
352
462
|
end function
|
|
353
463
|
`, undefined, 'source/main.bs');
|
|
354
464
|
});
|
|
355
|
-
it('properly handles child class constructor override and super calls', () => {
|
|
356
|
-
testTranspile(`
|
|
465
|
+
it('properly handles child class constructor override and super calls', async () => {
|
|
466
|
+
await testTranspile(`
|
|
357
467
|
class Animal
|
|
358
468
|
sub new(name as string)
|
|
359
469
|
end sub
|
|
470
|
+
|
|
471
|
+
sub DoSomething()
|
|
472
|
+
end sub
|
|
360
473
|
end class
|
|
361
474
|
|
|
362
475
|
class Duck extends Animal
|
|
@@ -370,6 +483,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
370
483
|
instance = {}
|
|
371
484
|
instance.new = sub(name as string)
|
|
372
485
|
end sub
|
|
486
|
+
instance.DoSomething = sub()
|
|
487
|
+
end sub
|
|
373
488
|
return instance
|
|
374
489
|
end function
|
|
375
490
|
function Animal(name as string)
|
|
@@ -393,8 +508,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
393
508
|
end function
|
|
394
509
|
`, undefined, 'source/main.bs');
|
|
395
510
|
});
|
|
396
|
-
it('transpiles super in nested blocks', () => {
|
|
397
|
-
testTranspile(`
|
|
511
|
+
it('transpiles super in nested blocks', async () => {
|
|
512
|
+
await testTranspile(`
|
|
398
513
|
class Creature
|
|
399
514
|
sub new(name as string)
|
|
400
515
|
end sub
|
|
@@ -435,7 +550,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
435
550
|
instance.super0_sayHello = instance.sayHello
|
|
436
551
|
instance.sayHello = function(text)
|
|
437
552
|
text = "The duck says " + text
|
|
438
|
-
if text <> invalid
|
|
553
|
+
if text <> invalid
|
|
439
554
|
m.super0_sayHello(text)
|
|
440
555
|
end if
|
|
441
556
|
end function
|
|
@@ -448,7 +563,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
448
563
|
end function
|
|
449
564
|
`, 'trim', 'source/main.bs');
|
|
450
565
|
});
|
|
451
|
-
it('properly transpiles classes from outside current namespace', () => {
|
|
566
|
+
it('properly transpiles classes from outside current namespace', async () => {
|
|
452
567
|
addFile('source/Animals.bs', `
|
|
453
568
|
namespace Animals
|
|
454
569
|
class Duck
|
|
@@ -457,7 +572,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
457
572
|
class Bird
|
|
458
573
|
end class
|
|
459
574
|
`);
|
|
460
|
-
testTranspile(`
|
|
575
|
+
await testTranspile(`
|
|
461
576
|
namespace Animals
|
|
462
577
|
sub init()
|
|
463
578
|
donaldDuck = new Duck()
|
|
@@ -473,8 +588,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
473
588
|
end sub
|
|
474
589
|
`, undefined, 'source/main.bs');
|
|
475
590
|
});
|
|
476
|
-
it('properly transpiles new statement for missing class ', () => {
|
|
477
|
-
testTranspile(`
|
|
591
|
+
it('properly transpiles new statement for missing class ', async () => {
|
|
592
|
+
await testTranspile(`
|
|
478
593
|
sub main()
|
|
479
594
|
bob = new Human()
|
|
480
595
|
end sub
|
|
@@ -484,14 +599,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
484
599
|
end sub
|
|
485
600
|
`, undefined, 'source/main.bs', false);
|
|
486
601
|
});
|
|
487
|
-
it('new keyword transpiles correctly', () => {
|
|
602
|
+
it('new keyword transpiles correctly', async () => {
|
|
488
603
|
addFile('source/Animal.bs', `
|
|
489
604
|
class Animal
|
|
490
605
|
sub new(name as string)
|
|
491
606
|
end sub
|
|
492
607
|
end class
|
|
493
608
|
`);
|
|
494
|
-
testTranspile(`
|
|
609
|
+
await testTranspile(`
|
|
495
610
|
sub main()
|
|
496
611
|
a = new Animal("donald")
|
|
497
612
|
end sub
|
|
@@ -501,8 +616,73 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
501
616
|
end sub
|
|
502
617
|
`, undefined, 'source/main.bs');
|
|
503
618
|
});
|
|
504
|
-
it('
|
|
505
|
-
testTranspile(`
|
|
619
|
+
it('calls super ', async () => {
|
|
620
|
+
const { file } = await testTranspile(`
|
|
621
|
+
class Parent
|
|
622
|
+
sub new()
|
|
623
|
+
end sub
|
|
624
|
+
end class
|
|
625
|
+
class Child extends Parent
|
|
626
|
+
sub new()
|
|
627
|
+
end sub
|
|
628
|
+
end class
|
|
629
|
+
`, `
|
|
630
|
+
function __Parent_builder()
|
|
631
|
+
instance = {}
|
|
632
|
+
instance.new = sub()
|
|
633
|
+
end sub
|
|
634
|
+
return instance
|
|
635
|
+
end function
|
|
636
|
+
function Parent()
|
|
637
|
+
instance = __Parent_builder()
|
|
638
|
+
instance.new()
|
|
639
|
+
return instance
|
|
640
|
+
end function
|
|
641
|
+
function __Child_builder()
|
|
642
|
+
instance = __Parent_builder()
|
|
643
|
+
instance.super0_new = instance.new
|
|
644
|
+
instance.new = sub()
|
|
645
|
+
m.super0_new()
|
|
646
|
+
end sub
|
|
647
|
+
return instance
|
|
648
|
+
end function
|
|
649
|
+
function Child()
|
|
650
|
+
instance = __Child_builder()
|
|
651
|
+
instance.new()
|
|
652
|
+
return instance
|
|
653
|
+
end function
|
|
654
|
+
`, undefined, undefined, false);
|
|
655
|
+
//the AST should not be permanently modified
|
|
656
|
+
const constructor = file.ast.statements[0].body[0];
|
|
657
|
+
(0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
|
|
658
|
+
});
|
|
659
|
+
it('adds field initializers', async () => {
|
|
660
|
+
const { file } = await testTranspile(`
|
|
661
|
+
class Person
|
|
662
|
+
sub new()
|
|
663
|
+
end sub
|
|
664
|
+
name = "Bob"
|
|
665
|
+
end class
|
|
666
|
+
`, `
|
|
667
|
+
function __Person_builder()
|
|
668
|
+
instance = {}
|
|
669
|
+
instance.new = sub()
|
|
670
|
+
m.name = "Bob"
|
|
671
|
+
end sub
|
|
672
|
+
return instance
|
|
673
|
+
end function
|
|
674
|
+
function Person()
|
|
675
|
+
instance = __Person_builder()
|
|
676
|
+
instance.new()
|
|
677
|
+
return instance
|
|
678
|
+
end function
|
|
679
|
+
`);
|
|
680
|
+
//the AST should not be permanently modified
|
|
681
|
+
const constructor = file.ast.statements[0].body[0];
|
|
682
|
+
(0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
|
|
683
|
+
});
|
|
684
|
+
it('does not screw up local variable references', async () => {
|
|
685
|
+
await testTranspile(`
|
|
506
686
|
class Animal
|
|
507
687
|
sub new(name as string)
|
|
508
688
|
m.name = name
|
|
@@ -600,17 +780,19 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
600
780
|
smokey = Animal("Smokey")
|
|
601
781
|
smokey.move(1)
|
|
602
782
|
'> Bear moved 1 meters
|
|
783
|
+
|
|
603
784
|
donald = Duck("Donald")
|
|
604
785
|
donald.move(2)
|
|
605
786
|
'> Waddling...\\nDonald moved 2 meters
|
|
787
|
+
|
|
606
788
|
dewey = BabyDuck("Dewey")
|
|
607
789
|
dewey.move(3)
|
|
608
790
|
'> Waddling...\\nDewey moved 2 meters\\nFell over...I'm new at this
|
|
609
791
|
end sub
|
|
610
792
|
`, 'trim', 'source/main.bs');
|
|
611
793
|
});
|
|
612
|
-
it('calculates the proper super index', () => {
|
|
613
|
-
testTranspile(`
|
|
794
|
+
it('calculates the proper super index', async () => {
|
|
795
|
+
await testTranspile(`
|
|
614
796
|
class Duck
|
|
615
797
|
public sub walk(meters as integer)
|
|
616
798
|
print "Walked " + meters.ToStr() + " meters"
|
|
@@ -658,10 +840,308 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
658
840
|
end function
|
|
659
841
|
`, 'trim', 'source/main.bs');
|
|
660
842
|
});
|
|
843
|
+
it('adds namespacing to constructors on field definitions', async () => {
|
|
844
|
+
await testTranspile(`
|
|
845
|
+
namespace MyNS
|
|
846
|
+
class KlassOne
|
|
847
|
+
other = new KlassTwo()
|
|
848
|
+
end class
|
|
849
|
+
|
|
850
|
+
class KlassTwo
|
|
851
|
+
end class
|
|
852
|
+
end namespace
|
|
853
|
+
`, `
|
|
854
|
+
function __MyNS_KlassOne_builder()
|
|
855
|
+
instance = {}
|
|
856
|
+
instance.new = sub()
|
|
857
|
+
m.other = MyNS_KlassTwo()
|
|
858
|
+
end sub
|
|
859
|
+
return instance
|
|
860
|
+
end function
|
|
861
|
+
function MyNS_KlassOne()
|
|
862
|
+
instance = __MyNS_KlassOne_builder()
|
|
863
|
+
instance.new()
|
|
864
|
+
return instance
|
|
865
|
+
end function
|
|
866
|
+
function __MyNS_KlassTwo_builder()
|
|
867
|
+
instance = {}
|
|
868
|
+
instance.new = sub()
|
|
869
|
+
end sub
|
|
870
|
+
return instance
|
|
871
|
+
end function
|
|
872
|
+
function MyNS_KlassTwo()
|
|
873
|
+
instance = __MyNS_KlassTwo_builder()
|
|
874
|
+
instance.new()
|
|
875
|
+
return instance
|
|
876
|
+
end function
|
|
877
|
+
`, 'trim', 'source/main.bs');
|
|
878
|
+
});
|
|
879
|
+
it('works with enums as field initial values inside a namespace', async () => {
|
|
880
|
+
await testTranspile(`
|
|
881
|
+
namespace MyNS
|
|
882
|
+
class HasEnumKlass
|
|
883
|
+
enumValue = MyEnum.A
|
|
884
|
+
end class
|
|
885
|
+
enum MyEnum
|
|
886
|
+
A = "A"
|
|
887
|
+
B = "B"
|
|
888
|
+
end enum
|
|
889
|
+
end namespace
|
|
890
|
+
`, `
|
|
891
|
+
function __MyNS_HasEnumKlass_builder()
|
|
892
|
+
instance = {}
|
|
893
|
+
instance.new = sub()
|
|
894
|
+
m.enumValue = "A"
|
|
895
|
+
end sub
|
|
896
|
+
return instance
|
|
897
|
+
end function
|
|
898
|
+
function MyNS_HasEnumKlass()
|
|
899
|
+
instance = __MyNS_HasEnumKlass_builder()
|
|
900
|
+
instance.new()
|
|
901
|
+
return instance
|
|
902
|
+
end function
|
|
903
|
+
`, 'trim', 'source/main.bs');
|
|
904
|
+
});
|
|
905
|
+
it('allows enums as super args inside a namespace', async () => {
|
|
906
|
+
await testTranspile(`
|
|
907
|
+
namespace MyNS
|
|
908
|
+
class SubKlass extends SuperKlass
|
|
909
|
+
sub new()
|
|
910
|
+
super(MyEnum.B)
|
|
911
|
+
end sub
|
|
912
|
+
end class
|
|
913
|
+
|
|
914
|
+
class SuperKlass
|
|
915
|
+
sub new(enumVal as MyEnum)
|
|
916
|
+
print enumVal
|
|
917
|
+
end sub
|
|
918
|
+
end class
|
|
919
|
+
|
|
920
|
+
enum MyEnum
|
|
921
|
+
A = "A"
|
|
922
|
+
B = "B"
|
|
923
|
+
end enum
|
|
924
|
+
end namespace
|
|
925
|
+
`, `
|
|
926
|
+
function __MyNS_SubKlass_builder()
|
|
927
|
+
instance = __MyNS_SuperKlass_builder()
|
|
928
|
+
instance.super0_new = instance.new
|
|
929
|
+
instance.new = sub()
|
|
930
|
+
m.super0_new("B")
|
|
931
|
+
end sub
|
|
932
|
+
return instance
|
|
933
|
+
end function
|
|
934
|
+
function MyNS_SubKlass()
|
|
935
|
+
instance = __MyNS_SubKlass_builder()
|
|
936
|
+
instance.new()
|
|
937
|
+
return instance
|
|
938
|
+
end function
|
|
939
|
+
function __MyNS_SuperKlass_builder()
|
|
940
|
+
instance = {}
|
|
941
|
+
instance.new = sub(enumVal as dynamic)
|
|
942
|
+
print enumVal
|
|
943
|
+
end sub
|
|
944
|
+
return instance
|
|
945
|
+
end function
|
|
946
|
+
function MyNS_SuperKlass(enumVal as dynamic)
|
|
947
|
+
instance = __MyNS_SuperKlass_builder()
|
|
948
|
+
instance.new(enumVal)
|
|
949
|
+
return instance
|
|
950
|
+
end function
|
|
951
|
+
`, 'trim', 'source/main.bs');
|
|
952
|
+
});
|
|
953
|
+
it('works with enums as values referenced in a namespace directly', async () => {
|
|
954
|
+
await testTranspile(`
|
|
955
|
+
namespace MyNS
|
|
956
|
+
class HasEnumKlass
|
|
957
|
+
myArray = [true, true] as boolean[]
|
|
958
|
+
sub new()
|
|
959
|
+
m.myArray[MyEnum.A] = true
|
|
960
|
+
m.myArray[MyEnum.B] = false
|
|
961
|
+
end sub
|
|
962
|
+
end class
|
|
963
|
+
enum MyEnum
|
|
964
|
+
A = 0
|
|
965
|
+
B = 1
|
|
966
|
+
end enum
|
|
967
|
+
end namespace
|
|
968
|
+
`, `
|
|
969
|
+
function __MyNS_HasEnumKlass_builder()
|
|
970
|
+
instance = {}
|
|
971
|
+
instance.new = sub()
|
|
972
|
+
m.myArray = [
|
|
973
|
+
true
|
|
974
|
+
true
|
|
975
|
+
]
|
|
976
|
+
m.myArray[0] = true
|
|
977
|
+
m.myArray[1] = false
|
|
978
|
+
end sub
|
|
979
|
+
return instance
|
|
980
|
+
end function
|
|
981
|
+
function MyNS_HasEnumKlass()
|
|
982
|
+
instance = __MyNS_HasEnumKlass_builder()
|
|
983
|
+
instance.new()
|
|
984
|
+
return instance
|
|
985
|
+
end function
|
|
986
|
+
`, 'trim', 'source/main.bs');
|
|
987
|
+
});
|
|
988
|
+
it('works with enums as values referenced in a namespace with namespace', async () => {
|
|
989
|
+
await testTranspile(`
|
|
990
|
+
namespace MyNS
|
|
991
|
+
class HasEnumKlass
|
|
992
|
+
myArray = [true, true] as boolean[]
|
|
993
|
+
sub new()
|
|
994
|
+
m.myArray[MyNS.MyEnum.A] = true
|
|
995
|
+
m.myArray[MyNS.MyEnum.B] = false
|
|
996
|
+
end sub
|
|
997
|
+
end class
|
|
998
|
+
enum MyEnum
|
|
999
|
+
A = 0
|
|
1000
|
+
B = 1
|
|
1001
|
+
end enum
|
|
1002
|
+
end namespace
|
|
1003
|
+
`, `
|
|
1004
|
+
function __MyNS_HasEnumKlass_builder()
|
|
1005
|
+
instance = {}
|
|
1006
|
+
instance.new = sub()
|
|
1007
|
+
m.myArray = [
|
|
1008
|
+
true
|
|
1009
|
+
true
|
|
1010
|
+
]
|
|
1011
|
+
m.myArray[0] = true
|
|
1012
|
+
m.myArray[1] = false
|
|
1013
|
+
end sub
|
|
1014
|
+
return instance
|
|
1015
|
+
end function
|
|
1016
|
+
function MyNS_HasEnumKlass()
|
|
1017
|
+
instance = __MyNS_HasEnumKlass_builder()
|
|
1018
|
+
instance.new()
|
|
1019
|
+
return instance
|
|
1020
|
+
end function
|
|
1021
|
+
`, 'trim', 'source/main.bs');
|
|
1022
|
+
});
|
|
1023
|
+
it('allows namespaced class function as function parameters', async () => {
|
|
1024
|
+
await testTranspile(`
|
|
1025
|
+
namespace Alpha
|
|
1026
|
+
function foo()
|
|
1027
|
+
return 1
|
|
1028
|
+
end function
|
|
1029
|
+
|
|
1030
|
+
function callSomeFunc(f as function)
|
|
1031
|
+
return f()
|
|
1032
|
+
end function
|
|
1033
|
+
|
|
1034
|
+
sub callFoo()
|
|
1035
|
+
callSomeFunc(foo)
|
|
1036
|
+
end sub
|
|
1037
|
+
end namespace
|
|
1038
|
+
`, `
|
|
1039
|
+
function Alpha_foo()
|
|
1040
|
+
return 1
|
|
1041
|
+
end function
|
|
1042
|
+
|
|
1043
|
+
function Alpha_callSomeFunc(f as function)
|
|
1044
|
+
return f()
|
|
1045
|
+
end function
|
|
1046
|
+
|
|
1047
|
+
sub Alpha_callFoo()
|
|
1048
|
+
Alpha_callSomeFunc(Alpha_foo)
|
|
1049
|
+
end sub
|
|
1050
|
+
`, 'trim', 'source/main.bs');
|
|
1051
|
+
});
|
|
1052
|
+
it('allows namespaced class constructors as function parameters', async () => {
|
|
1053
|
+
await testTranspile(`
|
|
1054
|
+
namespace Alpha
|
|
1055
|
+
class Button
|
|
1056
|
+
end class
|
|
1057
|
+
|
|
1058
|
+
function callSomeFunc(f as function)
|
|
1059
|
+
return f()
|
|
1060
|
+
end function
|
|
1061
|
+
|
|
1062
|
+
sub makeButton()
|
|
1063
|
+
callSomeFunc(Button)
|
|
1064
|
+
end sub
|
|
1065
|
+
end namespace
|
|
1066
|
+
`, `
|
|
1067
|
+
function __Alpha_Button_builder()
|
|
1068
|
+
instance = {}
|
|
1069
|
+
instance.new = sub()
|
|
1070
|
+
end sub
|
|
1071
|
+
return instance
|
|
1072
|
+
end function
|
|
1073
|
+
function Alpha_Button()
|
|
1074
|
+
instance = __Alpha_Button_builder()
|
|
1075
|
+
instance.new()
|
|
1076
|
+
return instance
|
|
1077
|
+
end function
|
|
1078
|
+
|
|
1079
|
+
function Alpha_callSomeFunc(f as function)
|
|
1080
|
+
return f()
|
|
1081
|
+
end function
|
|
1082
|
+
|
|
1083
|
+
sub Alpha_makeButton()
|
|
1084
|
+
Alpha_callSomeFunc(Alpha_Button)
|
|
1085
|
+
end sub
|
|
1086
|
+
`, 'trim', 'source/main.bs');
|
|
1087
|
+
});
|
|
1088
|
+
it('allows class constructors as functions in array', async () => {
|
|
1089
|
+
await testTranspile(`
|
|
1090
|
+
namespace Alpha
|
|
1091
|
+
class Button
|
|
1092
|
+
end class
|
|
1093
|
+
|
|
1094
|
+
class ButtonContainer
|
|
1095
|
+
private button = new Alpha.Button()
|
|
1096
|
+
|
|
1097
|
+
sub new()
|
|
1098
|
+
m.init()
|
|
1099
|
+
end sub
|
|
1100
|
+
|
|
1101
|
+
sub init()
|
|
1102
|
+
button = new Alpha.Button()
|
|
1103
|
+
items = [m.button, button, Alpha.Button]
|
|
1104
|
+
end sub
|
|
1105
|
+
end class
|
|
1106
|
+
end namespace
|
|
1107
|
+
`, `
|
|
1108
|
+
function __Alpha_Button_builder()
|
|
1109
|
+
instance = {}
|
|
1110
|
+
instance.new = sub()
|
|
1111
|
+
end sub
|
|
1112
|
+
return instance
|
|
1113
|
+
end function
|
|
1114
|
+
function Alpha_Button()
|
|
1115
|
+
instance = __Alpha_Button_builder()
|
|
1116
|
+
instance.new()
|
|
1117
|
+
return instance
|
|
1118
|
+
end function
|
|
1119
|
+
function __Alpha_ButtonContainer_builder()
|
|
1120
|
+
instance = {}
|
|
1121
|
+
instance.new = sub()
|
|
1122
|
+
m.button = Alpha_Button()
|
|
1123
|
+
m.init()
|
|
1124
|
+
end sub
|
|
1125
|
+
instance.init = sub()
|
|
1126
|
+
button = Alpha_Button()
|
|
1127
|
+
items = [
|
|
1128
|
+
m.button
|
|
1129
|
+
Alpha_button
|
|
1130
|
+
Alpha_Button
|
|
1131
|
+
]
|
|
1132
|
+
end sub
|
|
1133
|
+
return instance
|
|
1134
|
+
end function
|
|
1135
|
+
function Alpha_ButtonContainer()
|
|
1136
|
+
instance = __Alpha_ButtonContainer_builder()
|
|
1137
|
+
instance.new()
|
|
1138
|
+
return instance
|
|
1139
|
+
end function
|
|
1140
|
+
`, 'trim', 'source/main.bs');
|
|
1141
|
+
});
|
|
661
1142
|
});
|
|
662
1143
|
it('detects using `new` keyword on non-classes', () => {
|
|
663
|
-
|
|
664
|
-
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1144
|
+
program.setFile('source/main.bs', `
|
|
665
1145
|
sub quack()
|
|
666
1146
|
end sub
|
|
667
1147
|
sub main()
|
|
@@ -669,11 +1149,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
669
1149
|
end sub
|
|
670
1150
|
`);
|
|
671
1151
|
program.validate();
|
|
672
|
-
|
|
1152
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1153
|
+
DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('quack')
|
|
1154
|
+
]);
|
|
673
1155
|
});
|
|
674
1156
|
it('detects missing call to super', () => {
|
|
675
|
-
|
|
676
|
-
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1157
|
+
program.setFile('source/main.bs', `
|
|
677
1158
|
class Animal
|
|
678
1159
|
sub new()
|
|
679
1160
|
end sub
|
|
@@ -684,11 +1165,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
684
1165
|
end class
|
|
685
1166
|
`);
|
|
686
1167
|
program.validate();
|
|
687
|
-
|
|
1168
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1169
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
1170
|
+
]);
|
|
688
1171
|
});
|
|
689
1172
|
it.skip('detects calls to unknown m methods', () => {
|
|
690
|
-
|
|
691
|
-
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1173
|
+
program.setFile('source/main.bs', `
|
|
692
1174
|
class Animal
|
|
693
1175
|
sub new()
|
|
694
1176
|
m.methodThatDoesNotExist()
|
|
@@ -696,10 +1178,96 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
696
1178
|
end class
|
|
697
1179
|
`);
|
|
698
1180
|
program.validate();
|
|
699
|
-
|
|
1181
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1182
|
+
DiagnosticMessages_1.DiagnosticMessages.methodDoesNotExistOnType('methodThatDoesNotExist', 'Animal')
|
|
1183
|
+
]);
|
|
1184
|
+
});
|
|
1185
|
+
it('detects direct circular extends', () => {
|
|
1186
|
+
//direct
|
|
1187
|
+
program.setFile('source/Direct.bs', `
|
|
1188
|
+
class Parent extends Child
|
|
1189
|
+
end class
|
|
1190
|
+
|
|
1191
|
+
class Child extends Parent
|
|
1192
|
+
end class
|
|
1193
|
+
`);
|
|
1194
|
+
program.validate();
|
|
1195
|
+
(0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
|
|
1196
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Child'], 'source').message,
|
|
1197
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Child', 'Parent'], 'source').message
|
|
1198
|
+
]);
|
|
1199
|
+
});
|
|
1200
|
+
it('detects indirect circular extends', () => {
|
|
1201
|
+
//direct
|
|
1202
|
+
program.setFile('source/Indirect.bs', `
|
|
1203
|
+
class Parent extends Grandchild
|
|
1204
|
+
end class
|
|
1205
|
+
|
|
1206
|
+
class Child extends Parent
|
|
1207
|
+
end class
|
|
1208
|
+
|
|
1209
|
+
class Grandchild extends Child
|
|
1210
|
+
end class
|
|
1211
|
+
`);
|
|
1212
|
+
program.validate();
|
|
1213
|
+
(0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
|
|
1214
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Grandchild', 'Child'], 'source').message,
|
|
1215
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Grandchild', 'Child', 'Parent', 'Grandchild'], 'source').message,
|
|
1216
|
+
DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Grandchild', 'Child', 'Parent'], 'source').message
|
|
1217
|
+
]);
|
|
1218
|
+
});
|
|
1219
|
+
it('transpiles super method calls twice', async () => {
|
|
1220
|
+
program.setFile('source/lib.bs', `
|
|
1221
|
+
class Being
|
|
1222
|
+
function think()
|
|
1223
|
+
print "thinking..."
|
|
1224
|
+
end function
|
|
1225
|
+
end class
|
|
1226
|
+
|
|
1227
|
+
class Human extends Being
|
|
1228
|
+
function think()
|
|
1229
|
+
super.think()
|
|
1230
|
+
end function
|
|
1231
|
+
end class
|
|
1232
|
+
`);
|
|
1233
|
+
await program.build({ stagingDir: testHelpers_spec_2.stagingDir });
|
|
1234
|
+
fsExtra.emptyDirSync(testHelpers_spec_2.stagingDir);
|
|
1235
|
+
await program.build({ stagingDir: testHelpers_spec_2.stagingDir });
|
|
1236
|
+
(0, chai_config_spec_1.expect)(fsExtra.readFileSync((0, util_1.standardizePath) `${testHelpers_spec_2.stagingDir}/source/lib.brs`).toString().trimEnd()).to.eql((0, testHelpers_spec_1.trim) `
|
|
1237
|
+
function __Being_builder()
|
|
1238
|
+
instance = {}
|
|
1239
|
+
instance.new = sub()
|
|
1240
|
+
end sub
|
|
1241
|
+
instance.think = function()
|
|
1242
|
+
print "thinking..."
|
|
1243
|
+
end function
|
|
1244
|
+
return instance
|
|
1245
|
+
end function
|
|
1246
|
+
function Being()
|
|
1247
|
+
instance = __Being_builder()
|
|
1248
|
+
instance.new()
|
|
1249
|
+
return instance
|
|
1250
|
+
end function
|
|
1251
|
+
function __Human_builder()
|
|
1252
|
+
instance = __Being_builder()
|
|
1253
|
+
instance.super0_new = instance.new
|
|
1254
|
+
instance.new = sub()
|
|
1255
|
+
m.super0_new()
|
|
1256
|
+
end sub
|
|
1257
|
+
instance.think = function()
|
|
1258
|
+
m.super0_think()
|
|
1259
|
+
end function
|
|
1260
|
+
return instance
|
|
1261
|
+
end function
|
|
1262
|
+
function Human()
|
|
1263
|
+
instance = __Human_builder()
|
|
1264
|
+
instance.new()
|
|
1265
|
+
return instance
|
|
1266
|
+
end function
|
|
1267
|
+
`);
|
|
700
1268
|
});
|
|
701
1269
|
it('detects duplicate member names', () => {
|
|
702
|
-
program.setFile(
|
|
1270
|
+
program.setFile('source/main.bs', `
|
|
703
1271
|
class Animal
|
|
704
1272
|
public name
|
|
705
1273
|
public name
|
|
@@ -713,32 +1281,26 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
713
1281
|
end class
|
|
714
1282
|
`);
|
|
715
1283
|
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) })]);
|
|
1284
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [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) })]);
|
|
725
1285
|
});
|
|
726
1286
|
it('detects mismatched member type in child class', () => {
|
|
727
|
-
program.setFile(
|
|
1287
|
+
program.setFile('source/main.bs', `
|
|
728
1288
|
class Animal
|
|
729
1289
|
public name
|
|
730
1290
|
end class
|
|
731
1291
|
class Duck extends Animal
|
|
732
|
-
public function name()
|
|
1292
|
+
public override function name()
|
|
733
1293
|
return "Donald"
|
|
734
1294
|
end function
|
|
735
1295
|
end class
|
|
736
1296
|
`);
|
|
737
1297
|
program.validate();
|
|
738
|
-
|
|
1298
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1299
|
+
DiagnosticMessages_1.DiagnosticMessages.classChildMemberDifferentMemberTypeThanAncestor('method', 'field', 'Animal')
|
|
1300
|
+
]);
|
|
739
1301
|
});
|
|
740
1302
|
it('allows untyped overridden field in child class', () => {
|
|
741
|
-
program.setFile(
|
|
1303
|
+
program.setFile('source/main.bs', `
|
|
742
1304
|
class Animal
|
|
743
1305
|
public name
|
|
744
1306
|
end class
|
|
@@ -747,7 +1309,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
747
1309
|
end class
|
|
748
1310
|
`);
|
|
749
1311
|
program.validate();
|
|
750
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
1312
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
751
1313
|
});
|
|
752
1314
|
it('allows overridden property name in child class', () => {
|
|
753
1315
|
program.setFile('source/main.bs', `
|
|
@@ -759,7 +1321,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
759
1321
|
end class
|
|
760
1322
|
`);
|
|
761
1323
|
program.validate();
|
|
762
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
1324
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
763
1325
|
});
|
|
764
1326
|
it('flags incompatible child field type changes', () => {
|
|
765
1327
|
program.setFile('source/main.bs', `
|
|
@@ -769,21 +1331,20 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
769
1331
|
public owner as Person
|
|
770
1332
|
end class
|
|
771
1333
|
class Duck extends Bird
|
|
772
|
-
public age = 12.2 'should be integer but
|
|
1334
|
+
public age = 12.2 'should be integer, but a float can be assigned to an int
|
|
773
1335
|
public name = 12 'should be string but is integer
|
|
774
1336
|
public owner as string
|
|
775
1337
|
end class
|
|
776
1338
|
`);
|
|
777
1339
|
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
|
|
1340
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1341
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Person'),
|
|
1342
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string'),
|
|
1343
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person')
|
|
783
1344
|
]);
|
|
784
1345
|
});
|
|
785
1346
|
it('detects overridden methods without override keyword', () => {
|
|
786
|
-
program.setFile(
|
|
1347
|
+
program.setFile('source/main.bs', `
|
|
787
1348
|
class Animal
|
|
788
1349
|
sub speak()
|
|
789
1350
|
end sub
|
|
@@ -794,10 +1355,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
794
1355
|
end class
|
|
795
1356
|
`);
|
|
796
1357
|
program.validate();
|
|
797
|
-
|
|
1358
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1359
|
+
DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')
|
|
1360
|
+
]);
|
|
798
1361
|
});
|
|
799
1362
|
it('detects overridden methods with different visibility', () => {
|
|
800
|
-
program.setFile(
|
|
1363
|
+
program.setFile('source/main.bs', `
|
|
801
1364
|
class Animal
|
|
802
1365
|
sub speakInPublic()
|
|
803
1366
|
end sub
|
|
@@ -816,12 +1379,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
816
1379
|
end class
|
|
817
1380
|
`);
|
|
818
1381
|
program.validate();
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
1382
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1383
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakInPublic', 'private', 'public', 'Animal'),
|
|
1384
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFriends', 'public', 'protected', 'Animal'),
|
|
1385
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFamily', 'public', 'private', 'Animal')
|
|
1386
|
+
]);
|
|
822
1387
|
});
|
|
823
1388
|
it('allows overridden methods with matching visibility', () => {
|
|
824
|
-
program.setFile(
|
|
1389
|
+
program.setFile('source/main.bs', `
|
|
825
1390
|
class Animal
|
|
826
1391
|
sub speakInPublic()
|
|
827
1392
|
end sub
|
|
@@ -840,20 +1405,95 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
840
1405
|
end class
|
|
841
1406
|
`);
|
|
842
1407
|
program.validate();
|
|
843
|
-
|
|
1408
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
844
1409
|
});
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
1410
|
+
describe('detects unknown parent class', () => {
|
|
1411
|
+
it('non-namespaced parent from outside namespace', () => {
|
|
1412
|
+
program.setFile('source/main.bs', `
|
|
1413
|
+
class Duck extends Animal
|
|
1414
|
+
sub speak()
|
|
1415
|
+
end sub
|
|
1416
|
+
end class
|
|
1417
|
+
|
|
1418
|
+
namespace Vertibrates
|
|
1419
|
+
class Animal
|
|
1420
|
+
end class
|
|
1421
|
+
end namespace
|
|
1422
|
+
`);
|
|
1423
|
+
program.validate();
|
|
1424
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')), { range: vscode_languageserver_1.Range.create(1, 35, 1, 41) })]);
|
|
1425
|
+
});
|
|
1426
|
+
it('non-namespaced parent from within namespace', () => {
|
|
1427
|
+
program.setFile('source/main.bs', `
|
|
1428
|
+
namespace Vertibrates
|
|
1429
|
+
class Duck extends Animal
|
|
1430
|
+
sub speak()
|
|
1431
|
+
end sub
|
|
1432
|
+
end class
|
|
1433
|
+
end namespace
|
|
1434
|
+
`);
|
|
1435
|
+
program.validate();
|
|
1436
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1437
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
|
|
1438
|
+
]);
|
|
1439
|
+
});
|
|
1440
|
+
it('non-namespaced name from outside namespace alongside existing namespace', () => {
|
|
1441
|
+
program.setFile('source/main.bs', `
|
|
1442
|
+
namespace Vertibrates
|
|
1443
|
+
class Animal
|
|
1444
|
+
end class
|
|
1445
|
+
end namespace
|
|
1446
|
+
|
|
1447
|
+
class Duck extends Animal
|
|
1448
|
+
sub speak()
|
|
1449
|
+
end sub
|
|
1450
|
+
end class
|
|
1451
|
+
`);
|
|
1452
|
+
program.validate();
|
|
1453
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1454
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
|
|
1455
|
+
]);
|
|
1456
|
+
});
|
|
1457
|
+
it('namespaced parent class from outside namespace', () => {
|
|
1458
|
+
program.setFile('source/vertibrates.bs', `
|
|
1459
|
+
namespace Vertibrates
|
|
1460
|
+
class Bird
|
|
1461
|
+
end class
|
|
1462
|
+
end namespace
|
|
1463
|
+
`);
|
|
1464
|
+
program.setFile('source/Duck.bs', `
|
|
1465
|
+
class Duck extends Vertibrates.GroundedBird
|
|
1466
|
+
sub speak()
|
|
1467
|
+
end sub
|
|
1468
|
+
end class
|
|
1469
|
+
`);
|
|
1470
|
+
program.validate();
|
|
1471
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace')), { relatedInformation: [{
|
|
1472
|
+
message: `In scope 'source'`
|
|
1473
|
+
}] })]);
|
|
1474
|
+
});
|
|
1475
|
+
it('namespaced parent class from inside namespace', () => {
|
|
1476
|
+
program.setFile('source/vertibrates.bs', `
|
|
1477
|
+
namespace Vertibrates
|
|
1478
|
+
class Bird
|
|
1479
|
+
end class
|
|
1480
|
+
end namespace
|
|
1481
|
+
`);
|
|
1482
|
+
program.setFile('source/Duck.bs', `
|
|
1483
|
+
namespace Birdies
|
|
1484
|
+
class Duck extends Vertibrates.GroundedBird
|
|
1485
|
+
sub speak()
|
|
1486
|
+
end sub
|
|
1487
|
+
end class
|
|
1488
|
+
end namespace
|
|
1489
|
+
`);
|
|
1490
|
+
program.validate();
|
|
1491
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1492
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace').message
|
|
1493
|
+
]);
|
|
1494
|
+
});
|
|
854
1495
|
});
|
|
855
1496
|
it('catches newable class without namespace name', () => {
|
|
856
|
-
var _a;
|
|
857
1497
|
program.setFile('source/main.bs', `
|
|
858
1498
|
namespace NameA.NameB
|
|
859
1499
|
class Duck
|
|
@@ -865,11 +1505,13 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
865
1505
|
end sub
|
|
866
1506
|
`);
|
|
867
1507
|
program.validate();
|
|
868
|
-
|
|
1508
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1509
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindFunction('Duck').message,
|
|
1510
|
+
DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('Duck')
|
|
1511
|
+
]);
|
|
869
1512
|
});
|
|
870
1513
|
it('supports newable class namespace inference', () => {
|
|
871
|
-
|
|
872
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1514
|
+
program.setFile('source/main.bs', `
|
|
873
1515
|
namespace NameA.NameB
|
|
874
1516
|
class Duck
|
|
875
1517
|
end class
|
|
@@ -879,24 +1521,24 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
879
1521
|
end namespace
|
|
880
1522
|
`);
|
|
881
1523
|
program.validate();
|
|
882
|
-
|
|
1524
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
883
1525
|
});
|
|
884
1526
|
it('catches extending unknown namespaced class', () => {
|
|
885
|
-
|
|
886
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1527
|
+
program.setFile('source/main.bs', `
|
|
887
1528
|
namespace NameA.NameB
|
|
888
1529
|
class Animal
|
|
889
1530
|
end class
|
|
890
|
-
class Duck extends NameA.NameB.
|
|
1531
|
+
class Duck extends NameA.NameB.AnimalNotDefined
|
|
891
1532
|
end class
|
|
892
1533
|
end namespace
|
|
893
1534
|
`);
|
|
894
1535
|
program.validate();
|
|
895
|
-
|
|
1536
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1537
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindName('AnimalNotDefined', 'NameA.NameB.AnimalNotDefined', 'NameA.NameB', 'namespace')
|
|
1538
|
+
]);
|
|
896
1539
|
});
|
|
897
1540
|
it('supports omitting namespace prefix for items in same namespace', () => {
|
|
898
|
-
|
|
899
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1541
|
+
program.setFile('source/main.bs', `
|
|
900
1542
|
namespace NameA.NameB
|
|
901
1543
|
class Animal
|
|
902
1544
|
end class
|
|
@@ -905,45 +1547,54 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
905
1547
|
end namespace
|
|
906
1548
|
`);
|
|
907
1549
|
program.validate();
|
|
908
|
-
|
|
1550
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
909
1551
|
});
|
|
910
1552
|
it('catches duplicate root-level class declarations', () => {
|
|
911
|
-
|
|
912
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1553
|
+
program.setFile('source/main.bs', `
|
|
913
1554
|
class Animal
|
|
914
1555
|
end class
|
|
915
1556
|
class Animal
|
|
1557
|
+
end class
|
|
916
1558
|
`);
|
|
917
1559
|
program.validate();
|
|
918
|
-
|
|
1560
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1561
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'Animal')
|
|
1562
|
+
]);
|
|
919
1563
|
});
|
|
920
1564
|
it('catches duplicate namespace-level class declarations', () => {
|
|
921
|
-
|
|
922
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1565
|
+
program.setFile('source/main.bs', `
|
|
923
1566
|
namespace NameA.NameB
|
|
924
1567
|
class Animal
|
|
925
1568
|
end class
|
|
926
1569
|
class Animal
|
|
1570
|
+
end class
|
|
927
1571
|
end namespace
|
|
928
1572
|
`);
|
|
929
1573
|
program.validate();
|
|
930
|
-
|
|
1574
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1575
|
+
DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'Animal').message
|
|
1576
|
+
]);
|
|
931
1577
|
});
|
|
932
|
-
it('
|
|
933
|
-
|
|
934
|
-
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1578
|
+
it('allows namespaced class name which is the same as a global class', () => {
|
|
1579
|
+
program.setFile('source/main.bs', `
|
|
935
1580
|
namespace NameA.NameB
|
|
936
1581
|
class Animal
|
|
1582
|
+
name as string
|
|
937
1583
|
end class
|
|
1584
|
+
|
|
1585
|
+
sub printThisAnimalName(ani as Animal) ' this refers to NameA.NameB.Animal
|
|
1586
|
+
print ani.name
|
|
1587
|
+
end sub
|
|
938
1588
|
end namespace
|
|
1589
|
+
|
|
939
1590
|
class Animal
|
|
1591
|
+
doesNotHaveName as string
|
|
940
1592
|
end class
|
|
941
1593
|
`);
|
|
942
1594
|
program.validate();
|
|
943
|
-
|
|
1595
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
944
1596
|
});
|
|
945
1597
|
it('catches class with same name as function', () => {
|
|
946
|
-
var _a;
|
|
947
1598
|
program.setFile('source/main.bs', `
|
|
948
1599
|
class Animal
|
|
949
1600
|
end class
|
|
@@ -951,10 +1602,11 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
951
1602
|
end sub
|
|
952
1603
|
`);
|
|
953
1604
|
program.validate();
|
|
954
|
-
|
|
1605
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1606
|
+
DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('Animal').message
|
|
1607
|
+
]);
|
|
955
1608
|
});
|
|
956
1609
|
it('catches class with same name (but different case) as function', () => {
|
|
957
|
-
var _a;
|
|
958
1610
|
program.setFile('source/main.bs', `
|
|
959
1611
|
class ANIMAL
|
|
960
1612
|
end class
|
|
@@ -962,10 +1614,11 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
962
1614
|
end sub
|
|
963
1615
|
`);
|
|
964
1616
|
program.validate();
|
|
965
|
-
|
|
1617
|
+
(0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
|
|
1618
|
+
DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('animal').message
|
|
1619
|
+
]);
|
|
966
1620
|
});
|
|
967
1621
|
it('catches variable with same name as class', () => {
|
|
968
|
-
var _a;
|
|
969
1622
|
program.setFile('source/main.bs', `
|
|
970
1623
|
class Animal
|
|
971
1624
|
end class
|
|
@@ -974,7 +1627,9 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
974
1627
|
end sub
|
|
975
1628
|
`);
|
|
976
1629
|
program.validate();
|
|
977
|
-
|
|
1630
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1631
|
+
DiagnosticMessages_1.DiagnosticMessages.localVarSameNameAsClass('Animal').message
|
|
1632
|
+
]);
|
|
978
1633
|
});
|
|
979
1634
|
it('allows extending classes with more than one dot in the filename', () => {
|
|
980
1635
|
program.setFile('source/testclass.bs', `
|
|
@@ -1002,9 +1657,9 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1002
1657
|
end class
|
|
1003
1658
|
`);
|
|
1004
1659
|
program.validate();
|
|
1005
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
1660
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
1006
1661
|
});
|
|
1007
|
-
it('computes correct super index for grandchild class', () => {
|
|
1662
|
+
it('computes correct super index for grandchild class', async () => {
|
|
1008
1663
|
program.setFile('source/main.bs', `
|
|
1009
1664
|
sub Main()
|
|
1010
1665
|
c = new App.ClassC()
|
|
@@ -1018,7 +1673,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1018
1673
|
end class
|
|
1019
1674
|
end namespace
|
|
1020
1675
|
`);
|
|
1021
|
-
testTranspile(`
|
|
1676
|
+
await testTranspile(`
|
|
1022
1677
|
namespace App
|
|
1023
1678
|
class ClassC extends ClassB
|
|
1024
1679
|
sub new()
|
|
@@ -1042,12 +1697,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1042
1697
|
end function
|
|
1043
1698
|
`, 'trim', 'source/App.ClassC.bs');
|
|
1044
1699
|
});
|
|
1045
|
-
it('computes correct super index for namespaced child class and global parent class', () => {
|
|
1700
|
+
it('computes correct super index for namespaced child class and global parent class', async () => {
|
|
1046
1701
|
program.setFile('source/ClassA.bs', `
|
|
1047
1702
|
class ClassA
|
|
1048
1703
|
end class
|
|
1049
1704
|
`);
|
|
1050
|
-
testTranspile(`
|
|
1705
|
+
await testTranspile(`
|
|
1051
1706
|
namespace App
|
|
1052
1707
|
class ClassB extends ClassA
|
|
1053
1708
|
end class
|
|
@@ -1073,9 +1728,59 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1073
1728
|
class ClassB extends ClassA
|
|
1074
1729
|
end class
|
|
1075
1730
|
`);
|
|
1076
|
-
assert_1.doesNotThrow(() => {
|
|
1077
|
-
file.
|
|
1731
|
+
(0, assert_1.doesNotThrow)(() => {
|
|
1732
|
+
const classStatements = file.ast.findChildren(reflection_1.isClassStatement);
|
|
1733
|
+
classStatements[0]['getParentClassIndex'](new BrsTranspileState_1.BrsTranspileState(file));
|
|
1078
1734
|
});
|
|
1079
1735
|
});
|
|
1736
|
+
it('does not crash when child has field with same name as sub in parent', () => {
|
|
1737
|
+
program.setFile('source/main.bs', `
|
|
1738
|
+
class Parent
|
|
1739
|
+
public function helloWorld()
|
|
1740
|
+
end function
|
|
1741
|
+
end class
|
|
1742
|
+
class Child extends Parent
|
|
1743
|
+
public helloWorld as string
|
|
1744
|
+
end class
|
|
1745
|
+
`);
|
|
1746
|
+
program.validate();
|
|
1747
|
+
});
|
|
1748
|
+
it('does not crash when child has method with same name as field in parent', () => {
|
|
1749
|
+
program.setFile('source/main.bs', `
|
|
1750
|
+
class Parent
|
|
1751
|
+
public helloWorld as string
|
|
1752
|
+
end class
|
|
1753
|
+
class Child extends Parent
|
|
1754
|
+
public function helloWorld()
|
|
1755
|
+
end function
|
|
1756
|
+
end class
|
|
1757
|
+
`);
|
|
1758
|
+
program.validate();
|
|
1759
|
+
});
|
|
1760
|
+
it('detects calling class constructors with too many parameters', () => {
|
|
1761
|
+
program.setFile('source/main.bs', `
|
|
1762
|
+
class Parameterless
|
|
1763
|
+
sub new()
|
|
1764
|
+
end sub
|
|
1765
|
+
end class
|
|
1766
|
+
|
|
1767
|
+
class OneParam
|
|
1768
|
+
sub new(param1)
|
|
1769
|
+
end sub
|
|
1770
|
+
end class
|
|
1771
|
+
|
|
1772
|
+
sub main()
|
|
1773
|
+
c1 = new Parameterless(1)
|
|
1774
|
+
c2 = new OneParam(1, 2)
|
|
1775
|
+
c2 = new OneParam()
|
|
1776
|
+
end sub
|
|
1777
|
+
`);
|
|
1778
|
+
program.validate();
|
|
1779
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1780
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(0, 1),
|
|
1781
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 2),
|
|
1782
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 0)
|
|
1783
|
+
]);
|
|
1784
|
+
});
|
|
1080
1785
|
});
|
|
1081
1786
|
//# sourceMappingURL=BrsFile.Class.spec.js.map
|