From 835cca85ee45dd1b6722d761999c07c33fb97cc9 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Wed, 4 Feb 2015 01:45:41 +0100 Subject: Implemented parsing of enum types --- src/plugins/xml/XmlParser.cpp | 70 ++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/xml/XmlParser.cpp b/src/plugins/xml/XmlParser.cpp index e56d528..92caf09 100644 --- a/src/plugins/xml/XmlParser.cpp +++ b/src/plugins/xml/XmlParser.cpp @@ -107,38 +107,50 @@ public: { scope().setFlag(ParserFlag::POST_HEAD, true); - // Fetch the arguments used for creating this type - const std::string &name = args["name"].asString(); - const std::string &parent = args["parent"].asString(); - - // Fetch the current typesystem and create the struct node + // Fetch the current typesystem and create the enum node Rooted typesystem = scope().selectOrThrow(); - Rooted structType = typesystem->createStructType(name); - structType->setLocation(location()); + Rooted enumType = + typesystem->createEnumType(args["name"].asString()); + enumType->setLocation(location()); - // Try to resolve the parent type and set it as parent structure - if (!parent.empty()) { - scope().resolve( - parent, structType, logger(), - [](Handle parent, Handle structType, - Logger &logger) { - if (parent != nullptr) { - structType.cast()->setParentStructure( - parent.cast(), logger); - } - }); - } - scope().push(structType); + scope().push(enumType); } + void end() override { scope().pop(); } + + static Handler *create(const HandlerData &handlerData) + { + return new TypesystemEnumHandler{handlerData}; + } +}; + +class TypesystemEnumEntryHandler : public Handler { +public: + using Handler::Handler; + + std::string entry; + + void start(Variant::mapType &args) override {} + void end() override { - scope().pop(); + Rooted enumType = scope().selectOrThrow(); + enumType->addEntry(entry, logger()); + } + + void data(const std::string &data, int field) override + { + if (field != 0) { + // TODO: This should be stored in the HandlerData + logger().error("Enum entry only has one field."); + return; + } + entry.append(data); } static Handler *create(const HandlerData &handlerData) { - return new TypesystemEnumHandler{handlerData}; + return new TypesystemEnumEntryHandler{handlerData}; } }; @@ -174,10 +186,7 @@ public: scope().push(structType); } - void end() override - { - scope().pop(); - } + void end() override { scope().pop(); } static Handler *create(const HandlerData &handlerData) { @@ -474,9 +483,15 @@ static const ParserState Typesystem = .arguments({Argument::String("name", "")}); static const ParserState TypesystemEnum = ParserStateBuilder() + .parent(&Typesystem) .createdNodeType(&RttiTypes::EnumType) .elementHandler(TypesystemEnumHandler::create) - .parent(&Typesystem); + .arguments({Argument::String("name")}); +static const ParserState TypesystemEnumEntry = + ParserStateBuilder() + .parent(&TypesystemEnum) + .elementHandler(TypesystemEnumEntryHandler::create) + .arguments({}); static const ParserState TypesystemStruct = ParserStateBuilder() .parent(&Typesystem) @@ -520,6 +535,7 @@ static const std::multimap XmlStates{ {"primitive", &DomainStructPrimitive}, {"typesystem", &Typesystem}, {"enum", &TypesystemEnum}, + {"entry", &TypesystemEnumEntry}, {"struct", &TypesystemStruct}, {"field", &TypesystemStructField}, {"constant", &TypesystemConstant}, -- cgit v1.2.3