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