diff --git a/ets2panda/parser/ETSparser.cpp b/ets2panda/parser/ETSparser.cpp index 1c9fe98ea1e18eee9a8f0f6e877e2625057ed7f8..ac9c4f284a19479267477b29c4321be66370ab73 100644 --- a/ets2panda/parser/ETSparser.cpp +++ b/ets2panda/parser/ETSparser.cpp @@ -2305,7 +2305,7 @@ ir::OverloadDeclaration *ETSParser::ParseOverloadDeclaration(ir::ModifierFlags m modifiers, Allocator()); overloadDef->AddOverloadDeclFlag(ir::OverloadDeclFlags::FUNCTION); - auto startLoc = Lexer()->GetToken().Start(); + auto startLoc = overloadName->Start(); if (!Lexer()->TryEatTokenType(lexer::TokenType::PUNCTUATOR_LEFT_BRACE)) { LogExpectedToken(lexer::TokenType::PUNCTUATOR_LEFT_BRACE); } diff --git a/ets2panda/parser/JsdocHelper.cpp b/ets2panda/parser/JsdocHelper.cpp index 1823498a413feca1c2995f3e251e52d85c36c48f..a117035cf1ed95abe8c1639d5d5f5a61b6c9d34b 100644 --- a/ets2panda/parser/JsdocHelper.cpp +++ b/ets2panda/parser/JsdocHelper.cpp @@ -21,18 +21,15 @@ namespace ark::es2panda::parser { static constexpr std::string_view JSDOC_END = "*/"; -static constexpr std::string_view JSDOC_START = "/**"; -static constexpr std::string_view LICENSES_START = "/*"; static constexpr std::string_view EMPTY_JSDOC = "Empty Jsdoc"; -static constexpr std::string_view EMPTY_LICENSE = "Empty License"; static constexpr size_t START_POS = 0; static constexpr size_t COLLECT_CURRENT_POS = 1; // NOLINTBEGIN(modernize-avoid-c-arrays) -static constexpr std::string_view POTENTIAL_PREFIX[] = {"@", "get", "set", "let", "const", - "async", "readonly", "abstract", "native", "static", - "public", "private", "declare", "default", "export"}; +static constexpr std::string_view POTENTIAL_PREFIX[] = { + "@", "get", "set", "let", "const", "overload", "async", "readonly", + "abstract", "native", "static", "public", "private", "declare", "default", "export"}; // NOLINTEND(modernize-avoid-c-arrays) // Note: Potential annotation allowed node need to collect jsdoc. @@ -122,6 +119,10 @@ bool JsdocHelper::BackWardUntilJsdocStart() } case lexer::LEX_CHAR_ASTERISK: { Backward(1); + if (PeekBackWard() == lexer::LEX_CHAR_SLASH) { + // Note: found `/*` here, it is only the common start of comments, not jsdoc. + return false; + } if (PeekBackWard() != lexer::LEX_CHAR_ASTERISK) { continue; } @@ -167,22 +168,11 @@ util::StringView JsdocHelper::GetJsdocBackward() return SourceView(backwardPos, jsdocEndPos); } +// Note: Return first matched string that starts with `/*` or `/**` and ends with `*/` util::StringView JsdocHelper::GetLicenseStringFromStart() { - size_t startPos = START_POS; - auto sv = SourceView(startPos, sourceCode_.Length()); - static constexpr std::string_view MANDATORY_PREFIX = "\'use static\'\n"; - static constexpr std::string_view MANDATORY_PREFIX_DOUBLE_QUOTE = "\"use static\"\n"; - if (sv.StartsWith(MANDATORY_PREFIX) || sv.StartsWith(MANDATORY_PREFIX_DOUBLE_QUOTE)) { - startPos += MANDATORY_PREFIX.length(); - sv = SourceView(startPos, sourceCode_.Length()); - } - - if (!sv.StartsWith(LICENSES_START) && !sv.StartsWith(JSDOC_START)) { - return EMPTY_LICENSE; - } - Forward(LICENSES_START.length()); - + Iterator().Reset(START_POS); + auto licenseStart = START_POS; do { const char32_t cp = Iterator().Peek(); switch (cp) { @@ -195,7 +185,14 @@ util::StringView JsdocHelper::GetLicenseStringFromStart() Forward(1); break; } - [[fallthrough]]; + continue; + } + case lexer::LEX_CHAR_SLASH: { + Forward(1); + if (Iterator().Peek() == lexer::LEX_CHAR_ASTERISK) { + licenseStart = Iterator().Index() - 1; + } + continue; } default: { Iterator().SkipCp(); @@ -205,6 +202,6 @@ util::StringView JsdocHelper::GetLicenseStringFromStart() break; } while (true); - return SourceView(startPos, Iterator().Index()); + return SourceView(licenseStart, Iterator().Index()); } } // namespace ark::es2panda::parser diff --git a/ets2panda/test/ast/compiler/ets/first_match/function_same_name.ets b/ets2panda/test/ast/compiler/ets/first_match/function_same_name.ets index 9c7fd33d5b861d0c18f5ca5cb9cb4124bc185536..a5face17f5371fa11faa01e0cd196a3f7e2095c3 100644 --- a/ets2panda/test/ast/compiler/ets/first_match/function_same_name.ets +++ b/ets2panda/test/ast/compiler/ets/first_match/function_same_name.ets @@ -16,12 +16,12 @@ namespace NS{ export function foo(a:number){} export function foo2(a:string){} - export overload foo{foo2} + export overload /* @@ label */foo{foo2} } function foo(a:number){} function foo2(a:string){} -overload foo{foo2} +overload /* @@ label2 */foo{foo2} -/* @@? 19:24 Error TypeError: Method with the same name as overload declaration 'foo', overloadlist must list this medhod. */ -/* @@? 24:13 Error TypeError: Method with the same name as overload declaration 'foo', overloadlist must list this medhod. */ +/* @@@ label Error TypeError: Method with the same name as overload declaration 'foo', overloadlist must list this medhod. */ +/* @@@ label2 Error TypeError: Method with the same name as overload declaration 'foo', overloadlist must list this medhod. */ 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 index 79eda4c7fcdd606345f06a7c25aab4cf7d8f8b1b..68f03b5b61480a47dd6490dcc660bac0031b82da 100644 --- 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 @@ -147,6 +147,10 @@ * @param1 {} behindStr * @param2 preStr { p } */ +/** +this is jsdoc of tool +*/ +Empty Jsdoc /** * ==== ambient indexer jsdoc ==== * @param1 {} behindStr @@ -242,3 +246,8 @@ * @param1 {} behindStr * @param2 preStr { p } */ +/** + * ==== function overload declaration jsdoc ==== + * @param1 {} behindStr + * @param2 preStr { p } +*/ 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 ac4569d12c0ef977ce31713f329d7f123cec9835..d93219620376c22b37425bb2ee1f67fcf399d661 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 @@ -45,7 +45,8 @@ static std::map methodMap = { {"interfaceFoo1", nullptr}, {"interfaceFoo2", nullptr}, {"interfaceFoo3", nullptr}, {"interfaceFoo4", nullptr}, {"classFoo1", nullptr}, {"classFoo2", nullptr}, {"classFoo3", nullptr}, {"interfaceProp1", nullptr}, {"interfaceProp2", nullptr}, {"interfaceProp3", nullptr}, {"interfaceProp4", nullptr}, {"jsDocFunc", nullptr}, - {"intefaceGet", nullptr}, {"intefaceSet", nullptr}, {"testGet", nullptr}, {"testSet", nullptr}}; + {"intefaceGet", nullptr}, {"intefaceSet", nullptr}, {"testGet", nullptr}, {"testSet", nullptr}, + {"tool", nullptr}, {"tool2", nullptr}}; // Note: the variableDecl witll be transferred to property of ETSGLOBAL after lowerings. static std::map propertyMap = { @@ -63,6 +64,7 @@ static es2panda_AstNode *exportNamedDecl = nullptr; static es2panda_AstNode *exportSingleNamedDecl = nullptr; static es2panda_AstNode *reExportedDecl = nullptr; static es2panda_AstNode *importDecl = nullptr; +static es2panda_AstNode *overloadDecl = nullptr; static std::string g_source = R"('use static' /* @@ -402,8 +404,36 @@ export { PI, E } from "std/math" * @param2 preStr { p } */ export jsdocVal2 + +/** + * ==== function overload declaration jsdoc ==== + * @param1 {} behindStr + * @param2 preStr { p } +*/ +overload zoo { + jsDocFunc +} + +/** +this is jsdoc of tool +*/ +export function tool() {} + +/* +this isn't jsdoc of tool2 +*/ +export function tool2() {} + )"; +static void FindOverloadDecl(es2panda_AstNode *ast, void *context) +{ + [[maybe_unused]] auto ctx = reinterpret_cast(context); + if (impl->IsOverloadDeclaration(ast)) { + overloadDecl = ast; + } +} + static void FindImportExportSpecifier(es2panda_AstNode *ast, void *context) { auto ctx = reinterpret_cast(context); @@ -580,6 +610,7 @@ static void FindTargetAstAfterChecker(es2panda_Context *context, es2panda_AstNod impl->AstNodeForEach(ast, FindAnnotationDecl, context); impl->AstNodeForEach(ast, FindETSParamDecl, context); impl->AstNodeForEach(indexerClass, FindIndexerTransferredGetterSetter, context); + impl->AstNodeForEach(ast, FindOverloadDecl, context); } static void FindTargetAstAfterParser(es2panda_Context *context, es2panda_AstNode *ast) @@ -625,6 +656,7 @@ static void TestJSDoc(es2panda_Context *context, es2panda_AstNode *entryAst) std::cout << impl->JsdocStringFromDeclaration(context, reExportedDecl) << std::endl; std::cout << impl->JsdocStringFromDeclaration(context, exportSingleNamedDecl) << std::endl; std::cout << impl->JsdocStringFromDeclaration(context, importDecl) << std::endl; + std::cout << impl->JsdocStringFromDeclaration(context, overloadDecl) << std::endl; } int main(int argc, char **argv)