lib/gollum/public/gollum/livepreview/js/ace/lib/ace/mode/coffee/rewriter.js in gollum-3.1.2 vs lib/gollum/public/gollum/livepreview/js/ace/lib/ace/mode/coffee/rewriter.js in gollum-3.1.3
- old
+ new
@@ -1,7 +1,7 @@
/**
- * Copyright (c) 2009-2012 Jeremy Ashkenas
+ * Copyright (c) 2009-2013 Jeremy Ashkenas
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
@@ -19,33 +19,39 @@
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
+ *
*/
define(function(require, exports, module) {
-// Generated by CoffeeScript 1.3.3
+// Generated by CoffeeScript 1.6.3
- var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref,
+ var BALANCED_PAIRS, CALL_CLOSERS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, generate, left, rite, _i, _len, _ref,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
__slice = [].slice;
- exports.Rewriter = (function() {
+ generate = function(tag, value) {
+ var tok;
+ tok = [tag, value];
+ tok.generated = true;
+ return tok;
+ };
+ exports.Rewriter = (function() {
function Rewriter() {}
Rewriter.prototype.rewrite = function(tokens) {
this.tokens = tokens;
this.removeLeadingNewlines();
- this.removeMidExpressionNewlines();
this.closeOpenCalls();
this.closeOpenIndexes();
- this.addImplicitIndentation();
+ this.normalizeLines();
this.tagPostfixConditionals();
- this.addImplicitBraces();
- this.addImplicitParentheses();
+ this.addImplicitBracesAndParens();
+ this.addLocationDataToGeneratedTokens();
return this.tokens;
};
Rewriter.prototype.scanTokens = function(block) {
var i, token, tokens;
@@ -90,21 +96,10 @@
if (i) {
return this.tokens.splice(0, i);
}
};
- Rewriter.prototype.removeMidExpressionNewlines = function() {
- return this.scanTokens(function(token, i, tokens) {
- var _ref;
- if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) {
- return 1;
- }
- tokens.splice(i, 1);
- return 0;
- });
- };
-
Rewriter.prototype.closeOpenCalls = function() {
var action, condition;
condition = function(token, i) {
var _ref;
return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')';
@@ -135,148 +130,293 @@
}
return 1;
});
};
- Rewriter.prototype.addImplicitBraces = function() {
- var action, condition, sameLine, stack, start, startIndent, startIndex, startsLine;
- stack = [];
- start = null;
- startsLine = null;
- sameLine = true;
- startIndent = 0;
- startIndex = 0;
- condition = function(token, i) {
- var one, tag, three, two, _ref, _ref1;
- _ref = this.tokens.slice(i + 1, +(i + 3) + 1 || 9e9), one = _ref[0], two = _ref[1], three = _ref[2];
- if ('HERECOMMENT' === (one != null ? one[0] : void 0)) {
- return false;
+ Rewriter.prototype.matchTags = function() {
+ var fuzz, i, j, pattern, _i, _ref, _ref1;
+ i = arguments[0], pattern = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+ fuzz = 0;
+ for (j = _i = 0, _ref = pattern.length; 0 <= _ref ? _i < _ref : _i > _ref; j = 0 <= _ref ? ++_i : --_i) {
+ while (this.tag(i + j + fuzz) === 'HERECOMMENT') {
+ fuzz += 2;
}
- tag = token[0];
- if (__indexOf.call(LINEBREAKS, tag) >= 0) {
- sameLine = false;
+ if (pattern[j] == null) {
+ continue;
}
- return (((tag === 'TERMINATOR' || tag === 'OUTDENT') || (__indexOf.call(IMPLICIT_END, tag) >= 0 && sameLine && !(i - startIndex === 1))) && ((!startsLine && this.tag(i - 1) !== ',') || !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':'))) || (tag === ',' && one && ((_ref1 = one[0]) !== 'IDENTIFIER' && _ref1 !== 'NUMBER' && _ref1 !== 'STRING' && _ref1 !== '@' && _ref1 !== 'TERMINATOR' && _ref1 !== 'OUTDENT'));
- };
- action = function(token, i) {
- var tok;
- tok = this.generate('}', '}', token[2]);
- return this.tokens.splice(i, 0, tok);
- };
- return this.scanTokens(function(token, i, tokens) {
- var ago, idx, prevTag, tag, tok, value, _ref, _ref1;
- if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) {
- stack.push([(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag), i]);
- return 1;
+ if (typeof pattern[j] === 'string') {
+ pattern[j] = [pattern[j]];
}
- if (__indexOf.call(EXPRESSION_END, tag) >= 0) {
- start = stack.pop();
- return 1;
+ if (_ref1 = this.tag(i + j + fuzz), __indexOf.call(pattern[j], _ref1) < 0) {
+ return false;
}
- if (!(tag === ':' && ((ago = this.tag(i - 2)) === ':' || ((_ref1 = stack[stack.length - 1]) != null ? _ref1[0] : void 0) !== '{'))) {
- return 1;
+ }
+ return true;
+ };
+
+ Rewriter.prototype.looksObjectish = function(j) {
+ return this.matchTags(j, '@', null, ':') || this.matchTags(j, null, ':');
+ };
+
+ Rewriter.prototype.findTagsBackwards = function(i, tags) {
+ var backStack, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
+ backStack = [];
+ while (i >= 0 && (backStack.length || (_ref2 = this.tag(i), __indexOf.call(tags, _ref2) < 0) && ((_ref3 = this.tag(i), __indexOf.call(EXPRESSION_START, _ref3) < 0) || this.tokens[i].generated) && (_ref4 = this.tag(i), __indexOf.call(LINEBREAKS, _ref4) < 0))) {
+ if (_ref = this.tag(i), __indexOf.call(EXPRESSION_END, _ref) >= 0) {
+ backStack.push(this.tag(i));
}
- sameLine = true;
- startIndex = i + 1;
- stack.push(['{']);
- idx = ago === '@' ? i - 2 : i - 1;
- while (this.tag(idx - 2) === 'HERECOMMENT') {
- idx -= 2;
+ if ((_ref1 = this.tag(i), __indexOf.call(EXPRESSION_START, _ref1) >= 0) && backStack.length) {
+ backStack.pop();
}
- prevTag = this.tag(idx - 1);
- startsLine = !prevTag || (__indexOf.call(LINEBREAKS, prevTag) >= 0);
- value = new String('{');
- value.generated = true;
- tok = this.generate('{', value, token[2]);
- tokens.splice(idx, 0, tok);
- this.detectEnd(i + 2, condition, action);
- return 2;
- });
+ i -= 1;
+ }
+ return _ref5 = this.tag(i), __indexOf.call(tags, _ref5) >= 0;
};
- Rewriter.prototype.addImplicitParentheses = function() {
- var action, condition, noCall, seenControl, seenSingle;
- noCall = seenSingle = seenControl = false;
- condition = function(token, i) {
- var post, tag, _ref, _ref1;
+ Rewriter.prototype.addImplicitBracesAndParens = function() {
+ var stack;
+ stack = [];
+ return this.scanTokens(function(token, i, tokens) {
+ var endAllImplicitCalls, endImplicitCall, endImplicitObject, forward, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, nextTag, offset, prevTag, prevToken, s, sameLine, stackIdx, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startsLine, tag, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
tag = token[0];
- if (!seenSingle && token.fromThen) {
- return true;
+ prevTag = (prevToken = i > 0 ? tokens[i - 1] : [])[0];
+ nextTag = (i < tokens.length - 1 ? tokens[i + 1] : [])[0];
+ stackTop = function() {
+ return stack[stack.length - 1];
+ };
+ startIdx = i;
+ forward = function(n) {
+ return i - startIdx + n;
+ };
+ inImplicit = function() {
+ var _ref, _ref1;
+ return (_ref = stackTop()) != null ? (_ref1 = _ref[2]) != null ? _ref1.ours : void 0 : void 0;
+ };
+ inImplicitCall = function() {
+ var _ref;
+ return inImplicit() && ((_ref = stackTop()) != null ? _ref[0] : void 0) === '(';
+ };
+ inImplicitObject = function() {
+ var _ref;
+ return inImplicit() && ((_ref = stackTop()) != null ? _ref[0] : void 0) === '{';
+ };
+ inImplicitControl = function() {
+ var _ref;
+ return inImplicit && ((_ref = stackTop()) != null ? _ref[0] : void 0) === 'CONTROL';
+ };
+ startImplicitCall = function(j) {
+ var idx;
+ idx = j != null ? j : i;
+ stack.push([
+ '(', idx, {
+ ours: true
+ }
+ ]);
+ tokens.splice(idx, 0, generate('CALL_START', '('));
+ if (j == null) {
+ return i += 1;
+ }
+ };
+ endImplicitCall = function() {
+ stack.pop();
+ tokens.splice(i, 0, generate('CALL_END', ')'));
+ return i += 1;
+ };
+ endAllImplicitCalls = function() {
+ while (inImplicitCall()) {
+ endImplicitCall();
+ }
+ };
+ startImplicitObject = function(j, startsLine) {
+ var idx;
+ if (startsLine == null) {
+ startsLine = true;
+ }
+ idx = j != null ? j : i;
+ stack.push([
+ '{', idx, {
+ sameLine: true,
+ startsLine: startsLine,
+ ours: true
+ }
+ ]);
+ tokens.splice(idx, 0, generate('{', generate(new String('{'))));
+ if (j == null) {
+ return i += 1;
+ }
+ };
+ endImplicitObject = function(j) {
+ j = j != null ? j : i;
+ stack.pop();
+ tokens.splice(j, 0, generate('}', '}'));
+ return i += 1;
+ };
+ if (inImplicitCall() && (tag === 'IF' || tag === 'TRY' || tag === 'FINALLY' || tag === 'CATCH' || tag === 'CLASS' || tag === 'SWITCH')) {
+ stack.push([
+ 'CONTROL', i, {
+ ours: true
+ }
+ ]);
+ return forward(1);
}
- if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>' || tag === 'CLASS') {
- seenSingle = true;
+ if (tag === 'INDENT' && inImplicit()) {
+ if (prevTag !== '=>' && prevTag !== '->' && prevTag !== '[' && prevTag !== '(' && prevTag !== ',' && prevTag !== '{' && prevTag !== 'TRY' && prevTag !== 'ELSE' && prevTag !== '=') {
+ while (inImplicitCall()) {
+ endImplicitCall();
+ }
+ }
+ if (inImplicitControl()) {
+ stack.pop();
+ }
+ stack.push([tag, i]);
+ return forward(1);
}
- if (tag === 'IF' || tag === 'ELSE' || tag === 'SWITCH' || tag === 'TRY' || tag === '=') {
- seenControl = true;
+ if (__indexOf.call(EXPRESSION_START, tag) >= 0) {
+ stack.push([tag, i]);
+ return forward(1);
}
- if ((tag === '.' || tag === '?.' || tag === '::') && this.tag(i - 1) === 'OUTDENT') {
- return true;
+ if (__indexOf.call(EXPRESSION_END, tag) >= 0) {
+ while (inImplicit()) {
+ if (inImplicitCall()) {
+ endImplicitCall();
+ } else if (inImplicitObject()) {
+ endImplicitObject();
+ } else {
+ stack.pop();
+ }
+ }
+ stack.pop();
}
- return !token.generated && this.tag(i - 1) !== ',' && (__indexOf.call(IMPLICIT_END, tag) >= 0 || (tag === 'INDENT' && !seenControl)) && (tag !== 'INDENT' || (((_ref = this.tag(i - 2)) !== 'CLASS' && _ref !== 'EXTENDS') && (_ref1 = this.tag(i - 1), __indexOf.call(IMPLICIT_BLOCK, _ref1) < 0) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{')));
- };
- action = function(token, i) {
- return this.tokens.splice(i, 0, this.generate('CALL_END', ')', token[2]));
- };
- return this.scanTokens(function(token, i, tokens) {
- var callObject, current, next, prev, tag, _ref, _ref1, _ref2;
- tag = token[0];
- if (tag === 'CLASS' || tag === 'IF' || tag === 'FOR' || tag === 'WHILE') {
- noCall = true;
+ if ((__indexOf.call(IMPLICIT_FUNC, tag) >= 0 && token.spaced && !token.stringEnd || tag === '?' && i > 0 && !tokens[i - 1].spaced) && (__indexOf.call(IMPLICIT_CALL, nextTag) >= 0 || __indexOf.call(IMPLICIT_UNSPACED_CALL, nextTag) >= 0 && !((_ref = tokens[i + 1]) != null ? _ref.spaced : void 0) && !((_ref1 = tokens[i + 1]) != null ? _ref1.newLine : void 0))) {
+ if (tag === '?') {
+ tag = token[0] = 'FUNC_EXIST';
+ }
+ startImplicitCall(i + 1);
+ return forward(2);
}
- _ref = tokens.slice(i - 1, +(i + 1) + 1 || 9e9), prev = _ref[0], current = _ref[1], next = _ref[2];
- callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref1 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref1) >= 0);
- seenSingle = false;
- seenControl = false;
- if (__indexOf.call(LINEBREAKS, tag) >= 0) {
- noCall = false;
+ if (__indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.matchTags(i + 1, 'INDENT', null, ':') && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) {
+ startImplicitCall(i + 1);
+ stack.push(['INDENT', i + 2]);
+ return forward(3);
}
- if (prev && !prev.spaced && tag === '?') {
- token.call = true;
+ if (tag === ':') {
+ if (this.tag(i - 2) === '@') {
+ s = i - 2;
+ } else {
+ s = i - 1;
+ }
+ while (this.tag(s - 2) === 'HERECOMMENT') {
+ s -= 2;
+ }
+ startsLine = s === 0 || (_ref2 = this.tag(s - 1), __indexOf.call(LINEBREAKS, _ref2) >= 0) || tokens[s - 1].newLine;
+ if (stackTop()) {
+ _ref3 = stackTop(), stackTag = _ref3[0], stackIdx = _ref3[1];
+ if ((stackTag === '{' || stackTag === 'INDENT' && this.tag(stackIdx - 1) === '{') && (startsLine || this.tag(s - 1) === ',' || this.tag(s - 1) === '{')) {
+ return forward(1);
+ }
+ }
+ startImplicitObject(s, !!startsLine);
+ return forward(2);
}
- if (token.fromThen) {
+ if (inImplicitCall() && __indexOf.call(CALL_CLOSERS, tag) >= 0) {
+ if (prevTag === 'OUTDENT') {
+ endImplicitCall();
+ return forward(1);
+ }
+ if (prevToken.newLine) {
+ endAllImplicitCalls();
+ return forward(1);
+ }
+ }
+ if (inImplicitObject() && __indexOf.call(LINEBREAKS, tag) >= 0) {
+ stackTop()[2].sameLine = false;
+ }
+ if (__indexOf.call(IMPLICIT_END, tag) >= 0) {
+ while (inImplicit()) {
+ _ref4 = stackTop(), stackTag = _ref4[0], stackIdx = _ref4[1], (_ref5 = _ref4[2], sameLine = _ref5.sameLine, startsLine = _ref5.startsLine);
+ if (inImplicitCall() && prevTag !== ',') {
+ endImplicitCall();
+ } else if (inImplicitObject() && sameLine && !startsLine) {
+ endImplicitObject();
+ } else if (inImplicitObject() && tag === 'TERMINATOR' && prevTag !== ',' && !(startsLine && this.looksObjectish(i + 1))) {
+ endImplicitObject();
+ } else {
+ break;
+ }
+ }
+ }
+ if (tag === ',' && !this.looksObjectish(i + 1) && inImplicitObject() && (nextTag !== 'TERMINATOR' || !this.looksObjectish(i + 2))) {
+ offset = nextTag === 'OUTDENT' ? 1 : 0;
+ while (inImplicitObject()) {
+ endImplicitObject(i + offset);
+ }
+ }
+ return forward(1);
+ });
+ };
+
+ Rewriter.prototype.addLocationDataToGeneratedTokens = function() {
+ return this.scanTokens(function(token, i, tokens) {
+ var column, line, nextLocation, prevLocation, _ref, _ref1;
+ if (token[2]) {
return 1;
}
- 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))) {
+ if (!(token.generated || token.explicit)) {
return 1;
}
- tokens.splice(i, 0, this.generate('CALL_START', '(', token[2]));
- this.detectEnd(i + 1, condition, action);
- if (prev[0] === '?') {
- prev[0] = 'FUNC_EXIST';
+ if (token[0] === '{' && (nextLocation = (_ref = tokens[i + 1]) != null ? _ref[2] : void 0)) {
+ line = nextLocation.first_line, column = nextLocation.first_column;
+ } else if (prevLocation = (_ref1 = tokens[i - 1]) != null ? _ref1[2] : void 0) {
+ line = prevLocation.last_line, column = prevLocation.last_column;
+ } else {
+ line = column = 0;
}
- return 2;
+ token[2] = {
+ first_line: line,
+ first_column: column,
+ last_line: line,
+ last_column: column
+ };
+ return 1;
});
};
- Rewriter.prototype.addImplicitIndentation = function() {
+ Rewriter.prototype.normalizeLines = function() {
var action, condition, indent, outdent, starter;
starter = indent = outdent = null;
condition = function(token, i) {
- var _ref;
- return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'ELSE' && (starter !== 'IF' && starter !== 'THEN'));
+ var _ref, _ref1, _ref2, _ref3;
+ return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'TERMINATOR' && (_ref1 = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((_ref2 = token[0]) === 'CATCH' || _ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (_ref3 = token[0], __indexOf.call(CALL_CLOSERS, _ref3) >= 0) && this.tokens[i - 1].newLine;
};
action = function(token, i) {
return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent);
};
return this.scanTokens(function(token, i, tokens) {
- var tag, _ref, _ref1;
+ var j, tag, _i, _ref, _ref1, _ref2;
tag = token[0];
- if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') {
- tokens.splice(i, 1);
- return 0;
+ if (tag === 'TERMINATOR') {
+ if (this.tag(i + 1) === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {
+ tokens.splice.apply(tokens, [i, 1].concat(__slice.call(this.indentation())));
+ return 1;
+ }
+ if (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0) {
+ tokens.splice(i, 1);
+ return 0;
+ }
}
- if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {
- tokens.splice.apply(tokens, [i, 0].concat(__slice.call(this.indentation(token))));
- return 2;
+ if (tag === 'CATCH') {
+ for (j = _i = 1; _i <= 2; j = ++_i) {
+ if (!((_ref1 = this.tag(i + j)) === 'OUTDENT' || _ref1 === 'TERMINATOR' || _ref1 === 'FINALLY')) {
+ continue;
+ }
+ tokens.splice.apply(tokens, [i + j, 0].concat(__slice.call(this.indentation())));
+ return 2 + j;
+ }
}
- if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) {
- tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation(token))));
- return 4;
- }
if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {
starter = tag;
- _ref1 = this.indentation(token, true), indent = _ref1[0], outdent = _ref1[1];
+ _ref2 = this.indentation(true), indent = _ref2[0], outdent = _ref2[1];
if (starter === 'THEN') {
indent.fromThen = true;
}
tokens.splice(i + 1, 0, indent);
this.detectEnd(i + 2, condition, action);
@@ -291,12 +431,14 @@
Rewriter.prototype.tagPostfixConditionals = function() {
var action, condition, original;
original = null;
condition = function(token, i) {
- var _ref;
- return (_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT';
+ var prevTag, tag;
+ tag = token[0];
+ prevTag = this.tokens[i - 1][0];
+ return tag === 'TERMINATOR' || (tag === 'INDENT' && __indexOf.call(SINGLE_LINERS, prevTag) < 0);
};
action = function(token, i) {
if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) {
return original[0] = 'POST_' + original[0];
}
@@ -309,29 +451,27 @@
this.detectEnd(i + 1, condition, action);
return 1;
});
};
- Rewriter.prototype.indentation = function(token, implicit) {
+ Rewriter.prototype.indentation = function(implicit) {
var indent, outdent;
if (implicit == null) {
implicit = false;
}
- indent = ['INDENT', 2, token[2]];
- outdent = ['OUTDENT', 2, token[2]];
+ indent = ['INDENT', 2];
+ outdent = ['OUTDENT', 2];
if (implicit) {
indent.generated = outdent.generated = true;
}
+ if (!implicit) {
+ indent.explicit = outdent.explicit = true;
+ }
return [indent, outdent];
};
- Rewriter.prototype.generate = function(tag, value, line) {
- var tok;
- tok = [tag, value, line];
- tok.generated = true;
- return tok;
- };
+ Rewriter.prototype.generate = generate;
Rewriter.prototype.tag = function(i) {
var _ref;
return (_ref = this.tokens[i]) != null ? _ref[0] : void 0;
};
@@ -352,25 +492,25 @@
_ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1];
EXPRESSION_START.push(INVERSES[rite] = left);
EXPRESSION_END.push(INVERSES[left] = rite);
}
- EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);
+ EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);
IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS'];
- IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'NULL', 'UNDEFINED', 'UNARY', 'SUPER', '@', '->', '=>', '[', '(', '{', '--', '++'];
+ IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'NULL', 'UNDEFINED', 'UNARY', 'SUPER', 'THROW', '@', '->', '=>', '[', '(', '{', '--', '++'];
IMPLICIT_UNSPACED_CALL = ['+', '-'];
- IMPLICIT_BLOCK = ['->', '=>', '{', '[', ','];
-
IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR'];
SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN'];
SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN'];
LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT'];
+
+ CALL_CLOSERS = ['.', '?.', '::', '?::'];
});
\ No newline at end of file