diff options
author | Michi Henning <michi@zeroc.com> | 2005-05-19 04:44:55 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2005-05-19 04:44:55 +0000 |
commit | 671ab6be8ac91b7e312588e321c8ffb325b3b8b0 (patch) | |
tree | 6c59933868cba548afcdcca7472875fcb4997199 /cpp/src | |
parent | *** empty log message *** (diff) | |
download | ice-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.cpp | 74 | ||||
-rwxr-xr-x | cpp/src/slice2cs/Gen.cpp | 101 | ||||
-rwxr-xr-x | cpp/src/slice2vb/Gen.cpp | 99 |
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()) |