From 0706a89139fd0e789cd1d86fb121524e5003b011 Mon Sep 17 00:00:00 2001 From: huyx Date: Wed, 13 Dec 2023 09:27:07 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=B1=BB=E5=9E=8Bwptr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyx --- framework/tools/hdi-gen/ast/ast_attribute.cpp | 10 +++++ framework/tools/hdi-gen/ast/ast_attribute.h | 17 ++++++++ .../tools/hdi-gen/ast/ast_interface_type.cpp | 3 ++ framework/tools/hdi-gen/ast/ast_parameter.h | 8 ++++ framework/tools/hdi-gen/lexer/lexer.cpp | 2 + framework/tools/hdi-gen/parser/parser.cpp | 42 +++++++++++++++++++ framework/tools/hdi-gen/parser/parser.h | 2 + 7 files changed, 84 insertions(+) diff --git a/framework/tools/hdi-gen/ast/ast_attribute.cpp b/framework/tools/hdi-gen/ast/ast_attribute.cpp index 45e040d58..c9fba584d 100644 --- a/framework/tools/hdi-gen/ast/ast_attribute.cpp +++ b/framework/tools/hdi-gen/ast/ast_attribute.cpp @@ -74,5 +74,15 @@ std::string ASTParamAttr::Dump(const std::string &prefix) { return prefix + ToString(); } + +std::string ASTInterfaceParamAttr::ToString() const +{ + return StringHelper::Format("[%s]", (value_ == InterfaceParamAttr::TYPE_SPTR) ? "sptr" : "wptr"); +} + +std::string ASTInterfaceParamAttr::Dump(const std::string &prefix) +{ + return prefix + ToString(); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/framework/tools/hdi-gen/ast/ast_attribute.h b/framework/tools/hdi-gen/ast/ast_attribute.h index 7a438580a..6ccde6347 100644 --- a/framework/tools/hdi-gen/ast/ast_attribute.h +++ b/framework/tools/hdi-gen/ast/ast_attribute.h @@ -66,6 +66,23 @@ public: public: ParamAttr value_; }; + +enum class InterfaceParamAttr { + TYPE_SPTR, + TYPE_WPTR, +}; + +class ASTInterfaceParamAttr : public ASTNode { +public: + explicit ASTInterfaceParamAttr(InterfaceParamAttr value) : ASTNode(), value_(value) {} + + std::string ToString() const override; + + std::string Dump(const std::string &prefix) override; + +public: + InterfaceParamAttr value_; +}; } // namespace HDI } // namespace OHOS diff --git a/framework/tools/hdi-gen/ast/ast_interface_type.cpp b/framework/tools/hdi-gen/ast/ast_interface_type.cpp index b2ce86b05..7d43ec1cf 100644 --- a/framework/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/framework/tools/hdi-gen/ast/ast_interface_type.cpp @@ -123,6 +123,9 @@ std::string ASTInterfaceType::EmitCppType(TypeMode mode) const if (Options::GetInstance().GetSystemLevel() == SystemLevel::LITE) { pointerName = "std::shared_ptr"; } + if (false) { + pointerName = "wptr"; + } switch (mode) { case TypeMode::NO_MODE: return StringHelper::Format("%s<%s>", pointerName.c_str(), GetNameWithNamespace(namespace_, name_).c_str()); diff --git a/framework/tools/hdi-gen/ast/ast_parameter.h b/framework/tools/hdi-gen/ast/ast_parameter.h index 11d0f87bc..b4edd0050 100644 --- a/framework/tools/hdi-gen/ast/ast_parameter.h +++ b/framework/tools/hdi-gen/ast/ast_parameter.h @@ -13,6 +13,7 @@ #include "ast/ast_node.h" #include "ast/ast_type.h" #include "util/autoptr.h" +#include "util/logger.h" namespace OHOS { namespace HDI { @@ -28,6 +29,12 @@ public: { } + ASTParameter(const std::string &name, const AutoPtr &attribute, const AutoPtr &type, const AutoPtr &interfaceParamAttr) + : ASTNode(), name_(name), attr_(attribute), type_(type), interfaceAttr_(interfaceParamAttr) + { + Logger::E("ASTParameter","interfaceAttr_ =%d", interfaceAttr_->value_); + } + inline std::string GetName() { return name_; @@ -75,6 +82,7 @@ private: std::string name_; AutoPtr attr_; AutoPtr type_; + AutoPtr interfaceAttr_; }; } // namespace HDI } // namespace OHOS diff --git a/framework/tools/hdi-gen/lexer/lexer.cpp b/framework/tools/hdi-gen/lexer/lexer.cpp index 94d47033c..9a18930e4 100644 --- a/framework/tools/hdi-gen/lexer/lexer.cpp +++ b/framework/tools/hdi-gen/lexer/lexer.cpp @@ -31,6 +31,8 @@ Lexer::StrTokenTypeMap Lexer::keyWords_ = { {"SharedMemQueue", TokenType::SMQ }, {"char", TokenType::CHAR }, {"unsigned", TokenType::UNSIGNED }, + {"sptr", TokenType::SPTR }, + {"wptr", TokenType::WPTR }, {"enum", TokenType::ENUM }, {"struct", TokenType::STRUCT }, {"union", TokenType::UNION }, diff --git a/framework/tools/hdi-gen/parser/parser.cpp b/framework/tools/hdi-gen/parser/parser.cpp index 7f95b33b1..f88f97001 100644 --- a/framework/tools/hdi-gen/parser/parser.cpp +++ b/framework/tools/hdi-gen/parser/parser.cpp @@ -690,9 +690,15 @@ AutoPtr Parser::ParseParam() { AutoPtr paramAttr = ParseParamAttr(); AutoPtr paramType = ParseType(); + AutoPtr interfaceParamAttr = nullptr; std::string paramName = ""; Token token = lexer_.PeekToken(); + if (paramType->IsInterfaceType() && token.kind == TokenType::ANGLE_BRACKETS_LEFT) { + interfaceParamAttr = ParseInterfaceParamAttr(); + token = lexer_.PeekToken(); + } + if (token.kind != TokenType::ID) { LogError(token, StringHelper::Format("expected param name before '%s' token", token.value.c_str())); } else { @@ -714,6 +720,10 @@ AutoPtr Parser::ParseParam() } } + if (interfaceParamAttr != nullptr) { + return new ASTParameter(paramName, paramAttr, paramType, interfaceParamAttr); + } + return new ASTParameter(paramName, paramAttr, paramType); } @@ -749,6 +759,38 @@ AutoPtr Parser::ParseParamAttr() return attr; } +AutoPtr Parser::ParseInterfaceParamAttr() +{ + AutoPtr attr = new ASTInterfaceParamAttr(InterfaceParamAttr::TYPE_SPTR); + Token token = lexer_.PeekToken(); + if (token.kind != TokenType::ANGLE_BRACKETS_LEFT) { + return attr; + } else { + lexer_.GetToken(); + } + + token = lexer_.PeekToken(); + if (token.kind == TokenType::SPTR) { + attr->value_ = InterfaceParamAttr::TYPE_SPTR; + lexer_.GetToken(); + } else if (token.kind == TokenType::WPTR) { + attr->value_ = InterfaceParamAttr::TYPE_WPTR; + lexer_.GetToken(); + } else { + LogError( + token, StringHelper::Format("expected 'sptr' or 'wptr' attribute before '%s' token", token.value.c_str())); + } + + token = lexer_.PeekToken(); + if (token.kind != TokenType::ANGLE_BRACKETS_RIGHT) { + LogError(token, StringHelper::Format("expected '>' before '%s' token", token.value.c_str())); + } else { + lexer_.GetToken(); + } + + return attr; +} + AutoPtr Parser::ParseType() { AutoPtr type = nullptr; diff --git a/framework/tools/hdi-gen/parser/parser.h b/framework/tools/hdi-gen/parser/parser.h index 9b307f6ee..13a276f53 100644 --- a/framework/tools/hdi-gen/parser/parser.h +++ b/framework/tools/hdi-gen/parser/parser.h @@ -107,6 +107,8 @@ private: AutoPtr ParseParamAttr(); + AutoPtr ParseInterfaceParamAttr(); + // parse type AutoPtr ParseType(); -- Gitee From 14e54122dc267acf199fa8027489cd08538ab4d0 Mon Sep 17 00:00:00 2001 From: huyx Date: Thu, 21 Dec 2023 11:20:25 +0800 Subject: [PATCH 2/3] clear codecheck problems in code_emitter.cpp Signed-off-by: huyx --- framework/tools/hdi-gen/codegen/code_emitter.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/tools/hdi-gen/codegen/code_emitter.cpp b/framework/tools/hdi-gen/codegen/code_emitter.cpp index d5645eb24..657a0eeae 100644 --- a/framework/tools/hdi-gen/codegen/code_emitter.cpp +++ b/framework/tools/hdi-gen/codegen/code_emitter.cpp @@ -142,7 +142,9 @@ std::string CodeEmitter::InterfaceToFilePath(const std::string &interfaceName) c { std::string fullName = interfaceName; if (StringHelper::EndWith(fullName, "]")) { - fullName = fullName.substr(0, fullName.find("[")); + if (interfaceName.find("[") != std::string::npos) { + fullName = interfaceName.substr(0, interfaceName.find("[")); + } } size_t index = fullName.rfind("."); std::string prefix = fullName.substr(0, index + 1); -- Gitee From 97efe6e6973d9b5ad42dcbadf63ba06d5341d191 Mon Sep 17 00:00:00 2001 From: huyx Date: Thu, 21 Dec 2023 11:30:57 +0800 Subject: [PATCH 3/3] reset code_emitter.cpp Signed-off-by: huyx --- framework/tools/hdi-gen/codegen/code_emitter.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/tools/hdi-gen/codegen/code_emitter.cpp b/framework/tools/hdi-gen/codegen/code_emitter.cpp index 657a0eeae..d5645eb24 100644 --- a/framework/tools/hdi-gen/codegen/code_emitter.cpp +++ b/framework/tools/hdi-gen/codegen/code_emitter.cpp @@ -142,9 +142,7 @@ std::string CodeEmitter::InterfaceToFilePath(const std::string &interfaceName) c { std::string fullName = interfaceName; if (StringHelper::EndWith(fullName, "]")) { - if (interfaceName.find("[") != std::string::npos) { - fullName = interfaceName.substr(0, interfaceName.find("[")); - } + fullName = fullName.substr(0, fullName.find("[")); } size_t index = fullName.rfind("."); std::string prefix = fullName.substr(0, index + 1); -- Gitee