diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-08-19 17:05:24 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-08-19 17:05:24 +0200 |
commit | 2b02d443ab344bc02dfc2891fb1a57c6520c393f (patch) | |
tree | 3bff59757b0ef986d70c67def93d689fb18a5b66 /odb/parser.cxx | |
parent | 33cd64535d2307a2e7884ee0796e1aae42937aaf (diff) |
Use type names as specified in the header that we compile
Diffstat (limited to 'odb/parser.cxx')
-rw-r--r-- | odb/parser.cxx | 36 |
1 files changed, 31 insertions, 5 deletions
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 <odb/gcc.hxx> // Keep it first. #include <set> +#include <map> #include <string> #include <cassert> #include <sstream> @@ -49,6 +50,7 @@ private: }; typedef multiset<tree_decl> decl_set; + typedef map<tree, names*> 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<data_member> (file, line, clmn)); - unit_->new_edge<belongs> (member_node, type_node); unit_->new_edge<names> (*c_node, member_node, name, a); + belongs& edge (unit_->new_edge<belongs> (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<data_member> (file, line, clmn)); - unit_->new_edge<belongs> (member_node, type_node); unit_->new_edge<names> (*u_node, member_node, name, a); + belongs& edge (unit_->new_edge<belongs> (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<typedefs> (*scope_, node, name); + typedefs& edge (unit_->new_edge<typedefs> (*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; |