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 | |
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')
-rw-r--r-- | cpp/src/Slice/JavaUtil.cpp | 15 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 110 | ||||
-rw-r--r-- | cpp/src/slice2java/GenCompat.cpp | 127 |
3 files changed, 168 insertions, 84 deletions
diff --git a/cpp/src/Slice/JavaUtil.cpp b/cpp/src/Slice/JavaUtil.cpp index 3c6d0ece494..642b16f7e1f 100644 --- a/cpp/src/Slice/JavaUtil.cpp +++ b/cpp/src/Slice/JavaUtil.cpp @@ -396,6 +396,11 @@ private: result.push_back(s); continue; } + else if(s.substr(prefix.size(), pos - prefix.size()) == "implements") + { + result.push_back(s); + continue; + } emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'"); } @@ -455,7 +460,7 @@ private: else if(i->find("java:protobuf:") == 0 || i->find("java:serializable:") == 0) { // - // Only valid in sequence defintion which is checked in visitSequence + // Only valid in sequence definition which is checked in visitSequence // emitWarning(file, line, "ignoring invalid metadata `" + *i + "'"); } @@ -468,6 +473,14 @@ private: } emitWarning(file, line, "ignoring invalid metadata `" + *i + "'"); } + else if(i->find("java:implements:") == 0) + { + if(ClassDefPtr::dynamicCast(p) || StructPtr::dynamicCast(p)) + { + continue; + } + emitWarning(file, line, "ignoring invalid metadata `" + *i + "'"); + } } } 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; diff --git a/cpp/src/slice2java/GenCompat.cpp b/cpp/src/slice2java/GenCompat.cpp index eb0a18ddc4c..7bccb844408 100644 --- a/cpp/src/slice2java/GenCompat.cpp +++ b/cpp/src/slice2java/GenCompat.cpp @@ -2578,6 +2578,20 @@ Slice::GenCompat::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())); + } + } + + // // Slice interfaces map to Java interfaces. // out << sp; @@ -2585,108 +2599,91 @@ Slice::GenCompat::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 << "Ice.Object"; - out << "," << nl << '_' << name; - out << "Operations, _" << name << "OperationsNC"; } - else + out.useCurrentPosAsIndent(); + if(!p->isLocal()) { - if(!bases.empty()) + out << '_' << name << "Operations, _" << name << "OperationsNC"; + if(bases.empty()) { - out << " extends "; + out << "," << nl << "Ice.Object"; } - out.useCurrentPosAsIndent(); } - - 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->allOperations().size() > 0) // Don't use isAbstract() - see bug 3739 + if(p->allOperations().size() > 0 || !implements.empty()) // Don't use isAbstract() - see bug 3739 { out << "abstract "; } out << "class " << fixKwd(name); out.useCurrentPosAsIndent(); - StringList implements; - bool implementsOnNewLine = true; - - if(bases.empty() || bases.front()->isInterface()) + if(baseClass) { - if(p->isLocal()) - { - implementsOnNewLine = false; - implements.push_back("java.lang.Cloneable"); - } - else - { - out << " extends Ice.ObjectImpl"; - } + out << " extends " << getAbsolute(baseClass, package); + bases.pop_front(); + } + else if(!p->isLocal()) + { + out << " extends Ice.ObjectImpl"; } else { - out << " extends "; - out << getAbsolute(baseClass, package); - bases.pop_front(); + implements.push_back("java.lang.Cloneable"); } - // - // Implement interfaces - // - - if(p->isAbstract()) + if(p->isAbstract() && !p->isLocal()) { - if(!p->isLocal()) - { - implements.push_back("_" + name + "Operations"); - implements.push_back("_" + name + "OperationsNC"); - } + implements.push_back("_" + name + "Operations"); + implements.push_back("_" + name + "OperationsNC"); } - if(!bases.empty()) + for(ClassList::const_iterator q = bases.begin(); q != bases.end(); ++q) { - for(ClassList::const_iterator q = bases.begin(); q != bases.end();) - { - implements.push_back(getAbsolute(*q, package)); - q++; - } + implements.push_back(getAbsolute(*q, package)); } if(!implements.empty()) { - if(implementsOnNewLine) + if(baseClass || !p->isLocal()) { out << nl; } out << " implements "; out.useCurrentPosAsIndent(); - - for(StringList::const_iterator q = implements.begin(); q != implements.end();) + for(StringList::const_iterator q = implements.begin(); q != implements.end(); ++q) { if(q != implements.begin()) { out << ',' << nl; } out << *q; - q++; } - out.restoreIndent(); } @@ -3480,15 +3477,37 @@ Slice::GenCompat::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; writeDocComment(out, p, getDeprecateReason(p, 0, "type")); - 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.restoreIndent(); + out << sb; return true; |