(function () { var write = function (ast, opt) { var curPea = "" , curTPea = "" , opt = opt || {} , noop = function (str) { return str; } , optNames = "type".split(" ") , context = [] ; for (var i = 0, n = optNames.length; i < n; i++) { var o = optNames[i]; if (!opt[o]) opt[o] = noop; } var literal = function (it) { return it.value; }; var wsPea = function (it) { curPea += it.value; return ""; }; var wsTPea = function (it) { curTPea += it.value; return ""; }; var lineComment = function (it) { return "//" + it.value + "\n"; }; var multilineComment = function (it) { return "/*" + it.value + "*/"; }; var type = function (it) { if (typeof it === "string") return opt.type(it); // XXX should maintain some context if (it.union) return "(" + it.idlType.map(type).join(" or ") + ")"; var ret = ""; if (it.sequence) ret += "sequence<"; ret += type(it.idlType); if (it.array) { for (var i = 0, n = it.nullableArray.length; i < n; i++) { var val = it.nullableArray[i]; if (val) ret += "?"; ret += "[]"; } } if (it.sequence) ret += ">"; if (it.nullable) ret += "?"; return ret; }; var const_value = function (it) { var tp = it. type; if (tp === "boolean") return it.value ? "true" : "false"; else if (tp === "null") return "null"; else if (tp === "Infinity") return (it.negative ? "-" : "") + "Infinity"; else if (tp === "NaN") return "NaN"; else if (tp === "number") return it.value; else return '"' + it.value + '"'; }; var argument = function (arg, pea) { var ret = extended_attributes(arg.extAttrs, pea); if (arg.optional) ret += "optional "; ret += type(arg.idlType); if (arg.variadic) ret += "..."; ret += " " + arg.name; if (arg["default"]) ret += " = " + const_value(arg["default"]); return ret; }; var args = function (its) { var res = "" , pea = "" ; for (var i = 0, n = its.length; i < n; i++) { var arg = its[i]; if (arg.type === "ws") res += arg.value; else if (arg.type === "ws-pea") pea += arg.value; else { res += argument(arg, pea); if (i < n - 1) res += ","; pea = ""; } } return res; }; var make_ext_at = function (it) { if (it["arguments"] === null) return it.name; context.unshift(it); var ret = it.name + "(" + (it["arguments"].length ? args(it["arguments"]) : "") + ")"; context.shift(); // XXX need to add more contexts, but not more than needed for ReSpec return ret; }; var extended_attributes = function (eats, pea) { if (!eats || !eats.length) return ""; return "[" + eats.map(make_ext_at).join(", ") + "]" + pea; }; var modifiers = "getter setter creator deleter legacycaller stringifier static".split(" "); var operation = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; if (it.stringifier && !it.idlType) return "stringifier;"; for (var i = 0, n = modifiers.length; i < n; i++) { var mod = modifiers[i]; if (it[mod]) ret += mod + " "; } ret += type(it.idlType) + " "; if (it.name) ret += it.name; ret += "(" + args(it["arguments"]) + ");"; return ret; }; var attribute = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; if (it["static"]) ret += "static "; if (it.stringifier) ret += "stringifier "; if (it.readonly) ret += "readonly "; if (it.inherit) ret += "inherit "; ret += "attribute " + type(it.idlType) + " " + it.name + ";"; return ret; }; var interface_ = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; if (it.partial) ret += "partial "; ret += "interface " + it.name + " "; if (it.inheritance) ret += ": " + it.inheritance + " "; ret += "{" + iterate(it.members) + "};"; return ret; }; var dictionary = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; if (it.partial) ret += "partial "; ret += "dictionary " + it.name + " "; ret += "{" + iterate(it.members) + "};"; return ret; }; var field = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; ret += type(it.idlType) + " " + it.name; if (it["default"]) ret += " = " + const_value(it["default"]); ret += ";"; return ret; }; var exception = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; ret += "exception " + it.name + " "; if (it.inheritance) ret += ": " + it.inheritance + " "; ret += "{" + iterate(it.members) + "};"; return ret; }; var const_ = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; return ret + "const " + type(it.idlType) + " " + it.name + " = " + const_value(it.value) + ";"; }; var typedef = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; ret += "typedef " + extended_attributes(it.typeExtAttrs, curTPea); curTPea = ""; return ret + type(it.idlType) + " " + it.name + ";"; }; var implements_ = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; return ret + it.target + " implements " + it["implements"] + ";"; }; var callback = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; return ret + "callback " + it.name + " = " + type(it.idlType) + "(" + args(it["arguments"]) + ");"; }; var enum_ = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; ret += "enum " + it.name + " {"; for (var i = 0, n = it.values.length; i < n; i++) { var v = it.values[i]; if (typeof v === "string") ret += '"' + v + '"'; else if (v.type === "ws") ret += v.value; else if (v.type === ",") ret += ","; } return ret + "};"; }; var table = { ws: literal , "ws-pea": wsPea , "ws-tpea": wsTPea , "line-comment": lineComment , "multiline-comment": multilineComment , "interface": interface_ , operation: operation , attribute: attribute , dictionary: dictionary , field: field , exception: exception , "const": const_ , typedef: typedef , "implements": implements_ , callback: callback , "enum": enum_ }; var dispatch = function (it) { return table[it.type](it); }; var iterate = function (things) { if (!things) return; var ret = ""; for (var i = 0, n = things.length; i < n; i++) ret += dispatch(things[i]); return ret; }; return iterate(ast); }; var inNode = typeof module !== "undefined" && module.exports , obj = { write: function (ast, opt) { if (!opt) opt = {}; return write(ast, opt); } }; if (inNode) module.exports = obj; else window.WebIDL2Writer = obj; }());