string Slice::Ruby::CodeVisitor::getInitializer(const TypePtr& p) { BuiltinPtr builtin = BuiltinPtr::dynamicCast(p); if(builtin) { switch(builtin->kind()) { case Builtin::KindBool: { return "false"; } case Builtin::KindByte: case Builtin::KindShort: case Builtin::KindInt: case Builtin::KindLong: { return "0"; } case Builtin::KindFloat: case Builtin::KindDouble: { return "0.0"; } case Builtin::KindString: { return "''"; } case Builtin::KindObject: case Builtin::KindObjectProxy: case Builtin::KindLocalObject: { return "nil"; } } } EnumPtr en = EnumPtr::dynamicCast(p); if(en) { EnumeratorList enums = en->getEnumerators(); return getAbsolute(en, IdentToUpper) + "::" + fixIdent(enums.front()->name(), IdentToUpper); } StructPtr st = StructPtr::dynamicCast(p); if(st) { return getAbsolute(st, IdentToUpper) + ".new"; } return "nil"; }
void CodeVisitor::visitEnum(const EnumPtr& p) { string scoped = p->scoped(); string name = getName(p); string type = getTypeVar(p); string abs = getAbsolute(p, _ns); EnumeratorList enums = p->getEnumerators(); EnumeratorList::iterator q; long i; startNamespace(p); _out << sp << nl << "if(!class_exists('" << escapeName(abs) << "'))"; _out << sb; _out << nl << "class " << name; _out << sb; for(q = enums.begin(), i = 0; q != enums.end(); ++q, ++i) { string fixedEnum = fixIdent((*q)->name()); ostringstream idx; idx << i; _out << nl << "const " << fixedEnum << " = " << idx.str() << ';'; } _out << eb; // // Emit the type information. // _out << sp << nl << type << " = IcePHP_defineEnum('" << scoped << "', array("; for(q = enums.begin(); q != enums.end(); ++q) { if(q != enums.begin()) { _out << ", "; } _out << "'" << (*q)->name() << "'"; } _out << "));"; _out << eb; endNamespace(); }
void Slice::ChecksumVisitor::visitEnum(const EnumPtr& p) { if (p->isLocal()) { return; } ostringstream ostr; ostr << "enum " << p->name() << endl; EnumeratorList enums = p->getEnumerators(); for (EnumeratorList::iterator q = enums.begin(); q != enums.end(); ++q) { ostr << (*q)->name() << endl; } updateMap(p->scoped(), ostr.str()); }
void CodeVisitor::writeDefaultValue(const TypePtr& p) { BuiltinPtr builtin = BuiltinPtr::dynamicCast(p); if(builtin) { switch(builtin->kind()) { case Builtin::KindBool: { _out << "false"; break; } case Builtin::KindByte: case Builtin::KindShort: case Builtin::KindInt: case Builtin::KindLong: { _out << "0"; break; } case Builtin::KindFloat: case Builtin::KindDouble: { _out << "0.0"; break; } case Builtin::KindString: { _out << "''"; break; } case Builtin::KindObject: case Builtin::KindObjectProxy: case Builtin::KindLocalObject: { _out << "null"; break; } } return; } EnumPtr en = EnumPtr::dynamicCast(p); if(en) { EnumeratorList enums = en->getEnumerators(); _out << getAbsolute(en, _ns) << "::" << fixIdent(enums.front()->name()); return; } // // PHP does not allow the following construct: // // function foo($theStruct=new MyStructType) // // Instead we use null as the default value and allocate an instance in // the constructor. // StructPtr st = StructPtr::dynamicCast(p); if(st) { _out << "null"; return; } _out << "null"; }
void Slice::Ruby::CodeVisitor::visitEnum(const EnumPtr& p) { string scoped = p->scoped(); string name = fixIdent(p->name(), IdentToUpper); EnumeratorList enums = p->getEnumerators(); EnumeratorList::iterator q; int i; _out << sp << nl << "if not defined?(" << getAbsolute(p, IdentToUpper) << ')'; _out.inc(); _out << nl << "class " << name; _out.inc(); _out << nl << "include Comparable"; _out << sp << nl << "def initialize(val)"; _out.inc(); { ostringstream assertion; assertion << "fail(\"invalid value #{val} for " << name << "\") unless(val >= 0 and val < " << enums.size() << ')'; _out << nl << assertion.str(); } _out << nl << "@val = val"; _out.dec(); _out << nl << "end"; // // from_int // { _out << sp << nl << "def " << name << ".from_int(val)"; ostringstream sz; sz << enums.size() - 1; _out.inc(); _out << nl << "raise IndexError, \"#{val} is out of range 0.." << sz.str() << "\" if(val < 0 || val > " << sz.str() << ')'; _out << nl << "@@_values[val]"; _out.dec(); _out << nl << "end"; } // // to_s // _out << sp << nl << "def to_s"; _out.inc(); _out << nl << "@@_names[@val]"; _out.dec(); _out << nl << "end"; // // to_i // _out << sp << nl << "def to_i"; _out.inc(); _out << nl << "@val"; _out.dec(); _out << nl << "end"; // // <=> // _out << sp << nl << "def <=>(other)"; _out.inc(); _out << nl << "other.is_a?(" << name << ") or raise ArgumentError, \"value must be a " << name << "\""; _out << nl << "@val <=> other.to_i"; _out.dec(); _out << nl << "end"; // // hash // _out << sp << nl << "def hash"; _out.inc(); _out << nl << "@val.hash"; _out.dec(); _out << nl << "end"; // // inspect // _out << sp << nl << "def inspect"; _out.inc(); _out << nl << "@@_names[@val] + \"(#{@val})\""; _out.dec(); _out << nl << "end"; // // each // _out << sp << nl << "def " << name << ".each(&block)"; _out.inc(); _out << nl << "@@_values.each(&block)"; _out.dec(); _out << nl << "end"; _out << sp << nl << "@@_names = ["; for(q = enums.begin(); q != enums.end(); ++q) { if(q != enums.begin()) { _out << ", "; } _out << "'" << (*q)->name() << "'"; } _out << ']'; _out << nl << "@@_values = ["; for(EnumeratorList::size_type j = 0; j < enums.size(); ++j) { if(j > 0) { _out << ", "; } ostringstream idx; idx << j; _out << name << ".new(" << idx.str() << ')'; } _out << ']'; // // Constant for each enumerator. // _out << sp; for(q = enums.begin(), i = 0; q != enums.end(); ++q, ++i) { ostringstream idx; idx << i; _out << nl << fixIdent((*q)->name(), IdentToUpper) << " = @@_values[" << idx.str() << "]"; } _out << sp << nl << "private_class_method :new"; _out.dec(); _out << nl << "end"; // End of class. // // Emit the type information. // _out << sp << nl << "T_" << name << " = ::Ice::__defineEnum('" << scoped << "', " << name << ", ["; for(q = enums.begin(); q != enums.end(); ++q) { if(q != enums.begin()) { _out << ", "; } _out << name << "::" << fixIdent((*q)->name(), IdentToUpper); } _out << "])"; _out.dec(); _out << nl << "end"; // if not defined?() }
void FreezeScript::AnalyzeTransformVisitor::visitEnum(const EnumPtr& v) { if(v->isLocal()) { return; } string scoped = v->scoped(); if(ignoreType(scoped)) { return; } TypeList l = _newUnit->lookupTypeNoBuiltin(scoped, false); if(l.empty()) { _missingTypes.push_back(scoped); return; } EnumPtr newEnum = EnumPtr::dynamicCast(l.front()); if(!newEnum) { if(!_ignoreTypeChanges) { typeChange(scoped, v, l.front()); } return; } map<string, int> m; { Slice::EnumeratorList enumerators = newEnum->getEnumerators(); int i = 0; for(Slice::EnumeratorList::iterator p = enumerators.begin(); p != enumerators.end(); ++p, ++i) { m.insert(map<string, int>::value_type((*p)->name(), i)); } } _out.newline(); _out.newline(); _out << "<!-- enum " << scoped << " -->"; _out << se("transform") << attr("type", scoped); Slice::EnumeratorList enumerators = v->getEnumerators(); int i = 0; for(Slice::EnumeratorList::iterator p = enumerators.begin(); p != enumerators.end(); ++p, ++i) { map<string, int>::const_iterator q = m.find((*p)->name()); if(q == m.end()) { _out.newline(); _out << "<!-- NOTICE: enumerator `" << (*p)->name() << "' has been removed -->"; } else if(q->second != i) { _out.newline(); _out << "<!-- NOTICE: enumerator `" << (*p)->name() << "' has changed position -->"; } } _out << ee; }