From 4c408a85759eb42b6b84b8cdab81453df31cd289 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 15 Dec 2011 13:09:25 +0200 Subject: Register substituting anonymous types with polymorphic maps --- tests/cxx/tree/polymorphism/ostream/makefile | 2 +- tests/cxx/tree/polymorphism/ostream/output | 5 +++ tests/cxx/tree/polymorphism/ostream/test.xml | 13 ++++--- tests/cxx/tree/polymorphism/ostream/test.xsd | 18 ++++++++- xsd/cxx/tree/elements.cxx | 26 +++++++++++++ xsd/cxx/tree/elements.hxx | 6 +++ xsd/cxx/tree/serialization-source.cxx | 16 ++++++-- xsd/cxx/tree/stream-extraction-source.cxx | 16 ++++++-- xsd/cxx/tree/stream-insertion-source.cxx | 16 ++++++-- xsd/cxx/tree/stream-source.cxx | 16 ++++++-- xsd/cxx/tree/tree-source.cxx | 56 ++++++++++++++++++++++------ 11 files changed, 153 insertions(+), 37 deletions(-) diff --git a/tests/cxx/tree/polymorphism/ostream/makefile b/tests/cxx/tree/polymorphism/ostream/makefile index c6dd0b0..777d716 100644 --- a/tests/cxx/tree/polymorphism/ostream/makefile +++ b/tests/cxx/tree/polymorphism/ostream/makefile @@ -35,7 +35,7 @@ gen := $(addprefix $(out_base)/,$(genf)) $(gen): xsd := $(out_root)/xsd/xsd $(gen): xsd_options := --generate-polymorphic --polymorphic-type-all \ ---generate-ostream +--root-element root --generate-ostream $(gen): $(out_root)/xsd/xsd $(call include-dep,$(dep)) diff --git a/tests/cxx/tree/polymorphism/ostream/output b/tests/cxx/tree/polymorphism/ostream/output index bf0e814..e7fbd68 100644 --- a/tests/cxx/tree/polymorphism/ostream/output +++ b/tests/cxx/tree/polymorphism/ostream/output @@ -11,3 +11,8 @@ a: a fund: 1 c: c1 c: c2 +base: +a: a +fund: 1 +d: d1 +d: d2 diff --git a/tests/cxx/tree/polymorphism/ostream/test.xml b/tests/cxx/tree/polymorphism/ostream/test.xml index 157e15c..5409d2a 100644 --- a/tests/cxx/tree/polymorphism/ostream/test.xml +++ b/tests/cxx/tree/polymorphism/ostream/test.xml @@ -1,9 +1,10 @@ - + a1 - a1b - a1c1c2 + a1b + a1c1c2 + a1d1d2 - + diff --git a/tests/cxx/tree/polymorphism/ostream/test.xsd b/tests/cxx/tree/polymorphism/ostream/test.xsd index cc1f7a8..ddeaeae 100644 --- a/tests/cxx/tree/polymorphism/ostream/test.xsd +++ b/tests/cxx/tree/polymorphism/ostream/test.xsd @@ -1,5 +1,6 @@ - + @@ -7,6 +8,7 @@ + @@ -28,9 +30,21 @@ + + + + + + + + + + + + - + diff --git a/xsd/cxx/tree/elements.cxx b/xsd/cxx/tree/elements.cxx index 3c59e6a..0b69fff 100644 --- a/xsd/cxx/tree/elements.cxx +++ b/xsd/cxx/tree/elements.cxx @@ -622,6 +622,32 @@ namespace CXX return t.context ().get ("polymorphic"); } + Boolean Context:: + anonymous_substitutes_p (SemanticGraph::Type& t) + { + // ID/IDREF templates cannot match. + // + if (!t.named_p () && + (t.is_a () || + t.is_a ())) + return false; + + // See which elements this type classifies. + // + for (SemanticGraph::Type::ClassifiesIterator i (t.classifies_begin ()), + e (t.classifies_end ()); i != e; ++i) + { + if (SemanticGraph::Element* e = + dynamic_cast (&i->instance ())) + { + if (e->substitutes_p ()) + return true; + } + } + + return false; + } + // GenerateDefautCtor // GenerateDefaultCtor:: diff --git a/xsd/cxx/tree/elements.hxx b/xsd/cxx/tree/elements.hxx index 4977045..369dc3a 100644 --- a/xsd/cxx/tree/elements.hxx +++ b/xsd/cxx/tree/elements.hxx @@ -170,6 +170,12 @@ namespace CXX return t.context ().count ("anonymous"); } + // Return true if this anonymous type is defined in an element + // that belongs to a substitution group. + // + Boolean + anonymous_substitutes_p (SemanticGraph::Type&); + // Escaped names. // public: diff --git a/xsd/cxx/tree/serialization-source.cxx b/xsd/cxx/tree/serialization-source.cxx index 6519d32..05588bd 100644 --- a/xsd/cxx/tree/serialization-source.cxx +++ b/xsd/cxx/tree/serialization-source.cxx @@ -91,7 +91,9 @@ namespace CXX << "l << static_cast< const " << base << "& > (i);" << "}"; - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) { @@ -171,7 +173,9 @@ namespace CXX << "l << static_cast< const " << base << "& > (i);" << "}"; - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) { @@ -253,7 +257,9 @@ namespace CXX << "}"; - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) { @@ -805,7 +811,9 @@ namespace CXX os << "}"; } - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) { diff --git a/xsd/cxx/tree/stream-extraction-source.cxx b/xsd/cxx/tree/stream-extraction-source.cxx index c2bbeb0..e1d1679 100644 --- a/xsd/cxx/tree/stream-extraction-source.cxx +++ b/xsd/cxx/tree/stream-extraction-source.cxx @@ -61,7 +61,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && + polymorphic_p (l) && + (!anonymous_p (l) || anonymous_substitutes_p (l))) { // Note that we are using the original type name. // @@ -129,7 +131,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && + polymorphic_p (u) && + (!anonymous_p (u) || anonymous_substitutes_p (u))) { // Note that we are using the original type name. // @@ -222,7 +226,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && + polymorphic_p (e) && + (!anonymous_p (e) || anonymous_substitutes_p (e))) { // Note that we are using the original type name. // @@ -656,7 +662,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && + polymorphic_p (c) && + (!anonymous_p (c) || anonymous_substitutes_p (c))) { // Note that we are using the original type name. // diff --git a/xsd/cxx/tree/stream-insertion-source.cxx b/xsd/cxx/tree/stream-insertion-source.cxx index 9af8a33..00d9ae2 100644 --- a/xsd/cxx/tree/stream-insertion-source.cxx +++ b/xsd/cxx/tree/stream-insertion-source.cxx @@ -60,7 +60,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && + polymorphic_p (l) && + (!anonymous_p (l) || anonymous_substitutes_p (l))) { // Note that we are using the original type name. // @@ -128,7 +130,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && + polymorphic_p (u) && + (!anonymous_p (u) || anonymous_substitutes_p (u))) { // Note that we are using the original type name. // @@ -215,7 +219,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && + polymorphic_p (e) && + (!anonymous_p (e) || anonymous_substitutes_p (e))) { // Note that we are using the original type name. // @@ -436,7 +442,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && + polymorphic_p (c) && + (!anonymous_p (c) || anonymous_substitutes_p (c))) { // Note that we are using the original type name. // diff --git a/xsd/cxx/tree/stream-source.cxx b/xsd/cxx/tree/stream-source.cxx index 7c4954c..1d4b5d9 100644 --- a/xsd/cxx/tree/stream-source.cxx +++ b/xsd/cxx/tree/stream-source.cxx @@ -52,7 +52,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && + polymorphic_p (l) && + (!anonymous_p (l) || anonymous_substitutes_p (l))) { // Note that we are using the original type name. // @@ -107,7 +109,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && + polymorphic_p (u) && + (!anonymous_p (u) || anonymous_substitutes_p (u))) { // Note that we are using the original type name. // @@ -185,7 +189,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && + polymorphic_p (e) && + (!anonymous_p (e) || anonymous_substitutes_p (e))) { // Note that we are using the original type name. // @@ -380,7 +386,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && + polymorphic_p (c) && + (!anonymous_p (c) || anonymous_substitutes_p (c))) { // Note that we are using the original type name. // diff --git a/xsd/cxx/tree/tree-source.cxx b/xsd/cxx/tree/tree-source.cxx index d322027..c20876b 100644 --- a/xsd/cxx/tree/tree-source.cxx +++ b/xsd/cxx/tree/tree-source.cxx @@ -105,13 +105,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && polymorphic_p (l)) { // Note that we are using the original type name. // String const& name (ename (l)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (l) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -119,13 +123,17 @@ namespace CXX << strlit (l.name ()) << "," << endl << strlit (xml_ns_name (l)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (l) || anonymous_substitutes_p (l)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } } @@ -212,13 +220,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && polymorphic_p (u)) { // Note that we are using the original type name. // String const& name (ename (u)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (u) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -226,13 +238,17 @@ namespace CXX << strlit (u.name ()) << "," << endl << strlit (xml_ns_name (u)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (u) || anonymous_substitutes_p (u)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } } }; @@ -504,13 +520,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && polymorphic_p (e)) { // Note that we are using the original type name. // String const& name (ename (e)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (e) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -518,13 +538,17 @@ namespace CXX << strlit (e.name ()) << "," << endl << strlit (xml_ns_name (e)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (e) || anonymous_substitutes_p (e)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } } @@ -3057,13 +3081,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && polymorphic_p (c)) { // Note that we are using the original type name. // String const& name (ename (c)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (c) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -3071,13 +3099,17 @@ namespace CXX << strlit (c.name ()) << "," << endl << strlit (xml_ns_name (c)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (c) || anonymous_substitutes_p (c)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } // Comparison operators. -- cgit v1.1