From eb1473089bfe9105b3884a490edafeb561df935e Mon Sep 17 00:00:00 2001 From: Joe George Date: Thu, 3 Dec 2015 09:45:09 -0500 Subject: ICE-6897 - Add delegate metadata The "delegate" metadata tag can be applied to interfaces with one operation. In C++ they are mapped to std::function's, in C# delegates. In Java we still generate a interface with one operation, which is a FunctionalInterface. --- cpp/src/Slice/JavaUtil.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'cpp/src/Slice/JavaUtil.cpp') diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp index dd35e40abb0..f84b30eb8d5 100644 --- a/cpp/src/Slice/JavaUtil.cpp +++ b/cpp/src/Slice/JavaUtil.cpp @@ -1640,7 +1640,7 @@ Slice::JavaGenerator::writeMarshalUnmarshalCode(Output& out, BuiltinPtr elemBuiltin = BuiltinPtr::dynamicCast(elemType); if(optionalParam && elemBuiltin && elemBuiltin->kind() != Builtin::KindObject && - elemBuiltin->kind() != Builtin::KindObjectProxy && elemBuiltin->kind() != Builtin::KindValue && + elemBuiltin->kind() != Builtin::KindObjectProxy && elemBuiltin->kind() != Builtin::KindValue && !hasTypeMetaData(seq, metaData)) { static const char* builtinTable[] = @@ -2343,7 +2343,7 @@ Slice::JavaGenerator::writeSequenceMarshalUnmarshalCode(Output& out, { BuiltinPtr b = BuiltinPtr::dynamicCast(type); if(b && b->kind() != Builtin::KindObject && - b->kind() != Builtin::KindValue && + b->kind() != Builtin::KindValue && b->kind() != Builtin::KindObjectProxy) { switch(b->kind()) @@ -3201,7 +3201,7 @@ Slice::JavaGenerator::writeStreamDictionaryMarshalUnmarshalCode(Output& out, } } BuiltinPtr builtin = BuiltinPtr::dynamicCast(value); - if(!(builtin && (builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindValue)) && + if(!(builtin && (builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindValue)) && !ClassDeclPtr::dynamicCast(value)) { out << nl << "" << v << ".put(__key, __value);"; @@ -3536,7 +3536,7 @@ Slice::JavaGenerator::writeStreamSequenceMarshalUnmarshalCode(Output& out, { BuiltinPtr b = BuiltinPtr::dynamicCast(type); if(b && b->kind() != Builtin::KindObject && - b->kind() != Builtin::KindValue && + b->kind() != Builtin::KindValue && b->kind() != Builtin::KindObjectProxy) { switch(b->kind()) @@ -4280,6 +4280,11 @@ Slice::JavaGenerator::MetaDataVisitor::getMetaData(const ContainedPtr& cont) emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'"); } + else if(s == "delegate") + { + result.push_back(s); + continue; + } _history.insert(s); } @@ -4337,6 +4342,15 @@ Slice::JavaGenerator::MetaDataVisitor::validateType(const SyntaxTreeBasePtr& p, // emitWarning(file, line, "ignoring invalid metadata `" + *i + "'"); } + else if(i->find("delegate") == 0) + { + ClassDefPtr cl = ClassDefPtr::dynamicCast(p); + if(cl && cl->isDelegate()) + { + continue; + } + emitWarning(file, line, "ignoring invalid metadata `" + *i + "'"); + } } } -- cgit v1.2.3