diff --git a/lib/writer.js b/lib/writer.js index ba836373..d48e7410 100644 --- a/lib/writer.js +++ b/lib/writer.js @@ -35,16 +35,17 @@ 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<"; + if (it.generic) ret += it.generic + "<"; + else if (it.sequence) ret += "sequence<"; ret += type(it.idlType); - if (it.array) { + if (it.array || it.generic === '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.generic || it.sequence) ret += ">"; if (it.nullable) ret += "?"; return ret; @@ -142,6 +143,7 @@ var field = function (it) { var ret = extended_attributes(it.extAttrs, curPea); curPea = ""; + if (it.required) ret += "required "; ret += type(it.idlType) + " " + it.name; if (it["default"]) ret += " = " + const_value(it["default"]); ret += ";"; @@ -190,6 +192,44 @@ } return ret + "};"; }; + var serializer = function(it) { + var ret = "serializer"; + if (it.name) { + ret += " = " + it.name + ";"; + } else if (it.patternList) { + ret += " = [ " + it.names.join(", ") + " ];"; + } else if (it.patternMap) { + ret += " = { " + it.names.join(", ") + " };"; + } else if (it.operation) { + ret += " " + operation(it); + } else { + ret += ";"; + } + return ret; + }; + var iterable = function(it) { + return "iterable<" + (it.idlType instanceof Array + ? it.idlType.map(type).join(", ") + : type(it.idlType) + ) + ">;"; + }; + var legacyiterable = function(it) { + return "legacyiterable<" + (it.idlType instanceof Array + ? it.idlType.map(type).join(", ") + : type(it.idlType) + ) + ">;"; + }; + var maplike = function(it) { + return (it.readonly ? "readonly " : "") + "maplike<" + + it.idlType.map(type).join(", ") + ">;"; + }; + var setlike = function(it) { + return (it.readonly ? "readonly " : "") + "setlike<" + + type(it.idlType) + ">;"; + }; + var callbackInterface = function(it) { + return 'callback ' + interface_(it); + }; var table = { ws: literal @@ -208,6 +248,12 @@ , "implements": implements_ , callback: callback , "enum": enum_ + , serializer: serializer + , iterable: iterable + , legacyiterable: legacyiterable + , maplike: maplike + , setlike: setlike + , "callback interface": callbackInterface }; var dispatch = function (it) { return table[it.type](it);