1
0
Fork 0
mirror of https://github.com/jashkenas/coffeescript.git synced 2022-11-09 12:23:24 -05:00

CoffeeScript now compiled 'undefined' as 'void 0'

This commit is contained in:
Jeremy Ashkenas 2010-10-27 22:50:20 -04:00
parent 853d28860a
commit 6b4e437c93
13 changed files with 67 additions and 66 deletions

View file

@ -22,7 +22,7 @@
xhr.overrideMimeType('text/plain');
}
xhr.onreadystatechange = function() {
return xhr.readyState === 4 ? CoffeeScript.run(xhr.responseText, options) : undefined;
return xhr.readyState === 4 ? CoffeeScript.run(xhr.responseText, options) : void 0;
};
return xhr.send(null);
};

View file

@ -65,7 +65,7 @@
desc = task.description ? "# " + task.description : '';
console.log("cake " + name + spaces + " " + desc);
}
return switches.length ? console.log(oparse.help()) : undefined;
return switches.length ? console.log(oparse.help()) : void 0;
};
missingTask = function(task) {
console.log("No such task: \"" + task + "\"");

View file

@ -74,7 +74,7 @@
fs.readFile(source, function(err, code) {
return compileScript(source, code.toString(), base);
});
return opts.watch ? watch(source, base) : undefined;
return opts.watch ? watch(source, base) : void 0;
}
});
});
@ -110,7 +110,7 @@
} else {
t.output = CoffeeScript.compile(t.input, t.options);
CoffeeScript.emit('success', task);
return o.print ? console.log(t.output.trim()) : o.compile ? writeJs(t.file, t.output, base) : o.lint ? lint(t.file, t.output) : undefined;
return o.print ? console.log(t.output.trim()) : o.compile ? writeJs(t.file, t.output, base) : o.lint ? lint(t.file, t.output) : void 0;
}
} catch (err) {
CoffeeScript.emit('failure', err, task);
@ -129,7 +129,7 @@
code = '';
stdin = process.openStdin();
stdin.on('data', function(buffer) {
return buffer ? code += buffer.toString() : undefined;
return buffer ? code += buffer.toString() : void 0;
});
return stdin.on('end', function() {
return compileScript('stdio', code);
@ -163,7 +163,7 @@
js = ' ';
}
return fs.writeFile(jsPath, js, function(err) {
return err ? console.log(err.message) : opts.compile && opts.watch ? console.log("Compiled " + source) : undefined;
return err ? console.log(err.message) : opts.compile && opts.watch ? console.log("Compiled " + source) : void 0;
});
};
return path.exists(dir, function(exists) {

View file

@ -66,7 +66,7 @@
}), o('REGEX', function() {
return new Literal($1);
}), o('BOOL', function() {
return new Literal($1);
return new Literal($1 === 'undefined' ? 'void 0' : $1);
})
],
Assign: [

View file

@ -94,7 +94,7 @@
if (COFFEE_ALIASES.hasOwnProperty(id)) {
id = COFFEE_ALIASES[id];
}
tag = id === '!' ? 'UNARY' : id === '==' || id === '!=' ? 'COMPARE' : id === '&&' || id === '||' ? 'LOGIC' : id === 'true' || id === 'false' || id === 'null' ? 'BOOL' : tag;
tag = id === '!' ? 'UNARY' : id === '==' || id === '!=' ? 'COMPARE' : id === '&&' || id === '||' ? 'LOGIC' : id === 'true' || id === 'false' || id === 'null' || id === 'undefined' ? 'BOOL' : tag;
}
this.token(tag, id);
if (colon) {
@ -228,7 +228,7 @@
tokens.push(['+', '+']);
}
tokens.pop();
if (((_ref3 = tokens[0]) != null ? _ref3[0] : undefined) !== 'STRING') {
if (((_ref3 = tokens[0]) != null ? _ref3[0] : void 0) !== 'STRING') {
this.tokens.push(['STRING', '""'], ['+', '+']);
}
(_this = this.tokens).push.apply(_this, tokens);
@ -277,7 +277,7 @@
var dent, len;
while (moveOut > 0) {
len = this.indents.length - 1;
if (this.indents[len] === undefined) {
if (this.indents[len] === void 0) {
moveOut = 0;
} else if (this.indents[len] === this.outdebt) {
moveOut -= this.outdebt;
@ -357,7 +357,7 @@
tag = 'UNARY';
} else if (__indexOf.call(SHIFT, value) >= 0) {
tag = 'SHIFT';
} else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : undefined)) {
} else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) {
tag = 'LOGIC';
} else if (prev && !prev.spaced) {
if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) {
@ -565,7 +565,7 @@
return Lexer;
})();
JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'try', 'catch', 'finally', 'class', 'extends', 'super'];
COFFEE_KEYWORDS = ['then', 'unless', 'until', 'loop', 'of', 'by', 'when'];
COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when'];
for (op in COFFEE_ALIASES = {
and: '&&',
or: '||',
@ -608,7 +608,7 @@
COMPARE = ['==', '!=', '<', '>', '<=', '>='];
MATH = ['*', '/', '%'];
RELATION = ['IN', 'OF', 'INSTANCEOF'];
BOOL = ['TRUE', 'FALSE', 'NULL'];
BOOL = ['TRUE', 'FALSE', 'NULL', 'UNDEFINED'];
NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', '++', '--', ']'];
CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER'];
INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL');

View file

@ -76,7 +76,7 @@
contains = false;
this.traverseChildren(false, function(node, arg) {
var rearg;
return (rearg = block(node, arg)) === true ? !(contains = true) : arg != null ? rearg : undefined;
return (rearg = block(node, arg)) === true ? !(contains = true) : arg != null ? rearg : void 0;
}, arg);
return contains;
};
@ -311,7 +311,7 @@
Return.prototype.makeReturn = THIS;
Return.prototype.compile = function(o, level) {
var _ref2, expr;
expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : undefined;
expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0;
return expr && !(expr instanceof Return) ? expr.compile(o, level) : Return.__super__.compile.call(this, o, level);
};
Return.prototype.compileNode = function(o) {
@ -384,7 +384,7 @@
Value.prototype.cacheReference = function(o) {
var base, bref, name, nref;
name = last(this.properties);
if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : undefined)) {
if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) {
return [this, this];
}
base = new Value(this.base, this.properties.slice(0, -1));
@ -1029,7 +1029,7 @@
empty = this.body.expressions.length === 0;
delete o.bare;
delete o.globals;
splat = undefined;
splat = void 0;
params = [];
_ref2 = this.params;
for (i = 0, _len = _ref2.length; i < _len; i++) {
@ -1091,7 +1091,7 @@
return this.tags.front ? "(" + func + ")" : func;
};
Code.prototype.traverseChildren = function(crossScope, func) {
return crossScope ? Code.__super__.traverseChildren.call(this, crossScope, func) : undefined;
return crossScope ? Code.__super__.traverseChildren.call(this, crossScope, func) : void 0;
};
return Code;
})();
@ -1152,7 +1152,7 @@
o.scope.assign(len, 'arguments.length');
variadic = o.scope.freeVariable('result');
o.scope.assign(variadic, len + ' >= ' + this.arglength);
end = this.trailings.length ? ", " + len + " - " + this.trailings.length : undefined;
end = this.trailings.length ? ", " + len + " - " + this.trailings.length : void 0;
_ref2 = this.trailings;
for (idx = 0, _len = _ref2.length; idx < _len; idx++) {
trailing = _ref2[idx];
@ -1201,8 +1201,8 @@
While = (function() {
function While(condition, opts) {
While.__super__.constructor.call(this);
this.condition = (opts != null ? opts.invert : undefined) ? condition.invert() : condition;
this.guard = opts != null ? opts.guard : undefined;
this.condition = (opts != null ? opts.invert : void 0) ? condition.invert() : condition;
this.guard = opts != null ? opts.guard : void 0;
return this;
}
return While;
@ -1428,7 +1428,7 @@
var catchPart, errorPart;
o.indent = this.idt(1);
errorPart = this.error ? " (" + (this.error.compile(o)) + ") " : ' ';
catchPart = this.recovery ? " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : !(this.ensure || this.recovery) ? ' catch (_e) {}' : undefined;
catchPart = this.recovery ? " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : !(this.ensure || this.recovery) ? ' catch (_e) {}' : void 0;
return ("" + this.tab + "try {\n" + (this.attempt.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" + (catchPart || '')) + (this.ensure ? " finally {\n" + (this.ensure.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : '');
};
return Try;
@ -1540,8 +1540,8 @@
For.prototype.compileNode = function(o) {
var _ref2, _ref3, _ref4, _ref5, _ref6, body, code, cond, defPart, forPart, guardPart, idt, index, ivar, lvar, name, namePart, pvar, retPart, rvar, scope, sourcePart, step, svar, tail, tvar, varPart, vars;
scope = o.scope;
name = !this.pattern && ((_ref2 = this.name) != null ? _ref2.compile(o) : undefined);
index = (_ref3 = this.index) != null ? _ref3.compile(o) : undefined;
name = !this.pattern && ((_ref2 = this.name) != null ? _ref2.compile(o) : void 0);
index = (_ref3 = this.index) != null ? _ref3.compile(o) : void 0;
ivar = !index ? scope.freeVariable('i') : index;
varPart = guardPart = defPart = retPart = '';
body = Expressions.wrap([this.body]);
@ -1572,7 +1572,7 @@
} else {
sourcePart = svar = this.source.compile(o, LEVEL_PAREN);
}
namePart = this.pattern ? new Assign(this.name, new Literal("" + svar + "[" + ivar + "]")).compile(o, LEVEL_TOP) : name ? "" + name + " = " + svar + "[" + ivar + "]" : undefined;
namePart = this.pattern ? new Assign(this.name, new Literal("" + svar + "[" + ivar + "]")).compile(o, LEVEL_TOP) : name ? "" + name + " = " + svar + "[" + ivar + "]" : void 0;
if (!this.object) {
if (0 > pvar && (pvar | 0) === +pvar) {
vars = "" + ivar + " = " + svar + ".length - 1";
@ -1659,7 +1659,7 @@
var _i, _j, _len, _len2, _ref2, _ref3, _ref4, _ref5, block, body, code, cond, conditions, expr, i, idt1, idt2;
idt1 = this.idt(1);
idt2 = o.indent = this.idt(2);
code = this.tab + ("switch (" + (((_ref2 = this.subject) != null ? _ref2.compile(o, LEVEL_PAREN) : undefined) || false) + ") {\n");
code = this.tab + ("switch (" + (((_ref2 = this.subject) != null ? _ref2.compile(o, LEVEL_PAREN) : void 0) || false) + ") {\n");
for (i = 0, _len = this.cases.length; i < _len; i++) {
_ref3 = this.cases[i], conditions = _ref3[0], block = _ref3[1];
_ref4 = flatten([conditions]);
@ -1711,11 +1711,11 @@
If.prototype.children = ['condition', 'body', 'elseBody'];
If.prototype.bodyNode = function() {
var _ref2;
return (_ref2 = this.body) != null ? _ref2.unwrap() : undefined;
return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0;
};
If.prototype.elseBodyNode = function() {
var _ref2;
return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : undefined;
return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0;
};
If.prototype.addElse = function(elseBody) {
if (this.isChain) {
@ -1728,7 +1728,7 @@
};
If.prototype.isStatement = function(o) {
var _ref2;
return (o != null ? o.level : undefined) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : undefined);
return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0);
};
If.prototype.compileNode = function(o) {
return this.isStatement(o) ? this.compileStatement(o) : this.compileExpression(o);
@ -1767,8 +1767,11 @@
})) : "{\n" + (this.elseBody.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}");
};
If.prototype.compileExpression = function(o) {
var _ref2, code;
code = this.condition.compile(o, LEVEL_COND) + ' ? ' + this.bodyNode().compile(o, LEVEL_LIST) + ' : ' + ((_ref2 = this.elseBodyNode()) != null ? _ref2.compile(o, LEVEL_LIST) : undefined);
var alt, body, code, cond;
cond = this.condition.compile(o, LEVEL_COND);
body = this.bodyNode().compile(o, LEVEL_LIST);
alt = this.elseBodyNode() ? this.elseBodyNode().compile(o, LEVEL_LIST) : 'void 0';
code = "" + cond + " ? " + body + " : " + alt;
return o.level >= LEVEL_COND ? "(" + code + ")" : code;
};
If.prototype.unfoldSoak = function() {

View file

@ -81,7 +81,7 @@ case 35:this.$ = new yy.Literal($$[$0-1+1-1]);
break;
case 36:this.$ = new yy.Literal($$[$0-1+1-1]);
break;
case 37:this.$ = new yy.Literal($$[$0-1+1-1]);
case 37:this.$ = new yy.Literal($$[$0-1+1-1] === 'undefined' ? 'void 0' : $$[$0-1+1-1]);
break;
case 38:this.$ = new yy.Assign($$[$0-3+1-1], $$[$0-3+3-1]);
break;

View file

@ -17,7 +17,7 @@
globals: true,
fileName: 'repl'
});
if (val !== undefined) {
if (val !== void 0) {
console.log(val);
}
} catch (err) {

View file

@ -63,15 +63,15 @@
return 1;
}
before = tokens[i - 2], prev = tokens[i - 1], post = tokens[i + 1], after = tokens[i + 2];
if ((after != null ? after[0] : undefined) === 'INDENT') {
if ((after != null ? after[0] : void 0) === 'INDENT') {
tokens.splice(i + 2, 1);
if ((before != null ? before[0] : undefined) === 'OUTDENT' && (post != null ? post[0] : undefined) === 'TERMINATOR') {
if ((before != null ? before[0] : void 0) === 'OUTDENT' && (post != null ? post[0] : void 0) === 'TERMINATOR') {
tokens.splice(i - 2, 1);
} else {
tokens.splice(i, 0, after);
}
} else if (prev && ((_ref = prev[0]) !== 'TERMINATOR' && _ref !== 'INDENT' && _ref !== 'OUTDENT')) {
if ((post != null ? post[0] : undefined) === 'TERMINATOR' && (after != null ? after[0] : undefined) === 'OUTDENT') {
if ((post != null ? post[0] : void 0) === 'TERMINATOR' && (after != null ? after[0] : void 0) === 'OUTDENT') {
tokens.splice.apply(tokens, [i + 2, 0].concat(tokens.splice(i, 2)));
if (tokens[i + 2][0] !== 'TERMINATOR') {
tokens.splice(i + 2, 0, ['TERMINATOR', '\n', prev[2]]);
@ -92,7 +92,7 @@
break;
}
}
return i ? this.tokens.splice(0, i) : undefined;
return i ? this.tokens.splice(0, i) : void 0;
};
exports.Rewriter.prototype.removeMidExpressionNewlines = function() {
return this.scanTokens(function(token, i, tokens) {
@ -147,7 +147,7 @@
}
_ref = this.tokens, one = _ref[i + 1], two = _ref[i + 2], three = _ref[i + 3];
tag = token[0];
return (tag === 'TERMINATOR' || tag === 'OUTDENT') && !((two != null ? two[0] : undefined) === ':' || (one != null ? one[0] : undefined) === '@' && (three != null ? three[0] : undefined) === ':' || (one != null ? one[0] : undefined) === '(') || tag === ',' && one && ((_ref2 = one[0]) !== 'IDENTIFIER' && _ref2 !== 'NUMBER' && _ref2 !== 'STRING' && _ref2 !== '@' && _ref2 !== 'TERMINATOR' && _ref2 !== 'OUTDENT' && _ref2 !== '(');
return (tag === 'TERMINATOR' || tag === 'OUTDENT') && !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '(') || tag === ',' && one && ((_ref2 = one[0]) !== 'IDENTIFIER' && _ref2 !== 'NUMBER' && _ref2 !== 'STRING' && _ref2 !== '@' && _ref2 !== 'TERMINATOR' && _ref2 !== 'OUTDENT' && _ref2 !== '(');
};
action = function(token, i) {
return this.tokens.splice(i, 0, ['}', '}', token[2]]);
@ -162,7 +162,7 @@
start = stack.pop();
return 1;
}
if (!(tag === ':' && ((ago2 = this.tag(i - 2)) === ':' || (ago1 = this.tag(i - 1)) === ')' && this.tag(start[1] - 1) === ':' || ((_ref2 = stack[stack.length - 1]) != null ? _ref2[0] : undefined) !== '{'))) {
if (!(tag === ':' && ((ago2 = this.tag(i - 2)) === ':' || (ago1 = this.tag(i - 1)) === ')' && this.tag(start[1] - 1) === ':' || ((_ref2 = stack[stack.length - 1]) != null ? _ref2[0] : void 0) !== '{'))) {
return 1;
}
stack.push(['{']);
@ -200,7 +200,7 @@
if (prev && !prev.spaced && tag === '?') {
token.call = true;
}
if (!(callObject || (prev != null ? prev.spaced : undefined) && (prev.call || (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) {
if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) {
return 1;
}
tokens.splice(i, 0, ['CALL_START', '(', token[2]]);
@ -277,7 +277,7 @@
}
original = token;
this.detectEnd(i + 1, condition, function(token, i) {
return token[0] !== 'INDENT' ? original[0] = 'POST_' + original[0] : undefined;
return token[0] !== 'INDENT' ? original[0] = 'POST_' + original[0] : void 0;
});
return 1;
});
@ -363,7 +363,7 @@
};
exports.Rewriter.prototype.tag = function(i) {
var _ref;
return (_ref = this.tokens[i]) != null ? _ref[0] : undefined;
return (_ref = this.tokens[i]) != null ? _ref[0] : void 0;
};
BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']];
INVERSES = {};

View file

@ -71,10 +71,10 @@
Scope.prototype.check = function(name, options) {
var _ref2, immediate;
immediate = !!this.type(name);
if (immediate || (options != null ? options.immediate : undefined)) {
if (immediate || (options != null ? options.immediate : void 0)) {
return immediate;
}
return !!((_ref2 = this.parent) != null ? _ref2.check(name) : undefined);
return !!((_ref2 = this.parent) != null ? _ref2.check(name) : void 0);
};
Scope.prototype.temporary = function(name, index) {
return name.length > 1 ? '_' + name + (index > 1 ? index : '') : '_' + (index + parseInt(name, 36)).toString(36).replace(/\d/g, 'a');

View file

@ -131,7 +131,8 @@ grammar =
o 'AlphaNumeric'
o 'JS', -> new Literal $1
o 'REGEX', -> new Literal $1
o 'BOOL', -> new Literal $1
o 'BOOL', ->
new Literal if $1 is 'undefined' then 'void 0' else $1
]
# Assignment of a variable, property, or index to a value.
@ -486,24 +487,20 @@ grammar =
# if-related rules are broken up along these lines in order to avoid
# ambiguity.
IfBlock: [
o 'IF Expression Block', -> new If $2, $3
o 'UNLESS Expression Block', -> new If $2, $3, invert: true
o 'IfBlock ELSE IF Expression Block', -> $1.addElse new If $4, $5
o 'IfBlock ELSE Block', -> $1.addElse $3
o 'IF Expression Block', -> new If $2, $3
o 'UNLESS Expression Block', -> new If $2, $3, invert: true
o 'IfBlock ELSE IF Expression Block', -> $1.addElse new If $4, $5
o 'IfBlock ELSE Block', -> $1.addElse $3
]
# The full complement of *if* expressions, including postfix one-liner
# *if* and *unless*.
If: [
o 'IfBlock'
o 'Statement POST_IF Expression', ->
new If $3, Expressions.wrap([$1]), statement: true
o 'Expression POST_IF Expression', ->
new If $3, Expressions.wrap([$1]), statement: true
o 'Statement POST_UNLESS Expression', ->
new If $3, Expressions.wrap([$1]), statement: true, invert: true
o 'Expression POST_UNLESS Expression', ->
new If $3, Expressions.wrap([$1]), statement: true, invert: true
o 'Statement POST_IF Expression', -> new If $3, Expressions.wrap([$1]), statement: true
o 'Expression POST_IF Expression', -> new If $3, Expressions.wrap([$1]), statement: true
o 'Statement POST_UNLESS Expression', -> new If $3, Expressions.wrap([$1]), statement: true, invert: true
o 'Expression POST_UNLESS Expression', -> new If $3, Expressions.wrap([$1]), statement: true, invert: true
]
# Arithmetic and logical operators, working on one or more operands.

View file

@ -116,10 +116,10 @@ exports.Lexer = class Lexer
@identifierError id
unless forcedIdentifier
id = COFFEE_ALIASES[id] if COFFEE_ALIASES.hasOwnProperty id
tag = if id is '!' then 'UNARY'
else if id in ['==', '!='] then 'COMPARE'
else if id in ['&&', '||'] then 'LOGIC'
else if id in ['true', 'false', 'null'] then 'BOOL'
tag = if id is '!' then 'UNARY'
else if id in ['==', '!='] then 'COMPARE'
else if id in ['&&', '||'] then 'LOGIC'
else if id in ['true', 'false', 'null', 'undefined'] then 'BOOL'
else tag
@token tag, id
@token ':', ':' if colon
@ -497,7 +497,7 @@ JS_KEYWORDS = [
]
# CoffeeScript-only keywords.
COFFEE_KEYWORDS = ['then', 'unless', 'until', 'loop', 'of', 'by', 'when']
COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']
COFFEE_KEYWORDS.push op for all op of COFFEE_ALIASES =
and : '&&'
or : '||'
@ -599,7 +599,7 @@ MATH = ['*', '/', '%']
RELATION = ['IN', 'OF', 'INSTANCEOF']
# Boolean tokens.
BOOL = ['TRUE', 'FALSE', 'NULL']
BOOL = ['TRUE', 'FALSE', 'NULL', 'UNDEFINED']
# Tokens which a regular expression will never immediately follow, but which
# a division operator might.

View file

@ -1453,9 +1453,10 @@ exports.If = class If extends Base
# Compile the If as a conditional operator.
compileExpression: (o) ->
code = @condition .compile(o, LEVEL_COND) + ' ? ' +
@bodyNode().compile(o, LEVEL_LIST) + ' : ' +
@elseBodyNode()?.compile o, LEVEL_LIST
cond = @condition.compile o, LEVEL_COND
body = @bodyNode().compile o, LEVEL_LIST
alt = if @elseBodyNode() then @elseBodyNode().compile(o, LEVEL_LIST) else 'void 0'
code = "#{cond} ? #{body} : #{alt}"
if o.level >= LEVEL_COND then "(#{code})" else code
unfoldSoak: -> @soak and this