aboutsummaryrefslogtreecommitdiff
path: root/xsd-frontend
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-03-03 20:10:52 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-03-03 20:10:52 +0200
commit3717fce14ff732658d542c13890b226c8367e272 (patch)
treefea72a29626249bdf2961ae7ce0fb15891ad41cd /xsd-frontend
parente4f4f0bed9befbde2117af6f128d9323be3f1638 (diff)
Resolve anonymous bases in the multi-schema compilation
Also, resolve anonymous specialization arguments (list and union).
Diffstat (limited to 'xsd-frontend')
-rw-r--r--xsd-frontend/parser.cxx28
1 files changed, 28 insertions, 0 deletions
diff --git a/xsd-frontend/parser.cxx b/xsd-frontend/parser.cxx
index d40cda2..b9c76d2 100644
--- a/xsd-frontend/parser.cxx
+++ b/xsd-frontend/parser.cxx
@@ -599,6 +599,8 @@ namespace XSDFrontend
valid_ = false;
}
}
+
+ Traversal::List::traverse (l);
}
Void
@@ -638,6 +640,8 @@ namespace XSDFrontend
u.context ().remove ("union-member-types");
}
+
+ Traversal::Union::traverse (u);
}
Void
@@ -1979,9 +1983,11 @@ namespace XSDFrontend
Traversal::Names names;
Traversal::Inherits inherits;
+ Traversal::Argumented argumented;
resolver >> names >> resolver;
names >> anonymous_member;
resolver >> inherits >> anonymous_base;
+ resolver >> argumented >> anonymous_base;
if (trace_)
wcout << "starting resolution pass" << endl;
@@ -2201,12 +2207,34 @@ namespace XSDFrontend
Traversal::Belongs belongs_;
} anonymous_member (resolver);
+ struct AnonymousBase: Traversal::Type
+ {
+ AnonymousBase (Traversal::NodeDispatcherBase& d)
+ : base_ (d)
+ {
+ }
+
+ virtual Void
+ traverse (SemanticGraph::Type& t)
+ {
+ if (!t.named ())
+ base_.dispatch (t);
+ }
+
+ private:
+ Traversal::NodeDispatcherBase& base_;
+ } anonymous_base (resolver);
+
ns_names >> resolver;
ns_names >> anonymous_member;
Traversal::Names names;
+ Traversal::Inherits inherits;
+ Traversal::Argumented argumented;
resolver >> names >> resolver;
names >> anonymous_member;
+ resolver >> inherits >> anonymous_base;
+ resolver >> argumented >> anonymous_base;
if (trace_)
wcout << "starting resolution pass" << endl;