diff options
-rw-r--r-- | src/plugins/xml/XmlParser.cpp | 46 | ||||
-rw-r--r-- | test/plugins/xml/XmlParserTest.cpp | 2 | ||||
-rw-r--r-- | testdata/xmlparser/generic.oxm | 246 |
3 files changed, 285 insertions, 9 deletions
diff --git a/src/plugins/xml/XmlParser.cpp b/src/plugins/xml/XmlParser.cpp index d71ceac..f254326 100644 --- a/src/plugins/xml/XmlParser.cpp +++ b/src/plugins/xml/XmlParser.cpp @@ -161,7 +161,7 @@ public: const std::string &parent = args["parent"].asString(); // Fetch the current typesystem and create the struct node - Rooted<Typesystem> typesystem = scope().getLeaf().cast<Typesystem>(); + Rooted<Typesystem> typesystem = scope().select<Typesystem>(); Rooted<StructType> structType = typesystem->createStructType(name); structType->setLocation(location()); @@ -201,11 +201,11 @@ public: // Read the argument values const std::string &name = args["name"].asString(); const std::string &type = args["type"].asString(); - const Variant &defaultValue = args["default"]; + const Variant &defaultValue = args["default"]; // Build! const bool optional = !(defaultValue.isObject() && defaultValue.asObject() == nullptr); - Rooted<StructType> structType = scope().getLeaf().cast<StructType>(); + Rooted<StructType> structType = scope().select<StructType>(); Rooted<Attribute> attribute = structType->createAttribute(name, defaultValue, optional, logger()); attribute->setLocation(location()); @@ -227,6 +227,38 @@ public: } }; +class ConstantHandler : public Handler { +public: + using Handler::Handler; + + void start(Variant::mapType &args) override + { + // Read the argument values + const std::string &name = args["name"].asString(); + const std::string &type = args["type"].asString(); + const Variant &value = args["value"]; + + Rooted<Typesystem> typesystem = scope().select<Typesystem>(); + Rooted<Constant> constant = typesystem->createConstant(name, value); + constant->setLocation(location()); + + // Try to resolve the type + scope().resolve<Type>( + type, logger(), + [constant](Handle<Type> type, Logger &logger) mutable { + constant->setType(type, logger); + }, + location()); + } + + void end() override {} + + static Handler *create(const HandlerData &handlerData) + { + return new ConstantHandler{handlerData}; + } +}; + /* Document structure */ static const State STATE_DOCUMENT = 0; static const State STATE_DOCUMENT_HEAD = 1; @@ -289,7 +321,13 @@ static const std::multimap<std::string, HandlerDescriptor> XML_HANDLERS{ Argument::Any("default", Variant::fromObject(nullptr))}}}, {"constants", {{STATE_TYPESYSTEM}, DisableHeadHandler::create, STATE_CONSTANTS}}, - {"constant", {{STATE_CONSTANTS}, nullptr, STATE_CONSTANT}}}; + {"constant", + {{STATE_CONSTANTS}, + ConstantHandler::create, + STATE_CONSTANT, + false, + {Argument::String("name"), Argument::String("type"), + Argument::Any("value")}}}}; /** * Wrapper class around the XML_Parser pointer which safely frees it whenever diff --git a/test/plugins/xml/XmlParserTest.cpp b/test/plugins/xml/XmlParserTest.cpp index 6ac962d..0802d5b 100644 --- a/test/plugins/xml/XmlParserTest.cpp +++ b/test/plugins/xml/XmlParserTest.cpp @@ -67,7 +67,7 @@ TEST(XmlParser, generic) XmlStandaloneEnvironment env(logger); env.parse("generic.oxm", "", "", RttiSet{&RttiTypes::Typesystem}); #ifdef MANAGER_GRAPHVIZ_EXPORT - env.manager.exportGraphviz("xmlDocument.dot"); +// env.manager.exportGraphviz("xmlDocument.dot"); #endif } } diff --git a/testdata/xmlparser/generic.oxm b/testdata/xmlparser/generic.oxm index 94f0226..8ada0bb 100644 --- a/testdata/xmlparser/generic.oxm +++ b/testdata/xmlparser/generic.oxm @@ -1,11 +1,249 @@ <!--<?xml version="1.0" standalone="yes"?>--> <typesystem name="color"> <types> - <struct name="rgb" parent="rgb"> <!-- Instance 1 --> - <field name="r" type="double"/> - <field name="g" type="double"/> - <field name="b" type="double"/> + <struct name="color"> + <field name="r" type="int"/> + <field name="g" type="int"/> + <field name="b" type="int"/> </struct> </types> + <constants> + <constant name="aquamarine1" type="color" value="[127,255,212]"/> + <constant name="aquamarine2" type="color" value="[118,238,198]"/> + <constant name="aquamarine3" type="color" value="[102,205,170]"/> + <constant name="aquamarine" type="color" value="[127,255,212]"/> + <constant name="azure1" type="color" value="[240,255,255]"/> + <constant name="azure2" type="color" value="[224,238,238]"/> + <constant name="azure3" type="color" value="[193,205,205]"/> + <constant name="azure4" type="color" value="[131,139,139]"/> + <constant name="azure" type="color" value="[240,255,255]"/> + <constant name="beige" type="color" value="[245,245,220]"/> + <constant name="bisque1" type="color" value="[255,228,196]"/> + <constant name="bisque2" type="color" value="[238,213,183]"/> + <constant name="bisque3" type="color" value="[205,183,158]"/> + <constant name="bisque4" type="color" value="[139,125,107]"/> + <constant name="bisque" type="color" value="[255,228,196]"/> + <constant name="brown" type="color" value="[165,42,42]"/> + <constant name="burlywood1" type="color" value="[255,211,155]"/> + <constant name="burlywood2" type="color" value="[238,197,145]"/> + <constant name="burlywood3" type="color" value="[205,170,125]"/> + <constant name="burlywood" type="color" value="[222,184,135]"/> + <constant name="chartreuse" type="color" value="[127,255,0]"/> + <constant name="chocolate" type="color" value="[210,105,30]"/> + <constant name="coral" type="color" value="[255,127,80]"/> + <constant name="cornsilk1" type="color" value="[255,248,220]"/> + <constant name="cornsilk2" type="color" value="[238,232,205]"/> + <constant name="cornsilk3" type="color" value="[205,200,177]"/> + <constant name="cornsilk4" type="color" value="[139,136,120]"/> + <constant name="cornsilk" type="color" value="[255,248,220]"/> + <constant name="crimson" type="color" value="[220,20,60]"/> + <constant name="firebrick" type="color" value="[178,34,34]"/> + <constant name="fuchsia" type="color" value="[255,0,255]"/> + <constant name="gainsboro" type="color" value="[220,220,220]"/> + <constant name="goldenrod" type="color" value="[218,165,32]"/> + <constant name="gold" type="color" value="[255,215,0]"/> + <constant name="gray100" type="color" value="[255,255,255]"/> + <constant name="gray40" type="color" value="[102,102,102]"/> + <constant name="gray41" type="color" value="[105,105,105]"/> + <constant name="gray42" type="color" value="[107,107,107]"/> + <constant name="gray43" type="color" value="[110,110,110]"/> + <constant name="gray44" type="color" value="[112,112,112]"/> + <constant name="gray45" type="color" value="[115,115,115]"/> + <constant name="gray46" type="color" value="[117,117,117]"/> + <constant name="gray47" type="color" value="[120,120,120]"/> + <constant name="gray48" type="color" value="[122,122,122]"/> + <constant name="gray49" type="color" value="[125,125,125]"/> + <constant name="gray50" type="color" value="[127,127,127]"/> + <constant name="gray51" type="color" value="[130,130,130]"/> + <constant name="gray52" type="color" value="[133,133,133]"/> + <constant name="gray53" type="color" value="[135,135,135]"/> + <constant name="gray54" type="color" value="[138,138,138]"/> + <constant name="gray55" type="color" value="[140,140,140]"/> + <constant name="gray56" type="color" value="[143,143,143]"/> + <constant name="gray57" type="color" value="[145,145,145]"/> + <constant name="gray58" type="color" value="[148,148,148]"/> + <constant name="gray59" type="color" value="[150,150,150]"/> + <constant name="gray60" type="color" value="[153,153,153]"/> + <constant name="gray61" type="color" value="[156,156,156]"/> + <constant name="gray62" type="color" value="[158,158,158]"/> + <constant name="gray63" type="color" value="[161,161,161]"/> + <constant name="gray64" type="color" value="[163,163,163]"/> + <constant name="gray65" type="color" value="[166,166,166]"/> + <constant name="gray66" type="color" value="[168,168,168]"/> + <constant name="gray67" type="color" value="[171,171,171]"/> + <constant name="gray68" type="color" value="[173,173,173]"/> + <constant name="gray69" type="color" value="[176,176,176]"/> + <constant name="gray70" type="color" value="[179,179,179]"/> + <constant name="gray71" type="color" value="[181,181,181]"/> + <constant name="gray72" type="color" value="[184,184,184]"/> + <constant name="gray73" type="color" value="[186,186,186]"/> + <constant name="gray74" type="color" value="[189,189,189]"/> + <constant name="gray75" type="color" value="[191,191,191]"/> + <constant name="gray76" type="color" value="[194,194,194]"/> + <constant name="gray77" type="color" value="[196,196,196]"/> + <constant name="gray78" type="color" value="[199,199,199]"/> + <constant name="gray79" type="color" value="[201,201,201]"/> + <constant name="gray80" type="color" value="[204,204,204]"/> + <constant name="gray81" type="color" value="[207,207,207]"/> + <constant name="gray82" type="color" value="[209,209,209]"/> + <constant name="gray83" type="color" value="[212,212,212]"/> + <constant name="gray84" type="color" value="[214,214,214]"/> + <constant name="gray85" type="color" value="[217,217,217]"/> + <constant name="gray86" type="color" value="[219,219,219]"/> + <constant name="gray87" type="color" value="[222,222,222]"/> + <constant name="gray88" type="color" value="[224,224,224]"/> + <constant name="gray89" type="color" value="[227,227,227]"/> + <constant name="gray90" type="color" value="[229,229,229]"/> + <constant name="gray91" type="color" value="[232,232,232]"/> + <constant name="gray92" type="color" value="[235,235,235]"/> + <constant name="gray93" type="color" value="[237,237,237]"/> + <constant name="gray94" type="color" value="[240,240,240]"/> + <constant name="gray95" type="color" value="[242,242,242]"/> + <constant name="gray96" type="color" value="[245,245,245]"/> + <constant name="gray97" type="color" value="[247,247,247]"/> + <constant name="gray98" type="color" value="[250,250,250]"/> + <constant name="gray99" type="color" value="[252,252,252]"/> + <constant name="gray" type="color" value="[190,190,190]"/> + <constant name="grey100" type="color" value="[255,255,255]"/> + <constant name="grey40" type="color" value="[102,102,102]"/> + <constant name="grey41" type="color" value="[105,105,105]"/> + <constant name="grey42" type="color" value="[107,107,107]"/> + <constant name="grey43" type="color" value="[110,110,110]"/> + <constant name="grey44" type="color" value="[112,112,112]"/> + <constant name="grey45" type="color" value="[115,115,115]"/> + <constant name="grey46" type="color" value="[117,117,117]"/> + <constant name="grey47" type="color" value="[120,120,120]"/> + <constant name="grey48" type="color" value="[122,122,122]"/> + <constant name="grey49" type="color" value="[125,125,125]"/> + <constant name="grey50" type="color" value="[127,127,127]"/> + <constant name="grey51" type="color" value="[130,130,130]"/> + <constant name="grey52" type="color" value="[133,133,133]"/> + <constant name="grey53" type="color" value="[135,135,135]"/> + <constant name="grey54" type="color" value="[138,138,138]"/> + <constant name="grey55" type="color" value="[140,140,140]"/> + <constant name="grey56" type="color" value="[143,143,143]"/> + <constant name="grey57" type="color" value="[145,145,145]"/> + <constant name="grey58" type="color" value="[148,148,148]"/> + <constant name="grey59" type="color" value="[150,150,150]"/> + <constant name="grey60" type="color" value="[153,153,153]"/> + <constant name="grey61" type="color" value="[156,156,156]"/> + <constant name="grey62" type="color" value="[158,158,158]"/> + <constant name="grey63" type="color" value="[161,161,161]"/> + <constant name="grey64" type="color" value="[163,163,163]"/> + <constant name="grey65" type="color" value="[166,166,166]"/> + <constant name="grey66" type="color" value="[168,168,168]"/> + <constant name="grey67" type="color" value="[171,171,171]"/> + <constant name="grey68" type="color" value="[173,173,173]"/> + <constant name="grey69" type="color" value="[176,176,176]"/> + <constant name="grey70" type="color" value="[179,179,179]"/> + <constant name="grey71" type="color" value="[181,181,181]"/> + <constant name="grey72" type="color" value="[184,184,184]"/> + <constant name="grey73" type="color" value="[186,186,186]"/> + <constant name="grey74" type="color" value="[189,189,189]"/> + <constant name="grey75" type="color" value="[191,191,191]"/> + <constant name="grey76" type="color" value="[194,194,194]"/> + <constant name="grey77" type="color" value="[196,196,196]"/> + <constant name="grey78" type="color" value="[199,199,199]"/> + <constant name="grey79" type="color" value="[201,201,201]"/> + <constant name="grey80" type="color" value="[204,204,204]"/> + <constant name="grey81" type="color" value="[207,207,207]"/> + <constant name="grey82" type="color" value="[209,209,209]"/> + <constant name="grey83" type="color" value="[212,212,212]"/> + <constant name="grey84" type="color" value="[214,214,214]"/> + <constant name="grey85" type="color" value="[217,217,217]"/> + <constant name="grey86" type="color" value="[219,219,219]"/> + <constant name="grey87" type="color" value="[222,222,222]"/> + <constant name="grey88" type="color" value="[224,224,224]"/> + <constant name="grey89" type="color" value="[227,227,227]"/> + <constant name="grey90" type="color" value="[229,229,229]"/> + <constant name="grey91" type="color" value="[232,232,232]"/> + <constant name="grey92" type="color" value="[235,235,235]"/> + <constant name="grey93" type="color" value="[237,237,237]"/> + <constant name="grey94" type="color" value="[240,240,240]"/> + <constant name="grey95" type="color" value="[242,242,242]"/> + <constant name="grey96" type="color" value="[245,245,245]"/> + <constant name="grey97" type="color" value="[247,247,247]"/> + <constant name="grey98" type="color" value="[250,250,250]"/> + <constant name="grey99" type="color" value="[252,252,252]"/> + <constant name="grey" type="color" value="[190,190,190]"/> + <constant name="honeydew1" type="color" value="[240,255,240]"/> + <constant name="honeydew2" type="color" value="[224,238,224]"/> + <constant name="honeydew3" type="color" value="[193,205,193]"/> + <constant name="honeydew4" type="color" value="[131,139,131]"/> + <constant name="honeydew" type="color" value="[240,255,240]"/> + <constant name="ivory1" type="color" value="[255,255,240]"/> + <constant name="ivory2" type="color" value="[238,238,224]"/> + <constant name="ivory3" type="color" value="[205,205,193]"/> + <constant name="ivory4" type="color" value="[139,139,131]"/> + <constant name="ivory" type="color" value="[255,255,240]"/> + <constant name="khaki1" type="color" value="[255,246,143]"/> + <constant name="khaki2" type="color" value="[238,230,133]"/> + <constant name="khaki3" type="color" value="[205,198,115]"/> + <constant name="khaki" type="color" value="[240,230,140]"/> + <constant name="lavender" type="color" value="[230,230,250]"/> + <constant name="linen" type="color" value="[250,240,230]"/> + <constant name="magenta1" type="color" value="[255,0,255]"/> + <constant name="magenta2" type="color" value="[238,0,238]"/> + <constant name="magenta3" type="color" value="[205,0,205]"/> + <constant name="magenta4" type="color" value="[139,0,139]"/> + <constant name="magenta" type="color" value="[255,0,255]"/> + <constant name="maroon1" type="color" value="[255,52,179]"/> + <constant name="maroon2" type="color" value="[238,48,167]"/> + <constant name="maroon3" type="color" value="[205,41,144]"/> + <constant name="maroon" type="color" value="[176,48,96]"/> + <constant name="moccasin" type="color" value="[255,228,181]"/> + <constant name="olive" type="color" value="[128,128,0]"/> + <constant name="orange" type="color" value="[255,165,0]"/> + <constant name="orchid1" type="color" value="[255,131,250]"/> + <constant name="orchid2" type="color" value="[238,122,233]"/> + <constant name="orchid3" type="color" value="[205,105,201]"/> + <constant name="orchid4" type="color" value="[139,71,137]"/> + <constant name="orchid" type="color" value="[218,112,214]"/> + <constant name="peru" type="color" value="[205,133,63]"/> + <constant name="pink1" type="color" value="[255,181,197]"/> + <constant name="pink2" type="color" value="[238,169,184]"/> + <constant name="pink3" type="color" value="[205,145,158]"/> + <constant name="pink4" type="color" value="[139,99,108]"/> + <constant name="pink" type="color" value="[255,192,203]"/> + <constant name="plum1" type="color" value="[255,187,255]"/> + <constant name="plum2" type="color" value="[238,174,238]"/> + <constant name="plum3" type="color" value="[205,150,205]"/> + <constant name="plum4" type="color" value="[139,102,139]"/> + <constant name="plum" type="color" value="[221,160,221]"/> + <constant name="purple1" type="color" value="[155,48,255]"/> + <constant name="purple2" type="color" value="[145,44,238]"/> + <constant name="purple3" type="color" value="[125,38,205]"/> + <constant name="purple" type="color" value="[160,32,240]"/> + <constant name="red" type="color" value="[255,0,0]"/> + <constant name="salmon1" type="color" value="[255,140,105]"/> + <constant name="salmon" type="color" value="[250,128,114]"/> + <constant name="seashell1" type="color" value="[255,245,238]"/> + <constant name="seashell2" type="color" value="[238,229,222]"/> + <constant name="seashell3" type="color" value="[205,197,191]"/> + <constant name="seashell4" type="color" value="[139,134,130]"/> + <constant name="seashell" type="color" value="[255,245,238]"/> + <constant name="sienna" type="color" value="[160,82,45]"/> + <constant name="silver" type="color" value="[192,192,192]"/> + <constant name="snow1" type="color" value="[255,250,250]"/> + <constant name="snow2" type="color" value="[238,233,233]"/> + <constant name="snow3" type="color" value="[205,201,201]"/> + <constant name="snow4" type="color" value="[139,137,137]"/> + <constant name="snow" type="color" value="[255,250,250]"/> + <constant name="tan" type="color" value="[210,180,140]"/> + <constant name="thistle1" type="color" value="[255,225,255]"/> + <constant name="thistle2" type="color" value="[238,210,238]"/> + <constant name="thistle3" type="color" value="[205,181,205]"/> + <constant name="thistle4" type="color" value="[139,123,139]"/> + <constant name="thistle" type="color" value="[216,191,216]"/> + <constant name="tomato" type="color" value="[255,99,71]"/> + <constant name="violet" type="color" value="[238,130,238]"/> + <constant name="wheat1" type="color" value="[255,231,186]"/> + <constant name="wheat2" type="color" value="[238,216,174]"/> + <constant name="wheat3" type="color" value="[205,186,150]"/> + <constant name="wheat4" type="color" value="[139,126,102]"/> + <constant name="wheat" type="color" value="[245,222,179]"/> + <constant name="white" type="color" value="[255,255,255]"/> + <constant name="yellow" type="color" value="[255,255,0]"/> + </constants> </typesystem> |