diff options
Diffstat (limited to 'cpp/src/Slice/CsUtil.cpp')
-rw-r--r-- | cpp/src/Slice/CsUtil.cpp | 136 |
1 files changed, 95 insertions, 41 deletions
diff --git a/cpp/src/Slice/CsUtil.cpp b/cpp/src/Slice/CsUtil.cpp index ae8c6e667cc..2f656872638 100644 --- a/cpp/src/Slice/CsUtil.cpp +++ b/cpp/src/Slice/CsUtil.cpp @@ -9,6 +9,7 @@ #include <Slice/CsUtil.h> #include <Slice/DotNetNames.h> +#include <Slice/Util.h> #include <IceUtil/Functional.h> #include <sys/types.h> @@ -213,6 +214,13 @@ Slice::CsGenerator::typeToString(const TypePtr& type) } } + prefix = "clr:serializable:"; + if(seq->findMetaData(prefix, meta)) + { + string type = meta.substr(prefix.size()); + return global() + type; + } + return typeToString(seq->type()) + "[]"; } @@ -887,6 +895,21 @@ Slice::CsGenerator::writeSequenceMarshalUnmarshalCode(Output& out, } default: { + string prefix = "clr:serializable:"; + string meta; + if(seq->findMetaData(prefix, meta)) + { + if(marshal) + { + out << nl << stream << ".writeSerializable(" << param << ");"; + } + else + { + out << nl << param << " = (" << typeToString(seq) << ")" << stream << ".readSerializable();"; + } + break; + } + typeS[0] = toupper(static_cast<unsigned char>(typeS[0])); if(marshal) { @@ -1500,42 +1523,52 @@ Slice::CsGenerator::validateMetaData(const UnitPtr& u) u->visit(&visitor, true); } -Slice::CsGenerator::MetaDataVisitor::MetaDataVisitor() - : _globalMetaDataDone(false) -{ -} - bool -Slice::CsGenerator::MetaDataVisitor::visitModuleStart(const ModulePtr& p) +Slice::CsGenerator::MetaDataVisitor::visitUnitStart(const UnitPtr& p) { - if(!_globalMetaDataDone) + // + // Validate global metadata in the top-level file and all included files. + // + StringList files = p->allFiles(); + + for(StringList::iterator q = files.begin(); q != files.end(); ++q) { - // - // Validate global metadata. - // - DefinitionContextPtr dc = p->definitionContext(); + string file = *q; + DefinitionContextPtr dc = p->findDefinitionContext(file); assert(dc); StringList globalMetaData = dc->getMetaData(); - string file = dc->filename(); - static const string prefix = "cs:"; - for(StringList::const_iterator q = globalMetaData.begin(); q != globalMetaData.end(); ++q) + + static const string csPrefix = "cs:"; + static const string clrPrefix = "clr:"; + for(StringList::const_iterator r = globalMetaData.begin(); r != globalMetaData.end(); ++r) { - string s = *q; + string s = *r; if(_history.count(s) == 0) { - if(s.find(prefix) == 0) + if(s.find(csPrefix) == 0) { - static const string attributePrefix = "cs:attribute:"; - if(s.find(attributePrefix) != 0 || s.size() == attributePrefix.size()) + static const string csAttributePrefix = csPrefix + "attribute:"; + if(s.find(csAttributePrefix) == 0 && s.size() > csAttributePrefix.size()) { - cerr << file << ": warning: ignoring invalid global metadata `" << s << "'" << endl; + continue; } + emitWarning(file, -1, "ignoring invalid global metadata `" + s + "'"); + _history.insert(s); + } + else if(s.find(clrPrefix) == 0) + { + emitWarning(file, -1, "ignoring invalid global metadata `" + s + "'"); + _history.insert(s); } - _history.insert(s); } } - _globalMetaDataDone = true; } + return true; +} + +bool +Slice::CsGenerator::MetaDataVisitor::visitModuleStart(const ModulePtr& p) +{ validate(p); return true; } @@ -1595,13 +1628,20 @@ Slice::CsGenerator::MetaDataVisitor::visitOperation(const OperationPtr& p) ClassDefPtr cl = ClassDefPtr::dynamicCast(p->container()); if(!cl->isLocal()) { - cerr << p->definitionContext()->filename() << ":" << p->line() - << ": warning: metdata directive `UserException' applies only to local operations " - << "but enclosing " << (cl->isInterface() ? "interface" : "class") << "`" << cl->name() - << "' is not local" << endl; + ostringstream os; + os << "ignoring invalid metadata `UserException': directive applies only to local operations " + << "but enclosing " << (cl->isInterface() ? "interface" : "class") << "`" << cl->name() + << "' is not local"; + emitWarning(p->file(), p->line(), os.str()); } } validate(p); + + ParamDeclList params = p->parameters(); + for(ParamDeclList::const_iterator i = params.begin(); i != params.end(); ++i) + { + visitParamDecl(*i); + } } void @@ -1645,15 +1685,9 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) { const string msg = "ignoring invalid metadata"; - DefinitionContextPtr dc = cont->definitionContext(); - assert(dc); - string file = dc->filename(); - StringList localMetaData = cont->getMetaData(); - StringList::const_iterator p; - - for(p = localMetaData.begin(); p != localMetaData.end(); ++p) + for(StringList::const_iterator p = localMetaData.begin(); p != localMetaData.end(); ++p) { string s = *p; @@ -1669,9 +1703,10 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) { continue; } - if(s.substr(prefix.size(), 8) == "generic:") + static const string clrGenericPrefix = prefix + "generic:"; + if(s.find(clrGenericPrefix) == 0) { - string type = s.substr(prefix.size() + 8); + string type = s.substr(clrGenericPrefix.size()); if(type == "LinkedList" || type == "Queue" || type == "Stack") { ClassDeclPtr cd = ClassDeclPtr::dynamicCast(seq->type()); @@ -1686,6 +1721,23 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) continue; // Custom type or List<T> } } + static const string clrSerializablePrefix = prefix + "serializable:"; + if(s.find(clrSerializablePrefix) == 0) + { + string meta; + if(cont->findMetaData(prefix + "collection", meta) + || cont->findMetaData(prefix + "generic:", meta)) + { + emitWarning(cont->file(), cont->line(), msg + " `" + meta + "':\n" + + "serialization can only be used with the array mapping for byte sequences"); + } + string type = s.substr(clrSerializablePrefix.size()); + BuiltinPtr builtin = BuiltinPtr::dynamicCast(seq->type()); + if(!type.empty() && builtin && builtin->kind() == Builtin::KindByte) + { + continue; + } + } } else if(StructPtr::dynamicCast(cont)) { @@ -1711,18 +1763,19 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) { continue; } - if(s.substr(prefix.size(), 8) == "generic:") + static const string clrGenericPrefix = prefix + "generic:"; + if(s.find(clrGenericPrefix) == 0) { - string type = s.substr(prefix.size() + 8); + string type = s.substr(clrGenericPrefix.size()); if(type == "SortedDictionary" || type == "SortedList") { continue; } } } - cerr << file << ":" << cont->line() << ": warning: " << msg << " `" << s << "'" << endl; + emitWarning(cont->file(), cont->line(), msg + " `" + s + "'"); + _history.insert(s); } - _history.insert(s); } prefix = "cs:"; @@ -1730,13 +1783,14 @@ Slice::CsGenerator::MetaDataVisitor::validate(const ContainedPtr& cont) { if(s.find(prefix) == 0) { - if(s.substr(prefix.size()) == "attribute:") + static const string csAttributePrefix = prefix + "attribute:"; + if(s.find(csAttributePrefix) == 0 && s.size() > csAttributePrefix.size()) { continue; } - cerr << file << ":" << cont->line() << ": warning: " << msg << " `" << s << "'" << endl; + emitWarning(cont->file(), cont->line(), msg + " `" + s + "'"); + _history.insert(s); } - _history.insert(s); } } } |