summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/resources/webidl2/lib/writer.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/resources/webidl2/lib/writer.js')
-rw-r--r--testing/web-platform/tests/resources/webidl2/lib/writer.js236
1 files changed, 236 insertions, 0 deletions
diff --git a/testing/web-platform/tests/resources/webidl2/lib/writer.js b/testing/web-platform/tests/resources/webidl2/lib/writer.js
new file mode 100644
index 000000000..ba8363738
--- /dev/null
+++ b/testing/web-platform/tests/resources/webidl2/lib/writer.js
@@ -0,0 +1,236 @@
+
+(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;
+
+}());