summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/xml/XmlParser.cpp46
-rw-r--r--test/plugins/xml/XmlParserTest.cpp2
-rw-r--r--testdata/xmlparser/generic.oxm246
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>