diff --git a/framework/tools/hdi-gen/ast/ast_struct_type.cpp b/framework/tools/hdi-gen/ast/ast_struct_type.cpp index ff7f14bdc01496bb737a6c3c83683d1811980764..7b8f277c31bd7ece0db49e521174a1dcb4e1e4a9 100644 --- a/framework/tools/hdi-gen/ast/ast_struct_type.cpp +++ b/framework/tools/hdi-gen/ast/ast_struct_type.cpp @@ -11,6 +11,19 @@ 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)); + } + parentType_ = parentType; +} + void ASTStructType::AddMember(const AutoPtr &typeName, std::string name) { for (auto it : members_) { @@ -34,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 81ad65be287894166d61f8918ebf5c6530751ddb..b6fe4cdaa6c6e9474377b9ea56ee608ff8356327 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(); @@ -123,6 +130,7 @@ public: private: AutoPtr attr_; std::vector>> members_; + AutoPtr parentType_; }; } // namespace HDI } // namespace OHOS diff --git a/framework/tools/hdi-gen/parser/parser.cpp b/framework/tools/hdi-gen/parser/parser.cpp index 7f95b33b1f4f836ec7e259d4e60d1d124ed0234a..36f05184d0fa7439c8fd9238878afa8c85608207 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() +{ + lexer_.GetToken(); + Token token = lexer_.PeekToken(); + AutoPtr baseType = ParseType(); + if (baseType == nullptr) { + LogError(token, StringHelper::Format("expected base type name before '{' token")); + return nullptr; + } + + 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()); + 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 9b307f6ee9b23877e6263010bf2713b27d8394a3..b8870966c51da7b5852a448ac602c0ccfe5a3ca5 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