OLD | NEW |
1 | 1 |
2 | 2 |
3 (function () { | 3 (function () { |
4 var tokenise = function (str) { | 4 var tokenise = function (str) { |
5 var tokens = [] | 5 var tokens = [] |
6 , re = { | 6 , re = { |
7 "float": /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][-+]?[0
-9]+)?|[0-9]+[Ee][-+]?[0-9]+)/ | 7 "float": /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][-+]?[0
-9]+)?|[0-9]+[Ee][-+]?[0-9]+)/ |
8 , "integer": /^-?(0([Xx][0-9A-Fa-f]+|[0-7]*)|[1-9][0-9]*)/ | 8 , "integer": /^-?(0([Xx][0-9A-Fa-f]+|[0-7]*)|[1-9][0-9]*)/ |
9 , "identifier": /^[A-Z_a-z][0-9A-Z_a-z]*/ | 9 , "identifier": /^[A-Z_a-z][0-9A-Z_a-z]*/ |
10 , "string": /^"[^"]*"/ | 10 , "string": /^"[^"]*"/ |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 // Generic types | 207 // Generic types |
208 if (consume(OTHER, "<")) { | 208 if (consume(OTHER, "<")) { |
209 // backwards compat | 209 // backwards compat |
210 if (value === "sequence") { | 210 if (value === "sequence") { |
211 ret.sequence = true; | 211 ret.sequence = true; |
212 } | 212 } |
213 ret.generic = value; | 213 ret.generic = value; |
214 ret.idlType = type() || error("Error parsing generic type "
+ value); | 214 ret.idlType = type() || error("Error parsing generic type "
+ value); |
215 all_ws(); | 215 all_ws(); |
216 if (!consume(OTHER, ">")) error("Unterminated generic type "
+ value); | 216 if (!consume(OTHER, ">")) error("Unterminated generic type "
+ value); |
217 all_ws(); | 217 type_suffix(ret); |
218 if (consume(OTHER, "?")) ret.nullable = true; | |
219 return ret; | 218 return ret; |
220 } | 219 } |
221 else { | 220 else { |
222 ret.idlType = value; | 221 ret.idlType = value; |
223 } | 222 } |
224 } | 223 } |
225 else { | 224 else { |
226 return; | 225 return; |
227 } | 226 } |
228 type_suffix(ret); | 227 type_suffix(ret); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 all_ws(); | 323 all_ws(); |
325 var name = consume(ID); | 324 var name = consume(ID); |
326 if (!name) return; | 325 if (!name) return; |
327 var ret = { | 326 var ret = { |
328 name: name.value | 327 name: name.value |
329 , "arguments": null | 328 , "arguments": null |
330 }; | 329 }; |
331 all_ws(); | 330 all_ws(); |
332 var eq = consume(OTHER, "="); | 331 var eq = consume(OTHER, "="); |
333 if (eq) { | 332 if (eq) { |
| 333 var rhs; |
334 all_ws(); | 334 all_ws(); |
335 ret.rhs = consume(ID); | 335 if (rhs = consume(ID)) { |
| 336 ret.rhs = rhs |
| 337 } |
| 338 else if (consume(OTHER, "(")) { |
| 339 // [Exposed=(Window,Worker)] |
| 340 rhs = []; |
| 341 var id = consume(ID); |
| 342 if (id) { |
| 343 rhs = [id.value]; |
| 344 } |
| 345 identifiers(rhs); |
| 346 consume(OTHER, ")") || error("Unexpected token in extended a
ttribute argument list or type pair"); |
| 347 ret.rhs = { |
| 348 type: "identifier-list", |
| 349 value: rhs |
| 350 }; |
| 351 } |
336 if (!ret.rhs) return error("No right hand side to extended attri
bute assignment"); | 352 if (!ret.rhs) return error("No right hand side to extended attri
bute assignment"); |
337 } | 353 } |
338 all_ws(); | 354 all_ws(); |
339 if (consume(OTHER, "(")) { | 355 if (consume(OTHER, "(")) { |
340 var args, pair; | 356 var args, pair; |
341 // [Constructor(DOMString str)] | 357 // [Constructor(DOMString str)] |
342 if (args = argument_list(store)) { | 358 if (args = argument_list(store)) { |
343 ret["arguments"] = args; | 359 ret["arguments"] = args; |
344 } | 360 } |
345 // [MapClass(DOMString, DOMString)] | 361 // [MapClass(DOMString, DOMString)] |
(...skipping 27 matching lines...) Expand all Loading... |
373 }; | 389 }; |
374 | 390 |
375 var default_ = function () { | 391 var default_ = function () { |
376 all_ws(); | 392 all_ws(); |
377 if (consume(OTHER, "=")) { | 393 if (consume(OTHER, "=")) { |
378 all_ws(); | 394 all_ws(); |
379 var def = const_value(); | 395 var def = const_value(); |
380 if (def) { | 396 if (def) { |
381 return def; | 397 return def; |
382 } | 398 } |
| 399 else if (consume(OTHER, "[")) { |
| 400 if (!consume(OTHER, "]")) error("Default sequence value must
be empty"); |
| 401 return { type: "sequence", value: [] }; |
| 402 } |
383 else { | 403 else { |
384 var str = consume(STR) || error("No value for default"); | 404 var str = consume(STR) || error("No value for default"); |
385 str.value = str.value.replace(/^"/, "").replace(/"$/, ""); | 405 str.value = str.value.replace(/^"/, "").replace(/"$/, ""); |
386 return str; | 406 return str; |
387 } | 407 } |
388 } | 408 } |
389 }; | 409 }; |
390 | 410 |
391 var const_ = function (store) { | 411 var const_ = function (store) { |
392 all_ws(store, "pea"); | 412 all_ws(store, "pea"); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 operation_rest(ret, store); | 575 operation_rest(ret, store); |
556 return ret; | 576 return ret; |
557 } | 577 } |
558 if (consume(ID, "static")) { | 578 if (consume(ID, "static")) { |
559 ret["static"] = true; | 579 ret["static"] = true; |
560 ret.idlType = return_type(); | 580 ret.idlType = return_type(); |
561 operation_rest(ret, store); | 581 operation_rest(ret, store); |
562 return ret; | 582 return ret; |
563 } | 583 } |
564 else if (consume(ID, "stringifier")) { | 584 else if (consume(ID, "stringifier")) { |
565 ret.stringifier = true; | 585 ret.stringifier = true;- |
566 all_ws(); | 586 all_ws(); |
567 if (consume(OTHER, ";")) return ret; | 587 if (consume(OTHER, ";")) return ret; |
568 ret.idlType = return_type(); | 588 ret.idlType = return_type(); |
569 operation_rest(ret, store); | 589 operation_rest(ret, store); |
570 return ret; | 590 return ret; |
571 } | 591 } |
572 ret.idlType = return_type(); | 592 ret.idlType = return_type(); |
573 all_ws(); | 593 all_ws(); |
574 if (consume(ID, "iterator")) { | 594 if (consume(ID, "iterator")) { |
575 all_ws(); | 595 all_ws(); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 // noop, just parsing | 681 // noop, just parsing |
662 } | 682 } |
663 else { | 683 else { |
664 ret.idlType = return_type(); | 684 ret.idlType = return_type(); |
665 all_ws(); | 685 all_ws(); |
666 ret.operation = operation_rest(null, store); | 686 ret.operation = operation_rest(null, store); |
667 } | 687 } |
668 return ret; | 688 return ret; |
669 }; | 689 }; |
670 | 690 |
| 691 var iterable_type = function() { |
| 692 if (consume(ID, "iterable")) return "iterable"; |
| 693 else if (consume(ID, "legacyiterable")) return "legacyiterable"; |
| 694 else if (consume(ID, "maplike")) return "maplike"; |
| 695 else if (consume(ID, "setlike")) return "setlike"; |
| 696 else return; |
| 697 } |
| 698 |
| 699 var readonly_iterable_type = function() { |
| 700 if (consume(ID, "maplike")) return "maplike"; |
| 701 else if (consume(ID, "setlike")) return "setlike"; |
| 702 else return; |
| 703 } |
| 704 |
| 705 var iterable = function (store) { |
| 706 all_ws(store, "pea"); |
| 707 var grabbed = [], |
| 708 ret = {type: null, idlType: null, readonly: false}; |
| 709 if (consume(ID, "readonly")) { |
| 710 ret.readonly = true; |
| 711 grabbed.push(last_token); |
| 712 var w = all_ws(); |
| 713 if (w) grabbed.push(w); |
| 714 } |
| 715 var consumeItType = ret.readonly ? readonly_iterable_type : iterable
_type; |
| 716 |
| 717 var ittype = consumeItType(); |
| 718 if (!ittype) { |
| 719 tokens = grabbed.concat(tokens); |
| 720 return; |
| 721 } |
| 722 |
| 723 var secondTypeRequired = ittype === "maplike"; |
| 724 var secondTypeAllowed = secondTypeRequired || ittype === "iterable"; |
| 725 ret.type = ittype; |
| 726 if (ret.type !== 'maplike' && ret.type !== 'setlike') |
| 727 delete ret.readonly; |
| 728 all_ws(); |
| 729 if (consume(OTHER, "<")) { |
| 730 ret.idlType = type() || error("Error parsing " + ittype + " decl
aration"); |
| 731 all_ws(); |
| 732 if (secondTypeAllowed) { |
| 733 var type2 = null; |
| 734 if (consume(OTHER, ",")) { |
| 735 all_ws(); |
| 736 type2 = type(); |
| 737 all_ws(); |
| 738 } |
| 739 if (type2) |
| 740 ret.idlType = [ret.idlType, type2]; |
| 741 else if (secondTypeRequired) |
| 742 error("Missing second type argument in " + ittype + " de
claration"); |
| 743 } |
| 744 if (!consume(OTHER, ">")) error("Unterminated " + ittype + " dec
laration"); |
| 745 all_ws(); |
| 746 if (!consume(OTHER, ";")) error("Missing semicolon after " + itt
ype + " declaration"); |
| 747 } |
| 748 else |
| 749 error("Error parsing " + ittype + " declaration"); |
| 750 |
| 751 return ret; |
| 752 } |
| 753 |
671 var interface_ = function (isPartial, store) { | 754 var interface_ = function (isPartial, store) { |
672 all_ws(isPartial ? null : store, "pea"); | 755 all_ws(isPartial ? null : store, "pea"); |
673 if (!consume(ID, "interface")) return; | 756 if (!consume(ID, "interface")) return; |
674 all_ws(); | 757 all_ws(); |
675 var name = consume(ID) || error("No name for interface"); | 758 var name = consume(ID) || error("No name for interface"); |
676 var mems = [] | 759 var mems = [] |
677 , ret = { | 760 , ret = { |
678 type: "interface" | 761 type: "interface" |
679 , name: name.value | 762 , name: name.value |
680 , partial: false | 763 , partial: false |
(...skipping 10 matching lines...) Expand all Loading... |
691 return ret; | 774 return ret; |
692 } | 775 } |
693 var ea = extended_attrs(store ? mems : null); | 776 var ea = extended_attrs(store ? mems : null); |
694 all_ws(); | 777 all_ws(); |
695 var cnt = const_(store ? mems : null); | 778 var cnt = const_(store ? mems : null); |
696 if (cnt) { | 779 if (cnt) { |
697 cnt.extAttrs = ea; | 780 cnt.extAttrs = ea; |
698 ret.members.push(cnt); | 781 ret.members.push(cnt); |
699 continue; | 782 continue; |
700 } | 783 } |
701 var mem = serialiser(store ? mems : null) || | 784 var mem = (opt.allowNestedTypedefs && typedef(store ? mems : nul
l)) || |
| 785 iterable(store ? mems : null) || |
| 786 serialiser(store ? mems : null) || |
702 attribute(store ? mems : null) || | 787 attribute(store ? mems : null) || |
703 operation(store ? mems : null) || | 788 operation(store ? mems : null) || |
704 error("Unknown member"); | 789 error("Unknown member"); |
705 mem.extAttrs = ea; | 790 mem.extAttrs = ea; |
706 ret.members.push(mem); | 791 ret.members.push(mem); |
707 } | 792 } |
708 }; | 793 }; |
709 | 794 |
710 var partial = function (store) { | 795 var partial = function (store) { |
711 all_ws(store, "pea"); | 796 all_ws(store, "pea"); |
(...skipping 22 matching lines...) Expand all Loading... |
734 consume(OTHER, "{") || error("Bodyless dictionary"); | 819 consume(OTHER, "{") || error("Bodyless dictionary"); |
735 while (true) { | 820 while (true) { |
736 all_ws(store ? mems : null); | 821 all_ws(store ? mems : null); |
737 if (consume(OTHER, "}")) { | 822 if (consume(OTHER, "}")) { |
738 all_ws(); | 823 all_ws(); |
739 consume(OTHER, ";") || error("Missing semicolon after dictio
nary"); | 824 consume(OTHER, ";") || error("Missing semicolon after dictio
nary"); |
740 return ret; | 825 return ret; |
741 } | 826 } |
742 var ea = extended_attrs(store ? mems : null); | 827 var ea = extended_attrs(store ? mems : null); |
743 all_ws(store ? mems : null, "pea"); | 828 all_ws(store ? mems : null, "pea"); |
| 829 var required = consume(ID, "required"); |
744 var typ = type() || error("No type for dictionary member"); | 830 var typ = type() || error("No type for dictionary member"); |
745 all_ws(); | 831 all_ws(); |
746 var name = consume(ID) || error("No name for dictionary member")
; | 832 var name = consume(ID) || error("No name for dictionary member")
; |
| 833 var dflt = default_(); |
| 834 if (required && dflt) error("Required member must not have a def
ault"); |
747 ret.members.push({ | 835 ret.members.push({ |
748 type: "field" | 836 type: "field" |
749 , name: name.value | 837 , name: name.value |
| 838 , required: !!required |
750 , idlType: typ | 839 , idlType: typ |
751 , extAttrs: ea | 840 , extAttrs: ea |
752 , "default": default_() | 841 , "default": dflt |
753 }); | 842 }); |
754 all_ws(); | 843 all_ws(); |
755 consume(OTHER, ";") || error("Unterminated dictionary member"); | 844 consume(OTHER, ";") || error("Unterminated dictionary member"); |
756 } | 845 } |
757 }; | 846 }; |
758 | 847 |
759 var exception = function (store) { | 848 var exception = function (store) { |
760 all_ws(store, "pea"); | 849 all_ws(store, "pea"); |
761 if (!consume(ID, "exception")) return; | 850 if (!consume(ID, "exception")) return; |
762 all_ws(); | 851 all_ws(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 , name: name.value | 900 , name: name.value |
812 , values: vals | 901 , values: vals |
813 }; | 902 }; |
814 all_ws(); | 903 all_ws(); |
815 consume(OTHER, "{") || error("No curly for enum"); | 904 consume(OTHER, "{") || error("No curly for enum"); |
816 var saw_comma = false; | 905 var saw_comma = false; |
817 while (true) { | 906 while (true) { |
818 all_ws(store ? vals : null); | 907 all_ws(store ? vals : null); |
819 if (consume(OTHER, "}")) { | 908 if (consume(OTHER, "}")) { |
820 all_ws(); | 909 all_ws(); |
821 if (saw_comma) error("Trailing comma in enum"); | |
822 consume(OTHER, ";") || error("No semicolon after enum"); | 910 consume(OTHER, ";") || error("No semicolon after enum"); |
823 return ret; | 911 return ret; |
824 } | 912 } |
825 var val = consume(STR) || error("Unexpected value in enum"); | 913 var val = consume(STR) || error("Unexpected value in enum"); |
826 ret.values.push(val.value.replace(/"/g, "")); | 914 ret.values.push(val.value.replace(/"/g, "")); |
827 all_ws(store ? vals : null); | 915 all_ws(store ? vals : null); |
828 if (consume(OTHER, ",")) { | 916 if (consume(OTHER, ",")) { |
829 if (store) vals.push({ type: "," }); | 917 if (store) vals.push({ type: "," }); |
830 all_ws(store ? vals : null); | 918 all_ws(store ? vals : null); |
831 saw_comma = true; | 919 saw_comma = true; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 parse: function (str, opt) { | 1003 parse: function (str, opt) { |
916 if (!opt) opt = {}; | 1004 if (!opt) opt = {}; |
917 var tokens = tokenise(str); | 1005 var tokens = tokenise(str); |
918 return parse(tokens, opt); | 1006 return parse(tokens, opt); |
919 } | 1007 } |
920 }; | 1008 }; |
921 | 1009 |
922 if (inNode) module.exports = obj; | 1010 if (inNode) module.exports = obj; |
923 else self.WebIDL2 = obj; | 1011 else self.WebIDL2 = obj; |
924 }()); | 1012 }()); |
OLD | NEW |