| 1325 | } |
| 1326 | |
| 1327 | function arrayLiteralType(elements, scope, inner) { |
| 1328 | var tuple = elements.length > 1 && elements.length < 6 |
| 1329 | if (tuple) { |
| 1330 | var homogenous = true, litType |
| 1331 | for (var i = 0; i < elements.length; i++) { |
| 1332 | var elt = elements[i] |
| 1333 | if (!elt) |
| 1334 | tuple = false |
| 1335 | else if (elt.type != "Literal" || (litType && litType != typeof elt.value)) |
| 1336 | homogenous = false |
| 1337 | else |
| 1338 | litType = typeof elt.value |
| 1339 | } |
| 1340 | if (homogenous) tuple = false |
| 1341 | } |
| 1342 | |
| 1343 | if (tuple) { |
| 1344 | var types = [] |
| 1345 | for (var i = 0; i < elements.length; ++i) |
| 1346 | types.push(inner(elements[i], scope)) |
| 1347 | return new Arr(types) |
| 1348 | } else if (elements.length < 2) { |
| 1349 | return new Arr(elements[0] && inner(elements[0], scope)) |
| 1350 | } else { |
| 1351 | var eltVal = new AVal |
| 1352 | for (var i = 0; i < elements.length; i++) |
| 1353 | if (elements[i]) inner(elements[i], scope).propagate(eltVal) |
| 1354 | return new Arr(eltVal) |
| 1355 | } |
| 1356 | } |
| 1357 | |
| 1358 | function ret(f) { |
| 1359 | return function(node, scope, out, name) { |