diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2006-02-09 13:46:29 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2006-02-09 13:46:29 +0000 |
commit | 70a31bfd6d76baf43d2927c9b8e1962545624a86 (patch) | |
tree | cddd24c7ab8c9dcb7ae1e6eb95678dfcaaba38ad /cpp/src/slice2cppe | |
parent | Workaround for Sun compiler issues (diff) | |
download | ice-70a31bfd6d76baf43d2927c9b8e1962545624a86.tar.bz2 ice-70a31bfd6d76baf43d2927c9b8e1962545624a86.tar.xz ice-70a31bfd6d76baf43d2927c9b8e1962545624a86.zip |
Use metadata to specify includes
Diffstat (limited to 'cpp/src/slice2cppe')
-rw-r--r-- | cpp/src/slice2cppe/Gen.cpp | 38 | ||||
-rw-r--r-- | cpp/src/slice2cppe/Gen.h | 15 |
2 files changed, 53 insertions, 0 deletions
diff --git a/cpp/src/slice2cppe/Gen.cpp b/cpp/src/slice2cppe/Gen.cpp index 52d18fddce3..64507411689 100644 --- a/cpp/src/slice2cppe/Gen.cpp +++ b/cpp/src/slice2cppe/Gen.cpp @@ -249,6 +249,9 @@ Slice::Gen::generate(const UnitPtr& p) H << "\n#include <IceE/UndefSysMacros.h>"; + GlobalIncludeVisitor globalIncludeVisitor(H); + p->visit(&globalIncludeVisitor, false); + printVersionCheck(H); printVersionCheck(C); @@ -336,6 +339,36 @@ Slice::Gen::writeExtraHeaders(Output& out) } } +Slice::Gen::GlobalIncludeVisitor::GlobalIncludeVisitor(Output& h) : + H(h), _finished(false) +{ +} + +bool +Slice::Gen::GlobalIncludeVisitor::visitModuleStart(const ModulePtr& p) +{ + if(!_finished) + { + DefinitionContextPtr dc = p->definitionContext(); + assert(dc); + StringList globalMetaData = dc->getMetaData(); + + static const string includePrefix = "cpp:include:"; + + for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q) + { + string s = *q; + if(s.find(includePrefix) == 0) + { + H << nl << "#include <" << s.substr(includePrefix.size()) << ">"; + } + } + _finished = true; + } + + return false; +} + Slice::Gen::TypesVisitor::TypesVisitor(Output& h, Output& c, const string& dllExport) : H(h), C(c), _dllExport(dllExport), _doneStaticSymbol(false) { @@ -2980,6 +3013,11 @@ Slice::Gen::MetaDataVisitor::visitModuleStart(const ModulePtr& p) { if(s.find(prefix) == 0) { + string ss = s.substr(prefix.size()); + if(ss.find("include:") == 0) + { + continue; + } cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl; } _history.insert(s); diff --git a/cpp/src/slice2cppe/Gen.h b/cpp/src/slice2cppe/Gen.h index b1d9406a7ce..4e446743fe1 100644 --- a/cpp/src/slice2cppe/Gen.h +++ b/cpp/src/slice2cppe/Gen.h @@ -61,6 +61,21 @@ private: std::string _dllExport; bool _impl; + class GlobalIncludeVisitor : private ::IceUtil::noncopyable, public ParserVisitor + { + public: + + GlobalIncludeVisitor(::IceUtil::Output&); + + virtual bool visitModuleStart(const ModulePtr&); + + private: + + ::IceUtil::Output& H; + + bool _finished; + }; + class TypesVisitor : private ::IceUtil::noncopyable, public ParserVisitor { public: |