summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2005-05-19 04:44:55 +0000
committerMichi Henning <michi@zeroc.com>2005-05-19 04:44:55 +0000
commit671ab6be8ac91b7e312588e321c8ffb325b3b8b0 (patch)
tree6c59933868cba548afcdcca7472875fcb4997199 /cpp/src
parent*** empty log message *** (diff)
downloadice-671ab6be8ac91b7e312588e321c8ffb325b3b8b0.tar.bz2
ice-671ab6be8ac91b7e312588e321c8ffb325b3b8b0.tar.xz
ice-671ab6be8ac91b7e312588e321c8ffb325b3b8b0.zip
Fixed http://bugzilla.zeroc.com/bugzilla/show_bug.cgi?id=262
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Slice/Parser.cpp74
-rwxr-xr-xcpp/src/slice2cs/Gen.cpp101
-rwxr-xr-xcpp/src/slice2vb/Gen.cpp99
3 files changed, 236 insertions, 38 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index 6460efcaad4..3434d8bbf1a 100644
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -2752,18 +2752,29 @@ Slice::ClassDef::dataMembers() const
return result;
}
+//
+// Return the data members of this class and its parent classes, in base-to-derived order.
+//
DataMemberList
Slice::ClassDef::allDataMembers() const
{
- DataMemberList result = dataMembers();
- result.sort();
- result.unique();
- for(ClassList::const_iterator p = _bases.begin(); p != _bases.end(); ++p)
+ DataMemberList result;
+
+ //
+ // Check if we have a base class. If so, recursively
+ // get the data members of the base(s).
+ //
+ if(!_bases.empty() && !_bases.front()->isInterface())
{
- DataMemberList li = (*p)->allDataMembers();
- result.merge(li);
- result.unique();
+ result = _bases.front()->allDataMembers();
}
+
+ //
+ // Append this class's data members.
+ //
+ DataMemberList myMembers = dataMembers();
+ result.splice(result.end(), myMembers);
+
return result;
}
@@ -2786,6 +2797,9 @@ Slice::ClassDef::classDataMembers() const
return result;
}
+//
+// Return the class data members of this class and its parent classes, in base-to-derived order.
+//
DataMemberList
Slice::ClassDef::allClassDataMembers() const
{
@@ -3149,6 +3163,32 @@ Slice::Exception::dataMembers() const
return result;
}
+//
+// Return the data members of this exception and its parent exceptions, in base-to-derived order.
+//
+DataMemberList
+Slice::Exception::allDataMembers() const
+{
+ DataMemberList result;
+
+ //
+ // Check if we have a base exception. If so, recursively
+ // get the data members of the base exception(s).
+ //
+ if(base())
+ {
+ result = base()->allDataMembers();
+ }
+
+ //
+ // Append this exceptions's data members.
+ //
+ DataMemberList myMembers = dataMembers();
+ result.splice(result.end(), myMembers);
+
+ return result;
+}
+
DataMemberList
Slice::Exception::classDataMembers() const
{
@@ -3168,6 +3208,9 @@ Slice::Exception::classDataMembers() const
return result;
}
+//
+// Return the class data members of this exception and its parent exceptions, in base-to-derived order.
+//
DataMemberList
Slice::Exception::allClassDataMembers() const
{
@@ -3183,20 +3226,11 @@ Slice::Exception::allClassDataMembers() const
}
//
- // Append this exception's class members.
+ // Append this exceptions's class data members.
//
- for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
- {
- DataMemberPtr q = DataMemberPtr::dynamicCast(*p);
- if(q)
- {
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(q->type());
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(q->type()))
- {
- result.push_back(q);
- }
- }
- }
+ DataMemberList myMembers = classDataMembers();
+ result.splice(result.end(), myMembers);
+
return result;
}
diff --git a/cpp/src/slice2cs/Gen.cpp b/cpp/src/slice2cs/Gen.cpp
index 9bf9e7b0d05..abf5d3431a4 100755
--- a/cpp/src/slice2cs/Gen.cpp
+++ b/cpp/src/slice2cs/Gen.cpp
@@ -1078,6 +1078,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
string name = p->name();
string scoped = fixId(p->scoped());
ClassList bases = p->bases();
+ bool hasBaseClass = !bases.empty() && !bases.front()->isInterface();
if(!p->isLocal() && _stream)
{
@@ -1150,7 +1151,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
}
_out << "class " << fixId(name) << " : ";
- if(bases.empty() || bases.front()->isInterface())
+ if(!hasBaseClass)
{
if(p->isLocal())
{
@@ -1208,22 +1209,76 @@ void
Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p)
{
string name = fixId(p->name());
+ DataMemberList classMembers = p->classDataMembers();
+ DataMemberList allClassMembers = p->allClassDataMembers();
DataMemberList dataMembers = p->dataMembers();
+ DataMemberList allDataMembers = p->allDataMembers();
+ ClassList bases = p->bases();
+ bool hasBaseClass = !bases.empty() && !bases.front()->isInterface();
+ DataMemberList::const_iterator d;
if(!p->isInterface())
{
if(p->hasDataMembers() && !p->hasOperations())
{
- _out << sp << nl << "#endregion // Slice data members";
+ _out << sp << nl << "#endregion"; // Slice data members"
}
else if(p->hasDataMembers())
{
- _out << sp << nl << "#endregion // Slice data members and operations";
+ _out << sp << nl << "#endregion"; // Slice data members and operations"
}
else if(p->hasOperations())
{
- _out << sp << nl << "#endregion // Slice operations";
+ _out << sp << nl << "#endregion"; // Slice operations"
}
+
+ if(!allDataMembers.empty())
+ {
+ _out << sp << nl << "#region Constructors";
+
+ _out << sp << nl << "public " << name << spar << epar;
+ if(hasBaseClass)
+ {
+ _out << " : base()";
+ }
+ _out << sb;
+ _out << eb;
+
+ _out << sp << nl << "public " << name << spar;
+ vector<string> paramDecl;
+ for(d = allDataMembers.begin(); d != allDataMembers.end(); ++d)
+ {
+ string memberName = fixId((*d)->name());
+ string memberType = typeToString((*d)->type());
+ paramDecl.push_back(memberType + " " + memberName);
+ }
+ _out << paramDecl << epar;
+ if(hasBaseClass && allDataMembers.size() != dataMembers.size())
+ {
+ _out << " : base" << spar;
+ vector<string> baseParamNames;
+ DataMemberList baseDataMembers = bases.front()->allDataMembers();
+ for(d = baseDataMembers.begin(); d != baseDataMembers.end(); ++d)
+ {
+ baseParamNames.push_back(fixId((*d)->name()));
+ }
+ _out << baseParamNames << epar;
+ }
+ _out << sb;
+ vector<string> paramNames;
+ for(d = dataMembers.begin(); d != dataMembers.end(); ++d)
+ {
+ paramNames.push_back(fixId((*d)->name()));
+ }
+ for(vector<string>::const_iterator i = paramNames.begin(); i != paramNames.end(); ++i)
+ {
+ _out << nl << "this." << *i << " = " << *i << ';';
+ }
+ _out << eb;
+
+ _out << sp << nl << "#endregion"; // Constructors
+ }
+
writeInheritedOperations(p);
}
@@ -1232,7 +1287,6 @@ Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p)
writeDispatch(p);
DataMemberList members = p->dataMembers();
- DataMemberList::const_iterator d;
_out << sp << nl << "#region Marshaling support";
@@ -1251,12 +1305,10 @@ Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p)
_out << nl << "base.__write(__os);";
_out << eb;
- DataMemberList allClassMembers = p->allClassDataMembers();
if(allClassMembers.size() != 0)
{
_out << sp << nl << "public sealed ";
- ClassList bases = p->bases();
- if(!bases.empty() && !bases.front()->isInterface() && bases.front()->declaration()->usesClasses())
+ if(hasBaseClass && bases.front()->declaration()->usesClasses())
{
_out << "new ";
}
@@ -1323,7 +1375,6 @@ Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p)
_out << nl << "/* string myId = */ __is.readTypeId();";
_out << eb;
_out << nl << "__is.startReadSlice();";
- DataMemberList classMembers = p->classDataMembers();
int classMemberCount = static_cast<int>(allClassMembers.size() - classMembers.size());
for(d = members.begin(); d != members.end(); ++d)
{
@@ -1764,6 +1815,7 @@ Slice::Gen::TypesVisitor::visitExceptionEnd(const ExceptionPtr& p)
{
string name = fixId(p->name());
+ DataMemberList allDataMembers = p->allDataMembers();
DataMemberList dataMembers = p->dataMembers();
DataMemberList::const_iterator q;
@@ -2116,12 +2168,40 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
{
string name = fixId(p->name());
+ DataMemberList classMembers = p->classDataMembers();
DataMemberList dataMembers = p->dataMembers();
DataMemberList::const_iterator q;
_out << sp << nl << "#endregion"; // Slice data members
+ _out << sp << nl << "#region Constructor";
+
+ _out << sp << nl << "public " << name << spar;
+ vector<string> paramDecl;
+ vector<string> paramNames;
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ string memberName = fixId((*q)->name());
+ string memberType = typeToString((*q)->type());
+ paramDecl.push_back(memberType + " " + memberName);
+ paramNames.push_back(memberName);
+ }
+ _out << paramDecl << epar;
+ _out << sb;
+ for(vector<string>::const_iterator i = paramNames.begin(); i != paramNames.end(); ++i)
+ {
+ _out << nl << "this." << *i << " = " << *i << ';';
+ }
bool isClass = p->hasMetaData("cs:class");
+ bool patchStruct = !isClass && classMembers.size() != 0;
+ if(!p->isLocal() && patchStruct)
+ {
+ _out << nl << "_pm = null;";
+ }
+ _out << eb;
+
+ _out << sp << nl << "#endregion"; // Constructor
+
if(isClass)
{
_out << sp << nl << "#region ICloneable members";
@@ -2235,9 +2315,6 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
}
_out << eb;
- DataMemberList classMembers = p->classDataMembers();
-
- bool patchStruct = !isClass && classMembers.size() != 0;
if(classMembers.size() != 0)
{
diff --git a/cpp/src/slice2vb/Gen.cpp b/cpp/src/slice2vb/Gen.cpp
index 7f3787184aa..76f284d6188 100755
--- a/cpp/src/slice2vb/Gen.cpp
+++ b/cpp/src/slice2vb/Gen.cpp
@@ -1064,9 +1064,10 @@ Slice::Gen::TypesVisitor::visitModuleEnd(const ModulePtr&)
bool
Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
{
- string name = fixId(p->name());
+ string name = p->name();
string scoped = fixId(p->scoped());
ClassList bases = p->bases();
+ bool hasBaseClass = !bases.empty() && !bases.front()->isInterface();
if(!p->isLocal() && _stream)
{
@@ -1147,7 +1148,7 @@ Slice::Gen::TypesVisitor::visitClassDefStart(const ClassDefPtr& p)
_out << "Class " << name;
_out.inc();
- if(bases.empty() || bases.front()->isInterface())
+ if(!hasBaseClass)
{
if(p->isLocal())
{
@@ -1207,6 +1208,10 @@ Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p)
{
string name = fixId(p->name());
DataMemberList dataMembers = p->dataMembers();
+ DataMemberList allDataMembers = p->allDataMembers();
+ ClassList bases = p->bases();
+ bool hasBaseClass = !bases.empty() && !bases.front()->isInterface();
+ DataMemberList::const_iterator d;
if(!p->isInterface())
{
@@ -1224,6 +1229,60 @@ Slice::Gen::TypesVisitor::visitClassDefEnd(const ClassDefPtr& p)
_out << sp << nl << "#End Region"; // Slice operations
}
_out.restoreIndent();
+
+ if(!allDataMembers.empty())
+ {
+ _out.zeroIndent();
+ _out << sp << nl << "#Region \"Constructors\"";
+ _out.restoreIndent();
+
+ _out << sp << nl << "Public Sub New" << spar << epar;
+ _out.inc();
+ if(hasBaseClass)
+ {
+ _out << nl << "MyBase.New()";
+ }
+ _out.dec();
+ _out << nl << "End Sub";
+
+ _out << sp << nl << "Public Sub New" << spar;
+ vector<string> paramDecl;
+ for(d = allDataMembers.begin(); d != allDataMembers.end(); ++d)
+ {
+ string memberName = fixId((*d)->name());
+ string memberType = typeToString((*d)->type());
+ paramDecl.push_back("ByVal " + memberName + " As " + memberType);
+ }
+ _out << paramDecl << epar;
+ _out.inc();
+ if(hasBaseClass && allDataMembers.size() != dataMembers.size())
+ {
+ _out << nl << "MyBase.New" << spar;
+ vector<string> baseParamNames;
+ DataMemberList baseDataMembers = bases.front()->allDataMembers();
+ for(d = baseDataMembers.begin(); d != baseDataMembers.end(); ++d)
+ {
+ baseParamNames.push_back(fixId((*d)->name()));
+ }
+ _out << baseParamNames << epar;
+ }
+ vector<string> paramNames;
+ for(d = dataMembers.begin(); d != dataMembers.end(); ++d)
+ {
+ paramNames.push_back(fixId((*d)->name()));
+ }
+ for(vector<string>::const_iterator i = paramNames.begin(); i != paramNames.end(); ++i)
+ {
+ _out << nl << "Me." << *i << " = " << *i;
+ }
+ _out.dec();
+ _out << nl << "End Sub";
+
+ _out.zeroIndent();
+ _out << sp << nl << "#End Region"; // Constructors
+ _out.restoreIndent();
+ }
+
writeInheritedOperations(p);
}
@@ -2277,14 +2336,45 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
{
string name = fixId(p->name());
+ DataMemberList classMembers = p->classDataMembers();
DataMemberList dataMembers = p->dataMembers();
DataMemberList::const_iterator q;
_out.zeroIndent();
_out << sp << nl << "#End Region"; // Slice data members
+
+ _out << sp << nl << "#Region \"Constructor\"";
_out.restoreIndent();
+ _out << sp << nl << "Public Sub New" << spar;
+ vector<string> paramDecl;
+ vector<string> paramNames;
+ for(q = dataMembers.begin(); q != dataMembers.end(); ++q)
+ {
+ string memberName = fixId((*q)->name());
+ string memberType = typeToString((*q)->type());
+ paramDecl.push_back("ByVal " + memberName + " As " + memberType);
+ paramNames.push_back(memberName);
+ }
+ _out << paramDecl << epar;
+ _out.inc();
+ for(vector<string>::const_iterator i = paramNames.begin(); i != paramNames.end(); ++i)
+ {
+ _out << nl << "Me." << *i << " = " << *i;
+ }
bool isClass = p->hasMetaData("vb:class");
+ bool patchStruct = !isClass && classMembers.size() != 0;
+ if(!p->isLocal() && patchStruct)
+ {
+ _out << nl << "_pm = Nothing";
+ }
+ _out.dec();
+ _out << nl << "End Sub";
+
+ _out.zeroIndent();
+ _out << sp << nl << "#End Region"; // Constructor
+ _out.restoreIndent();
+
if(isClass)
{
_out.zeroIndent();
@@ -2453,9 +2543,6 @@ Slice::Gen::TypesVisitor::visitStructEnd(const StructPtr& p)
_out.dec();
_out << nl << "End Sub";
- DataMemberList classMembers = p->classDataMembers();
-
- bool patchStruct = !p->hasMetaData("vb:class") && classMembers.size() != 0;
if(classMembers.size() != 0)
{
@@ -4923,7 +5010,7 @@ Slice::Gen::TieVisitor::visitClassDefStart(const ClassDefPtr& p)
opIntfName += "NC";
}
- _out << sp << nl << "public class _" << name << "Tie";
+ _out << sp << nl << "Public Class _" << name << "Tie";
_out.inc();
_out << nl << "Inherits ";
if(p->isInterface())