summaryrefslogtreecommitdiff
path: root/cpp/src/slice2cpp/Gen.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2009-01-27 19:28:59 +0100
committerJose <jose@zeroc.com>2009-01-27 19:28:59 +0100
commit55f6e6863b8f17312e8ff58d05d6d035c822187b (patch)
tree787029a35e03a48456d1ed3cb8cc5965d0657319 /cpp/src/slice2cpp/Gen.cpp
parentAdded missing libs (diff)
downloadice-55f6e6863b8f17312e8ff58d05d6d035c822187b.tar.bz2
ice-55f6e6863b8f17312e8ff58d05d6d035c822187b.tar.xz
ice-55f6e6863b8f17312e8ff58d05d6d035c822187b.zip
Squashed commit of the following:
commit 9aa67a8862e402cb52276282b26a40422fae4adb Author: Jose Gutierrez <jose@zeroc.com> Date: Tue Jan 27 19:25:22 2009 +0100 Fixed 3374 --header-ext not work as intended.
Diffstat (limited to 'cpp/src/slice2cpp/Gen.cpp')
-rw-r--r--cpp/src/slice2cpp/Gen.cpp132
1 files changed, 104 insertions, 28 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index d442b2a7586..51ea19f40d2 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -15,11 +15,14 @@
#include <IceUtil/Iterator.h>
#include <Slice/Checksum.h>
#include <Slice/FileTracker.h>
+#include <Slice/Preprocessor.h>
#include <limits>
#include <sys/stat.h>
-#include <string.h>
+#include <string.h>
+
+#include <iostream> //TODO
using namespace std;
using namespace Slice;
@@ -44,11 +47,13 @@ Slice::Gen::Gen(const string& base, const string& headerExtension, const string&
bool imp, bool checksum, bool stream, bool ice) :
_base(base),
_headerExtension(headerExtension),
+ _implHeaderExtension(headerExtension),
_sourceExtension(sourceExtension),
_extraHeaders(extraHeaders),
_include(include),
_includePaths(includePaths),
_dllExport(dllExport),
+ _dir(dir),
_impl(imp),
_checksum(checksum),
_stream(stream),
@@ -64,15 +69,41 @@ Slice::Gen::Gen(const string& base, const string& headerExtension, const string&
{
_base.erase(0, pos + 1);
}
+}
+
+Slice::Gen::~Gen()
+{
+ H << "\n\n#endif\n";
+ C << '\n';
+
+ if(_impl)
+ {
+ implH << "\n\n#endif\n";
+ implC << '\n';
+ }
+}
+
+void
+Slice::Gen::generate(const UnitPtr& p)
+{
+
+ //
+ // Check the header-ext global meta data if is not empty we override _headerExtension
+ //
+ string headerExtension = getHeaderExt(p->modules());
+ if(!headerExtension.empty())
+ {
+ _headerExtension = headerExtension;
+ }
if(_impl)
{
- string fileImplH = _base + "I." + _headerExtension;
+ string fileImplH = _base + "I." + _implHeaderExtension;
string fileImplC = _base + "I." + _sourceExtension;
- if(!dir.empty())
+ if(!_dir.empty())
{
- fileImplH = dir + '/' + fileImplH;
- fileImplC = dir + '/' + fileImplC;
+ fileImplH = _dir + '/' + fileImplH;
+ fileImplC = _dir + '/' + fileImplC;
}
struct stat st;
@@ -120,10 +151,10 @@ Slice::Gen::Gen(const string& base, const string& headerExtension, const string&
string fileH = _base + "." + _headerExtension;
string fileC = _base + "." + _sourceExtension;
- if(!dir.empty())
+ if(!_dir.empty())
{
- fileH = dir + '/' + fileH;
- fileC = dir + '/' + fileC;
+ fileH = _dir + '/' + fileH;
+ fileC = _dir + '/' + fileC;
}
H.open(fileH.c_str());
@@ -158,23 +189,7 @@ Slice::Gen::Gen(const string& base, const string& headerExtension, const string&
H << "\n#ifndef __" << s << "__";
H << "\n#define __" << s << "__";
H << '\n';
-}
-
-Slice::Gen::~Gen()
-{
- H << "\n\n#endif\n";
- C << '\n';
-
- if(_impl)
- {
- implH << "\n\n#endif\n";
- implC << '\n';
- }
-}
-void
-Slice::Gen::generate(const UnitPtr& p)
-{
validateMetaData(p);
writeExtraHeaders(C);
@@ -193,6 +208,7 @@ Slice::Gen::generate(const UnitPtr& p)
}
C << _base << "." << _headerExtension << ">";
+
H << "\n#include <Ice/LocalObjectF.h>";
H << "\n#include <Ice/ProxyF.h>";
H << "\n#include <Ice/ObjectF.h>";
@@ -224,6 +240,7 @@ Slice::Gen::generate(const UnitPtr& p)
}
else if(p->hasNonLocalClassDecls())
{
+
H << "\n#include <Ice/Object.h>";
}
@@ -274,7 +291,12 @@ Slice::Gen::generate(const UnitPtr& p)
for(StringList::const_iterator q = includes.begin(); q != includes.end(); ++q)
{
- H << "\n#include <" << changeInclude(*q, _includePaths) << "." << _headerExtension << ">";
+ string extension = getHeaderExt((*q), p->modules());
+ if(extension.empty())
+ {
+ extension = _headerExtension;
+ }
+ H << "\n#include <" << changeInclude(*q, _includePaths) << "." << extension << ">";
}
H << "\n#include <Ice/UndefSysMacros.h>";
@@ -339,7 +361,7 @@ Slice::Gen::generate(const UnitPtr& p)
{
implH << _include << '/';
}
- implH << _base << ".h>";
+ implH << _base << "." << _headerExtension << ">";
writeExtraHeaders(implC);
@@ -348,7 +370,7 @@ Slice::Gen::generate(const UnitPtr& p)
{
implC << _include << '/';
}
- implC << _base << "I.h>";
+ implC << _base << "I." << _implHeaderExtension << ">";
ImplVisitor implVisitor(implH, implC, _dllExport);
p->visit(&implVisitor, false);
@@ -5641,6 +5663,8 @@ Slice::Gen::MetaDataVisitor::visitModuleStart(const ModulePtr& p)
StringList globalMetaData = dc->getMetaData();
string file = dc->filename();
static const string prefix = "cpp:";
+
+ int headerExtension = 0;
for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q)
{
string s = *q;
@@ -5653,7 +5677,15 @@ Slice::Gen::MetaDataVisitor::visitModuleStart(const ModulePtr& p)
{
continue;
}
- cerr << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
+ else if(ss.find("header-ext:") == 0)
+ {
+ headerExtension++;
+ if(headerExtension == 1)
+ {
+ continue;
+ }
+ }
+ cerr << file << ": warning: ignoring invalid global metadata `" << s << "', the cpp:header-ext global metadata can only appear once per file." << endl;
}
_history.insert(s);
}
@@ -5866,3 +5898,47 @@ Slice::Gen::resetUseWstring(list<bool>& hist)
hist.pop_back();
return use;
}
+
+string
+Slice::Gen::getHeaderExt(const string& file, const ModuleList& modules)
+{
+ string ext = "";
+ if(!modules.empty()) // Just in case the Slice file has no definitions
+ {
+ for(ModuleList::const_iterator i = modules.begin(); i != modules.end(); ++i)
+ {
+ if((*i)->definitionContext()->filename() == file)
+ {
+ string meta = (*i)->definitionContext()->findMetaData("cpp:header-ext");
+ string::size_type index = meta.find_last_of(":");
+ if(index != string::npos && index + 1 < meta.size())
+ {
+ ext = meta.substr(index + 1, meta.size() - index - 1);
+ }
+ }
+ }
+ }
+ return ext;
+}
+
+string
+Slice::Gen::getHeaderExt(const ModuleList& modules)
+{
+ string ext = "";
+ if(!modules.empty()) // Just in case the Slice file has no definitions
+ {
+ for(ModuleList::const_iterator i = modules.begin(); i != modules.end(); ++i)
+ {
+ if((*i)->definitionContext()->includeLevel() == 0)
+ {
+ string meta = (*i)->definitionContext()->findMetaData("cpp:header-ext");
+ string::size_type index = meta.find_last_of(":");
+ if(index != string::npos && index + 1 < meta.size())
+ {
+ ext = meta.substr(index + 1, meta.size() - index - 1);
+ }
+ }
+ }
+ }
+ return ext;
+}