bool FreezeScript::AnalyzeTransformVisitor::visitStructStart(const StructPtr& v) { if(v->isLocal()) { return false; } string scoped = v->scoped(); if(ignoreType(scoped)) { return false; } TypeList l = _newUnit->lookupTypeNoBuiltin(scoped, false); if(l.empty()) { _missingTypes.push_back(scoped); return false; } StructPtr newStruct = StructPtr::dynamicCast(l.front()); if(!newStruct) { if(!_ignoreTypeChanges) { typeChange(scoped, v, l.front()); } return false; } _out.newline(); _out.newline(); _out << "<!-- struct " << scoped << " -->"; _out << se("transform") << attr("type", scoped); DataMemberList oldMembers = v->dataMembers(); DataMemberList newMembers = newStruct->dataMembers(); compareMembers(oldMembers, newMembers); _out << ee; return false; }
bool Slice::ChecksumVisitor::visitStructStart(const StructPtr& p) { if (p->isLocal()) { return false; } ostringstream ostr; ostr << "struct " << p->name() << endl; DataMemberList members = p->dataMembers(); for (DataMemberList::iterator q = members.begin(); q != members.end(); ++q) { ostr << typeToString((*q)->type()) << ' ' << (*q)->name() << endl; } updateMap(p->scoped(), ostr.str()); return false; }
bool CodeVisitor::visitStructStart(const StructPtr& p) { string scoped = p->scoped(); string name = getName(p); string type = getTypeVar(p); string abs = getAbsolute(p, _ns); MemberInfoList memberList; MemberInfoList::iterator r; { DataMemberList members = p->dataMembers(); for(DataMemberList::iterator q = members.begin(); q != members.end(); ++q) { memberList.push_back(MemberInfo()); memberList.back().fixedName = fixIdent((*q)->name()); memberList.back().inherited = false; memberList.back().dataMember = *q; } } startNamespace(p); _out << sp << nl << "if(!class_exists('" << escapeName(abs) << "'))"; _out << sb; _out << nl << "class " << name; _out << sb; _out << nl << "public function __construct("; writeConstructorParams(memberList); _out << ")"; _out << sb; for(r = memberList.begin(); r != memberList.end(); ++r) { writeAssign(*r); } _out << eb; // // __toString // _out << sp << nl << "public function __toString()"; _out << sb; _out << nl << "global " << type << ';'; _out << nl << "return IcePHP_stringify($this, " << type << ");"; _out << eb; if(!memberList.empty()) { _out << sp; for(r = memberList.begin(); r != memberList.end(); ++r) { _out << nl << "public $" << r->fixedName << ';'; } } _out << eb; // // Emit the type information. // _out << sp << nl << type << " = IcePHP_defineStruct('" << scoped << "', '" << escapeName(abs) << "', array("; // // Data members are represented as an array: // // ('MemberName', MemberType) // // where MemberType is either a primitive type constant (T_INT, etc.) or the id of a constructed type. // for(r = memberList.begin(); r != memberList.end(); ++r) { if(r != memberList.begin()) { _out << ", "; } _out.inc(); _out << nl << "array('" << r->fixedName << "', "; writeType(r->dataMember->type()); _out << ')'; _out.dec(); } _out << "));"; _out << eb; endNamespace(); return false; }
bool Slice::Ruby::CodeVisitor::visitStructStart(const StructPtr& p) { string scoped = p->scoped(); string name = fixIdent(p->name(), IdentToUpper); MemberInfoList memberList; MemberInfoList::iterator r; { DataMemberList members = p->dataMembers(); for(DataMemberList::iterator q = members.begin(); q != members.end(); ++q) { memberList.push_back(MemberInfo()); memberList.back().lowerName = fixIdent((*q)->name(), IdentToLower); memberList.back().fixedName = fixIdent((*q)->name(), IdentNormal); memberList.back().inherited = false; memberList.back().dataMember = *q; } } _out << sp << nl << "if not defined?(" << getAbsolute(p, IdentToUpper) << ')'; _out.inc(); _out << nl << "class " << name; _out.inc(); if(!memberList.empty()) { _out << nl << "def initialize("; writeConstructorParams(memberList); _out << ")"; _out.inc(); for(r = memberList.begin(); r != memberList.end(); ++r) { _out << nl << '@' << r->fixedName << " = " << r->lowerName; } _out.dec(); _out << nl << "end"; } // // hash // _out << sp << nl << "def hash"; _out.inc(); _out << nl << "_h = 0"; int iter = 0; for(r = memberList.begin(); r != memberList.end(); ++r) { writeHash("@" + r->fixedName, r->dataMember->type(), iter); } _out << nl << "_h % 0x7fffffff"; _out.dec(); _out << nl << "end"; // // == // _out << sp << nl << "def ==(other)"; _out.inc(); _out << nl << "return false if"; _out.inc(); for(r = memberList.begin(); r != memberList.end(); ++r) { if(r != memberList.begin()) { _out << " or"; } _out << nl << "@" << r->fixedName << " != other." << r->fixedName; } _out.dec(); _out << nl << "true"; _out.dec(); _out << nl << "end"; // // eql? // // This method is used to determine the equality of keys in a Hash object. // _out << sp << nl << "def eql?(other)"; _out.inc(); _out << nl << "return other.class == self.class && other == self"; _out.dec(); _out << nl << "end"; // // inspect // _out << sp << nl << "def inspect"; _out.inc(); _out << nl << "::Ice::__stringify(self, T_" << name << ")"; _out.dec(); _out << nl << "end"; // // read/write accessors for data members. // if(!memberList.empty()) { _out << sp << nl << "attr_accessor "; for(r = memberList.begin(); r != memberList.end(); ++r) { if(r != memberList.begin()) { _out << ", "; } _out << ':' << r->fixedName; } } _out.dec(); _out << nl << "end"; // End of class. // // Emit the type information. // _out << sp << nl << "T_" << name << " = ::Ice::__defineStruct('" << scoped << "', " << name << ", ["; // // Data members are represented as an array: // // ['MemberName', MemberType] // // where MemberType is either a primitive type constant (T_INT, etc.) or the id of a constructed type. // if(memberList.size() > 1) { _out.inc(); _out << nl; } for(r = memberList.begin(); r != memberList.end(); ++r) { if(r != memberList.begin()) { _out << ',' << nl; } _out << "[\"" << r->fixedName << "\", "; writeType(r->dataMember->type()); _out << ']'; } if(memberList.size() > 1) { _out.dec(); _out << nl; } _out << "])"; _out.dec(); _out << nl << "end"; // if not defined?() return false; }
bool FreezeScript::AnalyzeTransformVisitor::visitStructStart(const StructPtr& v) { if(v->isLocal()) { return false; } string scoped = v->scoped(); if(ignoreType(scoped)) { return false; } TypeList l = _newUnit->lookupTypeNoBuiltin(scoped, false); if(l.empty()) { _missingTypes.push_back(scoped); return false; } // // Allow transforming from struct to class. // StructPtr newStruct = StructPtr::dynamicCast(l.front()); ClassDeclPtr decl = ClassDeclPtr::dynamicCast(l.front()); ClassDefPtr newClass; if(decl) { newClass = decl->definition(); if(!newClass) { _missingTypes.push_back(scoped); return false; } } else if(!newStruct) { if(!_ignoreTypeChanges) { typeChange(scoped, v, l.front()); } return false; } _out.newline(); _out.newline(); if(newClass) { _out << "<!-- class " << scoped << " -->"; } else { _out << "<!-- struct " << scoped << " -->"; } _out << se("transform") << attr("type", scoped); DataMemberList oldMembers, newMembers; if(newClass) { oldMembers = v->dataMembers(); newMembers = newClass->allDataMembers(); } else { oldMembers = v->dataMembers(); newMembers = newStruct->dataMembers(); } compareMembers(oldMembers, newMembers); _out << ee; return false; }