brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.20
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 +542 -253
- package/README.md +30 -9
- package/bsconfig.schema.json +13 -1
- package/dist/BsConfig.d.ts +4 -0
- package/dist/Cache.d.ts +3 -8
- package/dist/Cache.js +9 -14
- package/dist/Cache.js.map +1 -1
- package/dist/CodeActionUtil.d.ts +11 -2
- package/dist/CodeActionUtil.js +17 -3
- package/dist/CodeActionUtil.js.map +1 -1
- package/dist/CommentFlagProcessor.d.ts +4 -4
- package/dist/CommentFlagProcessor.js +5 -3
- package/dist/CommentFlagProcessor.js.map +1 -1
- package/dist/DependencyGraph.js +5 -4
- package/dist/DependencyGraph.js.map +1 -1
- package/dist/DiagnosticFilterer.js +1 -1
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +59 -4
- package/dist/DiagnosticMessages.js +65 -7
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +4 -14
- package/dist/LanguageServer.js +40 -26
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +2 -0
- package/dist/Logger.js +10 -8
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.d.ts +7 -3
- package/dist/PluginInterface.js +9 -0
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +43 -25
- package/dist/Program.js +180 -82
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.d.ts +4 -0
- package/dist/ProgramBuilder.js +30 -14
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +100 -28
- package/dist/Scope.js +382 -154
- package/dist/Scope.js.map +1 -1
- package/dist/SemanticTokenUtils.d.ts +14 -0
- package/dist/SemanticTokenUtils.js +81 -0
- package/dist/SemanticTokenUtils.js.map +1 -0
- package/dist/SymbolTable.d.ts +10 -4
- package/dist/SymbolTable.js +40 -13
- package/dist/SymbolTable.js.map +1 -1
- package/dist/XmlScope.d.ts +8 -3
- package/dist/XmlScope.js +65 -27
- package/dist/XmlScope.js.map +1 -1
- package/dist/astUtils/AstEditor.d.ts +33 -0
- package/dist/astUtils/AstEditor.js +107 -0
- package/dist/astUtils/AstEditor.js.map +1 -0
- package/dist/{types/FunctionType.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
- package/dist/astUtils/AstEditor.spec.js +170 -0
- package/dist/astUtils/AstEditor.spec.js.map +1 -0
- package/dist/astUtils/creators.d.ts +24 -6
- package/dist/astUtils/creators.js +130 -19
- package/dist/astUtils/creators.js.map +1 -1
- package/dist/astUtils/creators.spec.js +14 -4
- package/dist/astUtils/creators.spec.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +27 -8
- package/dist/astUtils/reflection.js +66 -1
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/reflection.spec.js +130 -119
- package/dist/astUtils/reflection.spec.js.map +1 -1
- package/dist/astUtils/stackedVisitor.js.map +1 -1
- package/dist/astUtils/stackedVisitor.spec.js +13 -13
- package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +17 -2
- package/dist/astUtils/visitors.js +2 -2
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +31 -29
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/astUtils/xml.d.ts +4 -3
- package/dist/astUtils/xml.js +8 -3
- package/dist/astUtils/xml.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +7 -1
- package/dist/bscPlugin/BscPlugin.js +28 -0
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +4 -4
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +26 -26
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -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 +73 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +52 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +29 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +183 -0
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
- package/dist/cli.js +9 -3
- package/dist/cli.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +1 -0
- package/dist/diagnosticUtils.js +15 -8
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/examples/plugins/removePrint.js +12 -14
- package/dist/examples/plugins/removePrint.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +634 -145
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +62 -30
- package/dist/files/BrsFile.js +683 -335
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +1055 -449
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +11 -10
- package/dist/files/XmlFile.js +33 -26
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +302 -237
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +44 -42
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
- package/dist/files/tests/optionalChaning.spec.js +88 -0
- package/dist/files/tests/optionalChaning.spec.js.map +1 -0
- package/dist/globalCallables.d.ts +3 -1
- package/dist/globalCallables.js +424 -152
- package/dist/globalCallables.js.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +129 -16
- package/dist/lexer/Lexer.d.ts +19 -1
- package/dist/lexer/Lexer.js +127 -21
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/Lexer.spec.js +657 -536
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/Token.d.ts +2 -2
- package/dist/lexer/TokenKind.d.ts +13 -1
- package/dist/lexer/TokenKind.js +60 -3
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/BrsTranspileState.d.ts +7 -0
- package/dist/parser/BrsTranspileState.js +9 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +150 -34
- package/dist/parser/Expression.js +337 -150
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.Class.spec.js +189 -89
- package/dist/parser/Parser.Class.spec.js.map +1 -1
- package/dist/parser/Parser.d.ts +152 -29
- package/dist/parser/Parser.js +1095 -501
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Parser.spec.js +687 -266
- package/dist/parser/Parser.spec.js.map +1 -1
- package/dist/parser/SGParser.d.ts +41 -4
- package/dist/parser/SGParser.js +186 -175
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +35 -22
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/SGTypes.d.ts +206 -38
- package/dist/parser/SGTypes.js +470 -161
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/SGTypes.spec.d.ts +1 -0
- package/dist/parser/SGTypes.spec.js +351 -0
- package/dist/parser/SGTypes.spec.js.map +1 -0
- package/dist/parser/Statement.d.ts +194 -40
- package/dist/parser/Statement.js +597 -160
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +11 -11
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/TranspileState.d.ts +1 -1
- package/dist/parser/TranspileState.js +15 -7
- package/dist/parser/TranspileState.js.map +1 -1
- package/dist/parser/tests/Parser.spec.d.ts +10 -9
- package/dist/parser/tests/Parser.spec.js +15 -11
- package/dist/parser/tests/Parser.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/For.spec.js +60 -60
- package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/ForEach.spec.js +40 -39
- package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/If.spec.js +213 -194
- package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
- package/dist/parser/tests/controlFlow/While.spec.js +37 -37
- package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
- package/dist/parser/tests/expression/Additive.spec.js +30 -30
- package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
- package/dist/parser/tests/expression/ArrayLiterals.spec.js +119 -119
- package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +162 -138
- package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
- package/dist/parser/tests/expression/Boolean.spec.js +24 -24
- package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
- package/dist/parser/tests/expression/Call.spec.js +41 -40
- package/dist/parser/tests/expression/Call.spec.js.map +1 -1
- package/dist/parser/tests/expression/Exponential.spec.js +17 -17
- package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
- package/dist/parser/tests/expression/Function.spec.js +256 -256
- package/dist/parser/tests/expression/Function.spec.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +87 -87
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/dist/parser/tests/expression/Multiplicative.spec.js +37 -37
- package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +75 -63
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/PrefixUnary.spec.js +41 -41
- package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
- package/dist/parser/tests/expression/Primary.spec.js +41 -41
- package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
- package/dist/parser/tests/expression/Relational.spec.js +43 -43
- package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +9 -9
- package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +28 -28
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +102 -102
- package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
- package/dist/parser/tests/statement/AssignmentOperators.spec.js +36 -36
- package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
- package/dist/parser/tests/statement/Declaration.spec.js +44 -44
- package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
- package/dist/parser/tests/statement/Dim.spec.js +21 -21
- package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +840 -0
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
- package/dist/parser/tests/statement/For.spec.d.ts +1 -0
- package/dist/parser/tests/statement/For.spec.js +46 -0
- package/dist/parser/tests/statement/For.spec.js.map +1 -0
- package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
- package/dist/parser/tests/statement/ForEach.spec.js +37 -0
- package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
- package/dist/parser/tests/statement/Function.spec.js +198 -197
- package/dist/parser/tests/statement/Function.spec.js.map +1 -1
- package/dist/parser/tests/statement/Goto.spec.js +15 -14
- package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
- package/dist/parser/tests/statement/Increment.spec.js +50 -50
- package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +254 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
- package/dist/parser/tests/statement/LibraryStatement.spec.js +17 -17
- package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Misc.spec.js +108 -106
- package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
- package/dist/parser/tests/statement/PrintStatement.spec.js +40 -40
- package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/ReturnStatement.spec.js +46 -46
- package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
- package/dist/parser/tests/statement/Set.spec.js +83 -83
- package/dist/parser/tests/statement/Set.spec.js.map +1 -1
- package/dist/parser/tests/statement/Stop.spec.js +12 -11
- package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
- package/dist/parser/tests/statement/Throw.spec.js +5 -5
- package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
- package/dist/parser/tests/statement/TryCatch.spec.js +15 -13
- package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
- package/dist/preprocessor/Chunk.d.ts +1 -1
- package/dist/preprocessor/Chunk.js.map +1 -1
- package/dist/preprocessor/Manifest.d.ts +5 -5
- package/dist/preprocessor/Manifest.js +14 -35
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/preprocessor/Manifest.spec.d.ts +1 -0
- package/dist/preprocessor/Manifest.spec.js +78 -103
- package/dist/preprocessor/Manifest.spec.js.map +1 -1
- package/dist/preprocessor/Preprocessor.d.ts +1 -1
- package/dist/preprocessor/Preprocessor.js +8 -8
- package/dist/preprocessor/Preprocessor.js.map +1 -1
- package/dist/preprocessor/Preprocessor.spec.js +49 -49
- package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
- package/dist/preprocessor/PreprocessorParser.spec.js +72 -72
- package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
- package/dist/roku-types/data.json +21891 -0
- package/dist/roku-types/index.d.ts +6776 -0
- package/dist/roku-types/index.js +11 -0
- package/dist/roku-types/index.js.map +1 -0
- package/dist/types/ArrayType.d.ts +8 -5
- package/dist/types/ArrayType.js +52 -12
- package/dist/types/ArrayType.js.map +1 -1
- package/dist/types/ArrayType.spec.js +72 -11
- package/dist/types/ArrayType.spec.js.map +1 -1
- package/dist/types/BooleanType.d.ts +4 -2
- package/dist/types/BooleanType.js +9 -4
- package/dist/types/BooleanType.js.map +1 -1
- package/dist/types/BooleanType.spec.js +5 -3
- package/dist/types/BooleanType.spec.js.map +1 -1
- package/dist/types/BscType.d.ts +20 -5
- package/dist/types/BscType.js +24 -0
- package/dist/types/BscType.js.map +1 -1
- package/dist/types/CustomType.d.ts +8 -6
- package/dist/types/CustomType.js +20 -11
- package/dist/types/CustomType.js.map +1 -1
- package/dist/types/DoubleType.d.ts +2 -0
- package/dist/types/DoubleType.js +14 -9
- package/dist/types/DoubleType.js.map +1 -1
- package/dist/types/DoubleType.spec.js +5 -3
- package/dist/types/DoubleType.spec.js.map +1 -1
- package/dist/types/DynamicType.d.ts +2 -0
- package/dist/types/DynamicType.js +6 -2
- package/dist/types/DynamicType.js.map +1 -1
- package/dist/types/DynamicType.spec.js +2 -2
- package/dist/types/DynamicType.spec.js.map +1 -1
- package/dist/types/FloatType.d.ts +2 -0
- package/dist/types/FloatType.js +14 -9
- package/dist/types/FloatType.js.map +1 -1
- package/dist/types/FloatType.spec.js +4 -2
- package/dist/types/FloatType.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +7 -31
- package/dist/types/FunctionType.js +11 -57
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/IntegerType.d.ts +2 -0
- package/dist/types/IntegerType.js +14 -9
- package/dist/types/IntegerType.js.map +1 -1
- package/dist/types/IntegerType.spec.js +5 -3
- package/dist/types/IntegerType.spec.js.map +1 -1
- package/dist/types/InterfaceType.d.ts +13 -4
- package/dist/types/InterfaceType.js +48 -8
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/InterfaceType.spec.d.ts +1 -0
- package/dist/types/InterfaceType.spec.js +194 -0
- package/dist/types/InterfaceType.spec.js.map +1 -0
- package/dist/types/InvalidType.d.ts +4 -2
- package/dist/types/InvalidType.js +10 -5
- package/dist/types/InvalidType.js.map +1 -1
- package/dist/types/InvalidType.spec.js +4 -2
- package/dist/types/InvalidType.spec.js.map +1 -1
- package/dist/types/LazyType.d.ts +8 -7
- package/dist/types/LazyType.js +22 -10
- package/dist/types/LazyType.js.map +1 -1
- package/dist/types/LongIntegerType.d.ts +2 -0
- package/dist/types/LongIntegerType.js +14 -9
- package/dist/types/LongIntegerType.js.map +1 -1
- package/dist/types/LongIntegerType.spec.js +4 -2
- package/dist/types/LongIntegerType.spec.js.map +1 -1
- package/dist/types/ObjectType.d.ts +8 -4
- package/dist/types/ObjectType.js +9 -4
- package/dist/types/ObjectType.js.map +1 -1
- package/dist/types/ObjectType.spec.js +2 -2
- package/dist/types/ObjectType.spec.js.map +1 -1
- package/dist/types/StringType.d.ts +4 -2
- package/dist/types/StringType.js +9 -4
- package/dist/types/StringType.js.map +1 -1
- package/dist/types/StringType.spec.js +4 -2
- package/dist/types/StringType.spec.js.map +1 -1
- package/dist/types/TypedFunctionType.d.ts +28 -0
- package/dist/types/TypedFunctionType.js +88 -0
- package/dist/types/TypedFunctionType.js.map +1 -0
- package/dist/types/TypedFunctionType.spec.d.ts +1 -0
- package/dist/types/TypedFunctionType.spec.js +37 -0
- package/dist/types/TypedFunctionType.spec.js.map +1 -0
- package/dist/types/UninitializedType.js +3 -3
- package/dist/types/UninitializedType.js.map +1 -1
- package/dist/types/VoidType.d.ts +4 -2
- package/dist/types/VoidType.js +8 -4
- package/dist/types/VoidType.js.map +1 -1
- package/dist/types/VoidType.spec.js +2 -2
- package/dist/types/VoidType.spec.js.map +1 -1
- package/dist/types/helpers.d.ts +42 -0
- package/dist/types/helpers.js +118 -0
- package/dist/types/helpers.js.map +1 -0
- package/dist/util.d.ts +87 -16
- package/dist/util.js +339 -94
- package/dist/util.js.map +1 -1
- package/dist/validators/ClassValidator.d.ts +19 -2
- package/dist/validators/ClassValidator.js +163 -102
- package/dist/validators/ClassValidator.js.map +1 -1
- package/package.json +26 -15
- package/dist/astUtils/index.d.ts +0 -7
- package/dist/astUtils/index.js +0 -26
- package/dist/astUtils/index.js.map +0 -1
- package/dist/lexer/index.d.ts +0 -3
- package/dist/lexer/index.js +0 -17
- package/dist/lexer/index.js.map +0 -1
- package/dist/parser/index.d.ts +0 -3
- package/dist/parser/index.js +0 -16
- package/dist/parser/index.js.map +0 -1
- package/dist/preprocessor/index.d.ts +0 -3
- package/dist/preprocessor/index.js +0 -16
- package/dist/preprocessor/index.js.map +0 -1
- package/dist/types/FunctionType.spec.js +0 -23
- package/dist/types/FunctionType.spec.js.map +0 -1
|
@@ -11,12 +11,13 @@ const util_1 = require("../util");
|
|
|
11
11
|
const fsExtra = require("fs-extra");
|
|
12
12
|
const BrsTranspileState_1 = require("../parser/BrsTranspileState");
|
|
13
13
|
const assert_1 = require("assert");
|
|
14
|
+
const reflection_1 = require("../astUtils/reflection");
|
|
14
15
|
let sinon = sinonImport.createSandbox();
|
|
15
16
|
describe('BrsFile BrighterScript classes', () => {
|
|
16
|
-
let tmpPath = util_1.standardizePath `${process.cwd()}/.tmp`;
|
|
17
|
-
let rootDir = util_1.standardizePath `${tmpPath}/rootDir`;
|
|
17
|
+
let tmpPath = (0, util_1.standardizePath) `${process.cwd()}/.tmp`;
|
|
18
|
+
let rootDir = (0, util_1.standardizePath) `${tmpPath}/rootDir`;
|
|
18
19
|
let program;
|
|
19
|
-
let testTranspile = testHelpers_spec_1.getTestTranspile(() => [program, rootDir]);
|
|
20
|
+
let testTranspile = (0, testHelpers_spec_1.getTestTranspile)(() => [program, rootDir]);
|
|
20
21
|
beforeEach(() => {
|
|
21
22
|
fsExtra.ensureDirSync(rootDir);
|
|
22
23
|
fsExtra.emptyDirSync(tmpPath);
|
|
@@ -29,10 +30,10 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
29
30
|
fsExtra.emptyDirSync(tmpPath);
|
|
30
31
|
});
|
|
31
32
|
function addFile(relativePath, text) {
|
|
32
|
-
return program.
|
|
33
|
+
return program.setFile({ src: `${rootDir}/${relativePath}`, dest: relativePath }, text);
|
|
33
34
|
}
|
|
34
35
|
it('detects all classes after parse', () => {
|
|
35
|
-
let file = program.
|
|
36
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
36
37
|
class Animal
|
|
37
38
|
end class
|
|
38
39
|
class Duck
|
|
@@ -40,18 +41,17 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
40
41
|
|
|
41
42
|
end class
|
|
42
43
|
`);
|
|
43
|
-
chai_1.expect(file.parser.references.classStatements.map(x => x.getName(Parser_1.ParseMode.BrighterScript)).sort()).to.eql(['Animal', 'Duck']);
|
|
44
|
+
(0, chai_1.expect)(file.parser.references.classStatements.map(x => x.getName(Parser_1.ParseMode.BrighterScript)).sort()).to.eql(['Animal', 'Duck']);
|
|
44
45
|
});
|
|
45
46
|
it('does not cause errors with incomplete class statement', () => {
|
|
46
|
-
program.
|
|
47
|
+
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
47
48
|
class
|
|
48
49
|
`);
|
|
49
50
|
program.validate();
|
|
50
51
|
//if no exception was thrown, this test passes
|
|
51
52
|
});
|
|
52
53
|
it('catches child class missing super call in constructor', () => {
|
|
53
|
-
|
|
54
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
54
|
+
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
55
55
|
class Person
|
|
56
56
|
sub new()
|
|
57
57
|
end sub
|
|
@@ -62,11 +62,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
62
62
|
end class
|
|
63
63
|
`);
|
|
64
64
|
program.validate();
|
|
65
|
-
|
|
65
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
66
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
67
|
+
]);
|
|
66
68
|
});
|
|
67
69
|
it('access modifier is option for override', () => {
|
|
68
|
-
|
|
69
|
-
let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
70
|
+
let file = program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
70
71
|
class Animal
|
|
71
72
|
sub move()
|
|
72
73
|
end sub
|
|
@@ -78,14 +79,13 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
78
79
|
end class
|
|
79
80
|
`);
|
|
80
81
|
program.validate();
|
|
81
|
-
|
|
82
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
82
83
|
let duckClass = file.parser.references.classStatements.find(x => x.name.text.toLowerCase() === 'duck');
|
|
83
|
-
chai_1.expect(duckClass).to.exist;
|
|
84
|
-
chai_1.expect(duckClass.memberMap['move']).to.exist;
|
|
84
|
+
(0, chai_1.expect)(duckClass).to.exist;
|
|
85
|
+
(0, chai_1.expect)(duckClass.memberMap['move']).to.exist;
|
|
85
86
|
});
|
|
86
87
|
it('supports various namespace configurations', () => {
|
|
87
|
-
|
|
88
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
88
|
+
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
89
89
|
class Animal
|
|
90
90
|
sub new()
|
|
91
91
|
bigBird = new Birds.Bird()
|
|
@@ -105,12 +105,11 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
105
105
|
end namespace
|
|
106
106
|
`);
|
|
107
107
|
program.validate();
|
|
108
|
-
|
|
108
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
109
109
|
});
|
|
110
110
|
describe('super', () => {
|
|
111
111
|
it('always requires super call in child constructor', () => {
|
|
112
|
-
|
|
113
|
-
program.addOrReplaceFile('source/main.bs', `
|
|
112
|
+
program.setFile('source/main.bs', `
|
|
114
113
|
class Bird
|
|
115
114
|
end class
|
|
116
115
|
class Duck extends Bird
|
|
@@ -119,11 +118,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
119
118
|
end class
|
|
120
119
|
`);
|
|
121
120
|
program.validate();
|
|
122
|
-
|
|
121
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
122
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
123
|
+
]);
|
|
123
124
|
});
|
|
124
125
|
it('requires super call in child when parent has own `new` method', () => {
|
|
125
|
-
|
|
126
|
-
program.addOrReplaceFile('source/main.bs', `
|
|
126
|
+
program.setFile('source/main.bs', `
|
|
127
127
|
class Bird
|
|
128
128
|
sub new()
|
|
129
129
|
end sub
|
|
@@ -134,11 +134,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
134
134
|
end class
|
|
135
135
|
`);
|
|
136
136
|
program.validate();
|
|
137
|
-
|
|
137
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
138
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
139
|
+
]);
|
|
138
140
|
});
|
|
139
141
|
it('allows non-`m` expressions and statements before the super call', () => {
|
|
140
|
-
|
|
141
|
-
program.addOrReplaceFile('source/main.bs', `
|
|
142
|
+
program.setFile('source/main.bs', `
|
|
142
143
|
class Bird
|
|
143
144
|
sub new(name)
|
|
144
145
|
end sub
|
|
@@ -153,10 +154,10 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
153
154
|
end class
|
|
154
155
|
`);
|
|
155
156
|
program.validate();
|
|
156
|
-
|
|
157
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
157
158
|
});
|
|
158
159
|
it('allows non-`m` expressions and statements before the super call', () => {
|
|
159
|
-
program.
|
|
160
|
+
program.setFile('source/main.bs', `
|
|
160
161
|
class Bird
|
|
161
162
|
sub new(name)
|
|
162
163
|
end sub
|
|
@@ -164,18 +165,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
164
165
|
class Duck extends Bird
|
|
165
166
|
sub new()
|
|
166
167
|
m.name = m.name + "Duck"
|
|
167
|
-
super()
|
|
168
|
+
super(m.name)
|
|
168
169
|
end sub
|
|
169
170
|
end class
|
|
170
171
|
`);
|
|
171
172
|
program.validate();
|
|
172
|
-
|
|
173
|
-
message: DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall().message,
|
|
174
|
-
range: vscode_languageserver_1.Range.create(7, 24, 7, 25)
|
|
175
|
-
}, {
|
|
176
|
-
message: DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall().message,
|
|
177
|
-
range: vscode_languageserver_1.Range.create(7, 33, 7, 34)
|
|
178
|
-
}]);
|
|
173
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { range: vscode_languageserver_1.Range.create(7, 24, 7, 25) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { range: vscode_languageserver_1.Range.create(7, 33, 7, 34) })]);
|
|
179
174
|
});
|
|
180
175
|
});
|
|
181
176
|
describe('transpile', () => {
|
|
@@ -357,6 +352,9 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
357
352
|
class Animal
|
|
358
353
|
sub new(name as string)
|
|
359
354
|
end sub
|
|
355
|
+
|
|
356
|
+
sub DoSomething()
|
|
357
|
+
end sub
|
|
360
358
|
end class
|
|
361
359
|
|
|
362
360
|
class Duck extends Animal
|
|
@@ -370,6 +368,8 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
370
368
|
instance = {}
|
|
371
369
|
instance.new = sub(name as string)
|
|
372
370
|
end sub
|
|
371
|
+
instance.DoSomething = sub()
|
|
372
|
+
end sub
|
|
373
373
|
return instance
|
|
374
374
|
end function
|
|
375
375
|
function Animal(name as string)
|
|
@@ -435,7 +435,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
435
435
|
instance.super0_sayHello = instance.sayHello
|
|
436
436
|
instance.sayHello = function(text)
|
|
437
437
|
text = "The duck says " + text
|
|
438
|
-
if text <> invalid
|
|
438
|
+
if text <> invalid
|
|
439
439
|
m.super0_sayHello(text)
|
|
440
440
|
end if
|
|
441
441
|
end function
|
|
@@ -660,8 +660,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
660
660
|
});
|
|
661
661
|
});
|
|
662
662
|
it('detects using `new` keyword on non-classes', () => {
|
|
663
|
-
|
|
664
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
663
|
+
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.brs' }, `
|
|
665
664
|
sub quack()
|
|
666
665
|
end sub
|
|
667
666
|
sub main()
|
|
@@ -669,37 +668,41 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
669
668
|
end sub
|
|
670
669
|
`);
|
|
671
670
|
program.validate();
|
|
672
|
-
|
|
671
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
672
|
+
DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('sub')
|
|
673
|
+
]);
|
|
673
674
|
});
|
|
674
675
|
it('detects missing call to super', () => {
|
|
675
|
-
|
|
676
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
676
|
+
program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.brs' }, `
|
|
677
677
|
class Animal
|
|
678
|
-
sub new()
|
|
678
|
+
sub new ()
|
|
679
679
|
end sub
|
|
680
680
|
end class
|
|
681
681
|
class Duck extends Animal
|
|
682
|
-
sub new()
|
|
682
|
+
sub new ()
|
|
683
683
|
end sub
|
|
684
684
|
end class
|
|
685
685
|
`);
|
|
686
686
|
program.validate();
|
|
687
|
-
|
|
687
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
688
|
+
DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
|
|
689
|
+
]);
|
|
688
690
|
});
|
|
689
691
|
it.skip('detects calls to unknown m methods', () => {
|
|
690
|
-
|
|
691
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
692
|
+
program.setFile('source/main.brs', `
|
|
692
693
|
class Animal
|
|
693
|
-
sub new()
|
|
694
|
+
sub new ()
|
|
694
695
|
m.methodThatDoesNotExist()
|
|
695
696
|
end sub
|
|
696
697
|
end class
|
|
697
698
|
`);
|
|
698
699
|
program.validate();
|
|
699
|
-
|
|
700
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
701
|
+
DiagnosticMessages_1.DiagnosticMessages.methodDoesNotExistOnType('methodThatDoesNotExist', 'Animal')
|
|
702
|
+
]);
|
|
700
703
|
});
|
|
701
704
|
it('detects duplicate member names', () => {
|
|
702
|
-
program.
|
|
705
|
+
program.setFile('source/main.bs', `
|
|
703
706
|
class Animal
|
|
704
707
|
public name
|
|
705
708
|
public name
|
|
@@ -713,32 +716,26 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
713
716
|
end class
|
|
714
717
|
`);
|
|
715
718
|
program.validate();
|
|
716
|
-
|
|
717
|
-
return {
|
|
718
|
-
code: x.code,
|
|
719
|
-
message: x.message,
|
|
720
|
-
range: x.range,
|
|
721
|
-
severity: vscode_languageserver_1.DiagnosticSeverity.Error
|
|
722
|
-
};
|
|
723
|
-
});
|
|
724
|
-
chai_1.expect(diagnostics).to.eql([Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(3, 23, 3, 27) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(4, 27, 4, 31) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(8, 27, 8, 30) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(10, 23, 10, 26) })]);
|
|
719
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(3, 23, 3, 27) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(4, 27, 4, 31) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(8, 27, 8, 30) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(10, 23, 10, 26) })]);
|
|
725
720
|
});
|
|
726
721
|
it('detects mismatched member type in child class', () => {
|
|
727
|
-
program.
|
|
722
|
+
program.setFile('source/main.bs', `
|
|
728
723
|
class Animal
|
|
729
724
|
public name
|
|
730
725
|
end class
|
|
731
726
|
class Duck extends Animal
|
|
732
|
-
public function name()
|
|
727
|
+
public override function name()
|
|
733
728
|
return "Donald"
|
|
734
729
|
end function
|
|
735
730
|
end class
|
|
736
731
|
`);
|
|
737
732
|
program.validate();
|
|
738
|
-
|
|
733
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
734
|
+
DiagnosticMessages_1.DiagnosticMessages.classChildMemberDifferentMemberTypeThanAncestor('method', 'field', 'Animal')
|
|
735
|
+
]);
|
|
739
736
|
});
|
|
740
737
|
it('allows untyped overridden field in child class', () => {
|
|
741
|
-
program.
|
|
738
|
+
program.setFile('source/main.bs', `
|
|
742
739
|
class Animal
|
|
743
740
|
public name
|
|
744
741
|
end class
|
|
@@ -747,10 +744,10 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
747
744
|
end class
|
|
748
745
|
`);
|
|
749
746
|
program.validate();
|
|
750
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
747
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
751
748
|
});
|
|
752
749
|
it('allows overridden property name in child class', () => {
|
|
753
|
-
program.
|
|
750
|
+
program.setFile('source/main.bs', `
|
|
754
751
|
class Bird
|
|
755
752
|
public name = "bird"
|
|
756
753
|
end class
|
|
@@ -759,10 +756,10 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
759
756
|
end class
|
|
760
757
|
`);
|
|
761
758
|
program.validate();
|
|
762
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
759
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
763
760
|
});
|
|
764
761
|
it('flags incompatible child field type changes', () => {
|
|
765
|
-
program.
|
|
762
|
+
program.setFile('source/main.bs', `
|
|
766
763
|
class Bird
|
|
767
764
|
public age = 12
|
|
768
765
|
public name = "bird"
|
|
@@ -775,15 +772,15 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
775
772
|
end class
|
|
776
773
|
`);
|
|
777
774
|
program.validate();
|
|
778
|
-
|
|
779
|
-
DiagnosticMessages_1.DiagnosticMessages.cannotFindType('Person')
|
|
780
|
-
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'age', 'float', 'integer')
|
|
781
|
-
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string')
|
|
782
|
-
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person')
|
|
775
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
776
|
+
DiagnosticMessages_1.DiagnosticMessages.cannotFindType('Person'),
|
|
777
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'age', 'float', 'integer'),
|
|
778
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string'),
|
|
779
|
+
DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person')
|
|
783
780
|
]);
|
|
784
781
|
});
|
|
785
782
|
it('detects overridden methods without override keyword', () => {
|
|
786
|
-
program.
|
|
783
|
+
program.setFile('source/main.bs', `
|
|
787
784
|
class Animal
|
|
788
785
|
sub speak()
|
|
789
786
|
end sub
|
|
@@ -794,10 +791,12 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
794
791
|
end class
|
|
795
792
|
`);
|
|
796
793
|
program.validate();
|
|
797
|
-
|
|
794
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
795
|
+
DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')
|
|
796
|
+
]);
|
|
798
797
|
});
|
|
799
798
|
it('detects overridden methods with different visibility', () => {
|
|
800
|
-
program.
|
|
799
|
+
program.setFile('source/main.bs', `
|
|
801
800
|
class Animal
|
|
802
801
|
sub speakInPublic()
|
|
803
802
|
end sub
|
|
@@ -816,12 +815,14 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
816
815
|
end class
|
|
817
816
|
`);
|
|
818
817
|
program.validate();
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
818
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
819
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakInPublic', 'private', 'public', 'Animal'),
|
|
820
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFriends', 'public', 'protected', 'Animal'),
|
|
821
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFamily', 'public', 'private', 'Animal')
|
|
822
|
+
]);
|
|
822
823
|
});
|
|
823
824
|
it('allows overridden methods with matching visibility', () => {
|
|
824
|
-
program.
|
|
825
|
+
program.setFile('source/main.bs', `
|
|
825
826
|
class Animal
|
|
826
827
|
sub speakInPublic()
|
|
827
828
|
end sub
|
|
@@ -840,50 +841,123 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
840
841
|
end class
|
|
841
842
|
`);
|
|
842
843
|
program.validate();
|
|
843
|
-
|
|
844
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
844
845
|
});
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
846
|
+
describe('detects unknown parent class', () => {
|
|
847
|
+
it('non-namespaced parent from outside namespace', () => {
|
|
848
|
+
program.setFile('source/main.bs', `
|
|
849
|
+
class Duck extends Animal
|
|
850
|
+
sub speak()
|
|
851
|
+
end sub
|
|
852
|
+
end class
|
|
853
|
+
|
|
854
|
+
namespace Vertibrates
|
|
855
|
+
class Animal
|
|
856
|
+
end class
|
|
857
|
+
end namespace
|
|
858
|
+
`);
|
|
859
|
+
program.validate();
|
|
860
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Animal', 'source')), { range: vscode_languageserver_1.Range.create(1, 35, 1, 41) })]);
|
|
861
|
+
});
|
|
862
|
+
it('non-namespaced parent from within namespace', () => {
|
|
863
|
+
program.setFile('source/main.bs', `
|
|
864
|
+
namespace Vertibrates
|
|
865
|
+
class Duck extends Animal
|
|
866
|
+
sub speak()
|
|
867
|
+
end sub
|
|
868
|
+
end class
|
|
869
|
+
end namespace
|
|
870
|
+
`);
|
|
871
|
+
program.validate();
|
|
872
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
873
|
+
DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Animal', 'source')
|
|
874
|
+
]);
|
|
875
|
+
});
|
|
876
|
+
it('non-namespaced name from outside namespace alongside existing namespace', () => {
|
|
877
|
+
program.setFile('source/main.bs', `
|
|
878
|
+
namespace Vertibrates
|
|
879
|
+
class Animal
|
|
880
|
+
end class
|
|
881
|
+
end namespace
|
|
882
|
+
|
|
883
|
+
class Duck extends Animal
|
|
884
|
+
sub speak()
|
|
885
|
+
end sub
|
|
886
|
+
end class
|
|
887
|
+
`);
|
|
888
|
+
program.validate();
|
|
889
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
890
|
+
DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Animal', 'source')
|
|
891
|
+
]);
|
|
892
|
+
});
|
|
893
|
+
it('namespaced parent class from outside namespace', () => {
|
|
894
|
+
program.setFile('source/vertibrates.bs', `
|
|
895
|
+
namespace Vertibrates
|
|
896
|
+
class Bird
|
|
897
|
+
end class
|
|
898
|
+
end namespace
|
|
899
|
+
`);
|
|
900
|
+
program.setFile('source/Duck.bs', `
|
|
901
|
+
class Duck extends Vertibrates.GroundedBird
|
|
902
|
+
sub speak()
|
|
903
|
+
end sub
|
|
904
|
+
end class
|
|
905
|
+
`);
|
|
906
|
+
program.validate();
|
|
907
|
+
//TODO replace this with `expectDiagnostics` once we fix the duplicate diagnostic one-per-file for missing base classes issue
|
|
908
|
+
(0, chai_1.expect)(program.getDiagnostics()[0].message).to.eql(DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Vertibrates.GroundedBird', 'source').message);
|
|
909
|
+
});
|
|
910
|
+
it('namespaced parent class from inside namespace', () => {
|
|
911
|
+
program.setFile('source/vertibrates.bs', `
|
|
912
|
+
namespace Vertibrates
|
|
913
|
+
class Bird
|
|
914
|
+
end class
|
|
915
|
+
end namespace
|
|
916
|
+
`);
|
|
917
|
+
program.setFile('source/Duck.bs', `
|
|
918
|
+
namespace Birdies
|
|
919
|
+
class Duck extends Vertibrates.GroundedBird
|
|
920
|
+
sub speak()
|
|
921
|
+
end sub
|
|
922
|
+
end class
|
|
923
|
+
end namespace
|
|
924
|
+
`);
|
|
925
|
+
program.validate();
|
|
926
|
+
//TODO replace this with `expectDiagnostics` once we fix the duplicate diagnostic one-per-file for missing base classes issue
|
|
927
|
+
(0, chai_1.expect)(program.getDiagnostics()[0].message).to.eql(DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Vertibrates.GroundedBird', 'source').message);
|
|
928
|
+
});
|
|
854
929
|
});
|
|
855
930
|
it('catches newable class without namespace name', () => {
|
|
856
|
-
|
|
857
|
-
program.addOrReplaceFile('source/main.bs', `
|
|
931
|
+
program.setFile('source/main.bs', `
|
|
858
932
|
namespace NameA.NameB
|
|
859
933
|
class Duck
|
|
860
934
|
end class
|
|
861
|
-
|
|
935
|
+
end namespace
|
|
862
936
|
sub main()
|
|
863
937
|
' this should be an error because the proper name is NameA.NameB.Duck"
|
|
864
938
|
d = new Duck()
|
|
865
939
|
end sub
|
|
866
|
-
|
|
940
|
+
`);
|
|
867
941
|
program.validate();
|
|
868
|
-
|
|
942
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
943
|
+
DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Duck', 'source')
|
|
944
|
+
]);
|
|
869
945
|
});
|
|
870
946
|
it('supports newable class namespace inference', () => {
|
|
871
|
-
|
|
872
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
947
|
+
program.setFile('source/main.bs', `
|
|
873
948
|
namespace NameA.NameB
|
|
874
949
|
class Duck
|
|
875
950
|
end class
|
|
876
|
-
|
|
951
|
+
sub main()
|
|
877
952
|
d = new Duck()
|
|
878
953
|
end sub
|
|
879
954
|
end namespace
|
|
880
|
-
|
|
955
|
+
`);
|
|
881
956
|
program.validate();
|
|
882
|
-
|
|
957
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
883
958
|
});
|
|
884
959
|
it('catches extending unknown namespaced class', () => {
|
|
885
|
-
|
|
886
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
960
|
+
program.setFile('source/main.bs', `
|
|
887
961
|
namespace NameA.NameB
|
|
888
962
|
class Animal
|
|
889
963
|
end class
|
|
@@ -892,120 +966,129 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
892
966
|
end namespace
|
|
893
967
|
`);
|
|
894
968
|
program.validate();
|
|
895
|
-
|
|
969
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
970
|
+
DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('NameA.NameB.Animal1', 'source')
|
|
971
|
+
]);
|
|
896
972
|
});
|
|
897
973
|
it('supports omitting namespace prefix for items in same namespace', () => {
|
|
898
|
-
|
|
899
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
974
|
+
program.setFile('source/main.bs', `
|
|
900
975
|
namespace NameA.NameB
|
|
901
976
|
class Animal
|
|
902
977
|
end class
|
|
903
978
|
class Duck extends Animal
|
|
904
979
|
end class
|
|
905
|
-
|
|
906
|
-
|
|
980
|
+
end namespace
|
|
981
|
+
`);
|
|
907
982
|
program.validate();
|
|
908
|
-
|
|
983
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
909
984
|
});
|
|
910
985
|
it('catches duplicate root-level class declarations', () => {
|
|
911
|
-
|
|
912
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
986
|
+
program.setFile('source/main.bs', `
|
|
913
987
|
class Animal
|
|
914
988
|
end class
|
|
915
989
|
class Animal
|
|
990
|
+
end class
|
|
916
991
|
`);
|
|
917
992
|
program.validate();
|
|
918
|
-
|
|
993
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
994
|
+
DiagnosticMessages_1.DiagnosticMessages.duplicateClassDeclaration('source', 'Animal')
|
|
995
|
+
]);
|
|
919
996
|
});
|
|
920
997
|
it('catches duplicate namespace-level class declarations', () => {
|
|
921
|
-
|
|
922
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
998
|
+
program.setFile('source/main.bs', `
|
|
923
999
|
namespace NameA.NameB
|
|
924
1000
|
class Animal
|
|
925
1001
|
end class
|
|
926
1002
|
class Animal
|
|
1003
|
+
end class
|
|
927
1004
|
end namespace
|
|
928
1005
|
`);
|
|
929
1006
|
program.validate();
|
|
930
|
-
|
|
1007
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1008
|
+
DiagnosticMessages_1.DiagnosticMessages.duplicateClassDeclaration('source', 'NameA.NameB.Animal')
|
|
1009
|
+
]);
|
|
931
1010
|
});
|
|
932
1011
|
it('catches namespaced class name which is the same as a global class', () => {
|
|
933
|
-
|
|
934
|
-
program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
|
|
1012
|
+
program.setFile('source/main.bs', `
|
|
935
1013
|
namespace NameA.NameB
|
|
936
1014
|
class Animal
|
|
937
1015
|
end class
|
|
938
|
-
|
|
1016
|
+
end namespace
|
|
939
1017
|
class Animal
|
|
940
1018
|
end class
|
|
941
1019
|
`);
|
|
942
1020
|
program.validate();
|
|
943
|
-
|
|
1021
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1022
|
+
DiagnosticMessages_1.DiagnosticMessages.namespacedClassCannotShareNamewithNonNamespacedClass('Animal').message
|
|
1023
|
+
]);
|
|
944
1024
|
});
|
|
945
1025
|
it('catches class with same name as function', () => {
|
|
946
|
-
|
|
947
|
-
program.addOrReplaceFile('source/main.bs', `
|
|
1026
|
+
program.setFile('source/main.bs', `
|
|
948
1027
|
class Animal
|
|
949
1028
|
end class
|
|
950
|
-
|
|
1029
|
+
sub Animal()
|
|
951
1030
|
end sub
|
|
952
|
-
|
|
1031
|
+
`);
|
|
953
1032
|
program.validate();
|
|
954
|
-
|
|
1033
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1034
|
+
DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('Animal').message
|
|
1035
|
+
]);
|
|
955
1036
|
});
|
|
956
1037
|
it('catches class with same name (but different case) as function', () => {
|
|
957
|
-
|
|
958
|
-
program.addOrReplaceFile('source/main.bs', `
|
|
1038
|
+
program.setFile('source/main.bs', `
|
|
959
1039
|
class ANIMAL
|
|
960
1040
|
end class
|
|
961
|
-
|
|
1041
|
+
sub animal()
|
|
962
1042
|
end sub
|
|
963
|
-
|
|
1043
|
+
`);
|
|
964
1044
|
program.validate();
|
|
965
|
-
|
|
1045
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1046
|
+
DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('animal').message
|
|
1047
|
+
]);
|
|
966
1048
|
});
|
|
967
1049
|
it('catches variable with same name as class', () => {
|
|
968
|
-
|
|
969
|
-
program.addOrReplaceFile('source/main.bs', `
|
|
1050
|
+
program.setFile('source/main.bs', `
|
|
970
1051
|
class Animal
|
|
971
1052
|
end class
|
|
972
|
-
|
|
1053
|
+
sub main()
|
|
973
1054
|
animal = new Animal()
|
|
974
1055
|
end sub
|
|
975
|
-
|
|
1056
|
+
`);
|
|
976
1057
|
program.validate();
|
|
977
|
-
|
|
1058
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1059
|
+
DiagnosticMessages_1.DiagnosticMessages.localVarSameNameAsClass('Animal').message
|
|
1060
|
+
]);
|
|
978
1061
|
});
|
|
979
1062
|
it('allows extending classes with more than one dot in the filename', () => {
|
|
980
|
-
program.
|
|
1063
|
+
program.setFile('source/testclass.bs', `
|
|
981
1064
|
class Foo
|
|
982
1065
|
end class
|
|
983
1066
|
|
|
984
1067
|
class Bar extends Foo
|
|
985
|
-
sub new()
|
|
1068
|
+
sub new ()
|
|
986
1069
|
super()
|
|
987
1070
|
end sub
|
|
988
1071
|
end class
|
|
989
1072
|
`);
|
|
990
|
-
program.
|
|
1073
|
+
program.setFile('source/testclass_no_testdot.bs', `
|
|
991
1074
|
class BarNoDot extends Foo
|
|
992
|
-
sub new()
|
|
1075
|
+
sub new ()
|
|
993
1076
|
super()
|
|
994
1077
|
end sub
|
|
995
1078
|
end class
|
|
996
1079
|
`);
|
|
997
|
-
program.
|
|
1080
|
+
program.setFile('source/testclass.dot.bs', `
|
|
998
1081
|
class BarDot extends Foo
|
|
999
|
-
sub new()
|
|
1082
|
+
sub new ()
|
|
1000
1083
|
super()
|
|
1001
1084
|
end sub
|
|
1002
1085
|
end class
|
|
1003
1086
|
`);
|
|
1004
1087
|
program.validate();
|
|
1005
|
-
testHelpers_spec_1.expectZeroDiagnostics(program);
|
|
1088
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
1006
1089
|
});
|
|
1007
1090
|
it('computes correct super index for grandchild class', () => {
|
|
1008
|
-
program.
|
|
1091
|
+
program.setFile('source/main.bs', `
|
|
1009
1092
|
sub Main()
|
|
1010
1093
|
c = new App.ClassC()
|
|
1011
1094
|
end sub
|
|
@@ -1021,7 +1104,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1021
1104
|
testTranspile(`
|
|
1022
1105
|
namespace App
|
|
1023
1106
|
class ClassC extends ClassB
|
|
1024
|
-
sub new()
|
|
1107
|
+
sub new ()
|
|
1025
1108
|
super()
|
|
1026
1109
|
end sub
|
|
1027
1110
|
end class
|
|
@@ -1043,7 +1126,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1043
1126
|
`, 'trim', 'source/App.ClassC.bs');
|
|
1044
1127
|
});
|
|
1045
1128
|
it('computes correct super index for namespaced child class and global parent class', () => {
|
|
1046
|
-
program.
|
|
1129
|
+
program.setFile('source/ClassA.bs', `
|
|
1047
1130
|
class ClassA
|
|
1048
1131
|
end class
|
|
1049
1132
|
`);
|
|
@@ -1052,7 +1135,7 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1052
1135
|
class ClassB extends ClassA
|
|
1053
1136
|
end class
|
|
1054
1137
|
end namespace
|
|
1055
|
-
|
|
1138
|
+
`, `
|
|
1056
1139
|
function __App_ClassB_builder()
|
|
1057
1140
|
instance = __ClassA_builder()
|
|
1058
1141
|
instance.super0_new = instance.new
|
|
@@ -1069,13 +1152,419 @@ describe('BrsFile BrighterScript classes', () => {
|
|
|
1069
1152
|
`, 'trim', 'source/App.ClassB.bs');
|
|
1070
1153
|
});
|
|
1071
1154
|
it('does not crash when parent class is missing', () => {
|
|
1072
|
-
const file = program.
|
|
1155
|
+
const file = program.setFile('source/ClassB.bs', `
|
|
1073
1156
|
class ClassB extends ClassA
|
|
1074
1157
|
end class
|
|
1075
1158
|
`);
|
|
1076
|
-
assert_1.doesNotThrow(() => {
|
|
1159
|
+
(0, assert_1.doesNotThrow)(() => {
|
|
1077
1160
|
file.parser.references.classStatements[0].getParentClassIndex(new BrsTranspileState_1.BrsTranspileState(file));
|
|
1078
1161
|
});
|
|
1079
1162
|
});
|
|
1163
|
+
describe('getHover', () => {
|
|
1164
|
+
const animalClassCode = `
|
|
1165
|
+
class Animal
|
|
1166
|
+
kind as string
|
|
1167
|
+
isHungry as boolean
|
|
1168
|
+
|
|
1169
|
+
sub new (kind as string)
|
|
1170
|
+
m.kind = kind
|
|
1171
|
+
m.isHungry = true ' born hungry
|
|
1172
|
+
end sub
|
|
1173
|
+
|
|
1174
|
+
sub eat(foodAmount as integer)
|
|
1175
|
+
if foodAmount > 100
|
|
1176
|
+
m.isHungry = false
|
|
1177
|
+
end if
|
|
1178
|
+
end sub
|
|
1179
|
+
|
|
1180
|
+
sub sleep()
|
|
1181
|
+
m.isHungry = false
|
|
1182
|
+
end sub
|
|
1183
|
+
|
|
1184
|
+
end class
|
|
1185
|
+
|
|
1186
|
+
class Dog extends Animal
|
|
1187
|
+
breed as string
|
|
1188
|
+
sub new (breed as string)
|
|
1189
|
+
super("Dog")
|
|
1190
|
+
m.breed = breed
|
|
1191
|
+
end sub
|
|
1192
|
+
|
|
1193
|
+
sub snooze()
|
|
1194
|
+
m.sleep()
|
|
1195
|
+
end sub
|
|
1196
|
+
end class
|
|
1197
|
+
|
|
1198
|
+
class DogHouse
|
|
1199
|
+
puppy as Dog
|
|
1200
|
+
sub new (pup as Dog)
|
|
1201
|
+
m.puppy = pup
|
|
1202
|
+
end sub
|
|
1203
|
+
end class
|
|
1204
|
+
|
|
1205
|
+
sub main()
|
|
1206
|
+
snoopy = new Dog("Beagle")
|
|
1207
|
+
biplane = new DogHouse(snoopy)
|
|
1208
|
+
print snoopy.kind ' Dog
|
|
1209
|
+
print snoopy.breed ' Beagle
|
|
1210
|
+
print snoopy.isHungry ' true
|
|
1211
|
+
feedAnimal(biplane.puppy)
|
|
1212
|
+
print snoopy.isHungry ' false
|
|
1213
|
+
end sub
|
|
1214
|
+
|
|
1215
|
+
sub feedAnimal(beast as Animal)
|
|
1216
|
+
beast.eat(100)
|
|
1217
|
+
end sub
|
|
1218
|
+
`;
|
|
1219
|
+
it('correctly parses the file', () => {
|
|
1220
|
+
program.setFile('source/animal.bs', animalClassCode);
|
|
1221
|
+
program.validate();
|
|
1222
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
1223
|
+
});
|
|
1224
|
+
it('gets the correct text for m', () => {
|
|
1225
|
+
let animalCode = program.setFile('source/animal.bs', animalClassCode);
|
|
1226
|
+
program.validate();
|
|
1227
|
+
let hover = animalCode.getHover(vscode_languageserver_1.Position.create(6, 21));
|
|
1228
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1229
|
+
'```brightscript',
|
|
1230
|
+
'm as Animal',
|
|
1231
|
+
'```'
|
|
1232
|
+
].join('\n'));
|
|
1233
|
+
hover = animalCode.getHover(vscode_languageserver_1.Position.create(26, 20));
|
|
1234
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1235
|
+
'```brightscript',
|
|
1236
|
+
'm as Dog',
|
|
1237
|
+
'```'
|
|
1238
|
+
].join('\n'));
|
|
1239
|
+
});
|
|
1240
|
+
it('gets the correct text for m.field', () => {
|
|
1241
|
+
let animalCode = program.setFile('source/animal.bs', animalClassCode);
|
|
1242
|
+
program.validate();
|
|
1243
|
+
let hover = animalCode.getHover(vscode_languageserver_1.Position.create(6, 26));
|
|
1244
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1245
|
+
'```brightscript',
|
|
1246
|
+
'Animal.kind as string',
|
|
1247
|
+
'```'
|
|
1248
|
+
].join('\n'));
|
|
1249
|
+
hover = animalCode.getHover(vscode_languageserver_1.Position.create(26, 25));
|
|
1250
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1251
|
+
'```brightscript',
|
|
1252
|
+
'Dog.breed as string',
|
|
1253
|
+
'```'
|
|
1254
|
+
].join('\n'));
|
|
1255
|
+
});
|
|
1256
|
+
it('gets the correct text for m.method', () => {
|
|
1257
|
+
let animalCode = program.setFile('source/animal.bs', animalClassCode);
|
|
1258
|
+
program.validate();
|
|
1259
|
+
let hover = animalCode.getHover(vscode_languageserver_1.Position.create(30, 25));
|
|
1260
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1261
|
+
'```brightscript',
|
|
1262
|
+
'sub Animal.sleep() as void',
|
|
1263
|
+
'```'
|
|
1264
|
+
].join('\n'));
|
|
1265
|
+
});
|
|
1266
|
+
it('gets the correct text for obj.field', () => {
|
|
1267
|
+
let animalCode = program.setFile('source/animal.brs', animalClassCode);
|
|
1268
|
+
program.validate();
|
|
1269
|
+
let hover = animalCode.getHover(vscode_languageserver_1.Position.create(46, 33));
|
|
1270
|
+
(0, chai_1.expect)(hover).to.exist;
|
|
1271
|
+
//TODO TYPES: This should probably say 'Animal.isHungry ...' because that field is defined in Animal
|
|
1272
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1273
|
+
'```brightscript',
|
|
1274
|
+
'Dog.isHungry as boolean',
|
|
1275
|
+
'```'
|
|
1276
|
+
].join('\n'));
|
|
1277
|
+
});
|
|
1278
|
+
it('gets the correct text for obj.method', () => {
|
|
1279
|
+
let animalCode = program.setFile('source/animal.bs', `
|
|
1280
|
+
sub feedAnimal(beast as Animal)
|
|
1281
|
+
beast.eat(100)
|
|
1282
|
+
end sub
|
|
1283
|
+
class Animal
|
|
1284
|
+
sub eat(foodAmount as integer)
|
|
1285
|
+
end sub
|
|
1286
|
+
end class
|
|
1287
|
+
`);
|
|
1288
|
+
program.validate();
|
|
1289
|
+
let hover = animalCode.getHover(vscode_languageserver_1.Position.create(2, 29));
|
|
1290
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1291
|
+
'```brightscript',
|
|
1292
|
+
'sub Animal.eat(foodAmount as integer) as void',
|
|
1293
|
+
'```'
|
|
1294
|
+
].join('\n'));
|
|
1295
|
+
});
|
|
1296
|
+
});
|
|
1297
|
+
describe('getHover class members', () => {
|
|
1298
|
+
const testCode = `
|
|
1299
|
+
class Foo
|
|
1300
|
+
sub new (name as string)
|
|
1301
|
+
end sub
|
|
1302
|
+
end class
|
|
1303
|
+
|
|
1304
|
+
class Bar
|
|
1305
|
+
sub doSomething()
|
|
1306
|
+
myFoo = new Foo()
|
|
1307
|
+
end sub
|
|
1308
|
+
|
|
1309
|
+
function getInt() as integer
|
|
1310
|
+
return 1
|
|
1311
|
+
end function
|
|
1312
|
+
end class
|
|
1313
|
+
|
|
1314
|
+
class Buz
|
|
1315
|
+
myInt as integer
|
|
1316
|
+
sub new (i as integer)
|
|
1317
|
+
myInt = i
|
|
1318
|
+
end sub
|
|
1319
|
+
end class
|
|
1320
|
+
|
|
1321
|
+
class Bee extends Buz
|
|
1322
|
+
sub new (i as integer)
|
|
1323
|
+
super(i)
|
|
1324
|
+
end sub
|
|
1325
|
+
|
|
1326
|
+
sub varSameNameAsMember()
|
|
1327
|
+
myInt = 4567
|
|
1328
|
+
print myInt ' should not print m.myInt
|
|
1329
|
+
end sub
|
|
1330
|
+
end class`;
|
|
1331
|
+
it('correctly parses the file', () => {
|
|
1332
|
+
program.setFile('source/fooBar.bs', testCode);
|
|
1333
|
+
program.validate();
|
|
1334
|
+
(0, chai_1.expect)(program.getDiagnostics().length).to.equal(0);
|
|
1335
|
+
});
|
|
1336
|
+
it('gets the correct text for new Class()', () => {
|
|
1337
|
+
let file = program.setFile('source/fooBar.bs', testCode);
|
|
1338
|
+
program.validate();
|
|
1339
|
+
let hover = file.getHover(vscode_languageserver_1.Position.create(8, 34)); // new Foo("hello")
|
|
1340
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1341
|
+
'```brightscript',
|
|
1342
|
+
'new Foo(name as string)',
|
|
1343
|
+
'```'
|
|
1344
|
+
].join('\n'));
|
|
1345
|
+
});
|
|
1346
|
+
it('gets the correct text for created object', () => {
|
|
1347
|
+
let file = program.setFile('source/fooBar.bs', testCode);
|
|
1348
|
+
program.validate();
|
|
1349
|
+
let hover = file.getHover(vscode_languageserver_1.Position.create(8, 23)); // myFoo
|
|
1350
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1351
|
+
'```brightscript',
|
|
1352
|
+
'myFoo as Foo',
|
|
1353
|
+
'```'
|
|
1354
|
+
].join('\n'));
|
|
1355
|
+
});
|
|
1356
|
+
it('gets the correct text for class declaration', () => {
|
|
1357
|
+
let file = program.setFile('source/fooBar.bs', testCode);
|
|
1358
|
+
program.validate();
|
|
1359
|
+
let hover = file.getHover(vscode_languageserver_1.Position.create(6, 21)); // class Bar
|
|
1360
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1361
|
+
'```brightscript',
|
|
1362
|
+
'class Bar',
|
|
1363
|
+
'```'
|
|
1364
|
+
].join('\n'));
|
|
1365
|
+
});
|
|
1366
|
+
it('gets the correct text for class method declaration', () => {
|
|
1367
|
+
let file = program.setFile('source/fooBar.bs', testCode);
|
|
1368
|
+
program.validate();
|
|
1369
|
+
let hover = file.getHover(vscode_languageserver_1.Position.create(11, 29)); // getInt
|
|
1370
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1371
|
+
'```brightscript',
|
|
1372
|
+
'function Bar.getInt() as integer',
|
|
1373
|
+
'```'
|
|
1374
|
+
].join('\n'));
|
|
1375
|
+
});
|
|
1376
|
+
it('gets the correct text for class field declaration', () => {
|
|
1377
|
+
let file = program.setFile('source/fooBar.bs', testCode);
|
|
1378
|
+
program.validate();
|
|
1379
|
+
let hover = file.getHover(vscode_languageserver_1.Position.create(17, 20)); // myInt
|
|
1380
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1381
|
+
'```brightscript',
|
|
1382
|
+
'Buz.myInt as integer',
|
|
1383
|
+
'```'
|
|
1384
|
+
].join('\n'));
|
|
1385
|
+
});
|
|
1386
|
+
it('gets the correct text for super() call', () => {
|
|
1387
|
+
let file = program.setFile('source/fooBar.bs', testCode);
|
|
1388
|
+
program.validate();
|
|
1389
|
+
let hover = file.getHover(vscode_languageserver_1.Position.create(25, 23)); // super() in Bee.new
|
|
1390
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1391
|
+
'```brightscript',
|
|
1392
|
+
'new Buz(i as integer)',
|
|
1393
|
+
'```'
|
|
1394
|
+
].join('\n'));
|
|
1395
|
+
});
|
|
1396
|
+
it('gets the correct text for variable with same name as a member', () => {
|
|
1397
|
+
let file = program.setFile('source/fooBar.bs', testCode);
|
|
1398
|
+
program.validate();
|
|
1399
|
+
let hover = file.getHover(vscode_languageserver_1.Position.create(29, 23)); // myInt in Bee.varSameNameAsMember
|
|
1400
|
+
(0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
|
|
1401
|
+
'```brightscript',
|
|
1402
|
+
'myInt as integer',
|
|
1403
|
+
'```'
|
|
1404
|
+
].join('\n'));
|
|
1405
|
+
});
|
|
1406
|
+
});
|
|
1407
|
+
describe('getSymbolTypeFromToken', () => {
|
|
1408
|
+
const testClassCode = `
|
|
1409
|
+
sub main()
|
|
1410
|
+
c = new KlassC()
|
|
1411
|
+
a = c.b.getA()
|
|
1412
|
+
num = c.b.getA().getInt()
|
|
1413
|
+
c.b.getA().printInt(num)
|
|
1414
|
+
end sub
|
|
1415
|
+
class KlassA
|
|
1416
|
+
function getInt() as integer
|
|
1417
|
+
return 1
|
|
1418
|
+
end function
|
|
1419
|
+
|
|
1420
|
+
sub printInt(i as integer)
|
|
1421
|
+
print i
|
|
1422
|
+
end sub
|
|
1423
|
+
end class
|
|
1424
|
+
|
|
1425
|
+
class KlassB
|
|
1426
|
+
|
|
1427
|
+
function getA() as KlassA
|
|
1428
|
+
return new KlassA()
|
|
1429
|
+
end function
|
|
1430
|
+
end class
|
|
1431
|
+
|
|
1432
|
+
class KlassC
|
|
1433
|
+
public b as KlassB
|
|
1434
|
+
|
|
1435
|
+
sub new ()
|
|
1436
|
+
m.b = new KlassB()
|
|
1437
|
+
end sub
|
|
1438
|
+
end class
|
|
1439
|
+
`;
|
|
1440
|
+
it('correctly parses the file', () => {
|
|
1441
|
+
program.setFile('source/klassTest.bs', testClassCode);
|
|
1442
|
+
program.validate();
|
|
1443
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
1444
|
+
});
|
|
1445
|
+
describe('finding tokens', () => {
|
|
1446
|
+
let klassCode;
|
|
1447
|
+
let mainScope;
|
|
1448
|
+
beforeEach(() => {
|
|
1449
|
+
klassCode = program.setFile('source/klassTest.bs', testClassCode);
|
|
1450
|
+
const scopes = program.getScopesForFile(klassCode);
|
|
1451
|
+
(0, chai_1.expect)(scopes.length).to.eql(1);
|
|
1452
|
+
mainScope = scopes[0];
|
|
1453
|
+
mainScope.linkSymbolTable();
|
|
1454
|
+
});
|
|
1455
|
+
afterEach(() => {
|
|
1456
|
+
mainScope.unlinkSymbolTable();
|
|
1457
|
+
});
|
|
1458
|
+
it('gets correct class for m', () => {
|
|
1459
|
+
var _a;
|
|
1460
|
+
const position = vscode_languageserver_1.Position.create(28, 20); // 'm' from m.b = new KlassB()
|
|
1461
|
+
const token = klassCode.parser.getTokenAt(position);
|
|
1462
|
+
(0, chai_1.expect)(token.text).to.equal('m');
|
|
1463
|
+
const func = klassCode.getFunctionExpressionAtPosition(position);
|
|
1464
|
+
let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
|
|
1465
|
+
(0, chai_1.expect)(klass).to.exist;
|
|
1466
|
+
(0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassC');
|
|
1467
|
+
});
|
|
1468
|
+
it('gets correct class for fieldMember', () => {
|
|
1469
|
+
var _a;
|
|
1470
|
+
const position = vscode_languageserver_1.Position.create(28, 23); // 'b' from m.b = new KlassB()
|
|
1471
|
+
const token = klassCode.parser.getTokenAt(position);
|
|
1472
|
+
(0, chai_1.expect)(token.text).to.equal('b');
|
|
1473
|
+
const func = klassCode.getFunctionExpressionAtPosition(position);
|
|
1474
|
+
let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
|
|
1475
|
+
(0, chai_1.expect)(klass).to.exist;
|
|
1476
|
+
(0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassB');
|
|
1477
|
+
});
|
|
1478
|
+
it('gets correct class for variable', () => {
|
|
1479
|
+
var _a;
|
|
1480
|
+
const position = vscode_languageserver_1.Position.create(4, 22); // 'c' from c.b.getA().getInt()
|
|
1481
|
+
const token = klassCode.parser.getTokenAt(position);
|
|
1482
|
+
(0, chai_1.expect)(token.text).to.equal('c');
|
|
1483
|
+
const func = klassCode.getFunctionExpressionAtPosition(position);
|
|
1484
|
+
let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
|
|
1485
|
+
(0, chai_1.expect)(klass).to.exist;
|
|
1486
|
+
(0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassC');
|
|
1487
|
+
});
|
|
1488
|
+
it('gets correct class for variable field', () => {
|
|
1489
|
+
var _a;
|
|
1490
|
+
const position = vscode_languageserver_1.Position.create(3, 23); // 'b' from c.b.getA()
|
|
1491
|
+
const token = klassCode.parser.getTokenAt(position);
|
|
1492
|
+
(0, chai_1.expect)(token.text).to.equal('b');
|
|
1493
|
+
const func = klassCode.getFunctionExpressionAtPosition(position);
|
|
1494
|
+
let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
|
|
1495
|
+
(0, chai_1.expect)(klass).to.exist;
|
|
1496
|
+
(0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassB');
|
|
1497
|
+
});
|
|
1498
|
+
it('gets type and return class for variable function field', () => {
|
|
1499
|
+
const position = vscode_languageserver_1.Position.create(3, 28); // 'getA' from c.b.getA()
|
|
1500
|
+
const token = klassCode.parser.getTokenAt(position);
|
|
1501
|
+
(0, chai_1.expect)(token.text).to.equal('getA');
|
|
1502
|
+
const func = klassCode.getFunctionExpressionAtPosition(position);
|
|
1503
|
+
let { type, symbolContainer } = klassCode.getSymbolTypeFromToken(token, func, mainScope);
|
|
1504
|
+
(0, chai_1.expect)((0, reflection_1.isTypedFunctionType)(type)).to.be.true;
|
|
1505
|
+
(0, chai_1.expect)((0, reflection_1.isCustomType)(symbolContainer)).to.be.true;
|
|
1506
|
+
(0, chai_1.expect)(symbolContainer.name).to.equal('KlassA');
|
|
1507
|
+
});
|
|
1508
|
+
it('gets type and class for field from return value of function', () => {
|
|
1509
|
+
const position = vscode_languageserver_1.Position.create(4, 37); // 'getInt' from c.b.getA().getInt()
|
|
1510
|
+
const token = klassCode.parser.getTokenAt(position);
|
|
1511
|
+
(0, chai_1.expect)(token.text).to.equal('getInt');
|
|
1512
|
+
const func = klassCode.getFunctionExpressionAtPosition(position);
|
|
1513
|
+
let { type, symbolContainer } = klassCode.getSymbolTypeFromToken(token, func, mainScope);
|
|
1514
|
+
(0, chai_1.expect)(type).to.exist;
|
|
1515
|
+
(0, chai_1.expect)((0, reflection_1.isTypedFunctionType)(type)).to.be.true;
|
|
1516
|
+
(0, chai_1.expect)(symbolContainer).to.be.undefined; // getInt() returns integer - no class reference at this point
|
|
1517
|
+
});
|
|
1518
|
+
});
|
|
1519
|
+
});
|
|
1520
|
+
it('does not crash when child has field with same name as sub in parent', () => {
|
|
1521
|
+
program.setFile('source/main.bs', `
|
|
1522
|
+
class Parent
|
|
1523
|
+
public function helloWorld()
|
|
1524
|
+
end function
|
|
1525
|
+
end class
|
|
1526
|
+
class Child extends Parent
|
|
1527
|
+
public helloWorld as string
|
|
1528
|
+
end class
|
|
1529
|
+
`);
|
|
1530
|
+
program.validate();
|
|
1531
|
+
});
|
|
1532
|
+
it('does not crash when child has method with same name as field in parent', () => {
|
|
1533
|
+
program.setFile('source/main.bs', `
|
|
1534
|
+
class Parent
|
|
1535
|
+
public helloWorld as string
|
|
1536
|
+
end class
|
|
1537
|
+
class Child extends Parent
|
|
1538
|
+
public function helloWorld()
|
|
1539
|
+
end function
|
|
1540
|
+
end class
|
|
1541
|
+
`);
|
|
1542
|
+
program.validate();
|
|
1543
|
+
});
|
|
1544
|
+
it.skip('detects calling class constructors with too many parameters', () => {
|
|
1545
|
+
program.setFile('source/main.bs', `
|
|
1546
|
+
class Parameterless
|
|
1547
|
+
sub new ()
|
|
1548
|
+
end sub
|
|
1549
|
+
end class
|
|
1550
|
+
|
|
1551
|
+
class OneParam
|
|
1552
|
+
sub new (param1)
|
|
1553
|
+
end sub
|
|
1554
|
+
end class
|
|
1555
|
+
|
|
1556
|
+
sub main()
|
|
1557
|
+
c1 = new Parameterless(1)
|
|
1558
|
+
c2 = new OneParam(1, 2)
|
|
1559
|
+
c2 = new OneParam()
|
|
1560
|
+
end sub
|
|
1561
|
+
`);
|
|
1562
|
+
program.validate();
|
|
1563
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
1564
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(0, 1),
|
|
1565
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 2),
|
|
1566
|
+
DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 0)
|
|
1567
|
+
]);
|
|
1568
|
+
});
|
|
1080
1569
|
});
|
|
1081
1570
|
//# sourceMappingURL=BrsFile.Class.spec.js.map
|