diff --git a/ets2panda/parser/ETSparser.cpp b/ets2panda/parser/ETSparser.cpp index 60ef0ad33b23a25cb32fa6416ca12c428e3f7d02..5d5e4ba0b72a6ca76730dd33e752153bdec35bf0 100644 --- a/ets2panda/parser/ETSparser.cpp +++ b/ets2panda/parser/ETSparser.cpp @@ -681,10 +681,6 @@ ir::TSTypeAliasDeclaration *ETSParser::ParseTypeAliasDeclaration() ES2PANDA_ASSERT(Lexer()->GetToken().KeywordType() == lexer::TokenType::KEYW_TYPE); const auto start = Lexer()->Save(); - - auto newStatus = GetContext().Status(); - newStatus &= ~ParserStatus::ALLOW_JS_DOC_START; - SavedParserContext savedContext(this, newStatus); lexer::SourcePosition typeStart = Lexer()->GetToken().Start(); Lexer()->NextToken(); // eat type keyword @@ -711,6 +707,7 @@ ir::TSTypeAliasDeclaration *ETSParser::ParseTypeAliasDeclaration() ExpectToken(lexer::TokenType::PUNCTUATOR_SUBSTITUTION); + HandleJsDocLikeComments(); TypeAnnotationParsingOptions options = TypeAnnotationParsingOptions::REPORT_ERROR; ir::TypeNode *typeAnnotation = ParseTypeAnnotation(&options); if (typeAnnotation == nullptr) { @@ -1113,6 +1110,7 @@ ir::ETSImportDeclaration *ETSParser::ParseImportPathBuildImport(ArenaVectorGetToken().KeywordType() != lexer::TokenType::KEYW_FROM && requireFrom) { LogExpectedToken(lexer::TokenType::KEYW_FROM); } + GetContext().Status() |= ParserStatus::ALLOW_JS_DOC_START; Lexer()->NextToken(); // eat `from` if (Lexer()->GetToken().Type() != lexer::TokenType::LITERAL_STRING) { diff --git a/ets2panda/parser/ETSparserClasses.cpp b/ets2panda/parser/ETSparserClasses.cpp index c1dc7c92e0533b4e90189b4face6ecfb071cfe32..d25190e9e8b5e0f41d89bffd20c121f923ebc5d1 100644 --- a/ets2panda/parser/ETSparserClasses.cpp +++ b/ets2panda/parser/ETSparserClasses.cpp @@ -537,7 +537,7 @@ void ETSParser::ParseClassFieldDefinition(ir::Identifier *fieldName, ir::Modifie ir::MethodDefinition *ETSParser::ParseClassMethodDefinition(ir::Identifier *methodName, ir::ModifierFlags modifiers, bool isDefault) { - auto newStatus = ParserStatus::NEED_RETURN_TYPE | ParserStatus::ALLOW_SUPER; + auto newStatus = ParserStatus::NEED_RETURN_TYPE | ParserStatus::ALLOW_SUPER | ParserStatus::ALLOW_JS_DOC_START; auto methodKind = ir::MethodDefinitionKind::METHOD; if ((modifiers & ir::ModifierFlags::CONSTRUCTOR) != 0) { @@ -1087,7 +1087,7 @@ ir::MethodDefinition *ETSParser::ParseInterfaceMethod(ir::ModifierFlags flags, i name->SetRange(Lexer()->GetToken().Loc()); Lexer()->NextToken(); } - FunctionContext functionContext(this, ParserStatus::FUNCTION); + FunctionContext functionContext(this, ParserStatus::FUNCTION | ParserStatus::ALLOW_JS_DOC_START); lexer::SourcePosition startLoc = Lexer()->GetToken().Start(); diff --git a/ets2panda/parser/ETSparserExpressions.cpp b/ets2panda/parser/ETSparserExpressions.cpp index 3882cf5b2bf8085f9caa38b5fe7e37dd0edb29f7..e1a501191647dda02d310377930e2f57b7cdd195 100644 --- a/ets2panda/parser/ETSparserExpressions.cpp +++ b/ets2panda/parser/ETSparserExpressions.cpp @@ -452,7 +452,7 @@ bool ETSParser::IsArrowFunctionExpressionStart() ir::ArrowFunctionExpression *ETSParser::ParseArrowFunctionExpression() { - auto newStatus = ParserStatus::ARROW_FUNCTION | ParserStatus::ALLOW_RECEIVER; + auto newStatus = ParserStatus::ARROW_FUNCTION | ParserStatus::ALLOW_RECEIVER | ParserStatus::ALLOW_JS_DOC_START; auto *func = ParseFunction(newStatus); auto *arrowFuncNode = AllocNode(func, Allocator()); arrowFuncNode->SetRange(func->Range()); diff --git a/ets2panda/parser/ETSparserJsDocInfo.cpp b/ets2panda/parser/ETSparserJsDocInfo.cpp index 8ddf1be0207fd411a7219e3f653c7d40ffa1bed0..a7e36b225465884e54f787b9a4a3819882d0036a 100644 --- a/ets2panda/parser/ETSparserJsDocInfo.cpp +++ b/ets2panda/parser/ETSparserJsDocInfo.cpp @@ -110,7 +110,6 @@ static void RegularCommentStr(std::string &str) std::tuple ETSParser::ParseJsDocInfoItemValue() { - ExcludeInvalidStart(); util::UString jsDocInfoItemCommentStr(Allocator()); std::string jsDocInfoParamStr {}; if (Lexer()->GetToken().Type() == lexer::TokenType::JS_DOC_END) { diff --git a/ets2panda/parser/ETSparserTypes.cpp b/ets2panda/parser/ETSparserTypes.cpp index dde455dc32461c2298be2ae41c0eac2d7e4fb62e..e7ce14be9001e40f34f80fa7029a852293af8d52 100644 --- a/ets2panda/parser/ETSparserTypes.cpp +++ b/ets2panda/parser/ETSparserTypes.cpp @@ -118,6 +118,11 @@ ir::TypeNode *ETSParser::ParseUnionType(ir::TypeNode *const firstType) if (!typeAnnotation->IsBrokenTypeNode()) { types.push_back(typeAnnotation); } + auto savedPos = HandleJsDocLikeComments(); + if (Lexer()->GetToken().Type() != lexer::TokenType::PUNCTUATOR_BITWISE_OR) { + Lexer()->Rewind(savedPos); + break; + } } auto const endLoc = types.back()->End(); @@ -489,11 +494,13 @@ ir::TypeNode *ETSParser::ParseTypeAnnotationNoPreferParam(TypeAnnotationParsingO typeAnnotation = ParseTsArrayType(typeAnnotation, options); + auto savedPos = HandleJsDocLikeComments(); if (((*options) & TypeAnnotationParsingOptions::DISALLOW_UNION) == 0 && Lexer()->GetToken().Type() == lexer::TokenType::PUNCTUATOR_BITWISE_OR) { ApplyAnnotationsToNode(typeAnnotation, std::move(annotations), startPos); return ParseUnionType(typeAnnotation); } + Lexer()->Rewind(savedPos); ApplyAnnotationsToNode(typeAnnotation, std::move(annotations), startPos, *options); return typeAnnotation; } diff --git a/ets2panda/test/runtime/ets/JsDocInfoTest.ets b/ets2panda/test/runtime/ets/JsDocInfoTest.ets deleted file mode 100644 index 68cf3ffb27355f7acf92503fa8413d1e96aa2f73..0000000000000000000000000000000000000000 --- a/ets2panda/test/runtime/ets/JsDocInfoTest.ets +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** -* JsDocTest on namespace -* -* @JsDocRecord1 comments -* @JsDocRecord2 { JsDocRecord1 param } comments -* @JsDocRecord3 {} comments -*/ -namespace ns { - /** - * JsDocTest on interface. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 param } comments - * @JsDocRecord3 {} comments - */ - export interface itfc1 { - /** - * JsDocTest on method. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - foo():void - - /** - * JsDocTest on prop. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - prop:number - } - - /** - * JsDocTest on class. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 param } comments - * @JsDocRecord3 {} comments - */ - export class cls { - /** - * JsDocTest on method. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - foo():void {} - - /** - * JsDocTest on prop. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - prop:number - } - - /** - * JsDocTest on namespace - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 param } comments - * @JsDocRecord3 {} comments - */ - namespace ns_inner {} -} - -/** - * JsDocTest on interface. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 param } comments - * @JsDocRecord3 {} comments - */ -export interface itfc1 { - /** - * JsDocTest on method. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - foo():void - - /** - * JsDocTest on prop. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - prop:number -} - - - -/** - * JsDocTest on class. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 param } comments - * @JsDocRecord3 {} comments - */ -export class cls { - /** - * JsDocTest on method. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - foo():void {} - - /** - * JsDocTest on prop. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - prop:number -} - -/** -* JsDocTest on arrow function. -* -* @JsDocRecord1 comments -* @JsDocRecord2 { JsDocRecord1 'param' } comments -* @JsDocRecord3 {} comments -*/ -let arrowFunc:() => void = ():void => {} - -/** -* JsDocTest on function decl. -* -* @JsDocRecord1 comments -* @JsDocRecord2 { JsDocRecord1 'param' } comments -* @JsDocRecord3 {} comments -*/ -function testFunc():void {} - -/** -* JsDocTest on typeAlias. -* -* @JsDocRecord1 comments -* @JsDocRecord2 { JsDocRecord1 'param' } comments -* @JsDocRecord3 {} comments -*/ -type xx = -/** -* @xx {xx} xx -*/ -'somexx' -/** -* @xx {xx} xx -*/ -| 'somexx2' -/** -* @xx {xx} xx -*/ -| 'somexx3' - -function main() { - /** - * JsDocTest on arrow variable decl. - * - * @JsDocRecord1 comments - * @JsDocRecord2 { JsDocRecord1 'param' } comments - * @JsDocRecord3 {} comments - */ - let val:string = "ssss" - assertTrue(true); - assertEQ(val, "ssss") -} \ No newline at end of file diff --git a/ets2panda/test/unit/plugin/CMakeLists.txt b/ets2panda/test/unit/plugin/CMakeLists.txt index 91cf3d297b6beefbc449bf27392ca1080b4afe91..7a633e81177f63fdbd1353b4d582237c677d0e7c 100644 --- a/ets2panda/test/unit/plugin/CMakeLists.txt +++ b/ets2panda/test/unit/plugin/CMakeLists.txt @@ -106,7 +106,7 @@ set(PLUGIN_TESTS "plugin_proceed_to_state_create_ets_new_expression compile.ets ${COMPILE_MODE} cpp ${EXECUTABLE_PLUGIN}" "plugin_proceed_to_state_log_diagnostic_with_suggestion compile.ets ${COMPILE_MODE} cpp ${EXECUTABLE_PLUGIN}" "use_plugin_to_test_export_table compile.ets ${COMPILE_MODE} cpp ${EXECUTABLE_PLUGIN}" - "plugin_proceed_to_state_check_jsdoc compile.ets ${COMPILE_MODE} cpp ${EXECUTABLE_PLUGIN}" + "plugin_proceed_to_state_check_jsdoc compile.ets ${EXPECTED_MODE} cpp ${EXECUTABLE_PLUGIN}" "plugin_proceed_to_state_test_global_func_call_dump compile.ets ${COMPILE_MODE} cpp ${EXECUTABLE_PLUGIN}" "plugin_proceed_to_state_test_interface_duplicate_setter compile.ets ${COMPILE_MODE} cpp ${EXECUTABLE_PLUGIN}" "plugin_proceed_to_state_test_case_block_dump compile.ets ${COMPILE_MODE} cpp ${EXECUTABLE_PLUGIN}" diff --git a/ets2panda/test/unit/plugin/plugin_proceed_to_state_check_jsdoc-expected.txt b/ets2panda/test/unit/plugin/plugin_proceed_to_state_check_jsdoc-expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..ab3d8cab3218716deec48cf0f06ef632b7b0bec5 --- /dev/null +++ b/ets2panda/test/unit/plugin/plugin_proceed_to_state_check_jsdoc-expected.txt @@ -0,0 +1,732 @@ +LOAD SUCCESS +PROCEED TO PARSE SUCCESS +JSDOC INFO OF ClassDefinition A: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT paramComm + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ClassDefinition JsDocClass: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT JsDocClass + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ClassDefinition JsDocClassOutside: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT JsDocClassOutside + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF Namespace JsdocInnerNS: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT JsdocInnerNS + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF Namespace JsdocNS: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT JsdocNS + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF Interface JsdocInterface: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT JsdocInterface + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF Interface JsdocInterfaceOutside: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT JsdocInterfaceOutside + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ScriptFunction classFoo1: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT classFoo1() + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ScriptFunction classFoo2: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT classFoo2() + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ScriptFunction classFoo3: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT classFoo3() + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ScriptFunction interfaceFoo1: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceFoo1() + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ScriptFunction interfaceFoo2: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceFoo2() + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ScriptFunction interfaceFoo3: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceFoo3() + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF ScriptFunction interfaceFoo4: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceFoo4() + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF FunctionDeclaration jsDocFunc: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT function jsDocFunc + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF InterfaceOrClassProp classProp1: + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT classProp1:number + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + +JSDOC INFO OF InterfaceOrClassProp classProp2: + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT classProp2:number + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + +JSDOC INFO OF InterfaceOrClassProp classProp3: + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT classProp3:number + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + +JSDOC INFO OF InterfaceOrClassProp interfaceProp1: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceProp1:number + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF InterfaceOrClassProp interfaceProp2: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceProp2:number | string[] + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF InterfaceOrClassProp interfaceProp3: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceProp3:number + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF InterfaceOrClassProp interfaceProp4: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT interfaceProp4:number + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF VariableDeclaration jsdocVal1: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT let jsdocVal1:string + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF VariableDeclaration jsdocVal2: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT 9 + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +JSDOC INFO OF TypeAliasDeclaration typeAlias: + RECORDNAME: param7 + RECORDPARAM: + RECORDCOMMENT + + RECORDNAME: param6 + RECORDPARAM: number + RECORDCOMMENT { number } + + RECORDNAME: param5 + RECORDPARAM: + RECORDCOMMENT typeAlias + + RECORDNAME: param4 + RECORDPARAM: + RECORDCOMMENT preStr {} behindStr + + RECORDNAME: param3 + RECORDPARAM: p + RECORDCOMMENT preStr { p } behindStr + + RECORDNAME: param2 + RECORDPARAM: p + RECORDCOMMENT preStr { p } + + RECORDNAME: param1 + RECORDPARAM: + RECORDCOMMENT {} behindStr + +PROCEED TO BOUND SUCCESS +PROCEED TO CHECKED SUCCESS +PROCEED TO LOWERED SUCCESS +PROCEED TO ASM SUCCESS +PROCEED TO BIN SUCCESS diff --git a/ets2panda/test/unit/plugin/plugin_proceed_to_state_check_jsdoc.cpp b/ets2panda/test/unit/plugin/plugin_proceed_to_state_check_jsdoc.cpp index bd890b99a673fd98af063fa6f219dfe251535fee..dd71f39e87d4fd35d9c310337d061c4883411dac 100644 --- a/ets2panda/test/unit/plugin/plugin_proceed_to_state_check_jsdoc.cpp +++ b/ets2panda/test/unit/plugin/plugin_proceed_to_state_check_jsdoc.cpp @@ -26,25 +26,363 @@ // NOLINTBEGIN static es2panda_Impl *impl = nullptr; -static es2panda_AstNode *targetClass = nullptr; +static bool testResult = true; static std::string g_source = R"( +import { PI as PI } from "std/math" /** * @param1 {} behindStr * @param2 preStr { p } * @param3 preStr { p } behindStr * @param4 preStr {} behindStr - * @returns { number } + * @param5 paramComm + * @param6 { number } + * @param7 */ -class A {} +declare class A {} + +/** +* JsDocTest on namespace +* +* @param1 {} behindStr +* @param2 preStr { p } +* @param3 preStr { p } behindStr +* @param4 preStr {} behindStr +* @param5 JsdocNS +* @param6 { number } +* @param7 +*/ +namespace JsdocNS { + /** + * JsDocTest on interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 JsdocInterface + * @param6 { number } + * @param7 + */ + export interface JsdocInterface { + /** + * JsDocTest on method of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceFoo1() + * @param6 { number } + * @param7 + */ + interfaceFoo1():void + + /** + * JsDocTest on method of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceFoo2() + * @param6 { number } + * @param7 + */ + interfaceFoo2():void + + /** + * JsDocTest on prop of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceProp1:number + * @param6 { number } + * @param7 + */ + interfaceProp1:number + + /** + * JsDocTest on prop of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceProp2:number | string[] + * @param6 { number } + * @param7 + */ + interfaceProp2:number | string[] + } + + /** + * JsDocTest on class. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 JsDocClass + * @param6 { number } + * @param7 + */ + export class JsDocClass { + /** + * JsDocTest on method of class. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 classFoo1() + * @param6 { number } + * @param7 + */ + classFoo1():void {} + + /** + * JsDocTest on prop of class. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 classProp1:number + * @param6 { number } + * @param7 + */ + classProp1:number = 0; + } + + /** + * JsDocTest on namespace of namespace + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 JsdocInnerNS + * @param6 { number } + * @param7 + */ + namespace JsdocInnerNS {} +} +/** + * JsDocTest on namespace of namespace + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 JsdocInterfaceOutside + * @param6 { number } + * @param7 + */ +export interface JsdocInterfaceOutside { + /** + * JsDocTest on method of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceFoo3() + * @param6 { number } + * @param7 + */ + interfaceFoo3():void + + /** + * JsDocTest on prop of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceProp3:number + * @param6 { number } + * @param7 + */ + interfaceProp3:number + + /** + * JsDocTest on method of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceFoo4() + * @param6 { number } + * @param7 + */ + interfaceFoo4():void + + /** + * JsDocTest on prop of interface. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 interfaceProp4:number + * @param6 { number } + * @param7 + */ + interfaceProp4:number +} + +/** +* JsDocTest on class. +* +* @param1 {} behindStr +* @param2 preStr { p } +* @param3 preStr { p } behindStr +* @param4 preStr {} behindStr +* @param5 JsDocClassOutside +* @param6 { number } +* @param7 +*/ +export class JsDocClassOutside { + /** + * JsDocTest on method of class. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 classFoo2() + * @param6 { number } + * @param7 + */ + classFoo2():void {} + + /** + * JsDocTest on method of class. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 classFoo3() + * @param6 { number } + * @param7 + */ + classFoo3():void {} + + /** + * JsDocTest on prop of class. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 classProp2:number + * @param6 { number } + * @param7 + */ + classProp2:number = 0; + + /** + * JsDocTest on prop of class. + * + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 classProp3:number + * @param6 { number } + * @param7 + */ + classProp3:number = 0; +} + +/** +* JsDocTest on function decl. +* +* @param1 {} behindStr +* @param2 preStr { p } +* @param3 preStr { p } behindStr +* @param4 preStr {} behindStr +* @param5 function jsDocFunc +* @param6 { number } +* @param7 +*/ +function jsDocFunc():void {} + +/** +* JsDocTest on function decl. +* +* @param1 {} behindStr +* @param2 preStr { p } +* @param3 preStr { p } behindStr +* @param4 preStr {} behindStr +* @param5 typeAlias +* @param6 { number } +* @param7 +*/ +type typeAlias = + /** + * @invalid {xx} xx + */ + 'somexx' + /** + * @invalid {xx} xx + */ + | 'somexx2' + /** + * @invalid {xx} xx + */ + | 'somexx3' + +/** + * JsDocTest on arrow variable decl. + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 let jsdocVal1:string + * @param6 { number } + * @param7 + */ +let jsdocVal1:string = "ssss" + +/** + * JsDocTest on arrow variable decl. + * @param1 {} behindStr + * @param2 preStr { p } + * @param3 preStr { p } behindStr + * @param4 preStr {} behindStr + * @param5 9 + * @param6 { number } + * @param7 + */ +let jsdocVal2:string = "ssss" )"; -static std::vector nameList = {"returns", "param4", "param3", "param2", "param1"}; -static std::vector paramList = {" number", "", " p", " p", ""}; -static std::vector commentsList = {"{ number }", "preStr {} behindStr", "preStr { p } behindStr", - "preStr { p }", "{} behindStr"}; +static std::map classMap = { + {"A", nullptr}, {"JsDocClass", nullptr}, {"JsDocClassOutside", nullptr}}; -static void SetTargetClass(es2panda_AstNode *ast, void *context) +static std::map interfaceMap = {{"JsdocInterface", nullptr}, + {"JsdocInterfaceOutside", nullptr}}; + +static std::map methodMap = { + {"interfaceFoo1", nullptr}, {"interfaceFoo2", nullptr}, {"interfaceFoo3", nullptr}, {"interfaceFoo4", nullptr}, + {"classFoo1", nullptr}, {"classFoo2", nullptr}, {"classFoo3", nullptr}}; + +static std::map propertyMap = { + {"interfaceProp1", nullptr}, {"interfaceProp2", nullptr}, {"interfaceProp3", nullptr}, {"interfaceProp4", nullptr}, + {"classProp1", nullptr}, {"classProp2", nullptr}, {"classProp3", nullptr}}; + +static std::map namespaceMap = {{"JsdocNS", nullptr}, {"JsdocInnerNS", nullptr}}; +static std::map variableDeclMap = {{"jsdocVal1", nullptr}, {"jsdocVal2", nullptr}}; +static es2panda_AstNode *jsDocFunc = nullptr; +static es2panda_AstNode *typeAlias = nullptr; + +static void FindClass(es2panda_AstNode *ast, void *context) { auto ctx = reinterpret_cast(context); if (!impl->IsClassDefinition(ast)) { @@ -54,25 +392,135 @@ static void SetTargetClass(es2panda_AstNode *ast, void *context) if (ident == nullptr) { return; } + auto name = std::string(impl->IdentifierName(ctx, ident)); + if (classMap.find(name) != classMap.end()) { + classMap[name] = ast; + } +} + +static void FindNamespace(es2panda_AstNode *ast, void *context) +{ + auto ctx = reinterpret_cast(context); + if (!impl->IsETSModule(ast)) { + return; + } + auto *ident = impl->ETSModuleIdent(ctx, ast); + if (ident == nullptr) { + return; + } + auto name = std::string(impl->IdentifierName(ctx, ident)); + if (namespaceMap.find(name) != namespaceMap.end()) { + namespaceMap[name] = ast; + } +} + +static void FindInterface(es2panda_AstNode *ast, void *context) +{ + auto ctx = reinterpret_cast(context); + if (!impl->IsTSInterfaceDeclaration(ast)) { + return; + } + auto *ident = impl->TSInterfaceDeclarationId(ctx, ast); + if (ident == nullptr) { + return; + } + auto name = std::string(impl->IdentifierName(ctx, ident)); + if (interfaceMap.find(name) != interfaceMap.end()) { + interfaceMap[name] = ast; + } +} + +static void FindScriptFunction(es2panda_AstNode *ast, void *context) +{ + auto ctx = reinterpret_cast(context); + if (!impl->IsScriptFunction(ast)) { + return; + } + auto *ident = impl->ScriptFunctionId(ctx, ast); + if (ident == nullptr) { + return; + } + auto name = std::string(impl->IdentifierName(ctx, ident)); + if (methodMap.find(name) != methodMap.end()) { + methodMap[name] = ast; + } +} + +static void FindClassElement(es2panda_AstNode *ast, void *context) +{ + auto ctx = reinterpret_cast(context); + if (!impl->IsClassProperty(ast)) { + return; + } + auto *ident = impl->ClassElementId(ctx, ast); + if (ident == nullptr) { + return; + } + auto name = std::string(impl->IdentifierName(ctx, ident)); + if (propertyMap.find(name) != propertyMap.end()) { + propertyMap[name] = ast; + } +} + +static void FindFunctionDeclaration(es2panda_AstNode *ast, void *context) +{ + auto ctx = reinterpret_cast(context); + if (!impl->IsFunctionDeclaration(ast)) { + return; + } + + auto scriptFunc = impl->FunctionDeclarationFunction(ctx, ast); + if (scriptFunc == nullptr) { + return; + } + + auto *ident = impl->ScriptFunctionId(ctx, scriptFunc); + if (ident == nullptr) { + return; + } + auto name = impl->IdentifierName(ctx, ident); - if (std::string(name) == "A") { - targetClass = ast; + if (std::string(name) == "jsDocFunc") { + jsDocFunc = ast; } } -static bool TestJSDoc(es2panda_Context *context) +static void FindJsdocVal(es2panda_AstNode *ast, void *context) { - auto *program = impl->ContextProgram(context); - auto *ast = impl->ProgramAst(context, program); - impl->AstNodeForEach(ast, SetTargetClass, context); - if (ast == nullptr) { - std::cerr << "FAILED TO GET AST" << std::endl; - return false; + auto ctx = reinterpret_cast(context); + if (!impl->IsVariableDeclaration(ast)) { + return; } - size_t jsDocInfoArrayLen = 0; - auto **jsDocInfoArray = impl->ClassDefinitionJsDocInformation(context, targetClass, &jsDocInfoArrayLen); + + if (impl->VariableDeclarationGetDeclaratorByNameConst(ctx, ast, const_cast("jsdocVal1")) != nullptr) { + variableDeclMap["jsdocVal1"] = ast; + } + + if (impl->VariableDeclarationGetDeclaratorByNameConst(ctx, ast, const_cast("jsdocVal2")) != nullptr) { + variableDeclMap["jsdocVal2"] = ast; + } +} + +static void FindTypeAliasDecl(es2panda_AstNode *ast, void *context) +{ + auto ctx = reinterpret_cast(context); + if (!impl->IsTSTypeAliasDeclaration(ast)) { + return; + } + auto *ident = impl->TSTypeAliasDeclarationId(ctx, ast); + if (ident == nullptr) { + return; + } + auto name = impl->IdentifierName(ctx, ident); + if (std::string(name) == "typeAlias") { + typeAlias = ast; + } +} + +static bool CheckJsDocInfo(es2panda_JsDocInfo **jsDocInfoArray, size_t jsDocInfoArrayLen) +{ if (jsDocInfoArray == nullptr || jsDocInfoArrayLen == 0) { - std::cerr << "FAILED TO GET JsDocInfo" << std::endl; + std::cerr << "FAILED TO GET JsDocInfoArray" << std::endl; return false; } for (size_t i = 0; i < jsDocInfoArrayLen; ++i) { @@ -83,40 +531,92 @@ static bool TestJSDoc(es2panda_Context *context) } for (size_t j = 0; j < jsDocInfo->len; ++j) { auto *jsDocRecord = jsDocInfo->jsDocRecords[j]; - if (jsDocRecord == nullptr) { - std::cerr << "FAILED TO GET JsDocRecord" << std::endl; - return false; - } - auto *name = jsDocInfo->strings[j]; - if (name == nullptr) { - std::cerr << "FAILED TO GET JsDocName" << std::endl; - return false; - } - - if (jsDocRecord->name != nameList[j]) { - std::cerr << "exact: " << jsDocRecord->name << " exp: " << nameList[j] << std::endl; - return false; - } - - if (jsDocRecord->param != paramList[j]) { - std::cerr << "exact: " << jsDocRecord->param << " exp: " << paramList[j] << std::endl; - return false; - } - - if (jsDocRecord->comment != commentsList[j]) { - std::cerr << "exact: " << jsDocRecord->comment << " exp: " << commentsList[j] << std::endl; - return false; - } + std::cout << " RECORDNAME: " << jsDocRecord->name << std::endl; + std::cout << " RECORDPARAM: " << jsDocRecord->param << std::endl; + std::cout << " RECORDCOMMENT " << jsDocRecord->comment << std::endl; + std::cout << std::endl; } } return true; } +static void FindTargetAst(es2panda_Context *context, es2panda_AstNode *ast) +{ + impl->AstNodeForEach(ast, FindClass, context); + impl->AstNodeForEach(ast, FindNamespace, context); + impl->AstNodeForEach(ast, FindInterface, context); + impl->AstNodeForEach(ast, FindScriptFunction, context); + impl->AstNodeForEach(ast, FindFunctionDeclaration, context); + impl->AstNodeForEach(ast, FindClassElement, context); + impl->AstNodeForEach(ast, FindJsdocVal, context); + impl->AstNodeForEach(ast, FindTypeAliasDecl, context); +} + +static bool TestJSDoc(es2panda_Context *context) +{ + auto *program = impl->ContextProgram(context); + auto *entryAst = impl->ProgramAst(context, program); + if (entryAst == nullptr) { + std::cerr << "FAILED TO GET AST" << std::endl; + return false; + } + + size_t jsDocInfoArrayLen; + es2panda_JsDocInfo **jsDocInfoArray = nullptr; + FindTargetAst(context, entryAst); + + for (const auto &[name, targetAst] : classMap) { + std::cout << "JSDOC INFO OF ClassDefinition " << name << ":" << std::endl; + jsDocInfoArray = impl->ClassDefinitionJsDocInformation(context, targetAst, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + } + + for (const auto &[name, targetAst] : namespaceMap) { + std::cout << "JSDOC INFO OF Namespace " << name << ":" << std::endl; + jsDocInfoArray = impl->ETSModuleJsDocInformation(context, targetAst, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + } + + for (const auto &[name, targetAst] : interfaceMap) { + std::cout << "JSDOC INFO OF Interface " << name << ":" << std::endl; + jsDocInfoArray = impl->TSInterfaceDeclarationJsDocInformation(context, targetAst, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + } + + for (const auto &[name, targetAst] : methodMap) { + std::cout << "JSDOC INFO OF ScriptFunction " << name << ":" << std::endl; + jsDocInfoArray = impl->ScriptFunctionJsDocInformation(context, targetAst, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + } + + std::cout << "JSDOC INFO OF FunctionDeclaration jsDocFunc: " << std::endl; + jsDocInfoArray = impl->FunctionDeclarationJsDocInformation(context, jsDocFunc, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + + for (const auto &[name, targetAst] : propertyMap) { + std::cout << "JSDOC INFO OF InterfaceOrClassProp " << name << ":" << std::endl; + jsDocInfoArray = impl->ClassPropertyJsDocInformation(context, targetAst, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + } + + for (const auto &[name, targetAst] : variableDeclMap) { + std::cout << "JSDOC INFO OF VariableDeclaration " << name << ":" << std::endl; + jsDocInfoArray = impl->VariableDeclarationJsDocInformation(context, targetAst, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + } + + std::cout << "JSDOC INFO OF TypeAliasDeclaration typeAlias: " << std::endl; + jsDocInfoArray = impl->TSTypeAliasDeclarationJsDocInformation(context, typeAlias, &jsDocInfoArrayLen); + testResult &= CheckJsDocInfo(jsDocInfoArray, jsDocInfoArrayLen); + + return testResult; +} + int main(int argc, char **argv) { std::vector newArgv(argv, argv + argc); - const char *extraArg = "--parse-jsdoc"; - newArgv.push_back(const_cast(extraArg)); + const char *enableJsdoc = "--parse-jsdoc"; + newArgv.push_back(const_cast(enableJsdoc)); int newArgc = static_cast(newArgv.size()); char **newArgvRaw = newArgv.data();