diff options
author | Benoit Foucher <benoit@zeroc.com> | 2017-01-30 15:13:27 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2017-01-30 15:13:27 +0100 |
commit | 25fed02adb3fd0d41da3f4dff027e59c424120bc (patch) | |
tree | d701310c3e03b54b5a7d9dc90738e00e35066da7 /cpp/src/slice2java/Gen.cpp | |
parent | slice2cs build failure (diff) | |
download | ice-25fed02adb3fd0d41da3f4dff027e59c424120bc.tar.bz2 ice-25fed02adb3fd0d41da3f4dff027e59c424120bc.tar.xz ice-25fed02adb3fd0d41da3f4dff027e59c424120bc.zip |
Fixed ICE-7493 - Support for java try-with and Python with statements for the Ice.Communicator
Diffstat (limited to 'cpp/src/slice2java/Gen.cpp')
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 110 |
1 files changed, 81 insertions, 29 deletions
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp index 6aee01c293b..6fea7f223f1 100644 --- a/cpp/src/slice2java/Gen.cpp +++ b/cpp/src/slice2java/Gen.cpp @@ -2445,6 +2445,20 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p) Output& out = output(); + // + // Check for java:implements metadata. + // + const StringList metaData = p->getMetaData(); + static const string prefix = "java:implements:"; + StringList implements; + for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q) + { + if(q->find(prefix) == 0) + { + implements.push_back(q->substr(prefix.size())); + } + } + DocCommentPtr dc = parseDocComment(p); // @@ -2459,61 +2473,79 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p) if(p->isInterface()) { out << nl << "public interface " << fixKwd(name); - if(!p->isLocal()) + ClassList::const_iterator q = bases.begin(); + StringList::const_iterator r = implements.begin(); + + if(!p->isLocal() || !bases.empty() || !implements.empty()) { out << " extends "; - out.useCurrentPosAsIndent(); - out << "com.zeroc.Ice.Object"; } - else + out.useCurrentPosAsIndent(); + if(!p->isLocal() && bases.empty()) { - if(!bases.empty()) - { - out << " extends "; - } - out.useCurrentPosAsIndent(); + out << "com.zeroc.Ice.Object"; } - - ClassList::const_iterator q = bases.begin(); - if(p->isLocal() && q != bases.end()) + else if(q != bases.end()) { out << getAbsolute(*q++, package); } - while(q != bases.end()) + else if(r != implements.end()) + { + out << *r++; + } + + for(;q != bases.end(); ++q) { out << ',' << nl << getAbsolute(*q, package); - q++; + } + for(; r != implements.end(); ++r) + { + out << ',' << nl << *r; } out.restoreIndent(); } else { out << nl << "public "; - if(p->isLocal() && !p->allOperations().empty()) + if((p->isLocal() && !p->allOperations().empty()) || !implements.empty()) { out << "abstract "; } out << "class " << fixKwd(name); out.useCurrentPosAsIndent(); - StringList implements; + if(baseClass) + { + out << " extends " << getAbsolute(baseClass, package); + bases.pop_front(); + } + else if(!p->isLocal()) + { + out << " extends com.zeroc.Ice.Value"; + } + else + { + implements.push_back("java.lang.Cloneable"); + } - if(bases.empty() || bases.front()->isInterface()) + if(!implements.empty()) { - if(p->isLocal()) + if(baseClass || !p->isLocal()) { - implements.push_back("java.lang.Cloneable"); + out << nl; } - else + + out << " implements "; + out.useCurrentPosAsIndent(); + for(StringList::const_iterator q = implements.begin(); q != implements.end(); ++q) { - out << " extends com.zeroc.Ice.Value"; + if(q != implements.begin()) + { + out << ',' << nl; + } + out << *q; } - } - else - { - out << " extends "; - out << getAbsolute(baseClass, package); - bases.pop_front(); + out.restoreIndent(); } out.restoreIndent(); @@ -3296,6 +3328,20 @@ Slice::Gen::TypesVisitor::visitStructStart(const StructPtr& p) Output& out = output(); + // + // Check for java:implements metadata. + // + const StringList metaData = p->getMetaData(); + static const string prefix = "java:implements:"; + StringList implements; + for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q) + { + if(q->find(prefix) == 0) + { + implements.push_back(q->substr(prefix.size())); + } + } + out << sp; DocCommentPtr dc = parseDocComment(p); @@ -3305,10 +3351,16 @@ Slice::Gen::TypesVisitor::visitStructStart(const StructPtr& p) out << nl << "@Deprecated"; } - out << nl << "public class " << name << " implements java.lang.Cloneable"; + out << nl << "public class " << name << " implements "; + out.useCurrentPosAsIndent(); + out << "java.lang.Cloneable"; if(!p->isLocal()) { - out << ", java.io.Serializable"; + out << "," << nl << "java.io.Serializable"; + } + for(StringList::const_iterator q = implements.begin(); q != implements.end(); ++q) + { + out << "," << nl << *q; } out << sb; |