summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java
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
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')
-rw-r--r--cpp/src/slice2java/Gen.cpp110
-rw-r--r--cpp/src/slice2java/GenCompat.cpp127
2 files changed, 154 insertions, 83 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;
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;