// // Copyright (c) 2007, Brian Frank and Andy Frank // Licensed under the Academic Free License version 3.0 // // History: // 30 Aug 07 Brian Frank Creation // ** ** FacetDef models a facet declaration. ** class FacetDef : Node, CFacet { ////////////////////////////////////////////////////////////////////////// // Construction ////////////////////////////////////////////////////////////////////////// new make(Loc loc, CType type) : super(loc) { this.type = type } ////////////////////////////////////////////////////////////////////////// // Facet ////////////////////////////////////////////////////////////////////////// override Str qname() { type.qname } override Obj? get(Str name) { i := names.index(name) if (i == null) return null literal := vals[i] as LiteralExpr if (literal == null) return null return literal.val } Str serialize() { if (names.isEmpty) return "" s := StrBuf() // serialized FFI types as name/value map for easy parsing if (type.isForeign) { s.addChar('[') names.each |n, i| { s.add(n.toCode).addChar(':').add(vals[i].serialize).addChar(',') } s.addChar(']') } // serialize normal Fantom types as a complex else { s.add(type.qname).addChar('{') names.each |n, i| { s.add(n).addChar('=').add(vals[i].serialize).addChar(';') } s.addChar('}') } return s.toStr } ////////////////////////////////////////////////////////////////////////// // Tree ////////////////////////////////////////////////////////////////////////// Void walk(Visitor v) { vals = Expr.walkExprs(v, vals) } ////////////////////////////////////////////////////////////////////////// // Debug ////////////////////////////////////////////////////////////////////////// override Str toStr() { names.isEmpty ? "@$type" : "@$serialize" } override Void print(AstWriter out) { out.w(toStr).nl } ////////////////////////////////////////////////////////////////////////// // Fields ////////////////////////////////////////////////////////////////////////// CType type Str[] names := Str[,] Expr[] vals := Expr[,] }