brighterscript 1.0.0-alpha.3 → 1.0.0-alpha.31
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 +1249 -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 +42 -0
- package/dist/AstValidationSegmenter.js +232 -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/CrossScopeValidator.d.ts +67 -0
- package/dist/CrossScopeValidator.js +625 -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 +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 +56 -0
- package/dist/DiagnosticManager.js +218 -0
- package/dist/DiagnosticManager.js.map +1 -0
- package/dist/DiagnosticMessages.d.ts +187 -20
- package/dist/DiagnosticMessages.js +247 -29
- 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 +199 -100
- package/dist/Program.js +1056 -700
- 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 +533 -552
- package/dist/Scope.js.map +1 -1
- package/dist/SemanticTokenUtils.d.ts +14 -0
- package/dist/SemanticTokenUtils.js +85 -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 +290 -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 +35 -87
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/CachedLookups.d.ts +50 -0
- package/dist/astUtils/CachedLookups.js +331 -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 +146 -82
- package/dist/astUtils/reflection.js +308 -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 +115 -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 +144 -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 +504 -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 +199 -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/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 +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 +123 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +1026 -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 +2897 -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 +147 -82
- package/dist/files/BrsFile.js +853 -911
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +3056 -836
- 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 +717 -119
- 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 +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 +181 -0
- package/dist/parser/AstNode.js +246 -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 +106 -120
- package/dist/parser/Parser.js +1432 -931
- 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 +759 -247
- package/dist/parser/Statement.js +1785 -607
- 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 +18 -8
- package/dist/parser/TranspileState.js +76 -12
- 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 +745 -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 +110 -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 +19369 -0
- package/dist/roku-types/index.d.ts +5497 -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 +25 -0
- package/dist/types/BuiltInInterfaceAdder.js +201 -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 +16 -0
- package/dist/types/ClassType.js +57 -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 +79 -0
- package/dist/types/ReferenceType.js +522 -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 +26 -0
- package/dist/types/helpers.js +191 -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 +218 -106
- package/dist/util.js +1310 -320
- 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
|
@@ -0,0 +1,2139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_config_spec_1 = require("../../chai-config.spec");
|
|
4
|
+
const Program_1 = require("../../Program");
|
|
5
|
+
const util_1 = require("../../util");
|
|
6
|
+
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
7
|
+
const sinon_1 = require("sinon");
|
|
8
|
+
const testHelpers_spec_1 = require("../../testHelpers.spec");
|
|
9
|
+
const XmlFile_1 = require("../../files/XmlFile");
|
|
10
|
+
const TokenKind_1 = require("../../lexer/TokenKind");
|
|
11
|
+
const CompletionsProcessor_1 = require("./CompletionsProcessor");
|
|
12
|
+
const pick = require("object.pick");
|
|
13
|
+
const BrsFile_1 = require("../../files/BrsFile");
|
|
14
|
+
const fsExtra = require("fs-extra");
|
|
15
|
+
const reflection_1 = require("../../astUtils/reflection");
|
|
16
|
+
describe('CompletionsProcessor', () => {
|
|
17
|
+
let program;
|
|
18
|
+
let sinon = (0, sinon_1.createSandbox)();
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
fsExtra.emptyDirSync(testHelpers_spec_1.tempDir);
|
|
21
|
+
fsExtra.ensureDirSync(testHelpers_spec_1.rootDir);
|
|
22
|
+
fsExtra.ensureDirSync(testHelpers_spec_1.stagingDir);
|
|
23
|
+
program = new Program_1.Program({ rootDir: testHelpers_spec_1.rootDir });
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
sinon.restore();
|
|
27
|
+
program.dispose();
|
|
28
|
+
});
|
|
29
|
+
describe('getCompletions - Program.spec', () => {
|
|
30
|
+
it('includes `for each` variable', () => {
|
|
31
|
+
program.setFile('source/main.brs', `
|
|
32
|
+
sub main()
|
|
33
|
+
items = [1, 2, 3]
|
|
34
|
+
for each thing in items
|
|
35
|
+
t =
|
|
36
|
+
end for
|
|
37
|
+
end sub
|
|
38
|
+
`);
|
|
39
|
+
program.validate();
|
|
40
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(4, 28)).map(x => x.label);
|
|
41
|
+
(0, chai_config_spec_1.expect)(completions).to.include('thing');
|
|
42
|
+
});
|
|
43
|
+
it('includes `for` variable', () => {
|
|
44
|
+
program.setFile('source/main.brs', `
|
|
45
|
+
sub main()
|
|
46
|
+
for i = 0 to 10
|
|
47
|
+
t =
|
|
48
|
+
end for
|
|
49
|
+
end sub
|
|
50
|
+
`);
|
|
51
|
+
program.validate();
|
|
52
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 28)).map(x => x.label);
|
|
53
|
+
(0, chai_config_spec_1.expect)(completions).to.include('i');
|
|
54
|
+
});
|
|
55
|
+
it('should include first-level namespace names for brighterscript files', () => {
|
|
56
|
+
program.setFile('source/main.bs', `
|
|
57
|
+
namespace NameA.NameB.NameC
|
|
58
|
+
sub DoSomething()
|
|
59
|
+
end sub
|
|
60
|
+
end namespace
|
|
61
|
+
sub main()
|
|
62
|
+
print
|
|
63
|
+
end sub
|
|
64
|
+
`);
|
|
65
|
+
program.validate();
|
|
66
|
+
// print |
|
|
67
|
+
const completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(6, 25));
|
|
68
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
69
|
+
label: 'NameA',
|
|
70
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
71
|
+
}]);
|
|
72
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
73
|
+
label: 'NameB',
|
|
74
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
75
|
+
}, {
|
|
76
|
+
label: 'NameA.NameB',
|
|
77
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
78
|
+
}, {
|
|
79
|
+
label: 'NameA.NameB.NameC',
|
|
80
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
81
|
+
}, {
|
|
82
|
+
label: 'NameA.NameB.NameC.DoSomething',
|
|
83
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
84
|
+
}]);
|
|
85
|
+
});
|
|
86
|
+
it('resolves completions for namespaces with next namespace part for brighterscript file', () => {
|
|
87
|
+
program.setFile('source/main.bs', `
|
|
88
|
+
namespace NameA.NameB.NameC
|
|
89
|
+
sub DoSomething()
|
|
90
|
+
end sub
|
|
91
|
+
end namespace
|
|
92
|
+
sub main()
|
|
93
|
+
NameA.
|
|
94
|
+
end sub
|
|
95
|
+
`);
|
|
96
|
+
program.validate();
|
|
97
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(6, 26)).map(x => x.label);
|
|
98
|
+
(0, chai_config_spec_1.expect)(completions).to.include('NameB');
|
|
99
|
+
(0, chai_config_spec_1.expect)(completions).not.to.include('NameA');
|
|
100
|
+
(0, chai_config_spec_1.expect)(completions).not.to.include('NameA.NameB');
|
|
101
|
+
(0, chai_config_spec_1.expect)(completions).not.to.include('NameA.NameB.NameC');
|
|
102
|
+
(0, chai_config_spec_1.expect)(completions).not.to.include('NameA.NameB.NameC.DoSomething');
|
|
103
|
+
});
|
|
104
|
+
it('finds namespace members for brighterscript file', () => {
|
|
105
|
+
program.setFile('source/main.bs', `
|
|
106
|
+
sub main()
|
|
107
|
+
NameA.
|
|
108
|
+
NameA.NameB.
|
|
109
|
+
NameA.NameB.NameC.
|
|
110
|
+
end sub
|
|
111
|
+
namespace NameA
|
|
112
|
+
sub alertA()
|
|
113
|
+
end sub
|
|
114
|
+
end namespace
|
|
115
|
+
namespace NameA
|
|
116
|
+
sub info()
|
|
117
|
+
end sub
|
|
118
|
+
end namespace
|
|
119
|
+
namespace NameA.NameB
|
|
120
|
+
sub alertB()
|
|
121
|
+
end sub
|
|
122
|
+
end namespace
|
|
123
|
+
namespace NameA.NameB.NameC
|
|
124
|
+
sub alertC()
|
|
125
|
+
end sub
|
|
126
|
+
end namespace
|
|
127
|
+
`);
|
|
128
|
+
program.validate();
|
|
129
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 26)).map(x => x.label).sort()).to.eql(['NameB', 'alertA', 'info']);
|
|
130
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 32)).map(x => x.label).sort()).to.eql(['NameC', 'alertB']);
|
|
131
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 38)).map(x => x.label).sort()).to.eql(['alertC']);
|
|
132
|
+
});
|
|
133
|
+
it('finds namespace members for classes', () => {
|
|
134
|
+
program.setFile('source/main.bs', `
|
|
135
|
+
sub main()
|
|
136
|
+
NameA.
|
|
137
|
+
NameA.NameB.
|
|
138
|
+
NameA.NameB.NameC.
|
|
139
|
+
end sub
|
|
140
|
+
namespace NameA
|
|
141
|
+
sub alertA()
|
|
142
|
+
end sub
|
|
143
|
+
end namespace
|
|
144
|
+
namespace NameA
|
|
145
|
+
sub info()
|
|
146
|
+
end sub
|
|
147
|
+
class MyClassA
|
|
148
|
+
end class
|
|
149
|
+
end namespace
|
|
150
|
+
namespace NameA.NameB
|
|
151
|
+
sub alertB()
|
|
152
|
+
end sub
|
|
153
|
+
class MyClassB
|
|
154
|
+
end class
|
|
155
|
+
end namespace
|
|
156
|
+
namespace NameA.NameB.NameC
|
|
157
|
+
sub alertC()
|
|
158
|
+
end sub
|
|
159
|
+
end namespace
|
|
160
|
+
`);
|
|
161
|
+
program.validate();
|
|
162
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 26)).map(x => x.label).sort()).to.eql(['MyClassA', 'NameB', 'alertA', 'info']);
|
|
163
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 32)).map(x => x.label).sort()).to.eql(['MyClassB', 'NameC', 'alertB']);
|
|
164
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 38)).map(x => x.label).sort()).to.eql(['alertC']);
|
|
165
|
+
});
|
|
166
|
+
it('finds only namespaces that have classes, when new keyword is used', () => {
|
|
167
|
+
program.setFile('source/main.bs', `
|
|
168
|
+
sub main()
|
|
169
|
+
a = new NameA.
|
|
170
|
+
b = new NameA.NameB.
|
|
171
|
+
c = new NameA.NameB.NameC.
|
|
172
|
+
end sub
|
|
173
|
+
namespace NameA
|
|
174
|
+
sub alertA()
|
|
175
|
+
end sub
|
|
176
|
+
end namespace
|
|
177
|
+
namespace NameA
|
|
178
|
+
sub info()
|
|
179
|
+
end sub
|
|
180
|
+
class MyClassA
|
|
181
|
+
end class
|
|
182
|
+
end namespace
|
|
183
|
+
namespace NameA.NoClassA
|
|
184
|
+
end namespace
|
|
185
|
+
namespace NameA.NoClassB
|
|
186
|
+
end namespace
|
|
187
|
+
namespace NameA.NameB
|
|
188
|
+
sub alertB()
|
|
189
|
+
end sub
|
|
190
|
+
class MyClassB
|
|
191
|
+
end class
|
|
192
|
+
end namespace
|
|
193
|
+
namespace NameA.NameB.NoClass
|
|
194
|
+
end namespace
|
|
195
|
+
namespace NameA.NameB.NameC
|
|
196
|
+
sub alertC()
|
|
197
|
+
end sub
|
|
198
|
+
end namespace
|
|
199
|
+
`);
|
|
200
|
+
program.validate();
|
|
201
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 34)).map(x => x.label).sort()).to.eql(['MyClassA', 'NameB']);
|
|
202
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 40)).map(x => x.label).sort()).to.eql(['MyClassB']);
|
|
203
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 46)).map(x => x.label).sort()).to.be.empty;
|
|
204
|
+
});
|
|
205
|
+
//Bron.. pain to get this working.. do we realy need this? seems moot with ropm..
|
|
206
|
+
it.skip('should include translated namespace function names for brightscript files', () => {
|
|
207
|
+
program.setFile('source/main.bs', `
|
|
208
|
+
namespace NameA.NameB.NameC
|
|
209
|
+
sub DoSomething()
|
|
210
|
+
end sub
|
|
211
|
+
end namespace
|
|
212
|
+
`);
|
|
213
|
+
program.setFile('source/lib.brs', `
|
|
214
|
+
sub test()
|
|
215
|
+
|
|
216
|
+
end sub
|
|
217
|
+
`);
|
|
218
|
+
program.validate();
|
|
219
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/lib.brs`, vscode_languageserver_1.Position.create(2, 23));
|
|
220
|
+
(0, chai_config_spec_1.expect)(completions.map(x => x.label)).to.include('NameA_NameB_NameC_DoSomething');
|
|
221
|
+
});
|
|
222
|
+
it('includes global completions for file with no scope', () => {
|
|
223
|
+
program.setFile('source/main.brs', `
|
|
224
|
+
function Main()
|
|
225
|
+
age = 1
|
|
226
|
+
end function
|
|
227
|
+
`);
|
|
228
|
+
program.validate();
|
|
229
|
+
let completions = program.getCompletions('source/main.brs', vscode_languageserver_1.Position.create(2, 21));
|
|
230
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label.toLowerCase() === 'abs')).to.be.lengthOf(1);
|
|
231
|
+
});
|
|
232
|
+
it('filters out text results for top-level function statements', () => {
|
|
233
|
+
program.setFile('source/main.brs', `
|
|
234
|
+
function Main()
|
|
235
|
+
age = 1
|
|
236
|
+
end function
|
|
237
|
+
`);
|
|
238
|
+
program.validate();
|
|
239
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 21));
|
|
240
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'Main')).to.be.lengthOf(1);
|
|
241
|
+
});
|
|
242
|
+
it('does not filter text results for object properties used in conditional statements', () => {
|
|
243
|
+
program.setFile('source/main.brs', `
|
|
244
|
+
sub Main()
|
|
245
|
+
p.
|
|
246
|
+
end sub
|
|
247
|
+
sub SayHello()
|
|
248
|
+
person = {}
|
|
249
|
+
if person.isAlive then
|
|
250
|
+
print "Hello"
|
|
251
|
+
end if
|
|
252
|
+
end sub
|
|
253
|
+
`);
|
|
254
|
+
program.validate();
|
|
255
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 22));
|
|
256
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'isAlive')).to.be.lengthOf(1);
|
|
257
|
+
});
|
|
258
|
+
it('does not filter text results for object properties used in assignments', () => {
|
|
259
|
+
program.setFile('source/main.brs', `
|
|
260
|
+
sub Main()
|
|
261
|
+
p.
|
|
262
|
+
end sub
|
|
263
|
+
sub SayHello()
|
|
264
|
+
person = {}
|
|
265
|
+
localVar = person.name
|
|
266
|
+
end sub
|
|
267
|
+
`);
|
|
268
|
+
program.validate();
|
|
269
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 22));
|
|
270
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'name')).to.be.lengthOf(1);
|
|
271
|
+
});
|
|
272
|
+
it('does not filter text results for object properties', () => {
|
|
273
|
+
program.setFile('source/main.brs', `
|
|
274
|
+
sub Main()
|
|
275
|
+
p.
|
|
276
|
+
end sub
|
|
277
|
+
sub SayHello()
|
|
278
|
+
person = {}
|
|
279
|
+
person.name = "bob"
|
|
280
|
+
end sub
|
|
281
|
+
`);
|
|
282
|
+
program.validate();
|
|
283
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 22));
|
|
284
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'name')).to.be.lengthOf(1);
|
|
285
|
+
});
|
|
286
|
+
it('filters out text results for local vars used in conditional statements', () => {
|
|
287
|
+
program.setFile('source/main.brs', `
|
|
288
|
+
sub Main()
|
|
289
|
+
|
|
290
|
+
end sub
|
|
291
|
+
sub SayHello()
|
|
292
|
+
isTrue = true
|
|
293
|
+
if isTrue then
|
|
294
|
+
print "is true"
|
|
295
|
+
end if
|
|
296
|
+
end sub
|
|
297
|
+
`);
|
|
298
|
+
program.validate();
|
|
299
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
|
|
300
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'isTrue')).to.be.lengthOf(0);
|
|
301
|
+
});
|
|
302
|
+
it('filters out text results for local variable assignments', () => {
|
|
303
|
+
program.setFile('source/main.brs', `
|
|
304
|
+
sub Main()
|
|
305
|
+
|
|
306
|
+
end sub
|
|
307
|
+
sub SayHello()
|
|
308
|
+
message = "Hello"
|
|
309
|
+
end sub
|
|
310
|
+
`);
|
|
311
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
|
|
312
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'message')).to.be.lengthOf(0);
|
|
313
|
+
});
|
|
314
|
+
it('filters out text results for local variables used in assignments', () => {
|
|
315
|
+
program.setFile('source/main.brs', `
|
|
316
|
+
sub Main()
|
|
317
|
+
|
|
318
|
+
end sub
|
|
319
|
+
sub SayHello()
|
|
320
|
+
message = "Hello"
|
|
321
|
+
otherVar = message
|
|
322
|
+
end sub
|
|
323
|
+
`);
|
|
324
|
+
program.validate();
|
|
325
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
|
|
326
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.label === 'message')).to.be.lengthOf(0);
|
|
327
|
+
});
|
|
328
|
+
it('does not suggest local variables when initiated to the right of a period', () => {
|
|
329
|
+
program.setFile('source/main.brs', `
|
|
330
|
+
function Main()
|
|
331
|
+
helloMessage = "jack"
|
|
332
|
+
person.hello
|
|
333
|
+
end function
|
|
334
|
+
`);
|
|
335
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 32));
|
|
336
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Variable).map(x => x.label)).not.to.contain('helloMessage');
|
|
337
|
+
});
|
|
338
|
+
it('finds all file paths when initiated on xml uri', () => {
|
|
339
|
+
let xmlPath = (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/components/component1.xml`;
|
|
340
|
+
program.setFile('components/component1.xml', (0, testHelpers_spec_1.trim) `
|
|
341
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
|
342
|
+
<component name="HeroScene" extends="Scene">
|
|
343
|
+
<script type="text/brightscript" uri="" />
|
|
344
|
+
</component>
|
|
345
|
+
`);
|
|
346
|
+
program.setFile('components/component1.brs', '');
|
|
347
|
+
program.validate();
|
|
348
|
+
let completions = program.getCompletions(xmlPath, vscode_languageserver_1.Position.create(2, 42));
|
|
349
|
+
(0, chai_config_spec_1.expect)(completions[0]).to.include({
|
|
350
|
+
kind: vscode_languageserver_1.CompletionItemKind.File,
|
|
351
|
+
label: 'component1.brs'
|
|
352
|
+
});
|
|
353
|
+
(0, chai_config_spec_1.expect)(completions[1]).to.include({
|
|
354
|
+
kind: vscode_languageserver_1.CompletionItemKind.File,
|
|
355
|
+
label: 'pkg:/components/component1.brs'
|
|
356
|
+
});
|
|
357
|
+
//it should NOT include the global methods
|
|
358
|
+
(0, chai_config_spec_1.expect)(completions).to.be.lengthOf(2);
|
|
359
|
+
});
|
|
360
|
+
it('get all functions and properties in scope when doing any dotted get on non m', () => {
|
|
361
|
+
program.setFile('source/main.bs', `
|
|
362
|
+
sub main()
|
|
363
|
+
thing.anonPropA = "foo"
|
|
364
|
+
thing.anonPropB = "bar"
|
|
365
|
+
thing.person
|
|
366
|
+
end sub
|
|
367
|
+
class MyClassA
|
|
368
|
+
personName = "rafa"
|
|
369
|
+
personAName = "rafaA"
|
|
370
|
+
function personAMethodA()
|
|
371
|
+
end function
|
|
372
|
+
function personAMethodB()
|
|
373
|
+
end function
|
|
374
|
+
end class
|
|
375
|
+
namespace NameA
|
|
376
|
+
sub alertA()
|
|
377
|
+
end sub
|
|
378
|
+
end namespace
|
|
379
|
+
namespace NameA.NameB
|
|
380
|
+
sub alertB()
|
|
381
|
+
end sub
|
|
382
|
+
class MyClassB
|
|
383
|
+
personName = "roger"
|
|
384
|
+
personBName = "rogerB"
|
|
385
|
+
function personAMethodC()
|
|
386
|
+
end function
|
|
387
|
+
function personBMethodA()
|
|
388
|
+
end function
|
|
389
|
+
function personBMethodB()
|
|
390
|
+
end function
|
|
391
|
+
end class
|
|
392
|
+
end namespace
|
|
393
|
+
namespace NameA.NameB.NameC
|
|
394
|
+
sub alertC()
|
|
395
|
+
end sub
|
|
396
|
+
end namespace
|
|
397
|
+
`);
|
|
398
|
+
program.validate();
|
|
399
|
+
//note - we let the vscode extension do the filtering, so we still return everything; otherwise it exhibits strange behaviour in the IDE
|
|
400
|
+
(0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(4, 32))).map(x => x.label).sort()).to.eql(['NameB', 'NameC', 'anonPropA', 'anonPropB', 'person', 'personAMethodA', 'personAMethodB', 'personAMethodC', 'personAName', 'personBMethodA', 'personBMethodB', 'personBName', 'personName']);
|
|
401
|
+
});
|
|
402
|
+
it('get all functions and properties relevant for m ', () => {
|
|
403
|
+
program.setFile('source/main.bs', `
|
|
404
|
+
class MyClassA
|
|
405
|
+
function new()
|
|
406
|
+
m.
|
|
407
|
+
end function
|
|
408
|
+
personName = "rafa"
|
|
409
|
+
personAName = "rafaA"
|
|
410
|
+
function personAMethodA()
|
|
411
|
+
end function
|
|
412
|
+
function personAMethodB()
|
|
413
|
+
end function
|
|
414
|
+
end class
|
|
415
|
+
class MyClassB
|
|
416
|
+
personName = "roger"
|
|
417
|
+
personBName = "rogerB"
|
|
418
|
+
function personAMethodC()
|
|
419
|
+
end function
|
|
420
|
+
function personBMethodA()
|
|
421
|
+
end function
|
|
422
|
+
function personBMethodB()
|
|
423
|
+
end function
|
|
424
|
+
end class
|
|
425
|
+
class MyClassC extends MyClassA
|
|
426
|
+
function new()
|
|
427
|
+
m.
|
|
428
|
+
end function
|
|
429
|
+
personCName = "rogerC"
|
|
430
|
+
function personCMethodC()
|
|
431
|
+
end function
|
|
432
|
+
function personCMethodA()
|
|
433
|
+
end function
|
|
434
|
+
function personCMethodB()
|
|
435
|
+
end function
|
|
436
|
+
end class
|
|
437
|
+
sub alertC()
|
|
438
|
+
end sub
|
|
439
|
+
`);
|
|
440
|
+
program.validate();
|
|
441
|
+
const myClassACompletions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 26));
|
|
442
|
+
// remove completions with sortText (they are built in methods), then sort the remaining labels
|
|
443
|
+
const myClassACompletionsSorted = myClassACompletions.filter(x => !x.sortText).map(x => x.label).sort();
|
|
444
|
+
(0, chai_config_spec_1.expect)(myClassACompletionsSorted).to.eql(['personAMethodA', 'personAMethodB', 'personAName', 'personName']);
|
|
445
|
+
const myClassCCompletions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(24, 26));
|
|
446
|
+
// remove completions with sortText (they are built in methods), then sort the remaining labels
|
|
447
|
+
const myClassCCompletionsSorted = myClassCCompletions.filter(x => !x.sortText).map(x => x.label).sort();
|
|
448
|
+
(0, chai_config_spec_1.expect)(myClassCCompletionsSorted).to.eql(['personAMethodA', 'personAMethodB', 'personAName', 'personCMethodA', 'personCMethodB', 'personCMethodC', 'personCName', 'personName']);
|
|
449
|
+
});
|
|
450
|
+
it.skip('include non-namespaced classes in the list of general output', () => {
|
|
451
|
+
program.setFile('source/main.bs', `
|
|
452
|
+
function regularFunc()
|
|
453
|
+
MyClass
|
|
454
|
+
end function
|
|
455
|
+
sub alertC()
|
|
456
|
+
end sub
|
|
457
|
+
class MyClassA
|
|
458
|
+
end class
|
|
459
|
+
class MyClassB
|
|
460
|
+
end class
|
|
461
|
+
class MyClassC extends MyClassA
|
|
462
|
+
end class
|
|
463
|
+
`);
|
|
464
|
+
(0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 26))).map(x => x.label).sort()).to.include.members(['MyClassA', 'MyClassB', 'MyClassC']);
|
|
465
|
+
});
|
|
466
|
+
it('only include classes when using new keyword', () => {
|
|
467
|
+
program.setFile('source/main.bs', `
|
|
468
|
+
class MyClassA
|
|
469
|
+
end class
|
|
470
|
+
class MyClassB
|
|
471
|
+
end class
|
|
472
|
+
class MyClassC extends MyClassA
|
|
473
|
+
end class
|
|
474
|
+
function regularFunc()
|
|
475
|
+
new MyClass
|
|
476
|
+
end function
|
|
477
|
+
sub alertC()
|
|
478
|
+
end sub
|
|
479
|
+
`);
|
|
480
|
+
program.validate();
|
|
481
|
+
(0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 29))).map(x => x.label).sort()).to.eql(['MyClassA', 'MyClassB', 'MyClassC']);
|
|
482
|
+
});
|
|
483
|
+
it('gets completions when using callfunc invocation', () => {
|
|
484
|
+
program.setFile('source/main.bs', `
|
|
485
|
+
function doStuff(myNode)
|
|
486
|
+
myNode@.sayHello(1, 2)
|
|
487
|
+
end function
|
|
488
|
+
`);
|
|
489
|
+
program.setFile('components/MyNode.bs', `
|
|
490
|
+
function sayHello(text, text2)
|
|
491
|
+
end function
|
|
492
|
+
`);
|
|
493
|
+
program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
|
|
494
|
+
<component name="Component1" extends="Scene">
|
|
495
|
+
<script type="text/brightscript" uri="pkg:/components/MyNode.bs" />
|
|
496
|
+
<interface>
|
|
497
|
+
<function name="sayHello"/>
|
|
498
|
+
</interface>
|
|
499
|
+
</component>`);
|
|
500
|
+
program.validate();
|
|
501
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
502
|
+
(0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 30))).map(x => x.label).sort()).to.eql(['sayHello']);
|
|
503
|
+
});
|
|
504
|
+
it('gets completions for callfunc invocation with multiple nodes', () => {
|
|
505
|
+
program.setFile('source/main.bs', `
|
|
506
|
+
function main()
|
|
507
|
+
myNode@.sayHello(arg1)
|
|
508
|
+
end function
|
|
509
|
+
`);
|
|
510
|
+
program.setFile('components/MyNode.bs', `
|
|
511
|
+
function sayHello(text, text2)
|
|
512
|
+
end function
|
|
513
|
+
function sayHello2(text, text2)
|
|
514
|
+
end function
|
|
515
|
+
`);
|
|
516
|
+
program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
|
|
517
|
+
<component name="Component1" extends="Scene">
|
|
518
|
+
<script type="text/brightscript" uri="pkg:/components/MyNode.bs" />
|
|
519
|
+
<interface>
|
|
520
|
+
<function name="sayHello"/>
|
|
521
|
+
<function name="sayHello2"/>
|
|
522
|
+
</interface>
|
|
523
|
+
</component>`);
|
|
524
|
+
program.setFile('components/MyNode2.bs', `
|
|
525
|
+
function sayHello3(text, text2)
|
|
526
|
+
end function
|
|
527
|
+
function sayHello4(text, text2)
|
|
528
|
+
end function
|
|
529
|
+
`);
|
|
530
|
+
program.setFile('components/MyNode2.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
|
|
531
|
+
<component name="Component2" extends="Scene">
|
|
532
|
+
<script type="text/brightscript" uri="pkg:/components/MyNode2.bs" />
|
|
533
|
+
<interface>
|
|
534
|
+
<function name="sayHello3"/>
|
|
535
|
+
<function name="sayHello4"/>
|
|
536
|
+
</interface>
|
|
537
|
+
</component>`);
|
|
538
|
+
program.validate();
|
|
539
|
+
(0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 30))).map(x => x.label).sort()).to.eql(['sayHello', 'sayHello2', 'sayHello3', 'sayHello4']);
|
|
540
|
+
});
|
|
541
|
+
it('gets completions for callfunc invocation with multiple nodes and validates single code completion results', () => {
|
|
542
|
+
program.setFile('source/main.bs', `
|
|
543
|
+
function main()
|
|
544
|
+
ParentNode@.sayHello(arg1)
|
|
545
|
+
end function
|
|
546
|
+
`);
|
|
547
|
+
program.setFile('components/ParentNode.bs', `
|
|
548
|
+
function sayHello(text, text2)
|
|
549
|
+
end function
|
|
550
|
+
`);
|
|
551
|
+
program.setFile('components/ParentNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
|
|
552
|
+
<component name="ParentNode" extends="Scene">
|
|
553
|
+
<script type="text/brightscript" uri="pkg:/components/ParentNode.bs" />
|
|
554
|
+
<interface>
|
|
555
|
+
<function name="sayHello"/>
|
|
556
|
+
</interface>
|
|
557
|
+
</component>`);
|
|
558
|
+
program.setFile('components/ChildNode.bs', `
|
|
559
|
+
function sayHello(text, text2)
|
|
560
|
+
end function
|
|
561
|
+
`);
|
|
562
|
+
program.setFile('components/ChildNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
|
|
563
|
+
<component name="ChildNode" extends="ParentNode">
|
|
564
|
+
<script type="text/brightscript" uri="pkg:/components/ChildNode.bs" />
|
|
565
|
+
</component>`);
|
|
566
|
+
program.validate();
|
|
567
|
+
(0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 31))).map(x => x.label).sort()).to.eql(['sayHello']);
|
|
568
|
+
});
|
|
569
|
+
it('gets completions for extended nodes with callfunc invocation - ensure overridden methods included', () => {
|
|
570
|
+
program.setFile('source/main.bs', `
|
|
571
|
+
function main()
|
|
572
|
+
myNode@.sayHello(arg1)
|
|
573
|
+
end function
|
|
574
|
+
`);
|
|
575
|
+
program.setFile('components/MyNode.bs', `
|
|
576
|
+
function sayHello(text, text2)
|
|
577
|
+
end function
|
|
578
|
+
function sayHello2(text, text2)
|
|
579
|
+
end function
|
|
580
|
+
`);
|
|
581
|
+
program.setFile('components/MyNode.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
|
|
582
|
+
<component name="Component1" extends="Scene">
|
|
583
|
+
<script type="text/brightscript" uri="pkg:/components/MyNode.bs" />
|
|
584
|
+
<interface>
|
|
585
|
+
<function name="sayHello"/>
|
|
586
|
+
<function name="sayHello2"/>
|
|
587
|
+
</interface>
|
|
588
|
+
</component>`);
|
|
589
|
+
program.setFile('components/MyNode2.bs', `
|
|
590
|
+
function sayHello3(text, text2)
|
|
591
|
+
end function
|
|
592
|
+
function sayHello2(text, text2)
|
|
593
|
+
end function
|
|
594
|
+
function sayHello4(text, text2)
|
|
595
|
+
end function
|
|
596
|
+
`);
|
|
597
|
+
program.setFile('components/MyNode2.xml', (0, testHelpers_spec_1.trim) `<?xml version="1.0" encoding="utf-8" ?>
|
|
598
|
+
<component name="Component2" extends="Component1">
|
|
599
|
+
<script type="text/brightscript" uri="pkg:/components/MyNode2.bs" />
|
|
600
|
+
<interface>
|
|
601
|
+
<function name="sayHello3"/>
|
|
602
|
+
<function name="sayHello4"/>
|
|
603
|
+
</interface>
|
|
604
|
+
</component>`);
|
|
605
|
+
program.validate();
|
|
606
|
+
(0, chai_config_spec_1.expect)((program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 30))).map(x => x.label).sort()).to.eql(['sayHello', 'sayHello2', 'sayHello3', 'sayHello4']);
|
|
607
|
+
});
|
|
608
|
+
describe('getBrsFileCompletions', () => {
|
|
609
|
+
it('does not crash on expression with missing range', () => {
|
|
610
|
+
const file = program.setFile('source/main.brs', `
|
|
611
|
+
sub main()
|
|
612
|
+
message = alpha
|
|
613
|
+
end sub
|
|
614
|
+
`);
|
|
615
|
+
const assignment = file.ast.findChild(reflection_1.isAssignmentStatement);
|
|
616
|
+
// destroy the `range` for this value
|
|
617
|
+
delete assignment.value.range;
|
|
618
|
+
const processor = new CompletionsProcessor_1.CompletionsProcessor({ scopes: [] });
|
|
619
|
+
(0, chai_config_spec_1.expect)(
|
|
620
|
+
// message = alpha|
|
|
621
|
+
processor['getBrsFileCompletions'](util_1.default.createPosition(2, 39), file)).to.eql([]);
|
|
622
|
+
});
|
|
623
|
+
it('does not crash when functionExpression.body is undefined (somehow...)', () => {
|
|
624
|
+
const file = program.setFile('source/main.brs', `
|
|
625
|
+
sub main()
|
|
626
|
+
message = alpha
|
|
627
|
+
end sub
|
|
628
|
+
`);
|
|
629
|
+
const func = file.ast.findChild(reflection_1.isFunctionExpression);
|
|
630
|
+
// destroy the `body` for this value
|
|
631
|
+
delete func.body;
|
|
632
|
+
const processor = new CompletionsProcessor_1.CompletionsProcessor({});
|
|
633
|
+
(0, chai_config_spec_1.expect)(
|
|
634
|
+
// message = alpha|
|
|
635
|
+
processor['getBrsFileCompletions'](util_1.default.createPosition(2, 39), file)).to.eql([]);
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
describe('getCompletions', () => {
|
|
639
|
+
it('returns all functions in scope', () => {
|
|
640
|
+
program.setFile('source/main.brs', `
|
|
641
|
+
sub Main()
|
|
642
|
+
|
|
643
|
+
end sub
|
|
644
|
+
|
|
645
|
+
sub ActionA()
|
|
646
|
+
end sub
|
|
647
|
+
`);
|
|
648
|
+
program.setFile('source/lib.brs', `
|
|
649
|
+
sub ActionB()
|
|
650
|
+
end sub
|
|
651
|
+
`);
|
|
652
|
+
program.validate();
|
|
653
|
+
let completions = program
|
|
654
|
+
//get completions
|
|
655
|
+
.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, util_1.default.createPosition(2, 10))
|
|
656
|
+
//only keep the label property for this test
|
|
657
|
+
.map(x => pick(x, 'label'));
|
|
658
|
+
(0, chai_config_spec_1.expect)(completions).to.deep.include({ label: 'Main' });
|
|
659
|
+
(0, chai_config_spec_1.expect)(completions).to.deep.include({ label: 'ActionA' });
|
|
660
|
+
(0, chai_config_spec_1.expect)(completions).to.deep.include({ label: 'ActionB' });
|
|
661
|
+
});
|
|
662
|
+
it('returns all variables in scope', () => {
|
|
663
|
+
program.setFile('source/main.brs', `
|
|
664
|
+
sub Main()
|
|
665
|
+
name = "bob"
|
|
666
|
+
age = 20
|
|
667
|
+
shoeSize = 12.5
|
|
668
|
+
end sub
|
|
669
|
+
sub ActionA()
|
|
670
|
+
end sub
|
|
671
|
+
`);
|
|
672
|
+
program.setFile('source/lib.brs', `
|
|
673
|
+
sub ActionB()
|
|
674
|
+
end sub
|
|
675
|
+
`);
|
|
676
|
+
program.validate();
|
|
677
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, util_1.default.createPosition(2, 24));
|
|
678
|
+
let labels = completions.map(x => pick(x, 'label'));
|
|
679
|
+
(0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'Main' });
|
|
680
|
+
(0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'ActionA' });
|
|
681
|
+
(0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'ActionB' });
|
|
682
|
+
(0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'name' });
|
|
683
|
+
(0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'age' });
|
|
684
|
+
(0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'shoeSize' });
|
|
685
|
+
});
|
|
686
|
+
it('returns empty set when out of range', () => {
|
|
687
|
+
const position = util_1.default.createPosition(99, 99);
|
|
688
|
+
const mainFile = program.setFile('source/main.brs', '');
|
|
689
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, position);
|
|
690
|
+
const completionProcessor = new CompletionsProcessor_1.CompletionsProcessor({
|
|
691
|
+
program: program,
|
|
692
|
+
file: mainFile,
|
|
693
|
+
position: position,
|
|
694
|
+
scopes: [],
|
|
695
|
+
completions: []
|
|
696
|
+
});
|
|
697
|
+
program.validate();
|
|
698
|
+
//get the name of all global completions
|
|
699
|
+
const globalCompletions = program.globalScope.getAllFiles().flatMap(x => completionProcessor.getBrsFileCompletions(position, x)).map(x => x.label);
|
|
700
|
+
//filter out completions from global scope
|
|
701
|
+
completions = completions.filter(x => !globalCompletions.includes(x.label));
|
|
702
|
+
(0, chai_config_spec_1.expect)(completions).to.be.empty;
|
|
703
|
+
});
|
|
704
|
+
it('finds parameters', () => {
|
|
705
|
+
program.setFile('source/main.brs', `
|
|
706
|
+
sub Main(count = 1)
|
|
707
|
+
firstName = "bob"
|
|
708
|
+
age = 21
|
|
709
|
+
shoeSize = 10
|
|
710
|
+
end sub
|
|
711
|
+
`);
|
|
712
|
+
program.validate();
|
|
713
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 10));
|
|
714
|
+
let labels = completions.map(x => pick(x, 'label'));
|
|
715
|
+
(0, chai_config_spec_1.expect)(labels).to.deep.include({ label: 'count' });
|
|
716
|
+
});
|
|
717
|
+
});
|
|
718
|
+
});
|
|
719
|
+
describe('getCompletions - BrsFile.spec', () => {
|
|
720
|
+
it('does not crash for callfunc on a function call', () => {
|
|
721
|
+
const file = program.setFile('source/main.brs', `
|
|
722
|
+
sub main()
|
|
723
|
+
getManager()@.
|
|
724
|
+
end sub
|
|
725
|
+
`);
|
|
726
|
+
program.validate();
|
|
727
|
+
(0, chai_config_spec_1.expect)(() => {
|
|
728
|
+
program.getCompletions(file.srcPath, util_1.default.createPosition(2, 34));
|
|
729
|
+
}).not.to.throw;
|
|
730
|
+
});
|
|
731
|
+
it('suggests pkg paths in strings that match that criteria', () => {
|
|
732
|
+
program.setFile('source/main.brs', `
|
|
733
|
+
sub main()
|
|
734
|
+
print "pkg:"
|
|
735
|
+
end sub
|
|
736
|
+
`);
|
|
737
|
+
program.validate();
|
|
738
|
+
const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
|
|
739
|
+
const names = result.map(x => x.label);
|
|
740
|
+
(0, chai_config_spec_1.expect)(names.sort()).to.eql([
|
|
741
|
+
'pkg:/source/main.brs'
|
|
742
|
+
]);
|
|
743
|
+
});
|
|
744
|
+
it('suggests libpkg paths in strings that match that criteria', () => {
|
|
745
|
+
program.setFile('source/main.brs', `
|
|
746
|
+
sub main()
|
|
747
|
+
print "libpkg:"
|
|
748
|
+
end sub
|
|
749
|
+
`);
|
|
750
|
+
program.validate();
|
|
751
|
+
const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
|
|
752
|
+
const names = result.map(x => x.label);
|
|
753
|
+
(0, chai_config_spec_1.expect)(names.sort()).to.eql([
|
|
754
|
+
'libpkg:/source/main.brs'
|
|
755
|
+
]);
|
|
756
|
+
});
|
|
757
|
+
it('suggests pkg paths in template strings', () => {
|
|
758
|
+
program.setFile('source/main.brs', `
|
|
759
|
+
sub main()
|
|
760
|
+
print \`pkg:\`
|
|
761
|
+
end sub
|
|
762
|
+
`);
|
|
763
|
+
program.validate();
|
|
764
|
+
const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
|
|
765
|
+
const names = result.map(x => x.label);
|
|
766
|
+
(0, chai_config_spec_1.expect)(names.sort()).to.eql([
|
|
767
|
+
'pkg:/source/main.brs'
|
|
768
|
+
]);
|
|
769
|
+
});
|
|
770
|
+
it('waits for the file to be processed before collecting completions', () => {
|
|
771
|
+
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
772
|
+
program.setFile('source/main.brs', `
|
|
773
|
+
sub Main()
|
|
774
|
+
print "hello"
|
|
775
|
+
Say
|
|
776
|
+
end sub
|
|
777
|
+
|
|
778
|
+
sub SayHello()
|
|
779
|
+
end sub
|
|
780
|
+
`);
|
|
781
|
+
program.validate();
|
|
782
|
+
let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
|
|
783
|
+
let names = result.map(x => x.label);
|
|
784
|
+
(0, chai_config_spec_1.expect)(names).to.includes('Main');
|
|
785
|
+
(0, chai_config_spec_1.expect)(names).to.includes('SayHello');
|
|
786
|
+
});
|
|
787
|
+
it('includes every type of item at base level', () => {
|
|
788
|
+
program.setFile('source/main.bs', `
|
|
789
|
+
sub main()
|
|
790
|
+
print
|
|
791
|
+
end sub
|
|
792
|
+
sub speak()
|
|
793
|
+
end sub
|
|
794
|
+
namespace stuff
|
|
795
|
+
end namespace
|
|
796
|
+
class Person
|
|
797
|
+
end class
|
|
798
|
+
enum Direction
|
|
799
|
+
end enum
|
|
800
|
+
`);
|
|
801
|
+
program.validate();
|
|
802
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 26)), [{
|
|
803
|
+
label: 'main',
|
|
804
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
805
|
+
}, {
|
|
806
|
+
label: 'speak',
|
|
807
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
808
|
+
}, {
|
|
809
|
+
label: 'stuff',
|
|
810
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
811
|
+
}, {
|
|
812
|
+
label: 'Person',
|
|
813
|
+
kind: vscode_languageserver_1.CompletionItemKind.Class
|
|
814
|
+
}, {
|
|
815
|
+
label: 'Direction',
|
|
816
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
817
|
+
}]);
|
|
818
|
+
});
|
|
819
|
+
describe('namespaces', () => {
|
|
820
|
+
it('gets full namespace completions at any point through the leading identifier', () => {
|
|
821
|
+
program.setFile('source/main.bs', `
|
|
822
|
+
sub main()
|
|
823
|
+
foo.bar
|
|
824
|
+
end sub
|
|
825
|
+
|
|
826
|
+
namespace foo.bar
|
|
827
|
+
end namespace
|
|
828
|
+
|
|
829
|
+
class Person
|
|
830
|
+
end class
|
|
831
|
+
`);
|
|
832
|
+
program.validate();
|
|
833
|
+
const result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 24)).map(x => x.label);
|
|
834
|
+
(0, chai_config_spec_1.expect)(result).includes('main');
|
|
835
|
+
(0, chai_config_spec_1.expect)(result).includes('foo');
|
|
836
|
+
(0, chai_config_spec_1.expect)(result).includes('Person');
|
|
837
|
+
});
|
|
838
|
+
it('gets namespace completions', () => {
|
|
839
|
+
program.setFile('source/main.bs', `
|
|
840
|
+
namespace foo.bar
|
|
841
|
+
function sayHello()
|
|
842
|
+
end function
|
|
843
|
+
end namespace
|
|
844
|
+
|
|
845
|
+
sub Main()
|
|
846
|
+
print "hello"
|
|
847
|
+
foo.ba
|
|
848
|
+
foo.bar.
|
|
849
|
+
end sub
|
|
850
|
+
`);
|
|
851
|
+
program.validate();
|
|
852
|
+
let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 30));
|
|
853
|
+
let names = result.map(x => x.label);
|
|
854
|
+
(0, chai_config_spec_1.expect)(names).to.includes('bar');
|
|
855
|
+
result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(9, 32));
|
|
856
|
+
names = result.map(x => x.label);
|
|
857
|
+
(0, chai_config_spec_1.expect)(names).to.includes('sayHello');
|
|
858
|
+
});
|
|
859
|
+
});
|
|
860
|
+
it('always includes `m`', () => {
|
|
861
|
+
program.setFile('source/main.brs', `
|
|
862
|
+
sub Main()
|
|
863
|
+
|
|
864
|
+
end sub
|
|
865
|
+
`);
|
|
866
|
+
program.validate();
|
|
867
|
+
let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
|
|
868
|
+
let names = result.map(x => x.label);
|
|
869
|
+
(0, chai_config_spec_1.expect)(names).to.contain('m');
|
|
870
|
+
});
|
|
871
|
+
it('does not fail for missing previousToken', () => {
|
|
872
|
+
//add a single character to the file, and get completions after it
|
|
873
|
+
program.setFile('source/main.brs', `i`);
|
|
874
|
+
program.validate();
|
|
875
|
+
(0, chai_config_spec_1.expect)(() => {
|
|
876
|
+
program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(0, 1)).map(x => x.label);
|
|
877
|
+
}).not.to.throw;
|
|
878
|
+
});
|
|
879
|
+
it.skip('includes all keywords`', () => {
|
|
880
|
+
program.setFile('source/main.brs', `
|
|
881
|
+
sub Main()
|
|
882
|
+
|
|
883
|
+
end sub
|
|
884
|
+
`);
|
|
885
|
+
program.validate();
|
|
886
|
+
let keywords = Object.keys(TokenKind_1.Keywords).filter(x => !x.includes(' '));
|
|
887
|
+
//inside the function
|
|
888
|
+
let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
|
|
889
|
+
let names = result.map(x => x.label);
|
|
890
|
+
for (let keyword of keywords) {
|
|
891
|
+
(0, chai_config_spec_1.expect)(names).to.include(keyword);
|
|
892
|
+
}
|
|
893
|
+
//outside the function
|
|
894
|
+
result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(4, 8));
|
|
895
|
+
names = result.map(x => x.label);
|
|
896
|
+
for (let keyword of keywords) {
|
|
897
|
+
(0, chai_config_spec_1.expect)(names).to.include(keyword);
|
|
898
|
+
}
|
|
899
|
+
});
|
|
900
|
+
it('does not provide completions within a comment', () => {
|
|
901
|
+
program.setFile('source/main.brs', `
|
|
902
|
+
sub Main()
|
|
903
|
+
'some comment
|
|
904
|
+
end sub
|
|
905
|
+
`);
|
|
906
|
+
program.validate();
|
|
907
|
+
//inside the function
|
|
908
|
+
let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 33));
|
|
909
|
+
(0, chai_config_spec_1.expect)(result).to.be.lengthOf(0);
|
|
910
|
+
});
|
|
911
|
+
it('does not provide duplicate entries for variables', () => {
|
|
912
|
+
program.setFile('source/main.brs', `
|
|
913
|
+
sub Main()
|
|
914
|
+
name = "bob"
|
|
915
|
+
age = 12
|
|
916
|
+
name = "john"
|
|
917
|
+
end sub
|
|
918
|
+
`);
|
|
919
|
+
program.validate();
|
|
920
|
+
let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
|
|
921
|
+
let count = result.reduce((total, x) => {
|
|
922
|
+
return x.label === 'name' ? total + 1 : total;
|
|
923
|
+
}, 0);
|
|
924
|
+
(0, chai_config_spec_1.expect)(count).to.equal(1);
|
|
925
|
+
});
|
|
926
|
+
it('does not include `as` and `string` text options when used in function params', () => {
|
|
927
|
+
program.setFile('source/main.brs', `
|
|
928
|
+
sub Main(name as string)
|
|
929
|
+
|
|
930
|
+
end sub
|
|
931
|
+
`);
|
|
932
|
+
program.validate();
|
|
933
|
+
let result = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
|
|
934
|
+
(0, chai_config_spec_1.expect)(result.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Text)).not.to.contain('as');
|
|
935
|
+
(0, chai_config_spec_1.expect)(result.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Text)).not.to.contain('string');
|
|
936
|
+
});
|
|
937
|
+
it('does not provide intellisense results when inside a comment', () => {
|
|
938
|
+
program.setFile('source/main.brs', `
|
|
939
|
+
sub Main(name as string)
|
|
940
|
+
'this is a comment
|
|
941
|
+
end sub
|
|
942
|
+
`);
|
|
943
|
+
program.validate();
|
|
944
|
+
let results = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 30));
|
|
945
|
+
(0, chai_config_spec_1.expect)(results).to.be.empty;
|
|
946
|
+
});
|
|
947
|
+
it('does provide intellisence for labels only after a goto keyword', () => {
|
|
948
|
+
var _a;
|
|
949
|
+
program.setFile('source/main.brs', `
|
|
950
|
+
sub Main(name as string)
|
|
951
|
+
something:
|
|
952
|
+
goto \nend sub
|
|
953
|
+
`);
|
|
954
|
+
program.validate();
|
|
955
|
+
let results = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 25));
|
|
956
|
+
(0, chai_config_spec_1.expect)(results.length).to.equal(1);
|
|
957
|
+
(0, chai_config_spec_1.expect)((_a = results[0]) === null || _a === void 0 ? void 0 : _a.label).to.equal('something');
|
|
958
|
+
});
|
|
959
|
+
it('includes function parameters at the end of the function', () => {
|
|
960
|
+
program.setFile('source/main.brs', `
|
|
961
|
+
sub main(myFuncParam as string)
|
|
962
|
+
myValue = 234
|
|
963
|
+
print
|
|
964
|
+
end sub
|
|
965
|
+
`);
|
|
966
|
+
program.validate();
|
|
967
|
+
// print |
|
|
968
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 28));
|
|
969
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
970
|
+
label: 'myFuncParam',
|
|
971
|
+
kind: vscode_languageserver_1.CompletionItemKind.Variable
|
|
972
|
+
}, {
|
|
973
|
+
label: 'myValue',
|
|
974
|
+
kind: vscode_languageserver_1.CompletionItemKind.Variable
|
|
975
|
+
}]);
|
|
976
|
+
});
|
|
977
|
+
it('includes function parameters at the end of the function in namespace', () => {
|
|
978
|
+
program.setFile('source/main.bs', `
|
|
979
|
+
namespace alpha
|
|
980
|
+
function main(param)
|
|
981
|
+
print
|
|
982
|
+
myValue = 234
|
|
983
|
+
end function
|
|
984
|
+
end namespace
|
|
985
|
+
`);
|
|
986
|
+
program.validate();
|
|
987
|
+
// print |
|
|
988
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(3, 33));
|
|
989
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
990
|
+
label: 'param',
|
|
991
|
+
kind: vscode_languageserver_1.CompletionItemKind.Variable
|
|
992
|
+
}]);
|
|
993
|
+
});
|
|
994
|
+
it('treats class name as a function', () => {
|
|
995
|
+
program.setFile('source/main.bs', `
|
|
996
|
+
class SomeKlass
|
|
997
|
+
name as string
|
|
998
|
+
end class
|
|
999
|
+
|
|
1000
|
+
sub test()
|
|
1001
|
+
print SomeKlass.
|
|
1002
|
+
end sub
|
|
1003
|
+
`);
|
|
1004
|
+
program.validate();
|
|
1005
|
+
// print SomeKlass.|
|
|
1006
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(6, 36));
|
|
1007
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1008
|
+
label: 'ifFunction',
|
|
1009
|
+
kind: vscode_languageserver_1.CompletionItemKind.Interface
|
|
1010
|
+
}]);
|
|
1011
|
+
});
|
|
1012
|
+
it('treats namespaced class name as a function', () => {
|
|
1013
|
+
program.setFile('source/main.bs', `
|
|
1014
|
+
namespace alpha
|
|
1015
|
+
class SomeKlass
|
|
1016
|
+
name as string
|
|
1017
|
+
end class
|
|
1018
|
+
end namespace
|
|
1019
|
+
|
|
1020
|
+
sub test()
|
|
1021
|
+
print alpha.SomeKlass.toStr()
|
|
1022
|
+
end sub
|
|
1023
|
+
`);
|
|
1024
|
+
program.validate();
|
|
1025
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
1026
|
+
// print alpha.SomeKlass.|
|
|
1027
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 42));
|
|
1028
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1029
|
+
label: 'ifFunction',
|
|
1030
|
+
kind: vscode_languageserver_1.CompletionItemKind.Interface
|
|
1031
|
+
}]);
|
|
1032
|
+
});
|
|
1033
|
+
});
|
|
1034
|
+
describe('getCompletions - XmlFile.spec', () => {
|
|
1035
|
+
it('formats completion paths with proper slashes', () => {
|
|
1036
|
+
let scriptPath = (0, util_1.standardizePath) `C:/app/components/component1/component1.brs`;
|
|
1037
|
+
program.files[scriptPath] = new BrsFile_1.BrsFile({ srcPath: scriptPath, destPath: (0, util_1.standardizePath) `components/component1/component1.brs`, program: program });
|
|
1038
|
+
let xmlFile = new XmlFile_1.XmlFile({
|
|
1039
|
+
srcPath: (0, util_1.standardizePath) `${testHelpers_spec_1.rootDir}/components/component1/component1.xml`,
|
|
1040
|
+
destPath: (0, util_1.standardizePath) `components/component1/component1.xml`,
|
|
1041
|
+
program: program
|
|
1042
|
+
});
|
|
1043
|
+
xmlFile.parser.references.scriptTagImports.push({
|
|
1044
|
+
destPath: (0, util_1.standardizePath) `components/component1/component1.brs`,
|
|
1045
|
+
text: 'component1.brs',
|
|
1046
|
+
filePathRange: vscode_languageserver_1.Range.create(1, 1, 1, 1)
|
|
1047
|
+
});
|
|
1048
|
+
const processesor = new CompletionsProcessor_1.CompletionsProcessor(null);
|
|
1049
|
+
const completions = processesor.getXmlFileCompletions(vscode_languageserver_1.Position.create(1, 1), xmlFile);
|
|
1050
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1051
|
+
label: 'component1.brs',
|
|
1052
|
+
kind: vscode_languageserver_1.CompletionItemKind.File
|
|
1053
|
+
}, {
|
|
1054
|
+
label: 'pkg:/components/component1/component1.brs',
|
|
1055
|
+
kind: vscode_languageserver_1.CompletionItemKind.File
|
|
1056
|
+
}]);
|
|
1057
|
+
});
|
|
1058
|
+
//TODO - refine this test once cdata scripts are supported
|
|
1059
|
+
it('prevents scope completions entirely', () => {
|
|
1060
|
+
program.setFile('components/component1.brs', ``);
|
|
1061
|
+
let xmlFile = program.setFile('components/component1.xml', (0, testHelpers_spec_1.trim) `
|
|
1062
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
|
1063
|
+
<component name="ParentScene" extends="GrandparentScene">
|
|
1064
|
+
<script type="text/brightscript" uri="./Component1.brs" />
|
|
1065
|
+
</component>
|
|
1066
|
+
`);
|
|
1067
|
+
program.validate();
|
|
1068
|
+
(0, chai_config_spec_1.expect)(program.getCompletions(xmlFile.srcPath, vscode_languageserver_1.Position.create(1, 1))).to.be.empty;
|
|
1069
|
+
});
|
|
1070
|
+
});
|
|
1071
|
+
describe('documentation', () => {
|
|
1072
|
+
it('returns documentation when possible', () => {
|
|
1073
|
+
program.setFile('source/main.brs', `
|
|
1074
|
+
sub Main()
|
|
1075
|
+
print "hello"
|
|
1076
|
+
Say
|
|
1077
|
+
end sub
|
|
1078
|
+
|
|
1079
|
+
' Says hello to the world
|
|
1080
|
+
sub SayHello()
|
|
1081
|
+
end sub
|
|
1082
|
+
`);
|
|
1083
|
+
program.validate();
|
|
1084
|
+
// Say|
|
|
1085
|
+
let completions = program.getCompletions(`${testHelpers_spec_1.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 22));
|
|
1086
|
+
//it should find the completions for the global scope
|
|
1087
|
+
(0, chai_config_spec_1.expect)(completions).to.be.length.greaterThan(0);
|
|
1088
|
+
//it should find documentation for completions
|
|
1089
|
+
(0, chai_config_spec_1.expect)(completions.filter(x => !!x.documentation)).to.have.length.greaterThan(0);
|
|
1090
|
+
});
|
|
1091
|
+
});
|
|
1092
|
+
describe('getPartialVariableName', () => {
|
|
1093
|
+
let entry = {
|
|
1094
|
+
src: `${testHelpers_spec_1.rootDir}/source/lib.brs`,
|
|
1095
|
+
dest: `source/lib.brs`
|
|
1096
|
+
};
|
|
1097
|
+
it('creates proper tokens', () => {
|
|
1098
|
+
const file = program.setFile(entry, `call(ModuleA.ModuleB.ModuleC.`);
|
|
1099
|
+
(0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[7])).to.equal('ModuleA.ModuleB.ModuleC.');
|
|
1100
|
+
(0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[6])).to.equal('ModuleA.ModuleB.ModuleC');
|
|
1101
|
+
(0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[5])).to.equal('ModuleA.ModuleB.');
|
|
1102
|
+
(0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[4])).to.equal('ModuleA.ModuleB');
|
|
1103
|
+
(0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[3])).to.equal('ModuleA.');
|
|
1104
|
+
(0, chai_config_spec_1.expect)(file['getPartialVariableName'](file.parser.tokens[2])).to.equal('ModuleA');
|
|
1105
|
+
});
|
|
1106
|
+
});
|
|
1107
|
+
describe('import completions', () => {
|
|
1108
|
+
it('should show import completions for a single scope', () => {
|
|
1109
|
+
program.setFile('source/common.bs', `
|
|
1110
|
+
import "
|
|
1111
|
+
`);
|
|
1112
|
+
program.setFile('source/common2.bs', `
|
|
1113
|
+
sub SayHello()
|
|
1114
|
+
end sub
|
|
1115
|
+
`);
|
|
1116
|
+
program.setFile('components/widget.xml', (0, testHelpers_spec_1.trim) `
|
|
1117
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
|
1118
|
+
<component name="Widget" extends="Group">
|
|
1119
|
+
<script uri="widget.bs"/>
|
|
1120
|
+
</component>
|
|
1121
|
+
`);
|
|
1122
|
+
program.setFile('components/widget.bs', `
|
|
1123
|
+
import "pkg:/source/common.bs"
|
|
1124
|
+
`);
|
|
1125
|
+
program.validate();
|
|
1126
|
+
// import "|
|
|
1127
|
+
const completions = program.getCompletions('source/common.bs', util_1.default.createPosition(1, 25));
|
|
1128
|
+
(0, chai_config_spec_1.expect)(completions).to.exist;
|
|
1129
|
+
(0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('common2.bs');
|
|
1130
|
+
(0, chai_config_spec_1.expect)(completions.map(comp => comp.label)).to.include('../components/widget.bs');
|
|
1131
|
+
});
|
|
1132
|
+
});
|
|
1133
|
+
describe('const completions', () => {
|
|
1134
|
+
it('shows up in standard completions', () => {
|
|
1135
|
+
program.setFile('source/main.bs', `
|
|
1136
|
+
const API_KEY = "123"
|
|
1137
|
+
sub log(message)
|
|
1138
|
+
log()
|
|
1139
|
+
end sub
|
|
1140
|
+
`);
|
|
1141
|
+
program.validate();
|
|
1142
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 24));
|
|
1143
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(
|
|
1144
|
+
// log(|)
|
|
1145
|
+
completions, [{
|
|
1146
|
+
label: 'API_KEY',
|
|
1147
|
+
kind: vscode_languageserver_1.CompletionItemKind.Constant
|
|
1148
|
+
}]);
|
|
1149
|
+
});
|
|
1150
|
+
it('shows up in namespace completions', () => {
|
|
1151
|
+
program.setFile('source/main.bs', `
|
|
1152
|
+
namespace constants
|
|
1153
|
+
const API_KEY = "123"
|
|
1154
|
+
end namespace
|
|
1155
|
+
sub log(message)
|
|
1156
|
+
log(constants.)
|
|
1157
|
+
end sub
|
|
1158
|
+
`);
|
|
1159
|
+
program.validate();
|
|
1160
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(
|
|
1161
|
+
// log(|)
|
|
1162
|
+
program.getCompletions('source/main.bs', util_1.default.createPosition(5, 34)), [{
|
|
1163
|
+
label: 'API_KEY',
|
|
1164
|
+
kind: vscode_languageserver_1.CompletionItemKind.Constant
|
|
1165
|
+
}]);
|
|
1166
|
+
});
|
|
1167
|
+
});
|
|
1168
|
+
describe('enum completions', () => {
|
|
1169
|
+
it('does not crash when completing enum members with unsupported values', () => {
|
|
1170
|
+
program.setFile('source/main.bs', `
|
|
1171
|
+
sub Main()
|
|
1172
|
+
direction.obj
|
|
1173
|
+
end sub
|
|
1174
|
+
enum Direction
|
|
1175
|
+
up
|
|
1176
|
+
down
|
|
1177
|
+
obj = {}
|
|
1178
|
+
end enum
|
|
1179
|
+
`);
|
|
1180
|
+
program.validate();
|
|
1181
|
+
// direction.|obj
|
|
1182
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 30)), [{
|
|
1183
|
+
label: 'up',
|
|
1184
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1185
|
+
}, {
|
|
1186
|
+
label: 'down',
|
|
1187
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1188
|
+
}, {
|
|
1189
|
+
label: 'obj',
|
|
1190
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1191
|
+
}]);
|
|
1192
|
+
});
|
|
1193
|
+
it('gets enum statement completions from global enum', () => {
|
|
1194
|
+
program.setFile('source/main.bs', `
|
|
1195
|
+
sub Main()
|
|
1196
|
+
direction.down
|
|
1197
|
+
end sub
|
|
1198
|
+
enum Direction
|
|
1199
|
+
up
|
|
1200
|
+
down
|
|
1201
|
+
end enum
|
|
1202
|
+
`);
|
|
1203
|
+
program.validate();
|
|
1204
|
+
// |direction.down
|
|
1205
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 20)), [{
|
|
1206
|
+
label: 'Direction',
|
|
1207
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1208
|
+
}]);
|
|
1209
|
+
// dire|ction.down
|
|
1210
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 24)), [{
|
|
1211
|
+
label: 'Direction',
|
|
1212
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1213
|
+
}]);
|
|
1214
|
+
// direction|.down
|
|
1215
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 29)), [{
|
|
1216
|
+
label: 'Direction',
|
|
1217
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1218
|
+
}]);
|
|
1219
|
+
});
|
|
1220
|
+
it('gets enum member completions from global enum', () => {
|
|
1221
|
+
program.setFile('source/main.bs', `
|
|
1222
|
+
sub Main()
|
|
1223
|
+
direction.down
|
|
1224
|
+
end sub
|
|
1225
|
+
enum Direction
|
|
1226
|
+
up
|
|
1227
|
+
down
|
|
1228
|
+
end enum
|
|
1229
|
+
`);
|
|
1230
|
+
program.validate();
|
|
1231
|
+
// direction.|down
|
|
1232
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 30)), [{
|
|
1233
|
+
label: 'up',
|
|
1234
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1235
|
+
}, {
|
|
1236
|
+
label: 'down',
|
|
1237
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1238
|
+
}]);
|
|
1239
|
+
// direction.do|wn
|
|
1240
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32)), [{
|
|
1241
|
+
label: 'up',
|
|
1242
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1243
|
+
}, {
|
|
1244
|
+
label: 'down',
|
|
1245
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1246
|
+
}]);
|
|
1247
|
+
// direction.down|
|
|
1248
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 34)), [{
|
|
1249
|
+
label: 'up',
|
|
1250
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1251
|
+
}, {
|
|
1252
|
+
label: 'down',
|
|
1253
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1254
|
+
}]);
|
|
1255
|
+
});
|
|
1256
|
+
it('gets enum statement completions from namespaced enum', () => {
|
|
1257
|
+
program.setFile('source/main.bs', `
|
|
1258
|
+
sub Main()
|
|
1259
|
+
enums.direction.down
|
|
1260
|
+
end sub
|
|
1261
|
+
namespace enums
|
|
1262
|
+
enum Direction
|
|
1263
|
+
up
|
|
1264
|
+
down
|
|
1265
|
+
end enum
|
|
1266
|
+
end namespace
|
|
1267
|
+
`);
|
|
1268
|
+
program.validate();
|
|
1269
|
+
// enums.|direction.down
|
|
1270
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 26)), [{
|
|
1271
|
+
label: 'Direction',
|
|
1272
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1273
|
+
}]);
|
|
1274
|
+
// enums.dire|ction.down
|
|
1275
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 30)), [{
|
|
1276
|
+
label: 'Direction',
|
|
1277
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1278
|
+
}]);
|
|
1279
|
+
// enums.direction|.down
|
|
1280
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 35)), [{
|
|
1281
|
+
label: 'Direction',
|
|
1282
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1283
|
+
}]);
|
|
1284
|
+
});
|
|
1285
|
+
it('gets enum member completions from namespaced enum', () => {
|
|
1286
|
+
program.setFile('source/main.bs', `
|
|
1287
|
+
sub Main()
|
|
1288
|
+
enums.direction.down
|
|
1289
|
+
end sub
|
|
1290
|
+
namespace enums
|
|
1291
|
+
enum Direction
|
|
1292
|
+
up
|
|
1293
|
+
down
|
|
1294
|
+
end enum
|
|
1295
|
+
end namespace
|
|
1296
|
+
`);
|
|
1297
|
+
program.validate();
|
|
1298
|
+
// enums.direction.|down
|
|
1299
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 36)), [{
|
|
1300
|
+
label: 'up',
|
|
1301
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1302
|
+
}, {
|
|
1303
|
+
label: 'down',
|
|
1304
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1305
|
+
}]);
|
|
1306
|
+
// enums.direction.do|wn
|
|
1307
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 38)), [{
|
|
1308
|
+
label: 'up',
|
|
1309
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1310
|
+
}, {
|
|
1311
|
+
label: 'down',
|
|
1312
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1313
|
+
}]);
|
|
1314
|
+
// enums.direction.down|
|
|
1315
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 40)), [{
|
|
1316
|
+
label: 'up',
|
|
1317
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1318
|
+
}, {
|
|
1319
|
+
label: 'down',
|
|
1320
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1321
|
+
}]);
|
|
1322
|
+
});
|
|
1323
|
+
it('excludes enum member completions from namespace enum', () => {
|
|
1324
|
+
program.setFile('source/main.bs', `
|
|
1325
|
+
sub Main()
|
|
1326
|
+
direction.ba
|
|
1327
|
+
end sub
|
|
1328
|
+
namespace enums
|
|
1329
|
+
enum Direction
|
|
1330
|
+
up
|
|
1331
|
+
down
|
|
1332
|
+
end enum
|
|
1333
|
+
end namespace
|
|
1334
|
+
`);
|
|
1335
|
+
program.validate();
|
|
1336
|
+
//should NOT find Direction because it's not directly available at the top level (you need to go through `enums.` to get at it)
|
|
1337
|
+
// dire|ction.down
|
|
1338
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 24)), [{
|
|
1339
|
+
label: 'Direction',
|
|
1340
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1341
|
+
}]);
|
|
1342
|
+
});
|
|
1343
|
+
it('infers namespace for enum statement completions', () => {
|
|
1344
|
+
program.setFile('source/main.bs', `
|
|
1345
|
+
namespace enums
|
|
1346
|
+
sub Main()
|
|
1347
|
+
direction.down
|
|
1348
|
+
end sub
|
|
1349
|
+
enum Direction
|
|
1350
|
+
up
|
|
1351
|
+
down
|
|
1352
|
+
end enum
|
|
1353
|
+
end namespace
|
|
1354
|
+
enum Logic
|
|
1355
|
+
yes
|
|
1356
|
+
no
|
|
1357
|
+
end enum
|
|
1358
|
+
`);
|
|
1359
|
+
program.validate();
|
|
1360
|
+
// dire|ction.down
|
|
1361
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 33));
|
|
1362
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1363
|
+
label: 'Direction',
|
|
1364
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1365
|
+
}, {
|
|
1366
|
+
label: 'Logic',
|
|
1367
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1368
|
+
}]);
|
|
1369
|
+
});
|
|
1370
|
+
it('infers multilevel deep namespace for enum statement completions', () => {
|
|
1371
|
+
program.setFile('source/main.bs', `
|
|
1372
|
+
namespace enums
|
|
1373
|
+
namespace deep
|
|
1374
|
+
sub Main()
|
|
1375
|
+
direction.down
|
|
1376
|
+
end sub
|
|
1377
|
+
enum Direction
|
|
1378
|
+
up
|
|
1379
|
+
down
|
|
1380
|
+
end enum
|
|
1381
|
+
end namespace
|
|
1382
|
+
end namespace
|
|
1383
|
+
enum Logic
|
|
1384
|
+
yes
|
|
1385
|
+
no
|
|
1386
|
+
end enum
|
|
1387
|
+
`);
|
|
1388
|
+
program.validate();
|
|
1389
|
+
// dire|ction.down
|
|
1390
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 33));
|
|
1391
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1392
|
+
label: 'Direction',
|
|
1393
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1394
|
+
}, {
|
|
1395
|
+
label: 'Logic',
|
|
1396
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1397
|
+
}]);
|
|
1398
|
+
});
|
|
1399
|
+
it('infers deep namespace for enum statement completions', () => {
|
|
1400
|
+
program.setFile('source/main.bs', `
|
|
1401
|
+
namespace enums.deep.deeper
|
|
1402
|
+
sub Main()
|
|
1403
|
+
direction.down
|
|
1404
|
+
end sub
|
|
1405
|
+
enum Direction
|
|
1406
|
+
up
|
|
1407
|
+
down
|
|
1408
|
+
end enum
|
|
1409
|
+
end namespace
|
|
1410
|
+
enum Logic
|
|
1411
|
+
yes
|
|
1412
|
+
no
|
|
1413
|
+
end enum
|
|
1414
|
+
`);
|
|
1415
|
+
program.validate();
|
|
1416
|
+
// dire|ction.down
|
|
1417
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(3, 33));
|
|
1418
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1419
|
+
label: 'Direction',
|
|
1420
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1421
|
+
}, {
|
|
1422
|
+
label: 'Logic',
|
|
1423
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1424
|
+
}]);
|
|
1425
|
+
});
|
|
1426
|
+
it('infers namespace for enum member completions', () => {
|
|
1427
|
+
program.setFile('source/main.bs', `
|
|
1428
|
+
namespace enums
|
|
1429
|
+
sub Main()
|
|
1430
|
+
direction.down
|
|
1431
|
+
end sub
|
|
1432
|
+
enum Direction
|
|
1433
|
+
up
|
|
1434
|
+
down
|
|
1435
|
+
end enum
|
|
1436
|
+
end namespace
|
|
1437
|
+
`);
|
|
1438
|
+
program.validate();
|
|
1439
|
+
// direction.do|wn
|
|
1440
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(3, 36)), [{
|
|
1441
|
+
label: 'up',
|
|
1442
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1443
|
+
}, {
|
|
1444
|
+
label: 'down',
|
|
1445
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1446
|
+
}]);
|
|
1447
|
+
});
|
|
1448
|
+
it('supports explicit namespace for enum statement completions', () => {
|
|
1449
|
+
program.setFile('source/main.bs', `
|
|
1450
|
+
namespace enums
|
|
1451
|
+
sub Main()
|
|
1452
|
+
enums.direction.down
|
|
1453
|
+
end sub
|
|
1454
|
+
enum Direction
|
|
1455
|
+
up
|
|
1456
|
+
down
|
|
1457
|
+
end enum
|
|
1458
|
+
end namespace
|
|
1459
|
+
`);
|
|
1460
|
+
program.validate();
|
|
1461
|
+
// enums.dire|ction.down
|
|
1462
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(3, 38)), [{
|
|
1463
|
+
label: 'Direction',
|
|
1464
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1465
|
+
}]);
|
|
1466
|
+
});
|
|
1467
|
+
it('supports explicit namespace for enum statement completions', () => {
|
|
1468
|
+
program.setFile('source/main.bs', `
|
|
1469
|
+
namespace logger
|
|
1470
|
+
sub log()
|
|
1471
|
+
enums.direction.down
|
|
1472
|
+
end sub
|
|
1473
|
+
end namespace
|
|
1474
|
+
namespace enums
|
|
1475
|
+
enum Direction
|
|
1476
|
+
up
|
|
1477
|
+
down
|
|
1478
|
+
end enum
|
|
1479
|
+
end namespace
|
|
1480
|
+
`);
|
|
1481
|
+
program.validate();
|
|
1482
|
+
// enums.dire|ction.down
|
|
1483
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(3, 38)), [{
|
|
1484
|
+
label: 'Direction',
|
|
1485
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
1486
|
+
}]);
|
|
1487
|
+
});
|
|
1488
|
+
it('gives completions for underlying types on enum members', () => {
|
|
1489
|
+
program.setFile('source/main.bs', `
|
|
1490
|
+
enum Direction
|
|
1491
|
+
up = "up"
|
|
1492
|
+
down = "down"
|
|
1493
|
+
end enum
|
|
1494
|
+
|
|
1495
|
+
sub goAway(dir as Direction)
|
|
1496
|
+
print dir.
|
|
1497
|
+
end sub
|
|
1498
|
+
|
|
1499
|
+
`);
|
|
1500
|
+
program.validate();
|
|
1501
|
+
// print dir.|
|
|
1502
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 31));
|
|
1503
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1504
|
+
label: 'Trim',
|
|
1505
|
+
kind: vscode_languageserver_1.CompletionItemKind.Method
|
|
1506
|
+
}]);
|
|
1507
|
+
});
|
|
1508
|
+
it('gives completions for underlying types on enum members on future enum declaration', () => {
|
|
1509
|
+
program.setFile('source/main.bs', `
|
|
1510
|
+
sub goAway(dir as Direction)
|
|
1511
|
+
print dir.
|
|
1512
|
+
end sub
|
|
1513
|
+
|
|
1514
|
+
enum Direction
|
|
1515
|
+
up = "up"
|
|
1516
|
+
down = "down"
|
|
1517
|
+
end enum
|
|
1518
|
+
`);
|
|
1519
|
+
program.validate();
|
|
1520
|
+
// print dir.|
|
|
1521
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 31));
|
|
1522
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1523
|
+
label: 'Trim',
|
|
1524
|
+
kind: vscode_languageserver_1.CompletionItemKind.Method
|
|
1525
|
+
}]);
|
|
1526
|
+
});
|
|
1527
|
+
it('does not give other members on enum member completion', () => {
|
|
1528
|
+
program.setFile('source/main.bs', `
|
|
1529
|
+
sub goAway(dir as Direction)
|
|
1530
|
+
print dir.
|
|
1531
|
+
end sub
|
|
1532
|
+
|
|
1533
|
+
enum Direction
|
|
1534
|
+
up = "up"
|
|
1535
|
+
down = "down"
|
|
1536
|
+
end enum
|
|
1537
|
+
`);
|
|
1538
|
+
program.validate();
|
|
1539
|
+
// print dir.|
|
|
1540
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 31));
|
|
1541
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
1542
|
+
label: 'down',
|
|
1543
|
+
kind: vscode_languageserver_1.CompletionItemKind.EnumMember
|
|
1544
|
+
}]);
|
|
1545
|
+
});
|
|
1546
|
+
});
|
|
1547
|
+
describe('built in type members', () => {
|
|
1548
|
+
it('finds built in members', () => {
|
|
1549
|
+
program.setFile('source/main.bs', `
|
|
1550
|
+
sub foo(name as string)
|
|
1551
|
+
print name.
|
|
1552
|
+
end sub
|
|
1553
|
+
`);
|
|
1554
|
+
program.validate();
|
|
1555
|
+
// print name|.
|
|
1556
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32)), [{
|
|
1557
|
+
label: 'Replace',
|
|
1558
|
+
kind: vscode_languageserver_1.CompletionItemKind.Method
|
|
1559
|
+
}]);
|
|
1560
|
+
});
|
|
1561
|
+
});
|
|
1562
|
+
describe('global callables', () => {
|
|
1563
|
+
it('finds built in members', () => {
|
|
1564
|
+
program.setFile('source/main.bs', `
|
|
1565
|
+
sub foo(name as string)
|
|
1566
|
+
print
|
|
1567
|
+
end sub
|
|
1568
|
+
`);
|
|
1569
|
+
program.validate();
|
|
1570
|
+
// print |
|
|
1571
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 27));
|
|
1572
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1573
|
+
label: 'LCase',
|
|
1574
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
1575
|
+
}]);
|
|
1576
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1577
|
+
label: 'CreateObject',
|
|
1578
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
1579
|
+
}]);
|
|
1580
|
+
});
|
|
1581
|
+
});
|
|
1582
|
+
describe('callfunc completions', () => {
|
|
1583
|
+
it('finds callfunc members', () => {
|
|
1584
|
+
program.setFile('components/Widget.xml', (0, testHelpers_spec_1.trim) `
|
|
1585
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
|
1586
|
+
<component name="Widget" extends="Group">
|
|
1587
|
+
<script uri="Widget.brs"/>
|
|
1588
|
+
<interface>
|
|
1589
|
+
<function name="someFunc" />
|
|
1590
|
+
</interface>
|
|
1591
|
+
</component>
|
|
1592
|
+
`);
|
|
1593
|
+
program.setFile('components/Widget.brs', `
|
|
1594
|
+
function someFunc(input as string) as float
|
|
1595
|
+
return input.toFloat()
|
|
1596
|
+
end function
|
|
1597
|
+
`);
|
|
1598
|
+
program.setFile('source/util.bs', `
|
|
1599
|
+
sub callWidgetSomeFunc(widget as roSGNodeWidget)
|
|
1600
|
+
print widget@.
|
|
1601
|
+
end sub
|
|
1602
|
+
`);
|
|
1603
|
+
program.validate();
|
|
1604
|
+
// print widget@.|
|
|
1605
|
+
let completions = program.getCompletions('source/util.bs', util_1.default.createPosition(2, 34));
|
|
1606
|
+
(0, chai_config_spec_1.expect)(completions.length).to.eql(1);
|
|
1607
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1608
|
+
label: 'someFunc',
|
|
1609
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
1610
|
+
}]);
|
|
1611
|
+
});
|
|
1612
|
+
it('includes documentation', () => {
|
|
1613
|
+
program.setFile('components/Widget.xml', (0, testHelpers_spec_1.trim) `
|
|
1614
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
|
1615
|
+
<component name="Widget" extends="Group">
|
|
1616
|
+
<script uri="Widget.brs"/>
|
|
1617
|
+
<interface>
|
|
1618
|
+
<function name="someFunc" />
|
|
1619
|
+
</interface>
|
|
1620
|
+
</component>
|
|
1621
|
+
`);
|
|
1622
|
+
program.setFile('components/Widget.brs', `
|
|
1623
|
+
' This is documentation
|
|
1624
|
+
function someFunc(input as string) as float
|
|
1625
|
+
return input.toFloat()
|
|
1626
|
+
end function
|
|
1627
|
+
`);
|
|
1628
|
+
program.setFile('source/util.bs', `
|
|
1629
|
+
sub callWidgetSomeFunc(widget as roSGNodeWidget)
|
|
1630
|
+
print widget@.
|
|
1631
|
+
end sub
|
|
1632
|
+
`);
|
|
1633
|
+
program.validate();
|
|
1634
|
+
// print widget@.|
|
|
1635
|
+
let completions = program.getCompletions('source/util.bs', util_1.default.createPosition(2, 34));
|
|
1636
|
+
(0, chai_config_spec_1.expect)(completions.length).to.eql(1);
|
|
1637
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1638
|
+
label: 'someFunc',
|
|
1639
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function,
|
|
1640
|
+
documentation: 'This is documentation'
|
|
1641
|
+
}]);
|
|
1642
|
+
});
|
|
1643
|
+
});
|
|
1644
|
+
describe('type expressions', () => {
|
|
1645
|
+
it('finds built in types', () => {
|
|
1646
|
+
program.setFile('source/main.bs', `
|
|
1647
|
+
sub foo(thing as )
|
|
1648
|
+
print thing
|
|
1649
|
+
end sub
|
|
1650
|
+
`);
|
|
1651
|
+
program.validate();
|
|
1652
|
+
// sub foo(thing as | )
|
|
1653
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 34));
|
|
1654
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1655
|
+
label: 'integer',
|
|
1656
|
+
kind: vscode_languageserver_1.CompletionItemKind.Keyword
|
|
1657
|
+
}]);
|
|
1658
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1659
|
+
label: 'roSGNode',
|
|
1660
|
+
kind: vscode_languageserver_1.CompletionItemKind.Interface
|
|
1661
|
+
}]);
|
|
1662
|
+
});
|
|
1663
|
+
it('does not include global values (true, false, invalid)', () => {
|
|
1664
|
+
program.setFile('source/main.bs', `
|
|
1665
|
+
sub foo(thing as )
|
|
1666
|
+
print thing
|
|
1667
|
+
end sub
|
|
1668
|
+
`);
|
|
1669
|
+
program.validate();
|
|
1670
|
+
// sub foo(thing as | )
|
|
1671
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 34));
|
|
1672
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
1673
|
+
label: 'true',
|
|
1674
|
+
kind: vscode_languageserver_1.CompletionItemKind.Value
|
|
1675
|
+
}, {
|
|
1676
|
+
label: 'false',
|
|
1677
|
+
kind: vscode_languageserver_1.CompletionItemKind.Value
|
|
1678
|
+
}, {
|
|
1679
|
+
label: 'invalid',
|
|
1680
|
+
kind: vscode_languageserver_1.CompletionItemKind.Value
|
|
1681
|
+
}]);
|
|
1682
|
+
});
|
|
1683
|
+
it('finds custom types', () => {
|
|
1684
|
+
program.setFile('source/main.bs', `
|
|
1685
|
+
sub foo(thing as )
|
|
1686
|
+
print thing
|
|
1687
|
+
end sub
|
|
1688
|
+
|
|
1689
|
+
class SomeKlass
|
|
1690
|
+
end class
|
|
1691
|
+
`);
|
|
1692
|
+
program.validate();
|
|
1693
|
+
// sub foo(thing as | )
|
|
1694
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 34));
|
|
1695
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1696
|
+
label: 'SomeKlass',
|
|
1697
|
+
kind: vscode_languageserver_1.CompletionItemKind.Class
|
|
1698
|
+
}]);
|
|
1699
|
+
});
|
|
1700
|
+
it('only shows intrinsic/native types in brightscript', () => {
|
|
1701
|
+
program.setFile('source/main.brs', `
|
|
1702
|
+
sub foo(thing as )
|
|
1703
|
+
print thing
|
|
1704
|
+
end sub
|
|
1705
|
+
`);
|
|
1706
|
+
program.validate();
|
|
1707
|
+
// sub foo(thing as | )
|
|
1708
|
+
const completions = program.getCompletions('source/main.brs', util_1.default.createPosition(1, 34));
|
|
1709
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1710
|
+
label: 'integer',
|
|
1711
|
+
kind: vscode_languageserver_1.CompletionItemKind.Keyword
|
|
1712
|
+
}]);
|
|
1713
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1714
|
+
label: 'function',
|
|
1715
|
+
kind: vscode_languageserver_1.CompletionItemKind.Keyword
|
|
1716
|
+
}]);
|
|
1717
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
1718
|
+
label: 'roSGNode'
|
|
1719
|
+
}]);
|
|
1720
|
+
});
|
|
1721
|
+
});
|
|
1722
|
+
describe('interfaces', () => {
|
|
1723
|
+
it('finds members of interfaces', () => {
|
|
1724
|
+
program.setFile('source/main.bs', `
|
|
1725
|
+
sub foo(thing as SomeInterface )
|
|
1726
|
+
print thing.
|
|
1727
|
+
end sub
|
|
1728
|
+
|
|
1729
|
+
|
|
1730
|
+
interface SomeInterface
|
|
1731
|
+
name as string
|
|
1732
|
+
data
|
|
1733
|
+
function doStuff()
|
|
1734
|
+
end interface
|
|
1735
|
+
`);
|
|
1736
|
+
program.validate();
|
|
1737
|
+
// print thing.|
|
|
1738
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
|
|
1739
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1740
|
+
label: 'name',
|
|
1741
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
1742
|
+
}]);
|
|
1743
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1744
|
+
label: 'data',
|
|
1745
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
1746
|
+
}]);
|
|
1747
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1748
|
+
label: 'doStuff',
|
|
1749
|
+
kind: vscode_languageserver_1.CompletionItemKind.Method
|
|
1750
|
+
}]);
|
|
1751
|
+
});
|
|
1752
|
+
it('finds optional members of interfaces', () => {
|
|
1753
|
+
program.setFile('source/main.bs', `
|
|
1754
|
+
sub foo(thing as SomeInterface )
|
|
1755
|
+
print thing.
|
|
1756
|
+
end sub
|
|
1757
|
+
|
|
1758
|
+
|
|
1759
|
+
interface SomeInterface
|
|
1760
|
+
optional name as string
|
|
1761
|
+
optional data
|
|
1762
|
+
optional function doStuff()
|
|
1763
|
+
end interface
|
|
1764
|
+
`);
|
|
1765
|
+
program.validate();
|
|
1766
|
+
// print thing.|
|
|
1767
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
|
|
1768
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1769
|
+
label: 'name',
|
|
1770
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
1771
|
+
}]);
|
|
1772
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1773
|
+
label: 'data',
|
|
1774
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
1775
|
+
}]);
|
|
1776
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1777
|
+
label: 'doStuff',
|
|
1778
|
+
kind: vscode_languageserver_1.CompletionItemKind.Method
|
|
1779
|
+
}]);
|
|
1780
|
+
});
|
|
1781
|
+
});
|
|
1782
|
+
describe('typed variables', () => {
|
|
1783
|
+
it('shows variables of type interface as CompletionItemKind.Variable', () => {
|
|
1784
|
+
program.setFile('source/main.bs', `
|
|
1785
|
+
sub foo(thing as SomeInterface)
|
|
1786
|
+
print thi|
|
|
1787
|
+
end sub
|
|
1788
|
+
|
|
1789
|
+
interface SomeInterface
|
|
1790
|
+
optional name as string
|
|
1791
|
+
optional data
|
|
1792
|
+
optional function doStuff()
|
|
1793
|
+
end interface
|
|
1794
|
+
`);
|
|
1795
|
+
program.validate();
|
|
1796
|
+
// print thi|
|
|
1797
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
|
|
1798
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1799
|
+
label: 'thing',
|
|
1800
|
+
kind: vscode_languageserver_1.CompletionItemKind.Variable
|
|
1801
|
+
}]);
|
|
1802
|
+
});
|
|
1803
|
+
it('shows variables of type class as CompletionItemKind.Variable', () => {
|
|
1804
|
+
program.setFile('source/main.bs', `
|
|
1805
|
+
sub foo(thing as SomeKlass)
|
|
1806
|
+
print thi|
|
|
1807
|
+
end sub
|
|
1808
|
+
|
|
1809
|
+
class SomeKlass
|
|
1810
|
+
name as string
|
|
1811
|
+
data
|
|
1812
|
+
function doStuff()
|
|
1813
|
+
end function
|
|
1814
|
+
end class
|
|
1815
|
+
`);
|
|
1816
|
+
program.validate();
|
|
1817
|
+
// print thi|
|
|
1818
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
|
|
1819
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1820
|
+
label: 'thing',
|
|
1821
|
+
kind: vscode_languageserver_1.CompletionItemKind.Variable
|
|
1822
|
+
}]);
|
|
1823
|
+
});
|
|
1824
|
+
it('shows variables of type enum as CompletionItemKind.Variable', () => {
|
|
1825
|
+
program.setFile('source/main.bs', `
|
|
1826
|
+
sub foo(thing as SomeEnum)
|
|
1827
|
+
print thi|
|
|
1828
|
+
end sub
|
|
1829
|
+
|
|
1830
|
+
enum SomeEnum
|
|
1831
|
+
up
|
|
1832
|
+
down
|
|
1833
|
+
end end
|
|
1834
|
+
`);
|
|
1835
|
+
program.validate();
|
|
1836
|
+
// print thi|
|
|
1837
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
|
|
1838
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1839
|
+
label: 'thing',
|
|
1840
|
+
kind: vscode_languageserver_1.CompletionItemKind.Variable
|
|
1841
|
+
}]);
|
|
1842
|
+
});
|
|
1843
|
+
it('shows variables of type function as CompletionItemKind.Variable', () => {
|
|
1844
|
+
program.setFile('source/main.bs', `
|
|
1845
|
+
sub foo(thing as function)
|
|
1846
|
+
print thi|
|
|
1847
|
+
end sub
|
|
1848
|
+
`);
|
|
1849
|
+
program.validate();
|
|
1850
|
+
// print thi|
|
|
1851
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 33));
|
|
1852
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1853
|
+
label: 'thing',
|
|
1854
|
+
kind: vscode_languageserver_1.CompletionItemKind.Variable
|
|
1855
|
+
}]);
|
|
1856
|
+
});
|
|
1857
|
+
});
|
|
1858
|
+
describe('brighterscript vs brightscript', () => {
|
|
1859
|
+
it('should not include transpiled versions of symbols in brighterscript code', () => {
|
|
1860
|
+
program.setFile('source/main.bs', `
|
|
1861
|
+
namespace Alpha
|
|
1862
|
+
sub beta()
|
|
1863
|
+
print "hello"
|
|
1864
|
+
end sub
|
|
1865
|
+
|
|
1866
|
+
sub gamma()
|
|
1867
|
+
' completions here should NOT have Alpha_beta or Alpha_gamma
|
|
1868
|
+
end sub
|
|
1869
|
+
end namespace
|
|
1870
|
+
`);
|
|
1871
|
+
program.validate();
|
|
1872
|
+
// | ' completions here
|
|
1873
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(6, 25));
|
|
1874
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
1875
|
+
label: 'Alpha_beta',
|
|
1876
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
1877
|
+
}, {
|
|
1878
|
+
label: 'Alpha_gamma',
|
|
1879
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
1880
|
+
}]);
|
|
1881
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1882
|
+
label: 'Alpha',
|
|
1883
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
1884
|
+
}]);
|
|
1885
|
+
});
|
|
1886
|
+
it('should include transpiled versions of symbols in brightscript code', () => {
|
|
1887
|
+
program.setFile('source/main.bs', `
|
|
1888
|
+
namespace Alpha
|
|
1889
|
+
sub beta()
|
|
1890
|
+
print "hello"
|
|
1891
|
+
end sub
|
|
1892
|
+
|
|
1893
|
+
sub gamma()
|
|
1894
|
+
print "gamma"
|
|
1895
|
+
end sub
|
|
1896
|
+
end namespace
|
|
1897
|
+
`);
|
|
1898
|
+
program.setFile('source/other.brs', `
|
|
1899
|
+
sub inBrsFile()
|
|
1900
|
+
' completions here should have Alpha_beta and Alpha_gamma
|
|
1901
|
+
end sub
|
|
1902
|
+
`);
|
|
1903
|
+
program.validate();
|
|
1904
|
+
// | ' completions here
|
|
1905
|
+
const completions = program.getCompletions('source/other.brs', util_1.default.createPosition(2, 21));
|
|
1906
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1907
|
+
label: 'Alpha_beta',
|
|
1908
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
1909
|
+
}, {
|
|
1910
|
+
label: 'Alpha_gamma',
|
|
1911
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
1912
|
+
}]);
|
|
1913
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
1914
|
+
label: 'Alpha',
|
|
1915
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
1916
|
+
}]);
|
|
1917
|
+
});
|
|
1918
|
+
it('should not include namespaces in brightscript code', () => {
|
|
1919
|
+
program.setFile('source/main.bs', `
|
|
1920
|
+
namespace Alpha
|
|
1921
|
+
end namespace
|
|
1922
|
+
`);
|
|
1923
|
+
program.setFile('source/other.brs', `
|
|
1924
|
+
sub inBrsFile()
|
|
1925
|
+
' completions here should have Alpha_beta and Alpha_gamma
|
|
1926
|
+
end sub
|
|
1927
|
+
`);
|
|
1928
|
+
program.validate();
|
|
1929
|
+
// | ' completions here
|
|
1930
|
+
const completions = program.getCompletions('source/other.brs', util_1.default.createPosition(2, 21));
|
|
1931
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
1932
|
+
label: 'Alpha',
|
|
1933
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
1934
|
+
}]);
|
|
1935
|
+
});
|
|
1936
|
+
});
|
|
1937
|
+
describe('global values', () => {
|
|
1938
|
+
it('should include true, false', () => {
|
|
1939
|
+
program.setFile('source/main.bs', `
|
|
1940
|
+
sub foo()
|
|
1941
|
+
fooValue =
|
|
1942
|
+
end sub
|
|
1943
|
+
`);
|
|
1944
|
+
program.validate();
|
|
1945
|
+
// fooValue = |
|
|
1946
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32));
|
|
1947
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1948
|
+
label: 'true',
|
|
1949
|
+
kind: vscode_languageserver_1.CompletionItemKind.Value
|
|
1950
|
+
}]);
|
|
1951
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1952
|
+
label: 'false',
|
|
1953
|
+
kind: vscode_languageserver_1.CompletionItemKind.Value
|
|
1954
|
+
}]);
|
|
1955
|
+
});
|
|
1956
|
+
it('should include invalid', () => {
|
|
1957
|
+
program.setFile('source/main.bs', `
|
|
1958
|
+
sub foo()
|
|
1959
|
+
fooValue =
|
|
1960
|
+
end sub
|
|
1961
|
+
`);
|
|
1962
|
+
program.validate();
|
|
1963
|
+
// fooValue = |
|
|
1964
|
+
const completions = program.getCompletions('source/main.bs', util_1.default.createPosition(2, 32));
|
|
1965
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1966
|
+
label: 'invalid',
|
|
1967
|
+
kind: vscode_languageserver_1.CompletionItemKind.Value
|
|
1968
|
+
}]);
|
|
1969
|
+
});
|
|
1970
|
+
});
|
|
1971
|
+
describe('accessibility values', () => {
|
|
1972
|
+
it('include appropriate accessible members', () => {
|
|
1973
|
+
program.setFile('source/main.bs', `
|
|
1974
|
+
class Accessibility
|
|
1975
|
+
private name
|
|
1976
|
+
protected age
|
|
1977
|
+
public id
|
|
1978
|
+
|
|
1979
|
+
sub someMethod()
|
|
1980
|
+
m. ' In class method
|
|
1981
|
+
end sub
|
|
1982
|
+
end class
|
|
1983
|
+
|
|
1984
|
+
sub foo(klass as Accessibility)
|
|
1985
|
+
klass. ' outside class method
|
|
1986
|
+
end sub
|
|
1987
|
+
`);
|
|
1988
|
+
program.validate();
|
|
1989
|
+
// m.| ' In class method
|
|
1990
|
+
let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 26));
|
|
1991
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
1992
|
+
label: 'name',
|
|
1993
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
1994
|
+
}, {
|
|
1995
|
+
label: 'age',
|
|
1996
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
1997
|
+
}, {
|
|
1998
|
+
label: 'id',
|
|
1999
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2000
|
+
}]);
|
|
2001
|
+
// klass.| ' outside class method
|
|
2002
|
+
completions = program.getCompletions('source/main.bs', util_1.default.createPosition(12, 26));
|
|
2003
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
2004
|
+
label: 'name',
|
|
2005
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2006
|
+
}, {
|
|
2007
|
+
label: 'age',
|
|
2008
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2009
|
+
}]);
|
|
2010
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
2011
|
+
label: 'id',
|
|
2012
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2013
|
+
}]);
|
|
2014
|
+
});
|
|
2015
|
+
it('includes private members on non-m variables when appropriate', () => {
|
|
2016
|
+
program.setFile('source/main.bs', `
|
|
2017
|
+
class Accessibility
|
|
2018
|
+
private name
|
|
2019
|
+
protected age
|
|
2020
|
+
public id
|
|
2021
|
+
|
|
2022
|
+
sub foo(notM as Accessibility)
|
|
2023
|
+
notM. ' In class method
|
|
2024
|
+
end sub
|
|
2025
|
+
end class
|
|
2026
|
+
`);
|
|
2027
|
+
program.validate();
|
|
2028
|
+
// m.| ' In class method
|
|
2029
|
+
let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(7, 29));
|
|
2030
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
2031
|
+
label: 'age',
|
|
2032
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2033
|
+
}, {
|
|
2034
|
+
label: 'id',
|
|
2035
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2036
|
+
}, {
|
|
2037
|
+
label: 'name',
|
|
2038
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2039
|
+
}]);
|
|
2040
|
+
});
|
|
2041
|
+
it('includes protected members on sub classes', () => {
|
|
2042
|
+
program.setFile('source/main.bs', `
|
|
2043
|
+
class Accessibility
|
|
2044
|
+
private name
|
|
2045
|
+
protected age
|
|
2046
|
+
public id
|
|
2047
|
+
end class
|
|
2048
|
+
|
|
2049
|
+
class AccessToo extends Accessibility
|
|
2050
|
+
sub foo()
|
|
2051
|
+
m. ' In class method
|
|
2052
|
+
end sub
|
|
2053
|
+
end class
|
|
2054
|
+
`);
|
|
2055
|
+
program.validate();
|
|
2056
|
+
// m.| ' In class method
|
|
2057
|
+
let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(9, 26));
|
|
2058
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
2059
|
+
label: 'age',
|
|
2060
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2061
|
+
}, {
|
|
2062
|
+
label: 'id',
|
|
2063
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2064
|
+
}]);
|
|
2065
|
+
(0, testHelpers_spec_1.expectCompletionsExcludes)(completions, [{
|
|
2066
|
+
label: 'name',
|
|
2067
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field
|
|
2068
|
+
}]);
|
|
2069
|
+
});
|
|
2070
|
+
});
|
|
2071
|
+
describe('alias', () => {
|
|
2072
|
+
it('includes aliases', () => {
|
|
2073
|
+
program.setFile('source/main.bs', `
|
|
2074
|
+
alias APerson = Person
|
|
2075
|
+
alias APi = Pi
|
|
2076
|
+
|
|
2077
|
+
namespace alpha
|
|
2078
|
+
sub test()
|
|
2079
|
+
print
|
|
2080
|
+
end sub
|
|
2081
|
+
|
|
2082
|
+
sub pi()
|
|
2083
|
+
print "Magnum"
|
|
2084
|
+
end sub
|
|
2085
|
+
|
|
2086
|
+
enum Person
|
|
2087
|
+
tall
|
|
2088
|
+
short
|
|
2089
|
+
end enum
|
|
2090
|
+
end namespace
|
|
2091
|
+
|
|
2092
|
+
function Person()
|
|
2093
|
+
return "John Doe"
|
|
2094
|
+
end function
|
|
2095
|
+
|
|
2096
|
+
const PI = 3.14
|
|
2097
|
+
`);
|
|
2098
|
+
program.validate();
|
|
2099
|
+
// print |
|
|
2100
|
+
let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(6, 31));
|
|
2101
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
2102
|
+
label: 'APi',
|
|
2103
|
+
kind: vscode_languageserver_1.CompletionItemKind.Constant
|
|
2104
|
+
}, {
|
|
2105
|
+
label: 'APerson',
|
|
2106
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
2107
|
+
}]);
|
|
2108
|
+
});
|
|
2109
|
+
it('includes runtime and typetime symbols on RHS', () => {
|
|
2110
|
+
program.setFile('source/main.bs', `
|
|
2111
|
+
alias myAlias = a
|
|
2112
|
+
|
|
2113
|
+
function getPersonName()
|
|
2114
|
+
return "John Doe"
|
|
2115
|
+
end function
|
|
2116
|
+
|
|
2117
|
+
const PI = 3.14
|
|
2118
|
+
|
|
2119
|
+
interface SomeInterface
|
|
2120
|
+
name as string
|
|
2121
|
+
end interface
|
|
2122
|
+
`);
|
|
2123
|
+
program.validate();
|
|
2124
|
+
// alias myAlias = a|
|
|
2125
|
+
let completions = program.getCompletions('source/main.bs', util_1.default.createPosition(1, 33));
|
|
2126
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(completions, [{
|
|
2127
|
+
label: 'getPersonName',
|
|
2128
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
2129
|
+
}, {
|
|
2130
|
+
label: 'PI',
|
|
2131
|
+
kind: vscode_languageserver_1.CompletionItemKind.Constant
|
|
2132
|
+
}, {
|
|
2133
|
+
label: 'SomeInterface',
|
|
2134
|
+
kind: vscode_languageserver_1.CompletionItemKind.Interface
|
|
2135
|
+
}]);
|
|
2136
|
+
});
|
|
2137
|
+
});
|
|
2138
|
+
});
|
|
2139
|
+
//# sourceMappingURL=CompletionsProcessor.spec.js.map
|