summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java/Gen.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-01-30 15:13:27 +0100
committerBenoit Foucher <benoit@zeroc.com>2017-01-30 15:13:27 +0100
commit25fed02adb3fd0d41da3f4dff027e59c424120bc (patch)
treed701310c3e03b54b5a7d9dc90738e00e35066da7 /cpp/src/slice2java/Gen.cpp
parentslice2cs build failure (diff)
downloadice-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.cpp110
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;