From 41b5e0daf71cba1710abb98dac5b757c2ddf5d4a Mon Sep 17 00:00:00 2001 From: j30052480 Date: Wed, 15 Nov 2023 11:05:57 +0800 Subject: [PATCH 1/3] provides the function of struct extension in idl Signed-off-by: j30052480 --- .../tools/hdi-gen/ast/ast_struct_type.cpp | 12 +++++++ framework/tools/hdi-gen/ast/ast_struct_type.h | 7 ++++ framework/tools/hdi-gen/parser/parser.cpp | 33 ++++++++++++++++++- framework/tools/hdi-gen/parser/parser.h | 2 ++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/framework/tools/hdi-gen/ast/ast_struct_type.cpp b/framework/tools/hdi-gen/ast/ast_struct_type.cpp index ff7f14bdc..3455d514e 100644 --- a/framework/tools/hdi-gen/ast/ast_struct_type.cpp +++ b/framework/tools/hdi-gen/ast/ast_struct_type.cpp @@ -11,6 +11,18 @@ namespace OHOS { namespace HDI { +void ASTStructType::SetParentType(const AutoPtr &parentType) +{ + if (parentType == nullptr) { + return; + } + + std::vector>> parentMembers = parentType->GetMembers(); + for (auto member : parentMembers) { + AddMember(std::get<1>(member), std::get<0>(member)); + } +} + void ASTStructType::AddMember(const AutoPtr &typeName, std::string name) { for (auto it : members_) { diff --git a/framework/tools/hdi-gen/ast/ast_struct_type.h b/framework/tools/hdi-gen/ast/ast_struct_type.h index 81ad65be2..14f3b2d58 100644 --- a/framework/tools/hdi-gen/ast/ast_struct_type.h +++ b/framework/tools/hdi-gen/ast/ast_struct_type.h @@ -49,8 +49,15 @@ public: return attr_ != nullptr ? attr_->HasValue(ASTAttr::LITE) : false; } + void SetParentType(const AutoPtr &parentType); + void AddMember(const AutoPtr &typeName, std::string name); + inline std::vector>> GetMembers() + { + return members_; + } + inline size_t GetMemberNumber() { return members_.size(); diff --git a/framework/tools/hdi-gen/parser/parser.cpp b/framework/tools/hdi-gen/parser/parser.cpp index 7f95b33b1..777afe642 100644 --- a/framework/tools/hdi-gen/parser/parser.cpp +++ b/framework/tools/hdi-gen/parser/parser.cpp @@ -1116,7 +1116,10 @@ void Parser::ParseStructDeclaration(const AttrSet &attrs) } token = lexer_.PeekToken(); - if (token.kind != TokenType::BRACES_LEFT) { + if (token.kind == TokenType::COLON) { + AutoPtr parentType = ParseStructParentType(); + structType->SetParentType(parentType); + } else if (token.kind != TokenType::BRACES_LEFT) { LogError(token, StringHelper::Format("expected '{' before '%s' token", token.value.c_str())); } else { lexer_.GetToken(); @@ -1142,6 +1145,34 @@ void Parser::ParseStructDeclaration(const AttrSet &attrs) ast_->AddTypeDefinition(structType.Get()); } +AutoPtr Parser::ParseStructParentType() +{ + AutoPtr baseType = nullptr; + Token token = lexer_.PeekToken(); + + lexer_.GetToken(); + token = lexer_.PeekToken(); + baseType = ParseType(); + if (baseType != nullptr) { + switch (baseType->GetTypeKind()) { + case TypeKind::TYPE_STRUCT: + break; + default: { + LogError(token, StringHelper::Format("illegal base type of struct", baseType->ToString().c_str())); + lexer_.SkipUntilToken(TokenType::BRACES_LEFT); + } + } + } + AutoPtr parentType = dynamic_cast(baseType.Get()); + + token = lexer_.PeekToken(); + if (token.kind != TokenType::BRACES_LEFT) { + LogError(token, StringHelper::Format("expected '{' before '%s' token", token.value.c_str())); + } + lexer_.GetToken(); + return parentType; +} + void Parser::ParseStructMember(const AutoPtr &structType) { Token token = lexer_.PeekToken(); diff --git a/framework/tools/hdi-gen/parser/parser.h b/framework/tools/hdi-gen/parser/parser.h index 9b307f6ee..b8870966c 100644 --- a/framework/tools/hdi-gen/parser/parser.h +++ b/framework/tools/hdi-gen/parser/parser.h @@ -134,6 +134,8 @@ private: // parse declaration of struct void ParseStructDeclaration(const AttrSet &attrs = {}); + AutoPtr ParseStructParentType(); + void ParseStructMember(const AutoPtr &structType); // parse declaration of union -- Gitee From edeb9425f7b5d9174283135b191eb747944602b8 Mon Sep 17 00:00:00 2001 From: j30052480 Date: Wed, 15 Nov 2023 18:01:13 +0800 Subject: [PATCH 2/3] feat:provides the function of struct extension in idl Signed-off-by: j30052480 --- framework/tools/hdi-gen/ast/ast_struct_type.cpp | 7 ++++++- framework/tools/hdi-gen/ast/ast_struct_type.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/tools/hdi-gen/ast/ast_struct_type.cpp b/framework/tools/hdi-gen/ast/ast_struct_type.cpp index 3455d514e..7b8f277c3 100644 --- a/framework/tools/hdi-gen/ast/ast_struct_type.cpp +++ b/framework/tools/hdi-gen/ast/ast_struct_type.cpp @@ -21,6 +21,7 @@ void ASTStructType::SetParentType(const AutoPtr &parentType) for (auto member : parentMembers) { AddMember(std::get<1>(member), std::get<0>(member)); } + parentType_ = parentType; } void ASTStructType::AddMember(const AutoPtr &typeName, std::string name) @@ -46,7 +47,11 @@ std::string ASTStructType::Dump(const std::string &prefix) { StringBuilder sb; sb.Append(prefix).Append(attr_->Dump(prefix)).Append(" "); - sb.AppendFormat("struct %s {\n", name_.c_str()); + if (parentType_ == nullptr) { + sb.AppendFormat("struct %s {\n", name_.c_str()); + } else { + sb.AppendFormat("struct %s : %s {\n", name_.c_str(), parentType_->ToString().c_str()); + } if (members_.size() > 0) { for (auto it : members_) { sb.Append(prefix + " "); diff --git a/framework/tools/hdi-gen/ast/ast_struct_type.h b/framework/tools/hdi-gen/ast/ast_struct_type.h index 14f3b2d58..b6fe4cdaa 100644 --- a/framework/tools/hdi-gen/ast/ast_struct_type.h +++ b/framework/tools/hdi-gen/ast/ast_struct_type.h @@ -130,6 +130,7 @@ public: private: AutoPtr attr_; std::vector>> members_; + AutoPtr parentType_; }; } // namespace HDI } // namespace OHOS -- Gitee From ed8309a785c252e830251cc00cbfe0e8ae4c88bf Mon Sep 17 00:00:00 2001 From: j30052480 Date: Mon, 20 Nov 2023 17:18:14 +0800 Subject: [PATCH 3/3] feat:provides the function of struct extension in idl Signed-off-by: j30052480 --- framework/tools/hdi-gen/parser/parser.cpp | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/framework/tools/hdi-gen/parser/parser.cpp b/framework/tools/hdi-gen/parser/parser.cpp index 777afe642..36f05184d 100644 --- a/framework/tools/hdi-gen/parser/parser.cpp +++ b/framework/tools/hdi-gen/parser/parser.cpp @@ -1147,24 +1147,24 @@ void Parser::ParseStructDeclaration(const AttrSet &attrs) AutoPtr Parser::ParseStructParentType() { - AutoPtr baseType = nullptr; + lexer_.GetToken(); Token token = lexer_.PeekToken(); + AutoPtr baseType = ParseType(); + if (baseType == nullptr) { + LogError(token, StringHelper::Format("expected base type name before '{' token")); + return nullptr; + } - lexer_.GetToken(); - token = lexer_.PeekToken(); - baseType = ParseType(); - if (baseType != nullptr) { - switch (baseType->GetTypeKind()) { - case TypeKind::TYPE_STRUCT: - break; - default: { - LogError(token, StringHelper::Format("illegal base type of struct", baseType->ToString().c_str())); - lexer_.SkipUntilToken(TokenType::BRACES_LEFT); - } + switch (baseType->GetTypeKind()) { + case TypeKind::TYPE_STRUCT: + break; + default: { + LogError(token, StringHelper::Format("illegal base type of struct: '%s'", baseType->ToString().c_str())); + lexer_.SkipUntilToken(TokenType::BRACES_LEFT); } } - AutoPtr parentType = dynamic_cast(baseType.Get()); + AutoPtr parentType = dynamic_cast(baseType.Get()); token = lexer_.PeekToken(); if (token.kind != TokenType::BRACES_LEFT) { LogError(token, StringHelper::Format("expected '{' before '%s' token", token.value.c_str())); -- Gitee