diff --git a/framework/tools/hdi-gen/ast/ast_attribute.cpp b/framework/tools/hdi-gen/ast/ast_attribute.cpp index 45e040d582138c8b6e5a0800f5dec2f0a51519d6..c9fba584dad5de52dc5363a2cb412aa53b520287 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 7a438580aa95594b991cf5a5b08b81d156f7da37..6ccde63470d2f75db008e1cedf66cc0d49532fac 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 b2ce86b05e804d73003c7944f1cd3d4232c633ab..7d43ec1cfbcae864f664179468e24d1961fb10af 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 11d0f87bc66a72f2410077f91fd9fdf4c5bb5ff9..b4edd005064fc2b63e7cf0014189613f005cd78c 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 94d47033c009b42ebeb3e8a3abc210669e5c43d5..9a18930e41f7bdb1ba8f8bb25038fdb6972316e4 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 7f95b33b1f4f836ec7e259d4e60d1d124ed0234a..f88f97001276bbba6fe0d0d025c5d0c2fa429b3b 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 9b307f6ee9b23877e6263010bf2713b27d8394a3..13a276f531f6cdfef9a6c83b1ea4082873fce992 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();