summaryrefslogtreecommitdiff
path: root/cpp/src/slice2cppe/Gen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2cppe/Gen.cpp')
-rw-r--r--cpp/src/slice2cppe/Gen.cpp214
1 files changed, 115 insertions, 99 deletions
diff --git a/cpp/src/slice2cppe/Gen.cpp b/cpp/src/slice2cppe/Gen.cpp
index ddc010cd38c..69a8279a9fe 100644
--- a/cpp/src/slice2cppe/Gen.cpp
+++ b/cpp/src/slice2cppe/Gen.cpp
@@ -389,7 +389,7 @@ Slice::Gen::TypesVisitor::visitExceptionStart(const ExceptionPtr& p)
for(q = allDataMembers.begin(); q != allDataMembers.end(); ++q)
{
string paramName = fixKwd((*q)->name());
- string typeName = inputTypeToString((*q)->type());
+ string typeName = inputTypeToString((*q)->type(), (*q)->getMetaData());
allTypes.push_back(typeName);
allParamDecls.push_back(typeName + " __ice_" + paramName);
}
@@ -567,17 +567,14 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
H << sp << nl << "virtual void __write(::IceInternal::BasicStream*) const;";
H << nl << "virtual void __read(::IceInternal::BasicStream*, bool);";
-
- TypeStringList memberList;
- for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
- {
- memberList.push_back(make_pair((*q)->type(), (*q)->name()));
- }
C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
C << sb;
C << nl << "__os->write(::std::string(\"" << p->scoped() << "\"));";
C << nl << "__os->startWriteSlice();";
- writeMarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true, (*q)->getMetaData());
+ }
C << nl << "__os->endWriteSlice();";
if(base)
{
@@ -593,7 +590,10 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
C << nl << "__is->read(myId);";
C << eb;
C << nl << "__is->startReadSlice();";
- writeUnmarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true, (*q)->getMetaData());
+ }
C << nl << "__is->endReadSlice();";
if(base)
{
@@ -741,19 +741,20 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
H << sp << nl << _dllExport << "void __write(::IceInternal::BasicStream*) const;";
H << nl << _dllExport << "void __read(::IceInternal::BasicStream*);";
- TypeStringList memberList;
+ C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
+ C << sb;
for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
{
- memberList.push_back(make_pair((*q)->type(), (*q)->name()));
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), true, "", true, (*q)->getMetaData());
}
- C << sp << nl << "void" << nl << scoped.substr(2) << "::__write(::IceInternal::BasicStream* __os) const";
- C << sb;
- writeMarshalCode(C, memberList, 0);
C << eb;
C << sp << nl << "void" << nl << scoped.substr(2) << "::__read(::IceInternal::BasicStream* __is)";
C << sb;
- writeUnmarshalCode(C, memberList, 0);
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ writeMarshalUnmarshalCode(C, (*q)->type(), fixKwd((*q)->name()), false, "", true, (*q)->getMetaData());
+ }
C << eb;
}
@@ -764,7 +765,7 @@ void
Slice::Gen::TypesVisitor::visitDataMember(const DataMemberPtr& p)
{
string name = fixKwd(p->name());
- string s = typeToString(p->type());
+ string s = typeToString(p->type(), p->getMetaData());
H << nl << s << ' ' << name << ';';
}
@@ -774,6 +775,13 @@ Slice::Gen::TypesVisitor::visitSequence(const SequencePtr& p)
string name = fixKwd(p->name());
TypePtr type = p->type();
string s = typeToString(type);
+ StringList metaData = p->getMetaData();
+ string seqType = findMetaData(metaData);
+ if(!seqType.empty())
+ {
+ return;
+ }
+
H << sp << nl << "typedef ::std::vector<" << (s[0] == ':' ? " " : "") << s << "> " << name << ';';
BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
@@ -1264,7 +1272,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
string scope = fixKwd(p->scope());
TypePtr ret = p->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, p->getMetaData());
vector<string> params;
vector<string> paramsDecl;
@@ -1283,7 +1291,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
string typeString;
if((*q)->isOutParam())
{
- typeString = outputTypeToString((*q)->type());
+ typeString = outputTypeToString((*q)->type(), metaData);
}
else
{
@@ -1291,7 +1299,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
}
#else
string typeString = (*q)->isOutParam() ?
- outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData);
+ outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData);
#endif
params.push_back(typeString);
@@ -1467,13 +1475,13 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
string scoped = fixKwd(p->scoped());
TypePtr ret = p->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, p->getMetaData());
vector<string> params;
vector<string> paramsDecl;
ParamDeclList inParams;
- TypeStringList outParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -1485,8 +1493,8 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
string typeString;
if(isOutParam)
{
- outParams.push_back(make_pair(type, paramName));
- typeString = outputTypeToString(type);
+ outParams.push_back(*q);
+ typeString = outputTypeToString(type, metaData);
}
else
{
@@ -1512,12 +1520,7 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
C << nl << "try";
C << sb;
C << nl << "::IceInternal::BasicStream* __os = __out.os();";
- ParamDeclList::const_iterator pli;
- for(pli = inParams.begin(); pli != inParams.end(); ++pli)
- {
- writeMarshalUnmarshalCode(C, (*pli)->type(), fixKwd((*pli)->name()), true, "", true,
- (*pli)->getMetaData());
- }
+ writeMarshalCode(C, inParams, 0);
C << eb;
C << nl << "catch(const ::Ice::LocalException& __ex)";
C << sb;
@@ -1581,8 +1584,8 @@ Slice::Gen::DelegateVisitor::visitOperation(const OperationPtr& p)
C << eb;
C << eb;
- writeAllocateCode(C, TypeStringList(), ret);
- writeUnmarshalCode(C, outParams, ret);
+ writeAllocateCode(C, ParamDeclList(), ret, p->getMetaData());
+ writeUnmarshalCode(C, outParams, ret, p->getMetaData());
if(ret)
{
C << nl << "return __ret;";
@@ -2159,7 +2162,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
string scope = fixKwd(p->scope());
TypePtr ret = p->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, p->getMetaData());
string params = "(";
string paramsDecl = "(";
@@ -2170,7 +2173,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
ParamDeclList inParams;
- TypeStringList outParams;
+ ParamDeclList outParams;
ParamDeclList paramList = p->parameters();
for(ParamDeclList::const_iterator q = paramList.begin(); q != paramList.end(); ++q)
{
@@ -2182,8 +2185,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
string typeString;
if(isOutParam)
{
- outParams.push_back(make_pair(type, paramName));
- typeString = outputTypeToString(type);
+ outParams.push_back(*q);
+ typeString = outputTypeToString(type, metaData);
}
else
{
@@ -2268,16 +2271,8 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << nl << "::IceInternal::BasicStream* __os = __in.os();";
}
- ParamDeclList::const_iterator pli;
- for(pli = inParams.begin(); pli != inParams.end(); ++pli)
- {
- C << nl << typeToString((*pli)->type(), (*pli)->getMetaData()) << ' ' << fixKwd((*pli)->name()) << ';';
- }
- for(pli = inParams.begin(); pli != inParams.end(); ++pli)
- {
- writeMarshalUnmarshalCode(C, (*pli)->type(), fixKwd((*pli)->name()), false, "", true,
- (*pli)->getMetaData());
- }
+ writeAllocateCode(C, inParams, 0);
+ writeUnmarshalCode(C, inParams, 0);
writeAllocateCode(C, outParams, 0);
if(!throws.empty())
{
@@ -2290,7 +2285,7 @@ Slice::Gen::ObjectVisitor::visitOperation(const OperationPtr& p)
C << retS << " __ret = ";
}
C << fixKwd(name) << args << ';';
- writeMarshalCode(C, outParams, ret);
+ writeMarshalCode(C, outParams, ret, p->getMetaData());
if(!throws.empty())
{
C << eb;
@@ -2313,7 +2308,7 @@ void
Slice::Gen::ObjectVisitor::visitDataMember(const DataMemberPtr& p)
{
string name = fixKwd(p->name());
- string s = typeToString(p->type());
+ string s = typeToString(p->type(), p->getMetaData());
H << nl << s << ' ' << name << ';';
}
@@ -2586,7 +2581,7 @@ Slice::Gen::ImplVisitor::writeDecl(Output& out, const string& name, const TypePt
}
void
-Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type)
+Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type, const StringList& metaData)
{
BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
if(builtin)
@@ -2660,7 +2655,7 @@ Slice::Gen::ImplVisitor::writeReturn(Output& out, const TypePtr& type)
SequencePtr seq = SequencePtr::dynamicCast(type);
if(seq)
{
- out << nl << "return " << fixKwd(seq->scoped()) << "();";
+ out << nl << "return " << typeToString(seq, metaData) << "();";
}
else
{
@@ -2748,7 +2743,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
string opName = op->name();
TypePtr ret = op->returnType();
- string retS = returnTypeToString(ret);
+ string retS = returnTypeToString(ret, op->getMetaData());
H << sp << nl << "virtual " << retS << ' ' << fixKwd(opName) << '(';
H.useCurrentPosAsIndent();
@@ -2769,7 +2764,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
string typeString;
if((*q)->isOutParam())
{
- typeString = outputTypeToString((*q)->type());
+ typeString = outputTypeToString((*q)->type(), metaData);
}
else
{
@@ -2777,7 +2772,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
}
#else
string typeString = (*q)->isOutParam() ?
- outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData);
+ outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData);
#endif
H << typeString;
}
@@ -2813,7 +2808,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
string typeString;
if((*q)->isOutParam())
{
- typeString = outputTypeToString((*q)->type());
+ typeString = outputTypeToString((*q)->type(), metaData);
}
else
{
@@ -2821,7 +2816,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
}
#else
string typeString = (*q)->isOutParam() ?
- outputTypeToString((*q)->type()) : inputTypeToString((*q)->type(), metaData);
+ outputTypeToString((*q)->type(), metaData) : inputTypeToString((*q)->type(), metaData);
#endif
C << typeString << ' ' << fixKwd((*q)->name());
}
@@ -2840,7 +2835,7 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
if(ret)
{
- writeReturn(C, ret);
+ writeReturn(C, ret, op->getMetaData());
}
C << eb;
@@ -2854,7 +2849,28 @@ Slice::Gen::ImplVisitor::visitClassDefStart(const ClassDefPtr& p)
bool
Slice::Gen::MetaDataVisitor::visitModuleStart(const ModulePtr& p)
{
- validate(p);
+ //
+ // Validate global metadata.
+ //
+ DefinitionContextPtr dc = p->definitionContext();
+ assert(dc);
+ StringList globalMetaData = dc->getMetaData();
+ string file = dc->filename();
+ static const string prefix = "cpp:";
+ for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q)
+ {
+ string s = *q;
+ if(_history.count(s) == 0)
+ {
+ if(s.find(prefix) == 0)
+ {
+ cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
+ }
+ _history.insert(s);
+ }
+ }
+
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2866,13 +2882,13 @@ Slice::Gen::MetaDataVisitor::visitModuleEnd(const ModulePtr&)
void
Slice::Gen::MetaDataVisitor::visitClassDecl(const ClassDeclPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
bool
Slice::Gen::MetaDataVisitor::visitClassDefStart(const ClassDefPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2884,7 +2900,7 @@ Slice::Gen::MetaDataVisitor::visitClassDefEnd(const ClassDefPtr&)
bool
Slice::Gen::MetaDataVisitor::visitExceptionStart(const ExceptionPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2896,7 +2912,7 @@ Slice::Gen::MetaDataVisitor::visitExceptionEnd(const ExceptionPtr&)
bool
Slice::Gen::MetaDataVisitor::visitStructStart(const StructPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
return true;
}
@@ -2908,72 +2924,78 @@ Slice::Gen::MetaDataVisitor::visitStructEnd(const StructPtr&)
void
Slice::Gen::MetaDataVisitor::visitOperation(const OperationPtr& p)
{
- validate(p);
+ StringList metaData = p->getMetaData();
+ TypePtr returnType = p->returnType();
+ if(!metaData.empty())
+ {
+ if(!returnType)
+ {
+ for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q)
+ {
+ if(q->find("cpp:type:", 0) == 0)
+ {
+ cout << p->definitionContext()->filename() << ":" << p->line()
+ << ": warning: invalid metadata for operation" << endl;
+ break;
+ }
+ }
+ }
+ else
+ {
+ validate(returnType, metaData, p->definitionContext()->filename(), p->line());
+ }
+ }
+
+ ParamDeclList params = p->parameters();
+ for(ParamDeclList::iterator q = params.begin(); q != params.end(); ++q)
+ {
+ validate((*q)->type(), (*q)->getMetaData(), p->definitionContext()->filename(), (*q)->line());
+ }
}
void
Slice::Gen::MetaDataVisitor::visitParamDecl(const ParamDeclPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitDataMember(const DataMemberPtr& p)
{
- validate(p);
+ validate(p->type(), p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitSequence(const SequencePtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitDictionary(const DictionaryPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitEnum(const EnumPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
Slice::Gen::MetaDataVisitor::visitConst(const ConstPtr& p)
{
- validate(p);
+ validate(p, p->getMetaData(), p->definitionContext()->filename(), p->line());
}
void
-Slice::Gen::MetaDataVisitor::validate(const ContainedPtr& cont)
+Slice::Gen::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const StringList& metaData,
+ const string& file, const string& line)
{
- DefinitionContextPtr dc = cont->definitionContext();
- assert(dc);
- StringList globalMetaData = dc->getMetaData();
- string file = dc->filename();
-
- StringList localMetaData = cont->getMetaData();
- StringList::const_iterator p;
static const string prefix = "cpp:";
-
- for(p = globalMetaData.begin(); p != globalMetaData.end(); ++p)
- {
- string s = *p;
- if(_history.count(s) == 0)
- {
- if(s.find(prefix) == 0)
- {
- cout << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl;
- }
- _history.insert(s);
- }
- }
-
- for(p = localMetaData.begin(); p != localMetaData.end(); ++p)
+ for(StringList::const_iterator p = metaData.begin(); p != metaData.end(); ++p)
{
string s = *p;
if(_history.count(s) == 0)
@@ -2982,19 +3004,13 @@ Slice::Gen::MetaDataVisitor::validate(const ContainedPtr& cont)
{
if(SequencePtr::dynamicCast(cont))
{
- if(s.substr(prefix.size()) == "collection")
- {
- continue;
- }
- }
- if(StructPtr::dynamicCast(cont))
- {
- if(s.substr(prefix.size()) == "class")
+ string ss = s.substr(prefix.size());
+ if(ss.find("type:") == 0)
{
continue;
}
}
- cout << file << ": warning: ignoring invalid metadata `" << s << "'" << endl;
+ cout << file << ":" << line << ": warning: ignoring invalid metadata `" << s << "'" << endl;
}
_history.insert(s);
}