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; }