From 2b02d443ab344bc02dfc2891fb1a57c6520c393f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 19 Aug 2010 17:05:24 +0200 Subject: Use type names as specified in the header that we compile --- odb/parser.cxx | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'odb/parser.cxx') diff --git a/odb/parser.cxx b/odb/parser.cxx index 1f7ba46..59c1046 100644 --- a/odb/parser.cxx +++ b/odb/parser.cxx @@ -6,6 +6,7 @@ #include // Keep it first. #include +#include #include #include #include @@ -49,6 +50,7 @@ private: }; typedef multiset decl_set; + typedef map name_hint_map; private: void @@ -149,6 +151,7 @@ private: size_t error_; decl_set decls_; + name_hint_map name_hints_; }; bool parser::impl::tree_decl:: @@ -376,8 +379,15 @@ emit_class (tree c, path const& file, size_t line, size_t clmn, bool stub) data_member& member_node ( unit_->new_node (file, line, clmn)); - unit_->new_edge (member_node, type_node); unit_->new_edge (*c_node, member_node, name, a); + belongs& edge (unit_->new_edge (member_node, type_node)); + + // See if there is a name hint for this type. + // + name_hint_map::const_iterator it (name_hints_.find (t)); + + if (it != name_hints_.end ()) + edge.hint (*it->second); if (trace) { @@ -514,8 +524,15 @@ emit_union (tree u, path const& file, size_t line, size_t clmn, bool stub) data_member& member_node ( unit_->new_node (file, line, clmn)); - unit_->new_edge (member_node, type_node); unit_->new_edge (*u_node, member_node, name, a); + belongs& edge (unit_->new_edge (member_node, type_node)); + + // See if there is a name hint for this type. + // + name_hint_map::const_iterator it (name_hints_.find (t)); + + if (it != name_hints_.end ()) + edge.hint (*it->second); if (trace) { @@ -868,15 +885,24 @@ emit_type_decl (tree decl) size_t c (DECL_SOURCE_COLUMN (decl)); type& node (emit_type (t, f, l, c)); - unit_->new_edge (*scope_, node, name); + typedefs& edge (unit_->new_edge (*scope_, node, name)); + + if (name_hints_.find (t) != name_hints_.end ()) + { + cerr << f << ':' << l << ':' << c << ": ice: " + << " name hint already exist for tree node"; + + throw failed (); + } + + name_hints_[t] = &edge; if (trace) { string s (emit_type_name (t, false)); ts << "typedef " << s << " (" << &node << ") -> " << name << " at " - << DECL_SOURCE_FILE (decl) << ":" - << DECL_SOURCE_LINE (decl) << endl; + << f << ":" << l << endl; } return 0; -- cgit v1.1