mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
fixing broken multi-line optional-paren blocks
This commit is contained in:
parent
21b5d2cac5
commit
1f9bb6a1c4
6 changed files with 27 additions and 11 deletions
|
@ -95,6 +95,7 @@ alert reverse '.eeffoC yrT'</textarea></div>
|
||||||
<a href="documentation/docs/rewriter.html">The Rewriter — src/rewriter</a>
|
<a href="documentation/docs/rewriter.html">The Rewriter — src/rewriter</a>
|
||||||
<a href="documentation/docs/nodes.html">The Syntax Tree — src/nodes</a>
|
<a href="documentation/docs/nodes.html">The Syntax Tree — src/nodes</a>
|
||||||
<a href="documentation/docs/scope.html">Lexical Scope — src/scope</a>
|
<a href="documentation/docs/scope.html">Lexical Scope — src/scope</a>
|
||||||
|
<a href="documentation/docs/helpers.html">Helpers & Utility Functions — src/helpers</a>
|
||||||
<a href="documentation/docs/coffee-script.html">The CoffeeScript Module — src/coffee-script</a>
|
<a href="documentation/docs/coffee-script.html">The CoffeeScript Module — src/coffee-script</a>
|
||||||
<a href="documentation/docs/cake.html">Cake & Cakefiles — src/cake</a>
|
<a href="documentation/docs/cake.html">Cake & Cakefiles — src/cake</a>
|
||||||
<a href="documentation/docs/command.html">"coffee" Command-Line Utility — src/command</a>
|
<a href="documentation/docs/command.html">"coffee" Command-Line Utility — src/command</a>
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
(function(){
|
(function(){
|
||||||
var __hasProp = Object.prototype.hasOwnProperty;
|
var __hasProp = Object.prototype.hasOwnProperty;
|
||||||
// Set up exported variables for both Node.js and the browser.
|
// This file contains the common helper functions that we'd like to share among
|
||||||
|
// the **Lexer**, **Rewriter**, and the **Nodes**. Merge objects, flatten
|
||||||
|
// arrays, count characters, that sort of thing.
|
||||||
|
// Set up exported variables for both **Node.js** and the browser.
|
||||||
if (!((typeof process !== "undefined" && process !== null))) {
|
if (!((typeof process !== "undefined" && process !== null))) {
|
||||||
this.exports = this;
|
this.exports = this;
|
||||||
}
|
}
|
||||||
|
@ -36,8 +39,8 @@
|
||||||
return num;
|
return num;
|
||||||
};
|
};
|
||||||
// Merge objects, returning a fresh copy with attributes from both sides.
|
// Merge objects, returning a fresh copy with attributes from both sides.
|
||||||
// Used every time `compile` is called, to allow properties in the options hash
|
// Used every time `BaseNode#compile` is called, to allow properties in the
|
||||||
// to propagate down the tree without polluting other branches.
|
// options hash to propagate down the tree without polluting other branches.
|
||||||
exports.merge = function merge(options, overrides) {
|
exports.merge = function merge(options, overrides) {
|
||||||
var _a, _b, fresh, key, val;
|
var _a, _b, fresh, key, val;
|
||||||
fresh = {};
|
fresh = {};
|
||||||
|
@ -56,7 +59,7 @@
|
||||||
return fresh;
|
return fresh;
|
||||||
};
|
};
|
||||||
// Return a completely flattened version of an array. Handy for getting a
|
// Return a completely flattened version of an array. Handy for getting a
|
||||||
// list of `children`.
|
// list of `children` from the nodes.
|
||||||
exports.flatten = function flatten(array) {
|
exports.flatten = function flatten(array) {
|
||||||
var _a, _b, _c, item, memo;
|
var _a, _b, _c, item, memo;
|
||||||
memo = [];
|
memo = [];
|
||||||
|
@ -78,7 +81,7 @@
|
||||||
// Matches a balanced group such as a single or double-quoted string. Pass in
|
// Matches a balanced group such as a single or double-quoted string. Pass in
|
||||||
// a series of delimiters, all of which must be nested correctly within the
|
// a series of delimiters, all of which must be nested correctly within the
|
||||||
// contents of the string. This method allows us to have strings within
|
// contents of the string. This method allows us to have strings within
|
||||||
// interpolations within strings etc...
|
// interpolations within strings, ad infinitum.
|
||||||
exports.balanced_string = function balanced_string(str, delimited, options) {
|
exports.balanced_string = function balanced_string(str, delimited, options) {
|
||||||
var _a, _b, _c, _d, close, i, levels, open, pair, slash;
|
var _a, _b, _c, _d, close, i, levels, open, pair, slash;
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
|
|
@ -149,7 +149,7 @@
|
||||||
calls = 0;
|
calls = 0;
|
||||||
return this.scan_tokens((function(__this) {
|
return this.scan_tokens((function(__this) {
|
||||||
var __func = function(prev, token, post, i) {
|
var __func = function(prev, token, post, i) {
|
||||||
var _a, _b, _c, _d, idx, last, size, stack_pointer, tag, tmp;
|
var _a, _b, _c, _d, idx, last, open, size, stack_pointer, tag, tmp;
|
||||||
tag = token[0];
|
tag = token[0];
|
||||||
if (tag === 'CALL_START') {
|
if (tag === 'CALL_START') {
|
||||||
calls += 1;
|
calls += 1;
|
||||||
|
@ -161,7 +161,8 @@
|
||||||
last = stack.pop();
|
last = stack.pop();
|
||||||
stack[stack.length - 1] += last;
|
stack[stack.length - 1] += last;
|
||||||
}
|
}
|
||||||
if (tag === 'CALL_END' && calls < 0) {
|
open = stack[stack.length - 1] > 0;
|
||||||
|
if (tag === 'CALL_END' && calls < 0 && open) {
|
||||||
stack[stack.length - 1] -= 1;
|
stack[stack.length - 1] -= 1;
|
||||||
this.tokens.splice(i, 0, ['CALL_END', ')', token[2]]);
|
this.tokens.splice(i, 0, ['CALL_END', ')', token[2]]);
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -170,7 +171,7 @@
|
||||||
if (tag === 'INDENT' && prev && include(IMPLICIT_BLOCK, prev[0])) {
|
if (tag === 'INDENT' && prev && include(IMPLICIT_BLOCK, prev[0])) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (stack[stack.length - 1] > 0 || tag === 'INDENT') {
|
if (open || tag === 'INDENT') {
|
||||||
idx = tag === 'OUTDENT' ? i + 1 : i;
|
idx = tag === 'OUTDENT' ? i + 1 : i;
|
||||||
stack_pointer = tag === 'INDENT' ? 2 : 1;
|
stack_pointer = tag === 'INDENT' ? 2 : 1;
|
||||||
_c = 0; _d = stack[stack.length - stack_pointer];
|
_c = 0; _d = stack[stack.length - stack_pointer];
|
||||||
|
|
|
@ -116,13 +116,14 @@ exports.Rewriter: class Rewriter
|
||||||
when 'OUTDENT'
|
when 'OUTDENT'
|
||||||
last: stack.pop()
|
last: stack.pop()
|
||||||
stack[stack.length - 1] += last
|
stack[stack.length - 1] += last
|
||||||
if tag is 'CALL_END' and calls < 0
|
open: stack[stack.length - 1] > 0
|
||||||
|
if tag is 'CALL_END' and calls < 0 and open
|
||||||
stack[stack.length - 1] -= 1
|
stack[stack.length - 1] -= 1
|
||||||
@tokens.splice(i, 0, ['CALL_END', ')', token[2]])
|
@tokens.splice(i, 0, ['CALL_END', ')', token[2]])
|
||||||
return 2
|
return 2
|
||||||
if !post? or include IMPLICIT_END, tag
|
if !post? or include IMPLICIT_END, tag
|
||||||
return 1 if tag is 'INDENT' and prev and include IMPLICIT_BLOCK, prev[0]
|
return 1 if tag is 'INDENT' and prev and include IMPLICIT_BLOCK, prev[0]
|
||||||
if stack[stack.length - 1] > 0 or tag is 'INDENT'
|
if open or tag is 'INDENT'
|
||||||
idx: if tag is 'OUTDENT' then i + 1 else i
|
idx: if tag is 'OUTDENT' then i + 1 else i
|
||||||
stack_pointer: if tag is 'INDENT' then 2 else 1
|
stack_pointer: if tag is 'INDENT' then 2 else 1
|
||||||
for tmp in [0...stack[stack.length - stack_pointer]]
|
for tmp in [0...stack[stack.length - stack_pointer]]
|
||||||
|
|
|
@ -21,7 +21,7 @@ class SplitNode extends BaseNode
|
||||||
# Extend CoffeeScript with our lexing function that matches --wordgoeshere--
|
# Extend CoffeeScript with our lexing function that matches --wordgoeshere--
|
||||||
# and creates a SplitNode.
|
# and creates a SplitNode.
|
||||||
CoffeeScript.extend ->
|
CoffeeScript.extend ->
|
||||||
return false unless variable: @match /^--(\w+)--/, 1
|
return false unless variable: @match(/^--(\w+)--/, 1)
|
||||||
@i += variable.length + 4
|
@i += variable.length + 4
|
||||||
@token 'EXTENSION', new SplitNode(variable)
|
@token 'EXTENSION', new SplitNode(variable)
|
||||||
true
|
true
|
||||||
|
|
|
@ -80,6 +80,16 @@ fn: (arg) -> arg
|
||||||
ok fn(fn {prop: 101}).prop is 101
|
ok fn(fn {prop: 101}).prop is 101
|
||||||
|
|
||||||
|
|
||||||
|
# Multi-blocks with optional parens.
|
||||||
|
|
||||||
|
result: fn( ->
|
||||||
|
fn ->
|
||||||
|
"Wrapped"
|
||||||
|
)
|
||||||
|
|
||||||
|
ok result()() is 'Wrapped'
|
||||||
|
|
||||||
|
|
||||||
# And even with strange things like this:
|
# And even with strange things like this:
|
||||||
|
|
||||||
funcs: [((x) -> x), ((x) -> x * x)]
|
funcs: [((x) -> x), ((x) -> x * x)]
|
||||||
|
|
Loading…
Add table
Reference in a new issue