| OLD | NEW |
| 1 /** | 1 /** |
| 2 * This file presents various methods to create a JS typing system. | 2 * This file presents various methods to create a JS typing system. |
| 3 */ | 3 */ |
| 4 | 4 |
| 5 function divine_inheritance(clazz, constants) { | 5 function divine_inheritance(clazz, constants) { |
| 6 let aliases = {}; | 6 let aliases = {}; |
| 7 for each (let c in constants) { | 7 for (let c of constants) { |
| 8 aliases[c.name] = c.init; | 8 aliases[c.name] = c.init; |
| 9 } | 9 } |
| 10 | 10 |
| 11 // First, do we have a QueryInterface variable? | 11 // First, do we have a QueryInterface variable? |
| 12 if ("QueryInterface" in clazz.variables) { | 12 if ("QueryInterface" in clazz.variables) { |
| 13 // Yes, it's a function, but the variable means that we found a XPCOMUtils | 13 // Yes, it's a function, but the variable means that we found a XPCOMUtils |
| 14 // utility. This'll be easy! | 14 // utility. This'll be easy! |
| 15 let xpcom = clazz.variables.QueryInterface.init; | 15 let xpcom = clazz.variables.QueryInterface.init; |
| 16 assert(xpcom.op == JSOP_CALL && xpcom.kids[0].atom == "generateQI"); | 16 assert(xpcom.op == JSOP_CALL && xpcom.kids[0].atom == "generateQI"); |
| 17 | 17 |
| 18 if (!clazz.inherits) | 18 if (!clazz.inherits) |
| 19 clazz.inherits = []; | 19 clazz.inherits = []; |
| 20 for each (let iface in xpcom.kids[1].kids) | 20 for (let iface of xpcom.kids[1].kids) |
| 21 clazz.inherits.push(iface.atom); | 21 clazz.inherits.push(iface.atom); |
| 22 return; | 22 return; |
| 23 } | 23 } |
| 24 | 24 |
| 25 if ("QueryInterface" in clazz.functions) { | 25 if ("QueryInterface" in clazz.functions) { |
| 26 if (!clazz.inherits) | 26 if (!clazz.inherits) |
| 27 clazz.inherits = []; | 27 clazz.inherits = []; |
| 28 function findInterfaces(ast) { | 28 function findInterfaces(ast) { |
| 29 » if (ast.op == JSOP_GETPROP && ast.kids[0]) { | 29 if (ast.op == JSOP_GETPROP && ast.kids[0]) { |
| 30 » » let check = ast.kids[0]; | 30 let check = ast.kids[0]; |
| 31 » » if (check.atom == "interfaces" && check.kids[0] && | 31 if (check.atom == "interfaces" && check.kids[0] && |
| 32 » » » » check.kids[0].atom == "Components") { | 32 check.kids[0].atom == "Components") { |
| 33 clazz.inherits.push(ast.atom); | 33 clazz.inherits.push(ast.atom); |
| 34 } | 34 } |
| 35 } | 35 } |
| 36 } | 36 } |
| 37 visit(clazz.functions.QueryInterface.body, findInterfaces, aliases); | 37 visit(clazz.functions.QueryInterface.body, findInterfaces, aliases); |
| 38 return; | 38 return; |
| 39 } | 39 } |
| 40 } | 40 } |
| OLD | NEW |