prettier 1.2.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +64 -1
- data/CONTRIBUTING.md +2 -2
- data/README.md +22 -94
- data/node_modules/prettier/index.js +54 -54
- data/package.json +2 -3
- data/rubocop.yml +26 -0
- data/src/haml/embed.js +87 -0
- data/src/haml/nodes/comment.js +27 -0
- data/src/haml/nodes/doctype.js +34 -0
- data/src/haml/nodes/filter.js +16 -0
- data/src/haml/nodes/hamlComment.js +21 -0
- data/src/haml/nodes/plain.js +6 -0
- data/src/haml/nodes/root.js +8 -0
- data/src/haml/nodes/script.js +33 -0
- data/src/haml/nodes/silentScript.js +59 -0
- data/src/haml/nodes/tag.js +193 -0
- data/src/haml/parser.js +22 -0
- data/src/haml/parser.rb +138 -0
- data/src/haml/printer.js +28 -0
- data/src/parser/getLang.js +32 -0
- data/src/parser/getNetcat.js +50 -0
- data/src/parser/netcat.js +15 -0
- data/src/parser/parseSync.js +33 -0
- data/src/parser/requestParse.js +74 -0
- data/src/parser/server.rb +61 -0
- data/src/{ruby.js → plugin.js} +25 -4
- data/src/prettier.js +1 -0
- data/src/rbs/parser.js +39 -0
- data/src/rbs/parser.rb +88 -0
- data/src/rbs/printer.js +605 -0
- data/src/{embed.js → ruby/embed.js} +6 -2
- data/src/{nodes.js → ruby/nodes.js} +0 -0
- data/src/{nodes → ruby/nodes}/alias.js +1 -1
- data/src/{nodes → ruby/nodes}/aref.js +8 -1
- data/src/{nodes → ruby/nodes}/args.js +2 -2
- data/src/{nodes → ruby/nodes}/arrays.js +2 -3
- data/src/{nodes → ruby/nodes}/assign.js +7 -3
- data/src/ruby/nodes/blocks.js +90 -0
- data/src/{nodes → ruby/nodes}/calls.js +20 -47
- data/src/{nodes → ruby/nodes}/case.js +1 -1
- data/src/{nodes → ruby/nodes}/class.js +1 -1
- data/src/ruby/nodes/commands.js +131 -0
- data/src/{nodes → ruby/nodes}/conditionals.js +3 -3
- data/src/{nodes → ruby/nodes}/constants.js +2 -2
- data/src/{nodes → ruby/nodes}/flow.js +2 -2
- data/src/{nodes → ruby/nodes}/hashes.js +32 -10
- data/src/{nodes → ruby/nodes}/heredocs.js +2 -2
- data/src/ruby/nodes/hooks.js +34 -0
- data/src/{nodes → ruby/nodes}/ints.js +0 -0
- data/src/{nodes → ruby/nodes}/lambdas.js +2 -2
- data/src/{nodes → ruby/nodes}/loops.js +10 -7
- data/src/{nodes → ruby/nodes}/massign.js +8 -1
- data/src/{nodes → ruby/nodes}/methods.js +10 -9
- data/src/{nodes → ruby/nodes}/operators.js +2 -2
- data/src/{nodes → ruby/nodes}/params.js +31 -16
- data/src/{nodes → ruby/nodes}/patterns.js +17 -6
- data/src/{nodes → ruby/nodes}/regexp.js +2 -2
- data/src/{nodes → ruby/nodes}/rescue.js +34 -27
- data/src/{nodes → ruby/nodes}/return.js +21 -10
- data/src/{nodes → ruby/nodes}/statements.js +9 -9
- data/src/{nodes → ruby/nodes}/strings.js +28 -36
- data/src/{nodes → ruby/nodes}/super.js +2 -2
- data/src/{nodes → ruby/nodes}/undef.js +1 -1
- data/src/ruby/parser.js +39 -0
- data/src/{parser.rb → ruby/parser.rb} +498 -529
- data/src/{printer.js → ruby/printer.js} +1 -3
- data/src/{toProc.js → ruby/toProc.js} +4 -8
- data/src/utils.js +10 -93
- data/src/utils/containsAssignment.js +11 -0
- data/src/utils/getTrailingComma.js +5 -0
- data/src/utils/hasAncestor.js +17 -0
- data/src/utils/literal.js +7 -0
- data/src/utils/makeCall.js +14 -0
- data/src/utils/noIndent.js +11 -0
- data/src/utils/skipAssignIndent.js +10 -0
- metadata +71 -41
- data/src/nodes/blocks.js +0 -85
- data/src/nodes/commands.js +0 -91
- data/src/nodes/hooks.js +0 -44
- data/src/parser.js +0 -86
@@ -6,30 +6,41 @@ const {
|
|
6
6
|
line,
|
7
7
|
join,
|
8
8
|
softline
|
9
|
-
} = require("
|
10
|
-
const { literal } = require("
|
9
|
+
} = require("../../prettier");
|
10
|
+
const { literal } = require("../../utils");
|
11
11
|
|
12
|
-
// You can't skip the parentheses if you have
|
13
|
-
//
|
14
|
-
// keep them in there.
|
12
|
+
// You can't skip the parentheses if you have comments or certain operators with
|
13
|
+
// lower precedence than the return keyword.
|
15
14
|
const canSkipParens = (args) => {
|
16
15
|
const stmts = args.body[0].body[0];
|
16
|
+
|
17
|
+
// return(
|
18
|
+
// # a
|
19
|
+
// b
|
20
|
+
// )
|
17
21
|
if (stmts.comments) {
|
18
22
|
return false;
|
19
23
|
}
|
20
24
|
|
21
25
|
const stmt = stmts.body[0];
|
22
|
-
|
26
|
+
|
27
|
+
// return (a or b)
|
28
|
+
if (stmt.type === "binary" && ["and", "or"].includes(stmt.body[1])) {
|
29
|
+
return false;
|
30
|
+
}
|
31
|
+
|
32
|
+
// return (not a)
|
33
|
+
if (stmt.type === "unary" && stmt.oper === "not") {
|
34
|
+
return false;
|
35
|
+
}
|
36
|
+
|
37
|
+
return true;
|
23
38
|
};
|
24
39
|
|
25
40
|
const printReturn = (path, opts, print) => {
|
26
41
|
let args = path.getValue().body[0].body[0];
|
27
42
|
let steps = ["body", 0, "body", 0];
|
28
43
|
|
29
|
-
if (!args) {
|
30
|
-
return "return";
|
31
|
-
}
|
32
|
-
|
33
44
|
if (args.body.length === 1) {
|
34
45
|
// If the body of the return contains parens, then just skip directly to the
|
35
46
|
// content of the parens so that we can skip printing parens if we don't
|
@@ -10,7 +10,7 @@ const {
|
|
10
10
|
literalline,
|
11
11
|
softline,
|
12
12
|
trim
|
13
|
-
} = require("
|
13
|
+
} = require("../../prettier");
|
14
14
|
|
15
15
|
function printBodyStmt(path, opts, print) {
|
16
16
|
const [stmts, rescue, elseClause, ensure] = path.getValue().body;
|
@@ -30,6 +30,7 @@ function printBodyStmt(path, opts, print) {
|
|
30
30
|
|
31
31
|
if (elseClause) {
|
32
32
|
// Before Ruby 2.6, this piece of bodystmt was an explicit "else" node
|
33
|
+
/* istanbul ignore next */
|
33
34
|
const stmts =
|
34
35
|
elseClause.type === "else"
|
35
36
|
? path.call(print, "body", 2, "body", 0)
|
@@ -69,11 +70,7 @@ function printParen(path, opts, print) {
|
|
69
70
|
}
|
70
71
|
|
71
72
|
return group(
|
72
|
-
concat([
|
73
|
-
"(",
|
74
|
-
indent(concat([softline, contentDoc])),
|
75
|
-
concat([softline, ")"])
|
76
|
-
])
|
73
|
+
concat(["(", indent(concat([softline, contentDoc])), softline, ")"])
|
77
74
|
);
|
78
75
|
}
|
79
76
|
|
@@ -82,6 +79,9 @@ module.exports = {
|
|
82
79
|
const { body } = path.getValue();
|
83
80
|
return concat([trim, "__END__", literalline, body]);
|
84
81
|
},
|
82
|
+
"@comment"(path, opts, _print) {
|
83
|
+
return opts.printer.printComment(path);
|
84
|
+
},
|
85
85
|
bodystmt: printBodyStmt,
|
86
86
|
paren: printParen,
|
87
87
|
program: (path, opts, print) =>
|
@@ -123,12 +123,12 @@ module.exports = {
|
|
123
123
|
if (lineNo === null) {
|
124
124
|
parts.push(printed);
|
125
125
|
} else if (
|
126
|
-
stmt.
|
126
|
+
stmt.sl - lineNo > 1 ||
|
127
127
|
[stmt.type, stmts[index - 1].type].includes("access_ctrl")
|
128
128
|
) {
|
129
129
|
parts.push(hardline, hardline, printed);
|
130
130
|
} else if (
|
131
|
-
stmt.
|
131
|
+
stmt.sl !== lineNo ||
|
132
132
|
path.getParentNode().type !== "string_embexpr"
|
133
133
|
) {
|
134
134
|
parts.push(hardline, printed);
|
@@ -136,7 +136,7 @@ module.exports = {
|
|
136
136
|
parts.push("; ", printed);
|
137
137
|
}
|
138
138
|
|
139
|
-
lineNo = stmt.
|
139
|
+
lineNo = stmt.el;
|
140
140
|
});
|
141
141
|
|
142
142
|
return concat(parts);
|
@@ -4,9 +4,10 @@ const {
|
|
4
4
|
hardline,
|
5
5
|
indent,
|
6
6
|
literalline,
|
7
|
+
removeLines,
|
7
8
|
softline,
|
8
9
|
join
|
9
|
-
} = require("
|
10
|
+
} = require("../../prettier");
|
10
11
|
|
11
12
|
// If there is some part of this string that matches an escape sequence or that
|
12
13
|
// contains the interpolation pattern ("#{"), then we are locked into whichever
|
@@ -31,17 +32,10 @@ function isSingleQuotable(node) {
|
|
31
32
|
|
32
33
|
const quotePattern = new RegExp("\\\\([\\s\\S])|(['\"])", "g");
|
33
34
|
|
34
|
-
function normalizeQuotes(content, enclosingQuote
|
35
|
-
const replaceOther = originalQuote === '"';
|
36
|
-
const otherQuote = enclosingQuote === '"' ? "'" : '"';
|
37
|
-
|
35
|
+
function normalizeQuotes(content, enclosingQuote) {
|
38
36
|
// Escape and unescape single and double quotes as needed to be able to
|
39
37
|
// enclose `content` with `enclosingQuote`.
|
40
38
|
return content.replace(quotePattern, (match, escaped, quote) => {
|
41
|
-
if (replaceOther && escaped === otherQuote) {
|
42
|
-
return escaped;
|
43
|
-
}
|
44
|
-
|
45
39
|
if (quote === enclosingQuote) {
|
46
40
|
return `\\${quote}`;
|
47
41
|
}
|
@@ -97,12 +91,34 @@ function printDynaSymbol(path, opts, print) {
|
|
97
91
|
return concat([":", quote].concat(path.map(print, "body")).concat(quote));
|
98
92
|
}
|
99
93
|
|
94
|
+
function printStringConcat(path, opts, print) {
|
95
|
+
const [leftDoc, rightDoc] = path.map(print, "body");
|
96
|
+
|
97
|
+
return group(concat([leftDoc, " \\", indent(concat([hardline, rightDoc]))]));
|
98
|
+
}
|
99
|
+
|
100
100
|
// Prints out an interpolated variable in the string by converting it into an
|
101
101
|
// embedded expression.
|
102
102
|
function printStringDVar(path, opts, print) {
|
103
103
|
return concat(["#{", path.call(print, "body", 0), "}"]);
|
104
104
|
}
|
105
105
|
|
106
|
+
function printStringEmbExpr(path, opts, print) {
|
107
|
+
const node = path.getValue();
|
108
|
+
const parts = path.call(print, "body", 0);
|
109
|
+
|
110
|
+
// If the contents of this embedded expression were originally on the same
|
111
|
+
// line in the source, then we're going to leave them in place and assume
|
112
|
+
// that's the way the developer wanted this expression represented.
|
113
|
+
if (node.sl === node.el) {
|
114
|
+
return concat(["#{", removeLines(parts), "}"]);
|
115
|
+
}
|
116
|
+
|
117
|
+
return group(
|
118
|
+
concat(["#{", indent(concat([softline, parts])), concat([softline, "}"])])
|
119
|
+
);
|
120
|
+
}
|
121
|
+
|
106
122
|
// Prints out a literal string. This function does its best to respect the
|
107
123
|
// wishes of the user with regards to single versus double quotes, but if the
|
108
124
|
// string contains any escape expressions then it will just keep the original
|
@@ -131,10 +147,7 @@ function printStringLiteral(path, { rubySingleQuote }, print) {
|
|
131
147
|
}
|
132
148
|
|
133
149
|
// In this case, the part of the string is just regular string content
|
134
|
-
return join(
|
135
|
-
literalline,
|
136
|
-
normalizeQuotes(part.body, quote, node.quote).split("\n")
|
137
|
-
);
|
150
|
+
return join(literalline, normalizeQuotes(part.body, quote).split("\n"));
|
138
151
|
});
|
139
152
|
|
140
153
|
return concat([quote].concat(parts).concat(getClosingQuote(quote)));
|
@@ -155,30 +168,9 @@ function printXStringLiteral(path, opts, print) {
|
|
155
168
|
module.exports = {
|
156
169
|
"@CHAR": printChar,
|
157
170
|
dyna_symbol: printDynaSymbol,
|
158
|
-
string_concat:
|
159
|
-
group(
|
160
|
-
concat([
|
161
|
-
path.call(print, "body", 0),
|
162
|
-
" \\",
|
163
|
-
indent(concat([hardline, path.call(print, "body", 1)]))
|
164
|
-
])
|
165
|
-
),
|
171
|
+
string_concat: printStringConcat,
|
166
172
|
string_dvar: printStringDVar,
|
167
|
-
string_embexpr:
|
168
|
-
const parts = path.call(print, "body", 0);
|
169
|
-
|
170
|
-
// If the interpolated expression is inside of a heredoc or an xstring
|
171
|
-
// literal (a string that gets sent to the command line) then we don't want
|
172
|
-
// to automatically indent, as this can lead to some very odd looking
|
173
|
-
// expressions
|
174
|
-
if (["heredoc", "xstring_literal"].includes(path.getParentNode().type)) {
|
175
|
-
return concat(["#{", parts, "}"]);
|
176
|
-
}
|
177
|
-
|
178
|
-
return group(
|
179
|
-
concat(["#{", indent(concat([softline, parts])), concat([softline, "}"])])
|
180
|
-
);
|
181
|
-
},
|
173
|
+
string_embexpr: printStringEmbExpr,
|
182
174
|
string_literal: printStringLiteral,
|
183
175
|
symbol_literal: printSymbolLiteral,
|
184
176
|
xstring_literal: printXStringLiteral
|
@@ -1,5 +1,5 @@
|
|
1
|
-
const { align, concat, group, join, line } = require("
|
2
|
-
const { literal } = require("
|
1
|
+
const { align, concat, group, join, line } = require("../../prettier");
|
2
|
+
const { literal } = require("../../utils");
|
3
3
|
|
4
4
|
function printSuper(path, opts, print) {
|
5
5
|
const args = path.getValue().body[0];
|
data/src/ruby/parser.js
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
const parseSync = require("../parser/parseSync");
|
2
|
+
|
3
|
+
// This function is responsible for taking an input string of text and returning
|
4
|
+
// to prettier a JavaScript object that is the equivalent AST that represents
|
5
|
+
// the code stored in that string. We accomplish this by spawning a new Ruby
|
6
|
+
// process of parser.rb and reading JSON off STDOUT.
|
7
|
+
function parse(text, _parsers, _opts) {
|
8
|
+
return parseSync("ruby", text);
|
9
|
+
}
|
10
|
+
|
11
|
+
const pragmaPattern = /#\s*@(prettier|format)/;
|
12
|
+
|
13
|
+
// This function handles checking whether or not the source string has the
|
14
|
+
// pragma for prettier. This is an optional workflow for incremental adoption.
|
15
|
+
function hasPragma(text) {
|
16
|
+
return pragmaPattern.test(text);
|
17
|
+
}
|
18
|
+
|
19
|
+
// This function is critical for comments and cursor support, and is responsible
|
20
|
+
// for returning the index of the character within the source string that is the
|
21
|
+
// beginning of the given node.
|
22
|
+
function locStart(node) {
|
23
|
+
return node.sc;
|
24
|
+
}
|
25
|
+
|
26
|
+
// This function is critical for comments and cursor support, and is responsible
|
27
|
+
// for returning the index of the character within the source string that is the
|
28
|
+
// ending of the given node.
|
29
|
+
function locEnd(node) {
|
30
|
+
return node.ec;
|
31
|
+
}
|
32
|
+
|
33
|
+
module.exports = {
|
34
|
+
parse,
|
35
|
+
astFormat: "ruby",
|
36
|
+
hasPragma,
|
37
|
+
locStart,
|
38
|
+
locEnd
|
39
|
+
};
|
@@ -14,7 +14,7 @@ if (RUBY_MAJOR < 2) || ((RUBY_MAJOR == 2) && (RUBY_MINOR < 5))
|
|
14
14
|
end
|
15
15
|
|
16
16
|
require 'delegate'
|
17
|
-
require 'json'
|
17
|
+
require 'json'
|
18
18
|
require 'ripper'
|
19
19
|
|
20
20
|
module Prettier; end
|
@@ -22,6 +22,10 @@ module Prettier; end
|
|
22
22
|
class Prettier::Parser < Ripper
|
23
23
|
attr_reader :source, :lines, :scanner_events, :line_counts
|
24
24
|
|
25
|
+
# This is an attr_accessor so Stmts objects can grab comments out of this
|
26
|
+
# array and attach them to themselves.
|
27
|
+
attr_accessor :comments
|
28
|
+
|
25
29
|
def initialize(source, *args)
|
26
30
|
super(source, *args)
|
27
31
|
|
@@ -40,6 +44,13 @@ class Prettier::Parser < Ripper
|
|
40
44
|
@source.lines.each { |line| @line_counts << @line_counts.last + line.size }
|
41
45
|
end
|
42
46
|
|
47
|
+
def self.parse(source)
|
48
|
+
builder = new(source)
|
49
|
+
|
50
|
+
response = builder.parse
|
51
|
+
response unless builder.error?
|
52
|
+
end
|
53
|
+
|
43
54
|
private
|
44
55
|
|
45
56
|
# This represents the current place in the source string that we've gotten to
|
@@ -89,14 +100,14 @@ class Prettier::Parser < Ripper
|
|
89
100
|
|
90
101
|
(SCANNER_EVENTS - defined).each do |event|
|
91
102
|
define_method(:"on_#{event}") do |value|
|
92
|
-
|
103
|
+
ec = char_pos + value.size
|
93
104
|
node = {
|
94
105
|
type: :"@#{event}",
|
95
106
|
body: value,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
107
|
+
sl: lineno,
|
108
|
+
el: lineno,
|
109
|
+
sc: char_pos,
|
110
|
+
ec: ec
|
100
111
|
}
|
101
112
|
|
102
113
|
scanner_events << node
|
@@ -118,10 +129,11 @@ class Prettier::Parser < Ripper
|
|
118
129
|
@comments << {
|
119
130
|
type: :@comment,
|
120
131
|
value: value[1..-1].chomp.force_encoding('UTF-8'),
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
132
|
+
inline: value.strip != lines[lineno - 1],
|
133
|
+
sl: lineno,
|
134
|
+
el: lineno,
|
135
|
+
sc: char_pos,
|
136
|
+
ec: char_pos + value.length - 1
|
125
137
|
}
|
126
138
|
end
|
127
139
|
|
@@ -138,10 +150,10 @@ class Prettier::Parser < Ripper
|
|
138
150
|
{
|
139
151
|
type: :ignored_nl,
|
140
152
|
body: nil,
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
153
|
+
sl: lineno,
|
154
|
+
el: lineno,
|
155
|
+
sc: char_pos,
|
156
|
+
ec: char_pos
|
145
157
|
}
|
146
158
|
end
|
147
159
|
|
@@ -186,16 +198,13 @@ class Prettier::Parser < Ripper
|
|
186
198
|
beging = find_scanner_event(:@lbrace)
|
187
199
|
ending = find_scanner_event(:@rbrace)
|
188
200
|
|
189
|
-
stmts.bind(
|
190
|
-
find_next_statement_start(beging[:char_end]),
|
191
|
-
ending[:char_start]
|
192
|
-
)
|
201
|
+
stmts.bind(find_next_statement_start(beging[:ec]), ending[:sc])
|
193
202
|
|
194
203
|
find_scanner_event(:@kw, 'BEGIN').merge!(
|
195
204
|
type: :BEGIN,
|
196
205
|
body: [beging, stmts],
|
197
|
-
|
198
|
-
|
206
|
+
el: ending[:el],
|
207
|
+
ec: ending[:ec]
|
199
208
|
)
|
200
209
|
end
|
201
210
|
|
@@ -213,16 +222,13 @@ class Prettier::Parser < Ripper
|
|
213
222
|
beging = find_scanner_event(:@lbrace)
|
214
223
|
ending = find_scanner_event(:@rbrace)
|
215
224
|
|
216
|
-
stmts.bind(
|
217
|
-
find_next_statement_start(beging[:char_end]),
|
218
|
-
ending[:char_start]
|
219
|
-
)
|
225
|
+
stmts.bind(find_next_statement_start(beging[:ec]), ending[:sc])
|
220
226
|
|
221
227
|
find_scanner_event(:@kw, 'END').merge!(
|
222
228
|
type: :END,
|
223
229
|
body: [beging, stmts],
|
224
|
-
|
225
|
-
|
230
|
+
el: ending[:el],
|
231
|
+
ec: ending[:ec]
|
226
232
|
)
|
227
233
|
end
|
228
234
|
|
@@ -234,16 +240,16 @@ class Prettier::Parser < Ripper
|
|
234
240
|
def on_alias(left, right)
|
235
241
|
beging = find_scanner_event(:@kw, 'alias')
|
236
242
|
|
237
|
-
paren = source[beging[:
|
243
|
+
paren = source[beging[:ec]...left[:sc]].include?('(')
|
238
244
|
ending = paren ? find_scanner_event(:@rparen) : right
|
239
245
|
|
240
246
|
{
|
241
247
|
type: :alias,
|
242
248
|
body: [left, right],
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
249
|
+
sl: beging[:sl],
|
250
|
+
sc: beging[:sc],
|
251
|
+
el: ending[:el],
|
252
|
+
ec: ending[:ec]
|
247
253
|
}
|
248
254
|
end
|
249
255
|
|
@@ -268,10 +274,10 @@ class Prettier::Parser < Ripper
|
|
268
274
|
{
|
269
275
|
type: :aref,
|
270
276
|
body: [collection, index],
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
277
|
+
sl: collection[:sl],
|
278
|
+
sc: collection[:sc],
|
279
|
+
el: ending[:el],
|
280
|
+
ec: ending[:ec]
|
275
281
|
}
|
276
282
|
end
|
277
283
|
|
@@ -284,10 +290,10 @@ class Prettier::Parser < Ripper
|
|
284
290
|
{
|
285
291
|
type: :aref_field,
|
286
292
|
body: [collection, index],
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
293
|
+
sl: collection[:sl],
|
294
|
+
sc: collection[:sc],
|
295
|
+
el: ending[:el],
|
296
|
+
ec: ending[:ec]
|
291
297
|
}
|
292
298
|
end
|
293
299
|
|
@@ -298,10 +304,10 @@ class Prettier::Parser < Ripper
|
|
298
304
|
{
|
299
305
|
type: :args,
|
300
306
|
body: [],
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
307
|
+
sl: lineno,
|
308
|
+
sc: char_pos,
|
309
|
+
el: lineno,
|
310
|
+
ec: char_pos
|
305
311
|
}
|
306
312
|
end
|
307
313
|
|
@@ -313,11 +319,7 @@ class Prettier::Parser < Ripper
|
|
313
319
|
if args[:body].empty?
|
314
320
|
arg.merge(type: :args, body: [arg])
|
315
321
|
else
|
316
|
-
args.merge!(
|
317
|
-
body: args[:body] << arg,
|
318
|
-
end: arg[:end],
|
319
|
-
char_end: arg[:char_end]
|
320
|
-
)
|
322
|
+
args.merge!(body: args[:body] << arg, el: arg[:el], ec: arg[:ec])
|
321
323
|
end
|
322
324
|
end
|
323
325
|
|
@@ -330,8 +332,8 @@ class Prettier::Parser < Ripper
|
|
330
332
|
args.merge(
|
331
333
|
type: :args_add_block,
|
332
334
|
body: [args, block],
|
333
|
-
|
334
|
-
|
335
|
+
el: ending[:el],
|
336
|
+
ec: ending[:ec]
|
335
337
|
)
|
336
338
|
end
|
337
339
|
|
@@ -345,10 +347,10 @@ class Prettier::Parser < Ripper
|
|
345
347
|
{
|
346
348
|
type: :args_add_star,
|
347
349
|
body: [args, part],
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
350
|
+
sl: beging[:sl],
|
351
|
+
sc: beging[:sc],
|
352
|
+
el: ending[:el],
|
353
|
+
ec: ending[:ec]
|
352
354
|
}
|
353
355
|
end
|
354
356
|
|
@@ -367,15 +369,15 @@ class Prettier::Parser < Ripper
|
|
367
369
|
# If the arguments exceed the ending of the parentheses, then we know we
|
368
370
|
# have a heredoc in the arguments, and we need to use the bounds of the
|
369
371
|
# arguments to determine how large the arg_paren is.
|
370
|
-
ending = (args && args[:
|
372
|
+
ending = (args && args[:el] > rparen[:el]) ? args : rparen
|
371
373
|
|
372
374
|
{
|
373
375
|
type: :arg_paren,
|
374
376
|
body: [args],
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
377
|
+
sl: beging[:sl],
|
378
|
+
sc: beging[:sc],
|
379
|
+
el: ending[:el],
|
380
|
+
ec: ending[:ec]
|
379
381
|
}
|
380
382
|
end
|
381
383
|
|
@@ -391,20 +393,20 @@ class Prettier::Parser < Ripper
|
|
391
393
|
{
|
392
394
|
type: :array,
|
393
395
|
body: [contents],
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
396
|
+
sl: beging[:sl],
|
397
|
+
sc: beging[:sc],
|
398
|
+
el: ending[:el],
|
399
|
+
ec: ending[:ec]
|
398
400
|
}
|
399
401
|
else
|
400
402
|
ending = find_scanner_event(:@tstring_end)
|
401
|
-
contents[:
|
403
|
+
contents[:ec] = ending[:ec]
|
402
404
|
|
403
405
|
ending.merge!(
|
404
406
|
type: :array,
|
405
407
|
body: [contents],
|
406
|
-
|
407
|
-
|
408
|
+
sl: contents[:sl],
|
409
|
+
sc: contents[:sc]
|
408
410
|
)
|
409
411
|
end
|
410
412
|
end
|
@@ -417,10 +419,10 @@ class Prettier::Parser < Ripper
|
|
417
419
|
{
|
418
420
|
type: :aryptn,
|
419
421
|
body: [const, preargs, splatarg, postargs],
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
422
|
+
sl: pieces[0][:sl],
|
423
|
+
sc: pieces[0][:sc],
|
424
|
+
el: pieces[-1][:el],
|
425
|
+
ec: pieces[-1][:ec]
|
424
426
|
}
|
425
427
|
end
|
426
428
|
|
@@ -431,8 +433,8 @@ class Prettier::Parser < Ripper
|
|
431
433
|
left.merge(
|
432
434
|
type: :assign,
|
433
435
|
body: [left, right],
|
434
|
-
|
435
|
-
|
436
|
+
el: right[:el],
|
437
|
+
ec: right[:ec]
|
436
438
|
)
|
437
439
|
end
|
438
440
|
|
@@ -443,10 +445,10 @@ class Prettier::Parser < Ripper
|
|
443
445
|
{
|
444
446
|
type: :assoc_new,
|
445
447
|
body: [key, value],
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
448
|
+
sl: key[:sl],
|
449
|
+
sc: key[:sc],
|
450
|
+
el: value[:el],
|
451
|
+
ec: value[:ec]
|
450
452
|
}
|
451
453
|
end
|
452
454
|
|
@@ -456,8 +458,8 @@ class Prettier::Parser < Ripper
|
|
456
458
|
find_scanner_event(:@op, '**').merge!(
|
457
459
|
type: :assoc_splat,
|
458
460
|
body: [contents],
|
459
|
-
|
460
|
-
|
461
|
+
el: contents[:el],
|
462
|
+
ec: contents[:ec]
|
461
463
|
)
|
462
464
|
end
|
463
465
|
|
@@ -469,10 +471,10 @@ class Prettier::Parser < Ripper
|
|
469
471
|
{
|
470
472
|
type: :assoclist_from_args,
|
471
473
|
body: assocs,
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
474
|
+
sl: assocs[0][:sl],
|
475
|
+
sc: assocs[0][:sc],
|
476
|
+
el: assocs[-1][:el],
|
477
|
+
ec: assocs[-1][:ec]
|
476
478
|
}
|
477
479
|
end
|
478
480
|
|
@@ -484,10 +486,10 @@ class Prettier::Parser < Ripper
|
|
484
486
|
{
|
485
487
|
type: :bare_assoc_hash,
|
486
488
|
body: assoc_news,
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
489
|
+
sl: assoc_news[0][:sl],
|
490
|
+
sc: assoc_news[0][:sc],
|
491
|
+
el: assoc_news[-1][:el],
|
492
|
+
ec: assoc_news[-1][:ec]
|
491
493
|
}
|
492
494
|
end
|
493
495
|
|
@@ -495,20 +497,20 @@ class Prettier::Parser < Ripper
|
|
495
497
|
# It includes a bodystmt event that has all of the consequent clauses.
|
496
498
|
def on_begin(bodystmt)
|
497
499
|
beging = find_scanner_event(:@kw, 'begin')
|
498
|
-
|
500
|
+
ec =
|
499
501
|
if bodystmt[:body][1..-1].any?
|
500
|
-
bodystmt[:
|
502
|
+
bodystmt[:ec]
|
501
503
|
else
|
502
|
-
find_scanner_event(:@kw, 'end')[:
|
504
|
+
find_scanner_event(:@kw, 'end')[:ec]
|
503
505
|
end
|
504
506
|
|
505
|
-
bodystmt.bind(beging[:
|
507
|
+
bodystmt.bind(beging[:ec], ec)
|
506
508
|
|
507
509
|
beging.merge!(
|
508
510
|
type: :begin,
|
509
511
|
body: [bodystmt],
|
510
|
-
|
511
|
-
|
512
|
+
el: bodystmt[:el],
|
513
|
+
ec: bodystmt[:ec]
|
512
514
|
)
|
513
515
|
end
|
514
516
|
|
@@ -518,10 +520,10 @@ class Prettier::Parser < Ripper
|
|
518
520
|
{
|
519
521
|
type: :binary,
|
520
522
|
body: [left, oper, right],
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
523
|
+
sl: left[:sl],
|
524
|
+
sc: left[:sc],
|
525
|
+
el: right[:el],
|
526
|
+
ec: right[:ec]
|
525
527
|
}
|
526
528
|
end
|
527
529
|
|
@@ -531,7 +533,7 @@ class Prettier::Parser < Ripper
|
|
531
533
|
index =
|
532
534
|
scanner_events.rindex do |event|
|
533
535
|
event[:type] == :@op && %w[| ||].include?(event[:body]) &&
|
534
|
-
event[:
|
536
|
+
event[:sc] < params[:sc]
|
535
537
|
end
|
536
538
|
|
537
539
|
beging = scanner_events[index]
|
@@ -540,10 +542,10 @@ class Prettier::Parser < Ripper
|
|
540
542
|
{
|
541
543
|
type: :block_var,
|
542
544
|
body: [params, locals],
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
545
|
+
sl: beging[:sl],
|
546
|
+
sc: beging[:sc],
|
547
|
+
el: ending[:el],
|
548
|
+
ec: ending[:ec]
|
547
549
|
}
|
548
550
|
end
|
549
551
|
|
@@ -553,8 +555,8 @@ class Prettier::Parser < Ripper
|
|
553
555
|
find_scanner_event(:@op, '&').merge!(
|
554
556
|
type: :blockarg,
|
555
557
|
body: [ident],
|
556
|
-
|
557
|
-
|
558
|
+
el: ident[:el],
|
559
|
+
ec: ident[:ec]
|
558
560
|
)
|
559
561
|
end
|
560
562
|
|
@@ -562,21 +564,18 @@ class Prettier::Parser < Ripper
|
|
562
564
|
# doesn't necessarily know where it started. So the parent node needs to
|
563
565
|
# report back down into this one where it goes.
|
564
566
|
class BodyStmt < SimpleDelegator
|
565
|
-
def bind(
|
566
|
-
merge!(
|
567
|
+
def bind(sc, ec)
|
568
|
+
merge!(sc: sc, ec: ec)
|
567
569
|
parts = self[:body]
|
568
570
|
|
569
571
|
# Here we're going to determine the bounds for the stmts
|
570
572
|
consequent = parts[1..-1].compact.first
|
571
|
-
self[:body][0].bind(
|
572
|
-
char_start,
|
573
|
-
consequent ? consequent[:char_start] : char_end
|
574
|
-
)
|
573
|
+
self[:body][0].bind(sc, consequent ? consequent[:sc] : ec)
|
575
574
|
|
576
575
|
# Next we're going to determine the rescue clause if there is one
|
577
576
|
if parts[1]
|
578
577
|
consequent = parts[2..-1].compact.first
|
579
|
-
self[:body][1].bind_end(consequent ? consequent[:
|
578
|
+
self[:body][1].bind_end(consequent ? consequent[:sc] : ec)
|
580
579
|
end
|
581
580
|
end
|
582
581
|
end
|
@@ -587,10 +586,10 @@ class Prettier::Parser < Ripper
|
|
587
586
|
BodyStmt.new(
|
588
587
|
type: :bodystmt,
|
589
588
|
body: [stmts, rescued, ensured, elsed],
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
589
|
+
sl: lineno,
|
590
|
+
sc: char_pos,
|
591
|
+
el: lineno,
|
592
|
+
ec: char_pos
|
594
593
|
)
|
595
594
|
end
|
596
595
|
|
@@ -602,15 +601,15 @@ class Prettier::Parser < Ripper
|
|
602
601
|
beging = find_scanner_event(:@lbrace)
|
603
602
|
ending = find_scanner_event(:@rbrace)
|
604
603
|
|
605
|
-
stmts.bind((block_var || beging)[:
|
604
|
+
stmts.bind((block_var || beging)[:ec], ending[:sc])
|
606
605
|
|
607
606
|
{
|
608
607
|
type: :brace_block,
|
609
608
|
body: [block_var, stmts],
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
609
|
+
sl: beging[:sl],
|
610
|
+
sc: beging[:sc],
|
611
|
+
el: ending[:el],
|
612
|
+
ec: ending[:ec]
|
614
613
|
}
|
615
614
|
end
|
616
615
|
|
@@ -630,8 +629,8 @@ class Prettier::Parser < Ripper
|
|
630
629
|
beging.merge!(
|
631
630
|
type: :break,
|
632
631
|
body: [args_add_block],
|
633
|
-
|
634
|
-
|
632
|
+
el: args_add_block[:el],
|
633
|
+
ec: args_add_block[:ec]
|
635
634
|
)
|
636
635
|
end
|
637
636
|
|
@@ -647,10 +646,6 @@ class Prettier::Parser < Ripper
|
|
647
646
|
# foo.(1, 2, 3)
|
648
647
|
#
|
649
648
|
def on_call(receiver, oper, sending)
|
650
|
-
# Make sure we take the operator out of the scanner events so that it
|
651
|
-
# doesn't get confused for a unary operator later.
|
652
|
-
scanner_events.delete(oper)
|
653
|
-
|
654
649
|
ending = sending
|
655
650
|
|
656
651
|
if sending == :call
|
@@ -664,10 +659,10 @@ class Prettier::Parser < Ripper
|
|
664
659
|
{
|
665
660
|
type: :call,
|
666
661
|
body: [receiver, oper, sending],
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
662
|
+
sl: receiver[:sl],
|
663
|
+
sc: receiver[:sc],
|
664
|
+
el: ending[:el],
|
665
|
+
ec: ending[:ec]
|
671
666
|
}
|
672
667
|
end
|
673
668
|
|
@@ -685,8 +680,8 @@ class Prettier::Parser < Ripper
|
|
685
680
|
|
686
681
|
beging.merge!(
|
687
682
|
body: [switch, consequent],
|
688
|
-
|
689
|
-
|
683
|
+
el: consequent[:el],
|
684
|
+
ec: consequent[:ec]
|
690
685
|
)
|
691
686
|
end
|
692
687
|
|
@@ -720,17 +715,17 @@ class Prettier::Parser < Ripper
|
|
720
715
|
ending = find_scanner_event(:@kw, 'end')
|
721
716
|
|
722
717
|
bodystmt.bind(
|
723
|
-
find_next_statement_start((superclass || const)[:
|
724
|
-
ending[:
|
718
|
+
find_next_statement_start((superclass || const)[:ec]),
|
719
|
+
ending[:sc]
|
725
720
|
)
|
726
721
|
|
727
722
|
{
|
728
723
|
type: :class,
|
729
724
|
body: [const, superclass, bodystmt],
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
725
|
+
sl: beging[:sl],
|
726
|
+
sc: beging[:sc],
|
727
|
+
el: ending[:el],
|
728
|
+
ec: ending[:ec]
|
734
729
|
}
|
735
730
|
end
|
736
731
|
|
@@ -741,10 +736,10 @@ class Prettier::Parser < Ripper
|
|
741
736
|
{
|
742
737
|
type: :command,
|
743
738
|
body: [ident, args],
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
739
|
+
sl: ident[:sl],
|
740
|
+
sc: ident[:sc],
|
741
|
+
el: args[:el],
|
742
|
+
ec: args[:ec]
|
748
743
|
}
|
749
744
|
end
|
750
745
|
|
@@ -753,20 +748,15 @@ class Prettier::Parser < Ripper
|
|
753
748
|
# of the method, the operator being used to send the method, the name of
|
754
749
|
# the method, and the arguments being passed to the method.
|
755
750
|
def on_command_call(receiver, oper, ident, args)
|
756
|
-
# Make sure we take the operator out of the scanner events so that it
|
757
|
-
# doesn't get confused for a unary operator later.
|
758
|
-
scanner_events.delete(oper)
|
759
|
-
|
760
|
-
# Grab the ending from either the arguments or the method being sent
|
761
751
|
ending = args || ident
|
762
752
|
|
763
753
|
{
|
764
754
|
type: :command_call,
|
765
755
|
body: [receiver, oper, ident, args],
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
756
|
+
sl: receiver[:sl],
|
757
|
+
sc: receiver[:sc],
|
758
|
+
el: ending[:el],
|
759
|
+
ec: ending[:ec]
|
770
760
|
}
|
771
761
|
end
|
772
762
|
|
@@ -780,10 +770,10 @@ class Prettier::Parser < Ripper
|
|
780
770
|
{
|
781
771
|
type: :const_path_field,
|
782
772
|
body: [left, const],
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
773
|
+
sl: left[:sl],
|
774
|
+
sc: left[:sc],
|
775
|
+
el: const[:el],
|
776
|
+
ec: const[:ec]
|
787
777
|
}
|
788
778
|
end
|
789
779
|
|
@@ -797,10 +787,10 @@ class Prettier::Parser < Ripper
|
|
797
787
|
{
|
798
788
|
type: :const_path_ref,
|
799
789
|
body: [left, const],
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
790
|
+
sl: left[:sl],
|
791
|
+
sc: left[:sc],
|
792
|
+
el: const[:el],
|
793
|
+
ec: const[:ec]
|
804
794
|
}
|
805
795
|
end
|
806
796
|
|
@@ -850,33 +840,30 @@ class Prettier::Parser < Ripper
|
|
850
840
|
{
|
851
841
|
type: :defsl,
|
852
842
|
body: [ident, params, bodystmt],
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
843
|
+
sl: beging[:sl],
|
844
|
+
sc: beging[:sc],
|
845
|
+
el: bodystmt[:el],
|
846
|
+
ec: bodystmt[:ec]
|
857
847
|
}
|
858
848
|
)
|
859
849
|
end
|
860
850
|
|
861
851
|
if params[:type] == :params && !params[:body].any?
|
862
|
-
location = ident[:
|
863
|
-
params.merge!(
|
852
|
+
location = ident[:ec]
|
853
|
+
params.merge!(sc: location, ec: location)
|
864
854
|
end
|
865
855
|
|
866
856
|
ending = find_scanner_event(:@kw, 'end')
|
867
857
|
|
868
|
-
bodystmt.bind(
|
869
|
-
find_next_statement_start(params[:char_end]),
|
870
|
-
ending[:char_start]
|
871
|
-
)
|
858
|
+
bodystmt.bind(find_next_statement_start(params[:ec]), ending[:sc])
|
872
859
|
|
873
860
|
{
|
874
861
|
type: :def,
|
875
862
|
body: [ident, params, bodystmt],
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
863
|
+
sl: beging[:sl],
|
864
|
+
sc: beging[:sc],
|
865
|
+
el: ending[:el],
|
866
|
+
ec: ending[:ec]
|
880
867
|
}
|
881
868
|
end
|
882
869
|
|
@@ -901,25 +888,22 @@ class Prettier::Parser < Ripper
|
|
901
888
|
scanner_events.delete(ident)
|
902
889
|
|
903
890
|
if params[:type] == :params && !params[:body].any?
|
904
|
-
location = ident[:
|
905
|
-
params.merge!(
|
891
|
+
location = ident[:ec]
|
892
|
+
params.merge!(sc: location, ec: location)
|
906
893
|
end
|
907
894
|
|
908
895
|
beging = find_scanner_event(:@kw, 'def')
|
909
896
|
ending = find_scanner_event(:@kw, 'end')
|
910
897
|
|
911
|
-
bodystmt.bind(
|
912
|
-
find_next_statement_start(params[:char_end]),
|
913
|
-
ending[:char_start]
|
914
|
-
)
|
898
|
+
bodystmt.bind(find_next_statement_start(params[:ec]), ending[:sc])
|
915
899
|
|
916
900
|
{
|
917
901
|
type: :defs,
|
918
902
|
body: [target, oper, ident, params, bodystmt],
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
903
|
+
sl: beging[:sl],
|
904
|
+
sc: beging[:sc],
|
905
|
+
el: ending[:el],
|
906
|
+
ec: ending[:ec]
|
923
907
|
}
|
924
908
|
end
|
925
909
|
|
@@ -930,14 +914,14 @@ class Prettier::Parser < Ripper
|
|
930
914
|
def on_defined(value)
|
931
915
|
beging = find_scanner_event(:@kw, 'defined?')
|
932
916
|
|
933
|
-
paren = source[beging[:
|
917
|
+
paren = source[beging[:ec]...value[:sc]].include?('(')
|
934
918
|
ending = paren ? find_scanner_event(:@rparen) : value
|
935
919
|
|
936
920
|
beging.merge!(
|
937
921
|
type: :defined,
|
938
922
|
body: [value],
|
939
|
-
|
940
|
-
|
923
|
+
el: ending[:el],
|
924
|
+
ec: ending[:ec]
|
941
925
|
)
|
942
926
|
end
|
943
927
|
|
@@ -949,15 +933,15 @@ class Prettier::Parser < Ripper
|
|
949
933
|
beging = find_scanner_event(:@kw, 'do')
|
950
934
|
ending = find_scanner_event(:@kw, 'end')
|
951
935
|
|
952
|
-
bodystmt.bind((block_var || beging)[:
|
936
|
+
bodystmt.bind((block_var || beging)[:ec], ending[:sc])
|
953
937
|
|
954
938
|
{
|
955
939
|
type: :do_block,
|
956
940
|
body: [block_var, bodystmt],
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
941
|
+
sl: beging[:sl],
|
942
|
+
sc: beging[:sc],
|
943
|
+
el: ending[:el],
|
944
|
+
ec: ending[:ec]
|
961
945
|
}
|
962
946
|
end
|
963
947
|
|
@@ -973,10 +957,10 @@ class Prettier::Parser < Ripper
|
|
973
957
|
{
|
974
958
|
type: :dot2,
|
975
959
|
body: [left, right],
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
960
|
+
sl: beging[:sl],
|
961
|
+
sc: beging[:sc],
|
962
|
+
el: ending[:el],
|
963
|
+
ec: ending[:ec]
|
980
964
|
}
|
981
965
|
end
|
982
966
|
|
@@ -992,10 +976,10 @@ class Prettier::Parser < Ripper
|
|
992
976
|
{
|
993
977
|
type: :dot3,
|
994
978
|
body: [left, right],
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
979
|
+
sl: beging[:sl],
|
980
|
+
sc: beging[:sc],
|
981
|
+
el: ending[:el],
|
982
|
+
ec: ending[:ec]
|
999
983
|
}
|
1000
984
|
end
|
1001
985
|
|
@@ -1027,8 +1011,8 @@ class Prettier::Parser < Ripper
|
|
1027
1011
|
type: :dyna_symbol,
|
1028
1012
|
quote: beging[:body][1],
|
1029
1013
|
body: string[:body],
|
1030
|
-
|
1031
|
-
|
1014
|
+
el: ending[:el],
|
1015
|
+
ec: ending[:ec]
|
1032
1016
|
)
|
1033
1017
|
else
|
1034
1018
|
# A dynamic symbol as a hash key
|
@@ -1038,10 +1022,10 @@ class Prettier::Parser < Ripper
|
|
1038
1022
|
string.merge!(
|
1039
1023
|
type: :dyna_symbol,
|
1040
1024
|
quote: ending[:body][0],
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1025
|
+
sl: beging[:sl],
|
1026
|
+
sc: beging[:sc],
|
1027
|
+
el: ending[:el],
|
1028
|
+
ec: ending[:ec]
|
1045
1029
|
)
|
1046
1030
|
end
|
1047
1031
|
end
|
@@ -1066,15 +1050,15 @@ class Prettier::Parser < Ripper
|
|
1066
1050
|
beging = find_scanner_event(:@kw, 'else')
|
1067
1051
|
ending = find_else_ending
|
1068
1052
|
|
1069
|
-
stmts.bind(beging[:
|
1053
|
+
stmts.bind(beging[:ec], ending[:sc])
|
1070
1054
|
|
1071
1055
|
{
|
1072
1056
|
type: :else,
|
1073
1057
|
body: [stmts],
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1058
|
+
sl: beging[:sl],
|
1059
|
+
sc: beging[:sc],
|
1060
|
+
el: ending[:el],
|
1061
|
+
ec: ending[:ec]
|
1078
1062
|
}
|
1079
1063
|
end
|
1080
1064
|
|
@@ -1086,15 +1070,15 @@ class Prettier::Parser < Ripper
|
|
1086
1070
|
beging = find_scanner_event(:@kw, 'elsif')
|
1087
1071
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
1088
1072
|
|
1089
|
-
stmts.bind(predicate[:
|
1073
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
1090
1074
|
|
1091
1075
|
{
|
1092
1076
|
type: :elsif,
|
1093
1077
|
body: [predicate, stmts, consequent],
|
1094
|
-
|
1095
|
-
|
1096
|
-
|
1097
|
-
|
1078
|
+
sl: beging[:sl],
|
1079
|
+
sc: beging[:sc],
|
1080
|
+
el: ending[:el],
|
1081
|
+
ec: ending[:ec]
|
1098
1082
|
}
|
1099
1083
|
end
|
1100
1084
|
|
@@ -1104,12 +1088,7 @@ class Prettier::Parser < Ripper
|
|
1104
1088
|
# and add to it as we get content. It always starts with this scanner
|
1105
1089
|
# event, so here we'll initialize the current embdoc.
|
1106
1090
|
def on_embdoc_beg(value)
|
1107
|
-
@embdoc = {
|
1108
|
-
type: :@embdoc,
|
1109
|
-
value: value,
|
1110
|
-
start: lineno,
|
1111
|
-
char_start: char_pos
|
1112
|
-
}
|
1091
|
+
@embdoc = { type: :@embdoc, value: value, sl: lineno, sc: char_pos }
|
1113
1092
|
end
|
1114
1093
|
|
1115
1094
|
# This is a scanner event that gets hit when we're inside an embdoc and
|
@@ -1128,8 +1107,8 @@ class Prettier::Parser < Ripper
|
|
1128
1107
|
@comments <<
|
1129
1108
|
@embdoc.merge!(
|
1130
1109
|
value: @embdoc[:value] << value.chomp,
|
1131
|
-
|
1132
|
-
|
1110
|
+
el: lineno,
|
1111
|
+
ec: char_pos + value.length - 1
|
1133
1112
|
)
|
1134
1113
|
|
1135
1114
|
@embdoc = nil
|
@@ -1148,18 +1127,15 @@ class Prettier::Parser < Ripper
|
|
1148
1127
|
end
|
1149
1128
|
|
1150
1129
|
ending = scanner_events[index]
|
1151
|
-
stmts.bind(
|
1152
|
-
find_next_statement_start(beging[:char_end]),
|
1153
|
-
ending[:char_start]
|
1154
|
-
)
|
1130
|
+
stmts.bind(find_next_statement_start(beging[:ec]), ending[:sc])
|
1155
1131
|
|
1156
1132
|
{
|
1157
1133
|
type: :ensure,
|
1158
1134
|
body: [beging, stmts],
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1135
|
+
sl: beging[:sl],
|
1136
|
+
sc: beging[:sc],
|
1137
|
+
el: ending[:el],
|
1138
|
+
ec: ending[:ec]
|
1163
1139
|
}
|
1164
1140
|
end
|
1165
1141
|
|
@@ -1187,10 +1163,10 @@ class Prettier::Parser < Ripper
|
|
1187
1163
|
{
|
1188
1164
|
type: :field,
|
1189
1165
|
body: [left, oper, right],
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1166
|
+
sl: left[:sl],
|
1167
|
+
sc: left[:sc],
|
1168
|
+
el: right[:el],
|
1169
|
+
ec: right[:ec]
|
1194
1170
|
}
|
1195
1171
|
end
|
1196
1172
|
|
@@ -1200,15 +1176,13 @@ class Prettier::Parser < Ripper
|
|
1200
1176
|
beging = const || find_scanner_event(:@lbracket)
|
1201
1177
|
ending = find_scanner_event(:@rbracket)
|
1202
1178
|
|
1203
|
-
pieces = [const, presplat, *args, postsplat].compact
|
1204
|
-
|
1205
1179
|
{
|
1206
1180
|
type: :fndptn,
|
1207
1181
|
body: [const, presplat, args, postsplat],
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1182
|
+
sl: beging[:sl],
|
1183
|
+
sc: beging[:sc],
|
1184
|
+
el: ending[:el],
|
1185
|
+
ec: ending[:ec]
|
1212
1186
|
}
|
1213
1187
|
end
|
1214
1188
|
|
@@ -1220,15 +1194,15 @@ class Prettier::Parser < Ripper
|
|
1220
1194
|
beging = find_scanner_event(:@kw, 'for')
|
1221
1195
|
ending = find_scanner_event(:@kw, 'end')
|
1222
1196
|
|
1223
|
-
stmts.bind(enumerable[:
|
1197
|
+
stmts.bind(enumerable[:ec], ending[:sc])
|
1224
1198
|
|
1225
1199
|
{
|
1226
1200
|
type: :for,
|
1227
1201
|
body: [ident, enumerable, stmts],
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1202
|
+
sl: beging[:sl],
|
1203
|
+
sc: beging[:sc],
|
1204
|
+
el: ending[:el],
|
1205
|
+
ec: ending[:ec]
|
1232
1206
|
}
|
1233
1207
|
end
|
1234
1208
|
|
@@ -1242,19 +1216,16 @@ class Prettier::Parser < Ripper
|
|
1242
1216
|
if assoclist_from_args
|
1243
1217
|
# Here we're going to expand out the location information for the assocs
|
1244
1218
|
# node so that it can grab up any remaining comments inside the hash.
|
1245
|
-
assoclist_from_args.merge!(
|
1246
|
-
char_start: beging[:char_end],
|
1247
|
-
char_end: ending[:char_start]
|
1248
|
-
)
|
1219
|
+
assoclist_from_args.merge!(sc: beging[:ec], ec: ending[:sc])
|
1249
1220
|
end
|
1250
1221
|
|
1251
1222
|
{
|
1252
1223
|
type: :hash,
|
1253
1224
|
body: [assoclist_from_args],
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1225
|
+
sl: beging[:sl],
|
1226
|
+
sc: beging[:sc],
|
1227
|
+
el: ending[:el],
|
1228
|
+
ec: ending[:ec]
|
1258
1229
|
}
|
1259
1230
|
end
|
1260
1231
|
|
@@ -1266,10 +1237,10 @@ class Prettier::Parser < Ripper
|
|
1266
1237
|
# printer through our embed function.
|
1267
1238
|
def on_heredoc_beg(beging)
|
1268
1239
|
location = {
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1240
|
+
sl: lineno,
|
1241
|
+
el: lineno,
|
1242
|
+
sc: char_pos,
|
1243
|
+
ec: char_pos + beging.length + 1
|
1273
1244
|
}
|
1274
1245
|
|
1275
1246
|
# Here we're going to artificially create an extra node type so that if
|
@@ -1291,7 +1262,7 @@ class Prettier::Parser < Ripper
|
|
1291
1262
|
|
1292
1263
|
# This is a scanner event that represents the end of the heredoc.
|
1293
1264
|
def on_heredoc_end(ending)
|
1294
|
-
@heredocs[-1].merge!(ending: ending.chomp,
|
1265
|
+
@heredocs[-1].merge!(ending: ending.chomp, el: lineno, ec: char_pos)
|
1295
1266
|
end
|
1296
1267
|
|
1297
1268
|
# hshptn is a parser event that represents matching against a hash pattern
|
@@ -1302,10 +1273,10 @@ class Prettier::Parser < Ripper
|
|
1302
1273
|
{
|
1303
1274
|
type: :hshptn,
|
1304
1275
|
body: [const, kw, kwrest],
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1276
|
+
sl: pieces[0][:sl],
|
1277
|
+
sc: pieces[0][:sc],
|
1278
|
+
el: pieces[-1][:el],
|
1279
|
+
ec: pieces[-1][:ec]
|
1309
1280
|
}
|
1310
1281
|
end
|
1311
1282
|
|
@@ -1316,15 +1287,15 @@ class Prettier::Parser < Ripper
|
|
1316
1287
|
beging = find_scanner_event(:@kw, 'if')
|
1317
1288
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
1318
1289
|
|
1319
|
-
stmts.bind(predicate[:
|
1290
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
1320
1291
|
|
1321
1292
|
{
|
1322
1293
|
type: :if,
|
1323
1294
|
body: [predicate, stmts, consequent],
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1295
|
+
sl: beging[:sl],
|
1296
|
+
sc: beging[:sc],
|
1297
|
+
el: ending[:el],
|
1298
|
+
ec: ending[:ec]
|
1328
1299
|
}
|
1329
1300
|
end
|
1330
1301
|
|
@@ -1335,8 +1306,8 @@ class Prettier::Parser < Ripper
|
|
1335
1306
|
predicate.merge(
|
1336
1307
|
type: :ifop,
|
1337
1308
|
body: [predicate, truthy, falsy],
|
1338
|
-
|
1339
|
-
|
1309
|
+
el: falsy[:el],
|
1310
|
+
ec: falsy[:ec]
|
1340
1311
|
)
|
1341
1312
|
end
|
1342
1313
|
|
@@ -1349,10 +1320,10 @@ class Prettier::Parser < Ripper
|
|
1349
1320
|
{
|
1350
1321
|
type: :if_mod,
|
1351
1322
|
body: [predicate, statement],
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1323
|
+
sl: statement[:sl],
|
1324
|
+
sc: statement[:sc],
|
1325
|
+
el: predicate[:el],
|
1326
|
+
ec: predicate[:ec]
|
1356
1327
|
}
|
1357
1328
|
end
|
1358
1329
|
|
@@ -1366,13 +1337,13 @@ class Prettier::Parser < Ripper
|
|
1366
1337
|
beging = find_scanner_event(:@kw, 'in')
|
1367
1338
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
1368
1339
|
|
1369
|
-
stmts.bind(beging[:
|
1340
|
+
stmts.bind(beging[:ec], ending[:sc])
|
1370
1341
|
|
1371
1342
|
beging.merge!(
|
1372
1343
|
type: :in,
|
1373
1344
|
body: [pattern, stmts, consequent],
|
1374
|
-
|
1375
|
-
|
1345
|
+
el: ending[:el],
|
1346
|
+
ec: ending[:ec]
|
1376
1347
|
)
|
1377
1348
|
end
|
1378
1349
|
|
@@ -1385,8 +1356,8 @@ class Prettier::Parser < Ripper
|
|
1385
1356
|
oper.merge!(
|
1386
1357
|
type: :kwrest_param,
|
1387
1358
|
body: [ident],
|
1388
|
-
|
1389
|
-
|
1359
|
+
el: ident[:el],
|
1360
|
+
ec: ident[:ec]
|
1390
1361
|
)
|
1391
1362
|
end
|
1392
1363
|
|
@@ -1408,15 +1379,15 @@ class Prettier::Parser < Ripper
|
|
1408
1379
|
closing = find_scanner_event(:@kw, 'end')
|
1409
1380
|
end
|
1410
1381
|
|
1411
|
-
stmts.bind(opening[:
|
1382
|
+
stmts.bind(opening[:ec], closing[:sc])
|
1412
1383
|
|
1413
1384
|
{
|
1414
1385
|
type: :lambda,
|
1415
1386
|
body: [params, stmts],
|
1416
|
-
|
1417
|
-
|
1418
|
-
|
1419
|
-
|
1387
|
+
sl: beging[:sl],
|
1388
|
+
sc: beging[:sc],
|
1389
|
+
el: closing[:el],
|
1390
|
+
ec: closing[:ec]
|
1420
1391
|
}
|
1421
1392
|
end
|
1422
1393
|
|
@@ -1438,17 +1409,15 @@ class Prettier::Parser < Ripper
|
|
1438
1409
|
# in which case we need to explicitly track the comma and add it onto the
|
1439
1410
|
# child node.
|
1440
1411
|
def on_massign(left, right)
|
1441
|
-
if source[left[:
|
1442
|
-
left[:comma] = true
|
1443
|
-
end
|
1412
|
+
left[:comma] = true if source[left[:ec]...right[:sc]].strip.start_with?(',')
|
1444
1413
|
|
1445
1414
|
{
|
1446
1415
|
type: :massign,
|
1447
1416
|
body: [left, right],
|
1448
|
-
|
1449
|
-
|
1450
|
-
|
1451
|
-
|
1417
|
+
sl: left[:sl],
|
1418
|
+
sc: left[:sc],
|
1419
|
+
el: right[:el],
|
1420
|
+
ec: right[:ec]
|
1452
1421
|
}
|
1453
1422
|
end
|
1454
1423
|
|
@@ -1467,10 +1436,10 @@ class Prettier::Parser < Ripper
|
|
1467
1436
|
{
|
1468
1437
|
type: :method_add_arg,
|
1469
1438
|
body: [fcall, arg_paren],
|
1470
|
-
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
1439
|
+
sl: fcall[:sl],
|
1440
|
+
sc: fcall[:sc],
|
1441
|
+
el: arg_paren[:el],
|
1442
|
+
ec: arg_paren[:ec]
|
1474
1443
|
}
|
1475
1444
|
end
|
1476
1445
|
|
@@ -1481,10 +1450,10 @@ class Prettier::Parser < Ripper
|
|
1481
1450
|
{
|
1482
1451
|
type: :method_add_block,
|
1483
1452
|
body: [method_add_arg, block],
|
1484
|
-
|
1485
|
-
|
1486
|
-
|
1487
|
-
|
1453
|
+
sl: method_add_arg[:sl],
|
1454
|
+
sc: method_add_arg[:sc],
|
1455
|
+
el: block[:el],
|
1456
|
+
ec: block[:ec]
|
1488
1457
|
}
|
1489
1458
|
end
|
1490
1459
|
|
@@ -1495,10 +1464,10 @@ class Prettier::Parser < Ripper
|
|
1495
1464
|
{
|
1496
1465
|
type: :mlhs,
|
1497
1466
|
body: [],
|
1498
|
-
|
1499
|
-
|
1500
|
-
|
1501
|
-
|
1467
|
+
sl: lineno,
|
1468
|
+
sc: char_pos,
|
1469
|
+
el: lineno,
|
1470
|
+
ec: char_pos
|
1502
1471
|
}
|
1503
1472
|
end
|
1504
1473
|
|
@@ -1509,11 +1478,7 @@ class Prettier::Parser < Ripper
|
|
1509
1478
|
if mlhs[:body].empty?
|
1510
1479
|
part.merge(type: :mlhs, body: [part])
|
1511
1480
|
else
|
1512
|
-
mlhs.merge!(
|
1513
|
-
body: mlhs[:body] << part,
|
1514
|
-
end: part[:end],
|
1515
|
-
char_end: part[:char_end]
|
1516
|
-
)
|
1481
|
+
mlhs.merge!(body: mlhs[:body] << part, el: part[:el], ec: part[:ec])
|
1517
1482
|
end
|
1518
1483
|
end
|
1519
1484
|
|
@@ -1526,8 +1491,8 @@ class Prettier::Parser < Ripper
|
|
1526
1491
|
mlhs_add_star.merge(
|
1527
1492
|
type: :mlhs_add_post,
|
1528
1493
|
body: [mlhs_add_star, mlhs],
|
1529
|
-
|
1530
|
-
|
1494
|
+
el: mlhs[:el],
|
1495
|
+
ec: mlhs[:ec]
|
1531
1496
|
)
|
1532
1497
|
end
|
1533
1498
|
|
@@ -1542,10 +1507,10 @@ class Prettier::Parser < Ripper
|
|
1542
1507
|
{
|
1543
1508
|
type: :mlhs_add_star,
|
1544
1509
|
body: [mlhs, part],
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1510
|
+
sl: beging[:sl],
|
1511
|
+
sc: beging[:sc],
|
1512
|
+
el: ending[:el],
|
1513
|
+
ec: ending[:ec]
|
1549
1514
|
}
|
1550
1515
|
end
|
1551
1516
|
|
@@ -1557,17 +1522,17 @@ class Prettier::Parser < Ripper
|
|
1557
1522
|
beging = find_scanner_event(:@lparen)
|
1558
1523
|
ending = find_scanner_event(:@rparen)
|
1559
1524
|
|
1560
|
-
if source[beging[:
|
1525
|
+
if source[beging[:ec]...ending[:sc]].strip.end_with?(',')
|
1561
1526
|
contents[:comma] = true
|
1562
1527
|
end
|
1563
1528
|
|
1564
1529
|
{
|
1565
1530
|
type: :mlhs_paren,
|
1566
1531
|
body: [contents],
|
1567
|
-
|
1568
|
-
|
1569
|
-
|
1570
|
-
|
1532
|
+
sl: beging[:sl],
|
1533
|
+
sc: beging[:sc],
|
1534
|
+
el: ending[:el],
|
1535
|
+
ec: ending[:ec]
|
1571
1536
|
}
|
1572
1537
|
end
|
1573
1538
|
|
@@ -1578,18 +1543,15 @@ class Prettier::Parser < Ripper
|
|
1578
1543
|
beging = find_scanner_event(:@kw, 'module')
|
1579
1544
|
ending = find_scanner_event(:@kw, 'end')
|
1580
1545
|
|
1581
|
-
bodystmt.bind(
|
1582
|
-
find_next_statement_start(const[:char_end]),
|
1583
|
-
ending[:char_start]
|
1584
|
-
)
|
1546
|
+
bodystmt.bind(find_next_statement_start(const[:ec]), ending[:sc])
|
1585
1547
|
|
1586
1548
|
{
|
1587
1549
|
type: :module,
|
1588
1550
|
body: [const, bodystmt],
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1551
|
+
sl: beging[:sl],
|
1552
|
+
sc: beging[:sc],
|
1553
|
+
el: ending[:el],
|
1554
|
+
ec: ending[:ec]
|
1593
1555
|
}
|
1594
1556
|
end
|
1595
1557
|
|
@@ -1601,10 +1563,10 @@ class Prettier::Parser < Ripper
|
|
1601
1563
|
{
|
1602
1564
|
type: :mrhs,
|
1603
1565
|
body: [],
|
1604
|
-
|
1605
|
-
|
1606
|
-
|
1607
|
-
|
1566
|
+
sl: lineno,
|
1567
|
+
sc: char_pos,
|
1568
|
+
el: lineno,
|
1569
|
+
ec: char_pos
|
1608
1570
|
}
|
1609
1571
|
end
|
1610
1572
|
|
@@ -1614,11 +1576,7 @@ class Prettier::Parser < Ripper
|
|
1614
1576
|
if mrhs[:body].empty?
|
1615
1577
|
part.merge(type: :mrhs, body: [part])
|
1616
1578
|
else
|
1617
|
-
mrhs.merge!(
|
1618
|
-
body: mrhs[:body] << part,
|
1619
|
-
end: part[:end],
|
1620
|
-
char_end: part[:char_end]
|
1621
|
-
)
|
1579
|
+
mrhs.merge!(body: mrhs[:body] << part, el: part[:el], ec: part[:ec])
|
1622
1580
|
end
|
1623
1581
|
end
|
1624
1582
|
|
@@ -1632,10 +1590,10 @@ class Prettier::Parser < Ripper
|
|
1632
1590
|
{
|
1633
1591
|
type: :mrhs_add_star,
|
1634
1592
|
body: [mrhs, part],
|
1635
|
-
|
1636
|
-
|
1637
|
-
|
1638
|
-
|
1593
|
+
sl: beging[:sl],
|
1594
|
+
sc: beging[:sc],
|
1595
|
+
el: ending[:el],
|
1596
|
+
ec: ending[:ec]
|
1639
1597
|
}
|
1640
1598
|
end
|
1641
1599
|
|
@@ -1658,8 +1616,8 @@ class Prettier::Parser < Ripper
|
|
1658
1616
|
find_scanner_event(:@kw, 'next').merge!(
|
1659
1617
|
type: :next,
|
1660
1618
|
body: [args_add_block],
|
1661
|
-
|
1662
|
-
|
1619
|
+
el: args_add_block[:el],
|
1620
|
+
ec: args_add_block[:ec]
|
1663
1621
|
)
|
1664
1622
|
end
|
1665
1623
|
|
@@ -1671,8 +1629,8 @@ class Prettier::Parser < Ripper
|
|
1671
1629
|
left.merge(
|
1672
1630
|
type: :opassign,
|
1673
1631
|
body: [left, oper, right],
|
1674
|
-
|
1675
|
-
|
1632
|
+
el: right[:el],
|
1633
|
+
ec: right[:ec]
|
1676
1634
|
)
|
1677
1635
|
end
|
1678
1636
|
|
@@ -1686,13 +1644,13 @@ class Prettier::Parser < Ripper
|
|
1686
1644
|
location =
|
1687
1645
|
if flattened.any?
|
1688
1646
|
{
|
1689
|
-
|
1690
|
-
|
1691
|
-
|
1692
|
-
|
1647
|
+
sl: flattened[0][:sl],
|
1648
|
+
sc: flattened[0][:sc],
|
1649
|
+
el: flattened[-1][:el],
|
1650
|
+
ec: flattened[-1][:ec]
|
1693
1651
|
}
|
1694
1652
|
else
|
1695
|
-
{
|
1653
|
+
{ sl: lineno, sc: char_pos, el: lineno, ec: char_pos }
|
1696
1654
|
end
|
1697
1655
|
|
1698
1656
|
location.merge!(type: :params, body: types)
|
@@ -1702,13 +1660,18 @@ class Prettier::Parser < Ripper
|
|
1702
1660
|
# anywhere in a Ruby program. It accepts as arguments the contents, which
|
1703
1661
|
# can be either params or statements.
|
1704
1662
|
def on_paren(contents)
|
1663
|
+
beging = find_scanner_event(:@lparen)
|
1705
1664
|
ending = find_scanner_event(:@rparen)
|
1706
1665
|
|
1707
|
-
|
1666
|
+
if contents && contents[:type] == :params
|
1667
|
+
contents.merge!(sc: beging[:ec], ec: ending[:sc])
|
1668
|
+
end
|
1669
|
+
|
1670
|
+
beging.merge!(
|
1708
1671
|
type: :paren,
|
1709
1672
|
body: [contents],
|
1710
|
-
|
1711
|
-
|
1673
|
+
el: ending[:el],
|
1674
|
+
ec: ending[:ec]
|
1712
1675
|
)
|
1713
1676
|
end
|
1714
1677
|
|
@@ -1717,12 +1680,7 @@ class Prettier::Parser < Ripper
|
|
1717
1680
|
# source string. We'll also attach on the __END__ content if there was
|
1718
1681
|
# some found at the end of the source string.
|
1719
1682
|
def on_program(stmts)
|
1720
|
-
range = {
|
1721
|
-
start: 1,
|
1722
|
-
end: lines.length,
|
1723
|
-
char_start: 0,
|
1724
|
-
char_end: source.length
|
1725
|
-
}
|
1683
|
+
range = { sl: 1, el: lines.length, sc: 0, ec: source.length }
|
1726
1684
|
|
1727
1685
|
stmts[:body] << @__end__ if @__end__
|
1728
1686
|
stmts.bind(0, source.length)
|
@@ -1744,8 +1702,8 @@ class Prettier::Parser < Ripper
|
|
1744
1702
|
def on_qsymbols_add(qsymbols, tstring_content)
|
1745
1703
|
qsymbols.merge!(
|
1746
1704
|
body: qsymbols[:body] << tstring_content,
|
1747
|
-
|
1748
|
-
|
1705
|
+
el: tstring_content[:el],
|
1706
|
+
ec: tstring_content[:ec]
|
1749
1707
|
)
|
1750
1708
|
end
|
1751
1709
|
|
@@ -1763,8 +1721,8 @@ class Prettier::Parser < Ripper
|
|
1763
1721
|
def on_qwords_add(qwords, tstring_content)
|
1764
1722
|
qwords.merge!(
|
1765
1723
|
body: qwords[:body] << tstring_content,
|
1766
|
-
|
1767
|
-
|
1724
|
+
el: tstring_content[:el],
|
1725
|
+
ec: tstring_content[:ec]
|
1768
1726
|
)
|
1769
1727
|
end
|
1770
1728
|
|
@@ -1789,8 +1747,8 @@ class Prettier::Parser < Ripper
|
|
1789
1747
|
def on_regexp_add(regexp, piece)
|
1790
1748
|
regexp.merge!(
|
1791
1749
|
body: regexp[:body] << piece,
|
1792
|
-
|
1793
|
-
|
1750
|
+
el: regexp[:el],
|
1751
|
+
ec: regexp[:ec]
|
1794
1752
|
)
|
1795
1753
|
end
|
1796
1754
|
|
@@ -1802,8 +1760,8 @@ class Prettier::Parser < Ripper
|
|
1802
1760
|
regexp.merge!(
|
1803
1761
|
type: :regexp_literal,
|
1804
1762
|
ending: ending[:body],
|
1805
|
-
|
1806
|
-
|
1763
|
+
el: ending[:el],
|
1764
|
+
ec: ending[:ec]
|
1807
1765
|
)
|
1808
1766
|
end
|
1809
1767
|
|
@@ -1812,17 +1770,17 @@ class Prettier::Parser < Ripper
|
|
1812
1770
|
# determine its ending. Therefore it relies on its parent bodystmt node to
|
1813
1771
|
# report its ending to it.
|
1814
1772
|
class Rescue < SimpleDelegator
|
1815
|
-
def bind_end(
|
1816
|
-
merge!(
|
1773
|
+
def bind_end(ec)
|
1774
|
+
merge!(ec: ec)
|
1817
1775
|
|
1818
|
-
stmts = self[:body][
|
1819
|
-
consequent = self[:body][
|
1776
|
+
stmts = self[:body][1]
|
1777
|
+
consequent = self[:body][2]
|
1820
1778
|
|
1821
1779
|
if consequent
|
1822
|
-
consequent.bind_end(
|
1823
|
-
stmts.bind_end(consequent[:
|
1780
|
+
consequent.bind_end(ec)
|
1781
|
+
stmts.bind_end(consequent[:sc])
|
1824
1782
|
else
|
1825
|
-
stmts.bind_end(
|
1783
|
+
stmts.bind_end(ec)
|
1826
1784
|
end
|
1827
1785
|
end
|
1828
1786
|
end
|
@@ -1831,18 +1789,32 @@ class Prettier::Parser < Ripper
|
|
1831
1789
|
# inside of a bodystmt.
|
1832
1790
|
def on_rescue(exceptions, variable, stmts, consequent)
|
1833
1791
|
beging = find_scanner_event(:@kw, 'rescue')
|
1792
|
+
exceptions = exceptions[0] if exceptions.is_a?(Array)
|
1834
1793
|
|
1835
|
-
|
1836
|
-
last_node
|
1794
|
+
last_node = variable || exceptions || beging
|
1795
|
+
stmts.bind(find_next_statement_start(last_node[:ec]), char_pos)
|
1837
1796
|
|
1838
|
-
|
1797
|
+
# We add an additional inner node here that ripper doesn't provide so that
|
1798
|
+
# we have a nice place to attach inline comment. But we only need it if we
|
1799
|
+
# have an exception or a variable that we're rescuing.
|
1800
|
+
rescue_ex =
|
1801
|
+
if exceptions || variable
|
1802
|
+
{
|
1803
|
+
type: :rescue_ex,
|
1804
|
+
body: [exceptions, variable],
|
1805
|
+
sl: beging[:sl],
|
1806
|
+
sc: beging[:ec] + 1,
|
1807
|
+
el: last_node[:el],
|
1808
|
+
ec: last_node[:ec]
|
1809
|
+
}
|
1810
|
+
end
|
1839
1811
|
|
1840
1812
|
Rescue.new(
|
1841
1813
|
beging.merge!(
|
1842
1814
|
type: :rescue,
|
1843
|
-
body: [
|
1844
|
-
|
1845
|
-
|
1815
|
+
body: [rescue_ex, stmts, consequent],
|
1816
|
+
el: lineno,
|
1817
|
+
ec: char_pos
|
1846
1818
|
)
|
1847
1819
|
)
|
1848
1820
|
end
|
@@ -1856,10 +1828,10 @@ class Prettier::Parser < Ripper
|
|
1856
1828
|
{
|
1857
1829
|
type: :rescue_mod,
|
1858
1830
|
body: [statement, rescued],
|
1859
|
-
|
1860
|
-
|
1861
|
-
|
1862
|
-
|
1831
|
+
sl: statement[:sl],
|
1832
|
+
sc: statement[:sc],
|
1833
|
+
el: rescued[:el],
|
1834
|
+
ec: rescued[:ec]
|
1863
1835
|
}
|
1864
1836
|
end
|
1865
1837
|
|
@@ -1874,8 +1846,8 @@ class Prettier::Parser < Ripper
|
|
1874
1846
|
oper.merge!(
|
1875
1847
|
type: :rest_param,
|
1876
1848
|
body: [ident],
|
1877
|
-
|
1878
|
-
|
1849
|
+
el: ident[:el],
|
1850
|
+
ec: ident[:ec]
|
1879
1851
|
)
|
1880
1852
|
end
|
1881
1853
|
|
@@ -1892,8 +1864,8 @@ class Prettier::Parser < Ripper
|
|
1892
1864
|
find_scanner_event(:@kw, 'return').merge!(
|
1893
1865
|
type: :return,
|
1894
1866
|
body: [args_add_block],
|
1895
|
-
|
1896
|
-
|
1867
|
+
el: args_add_block[:el],
|
1868
|
+
ec: args_add_block[:ec]
|
1897
1869
|
)
|
1898
1870
|
end
|
1899
1871
|
|
@@ -1919,18 +1891,15 @@ class Prettier::Parser < Ripper
|
|
1919
1891
|
beging = find_scanner_event(:@kw, 'class')
|
1920
1892
|
ending = find_scanner_event(:@kw, 'end')
|
1921
1893
|
|
1922
|
-
bodystmt.bind(
|
1923
|
-
find_next_statement_start(target[:char_end]),
|
1924
|
-
ending[:char_start]
|
1925
|
-
)
|
1894
|
+
bodystmt.bind(find_next_statement_start(target[:ec]), ending[:sc])
|
1926
1895
|
|
1927
1896
|
{
|
1928
1897
|
type: :sclass,
|
1929
1898
|
body: [target, bodystmt],
|
1930
|
-
|
1931
|
-
|
1932
|
-
|
1933
|
-
|
1899
|
+
sl: beging[:sl],
|
1900
|
+
sc: beging[:sc],
|
1901
|
+
el: ending[:el],
|
1902
|
+
ec: ending[:ec]
|
1934
1903
|
}
|
1935
1904
|
end
|
1936
1905
|
|
@@ -1942,28 +1911,53 @@ class Prettier::Parser < Ripper
|
|
1942
1911
|
# propagate that onto void_stmt nodes inside the stmts in order to make sure
|
1943
1912
|
# all comments get printed appropriately.
|
1944
1913
|
class Stmts < SimpleDelegator
|
1945
|
-
|
1946
|
-
|
1914
|
+
attr_reader :parser
|
1915
|
+
|
1916
|
+
def initialize(parser, values)
|
1917
|
+
@parser = parser
|
1918
|
+
__setobj__(values)
|
1919
|
+
end
|
1920
|
+
|
1921
|
+
def bind(sc, ec)
|
1922
|
+
merge!(sc: sc, ec: ec)
|
1947
1923
|
|
1948
1924
|
if self[:body][0][:type] == :void_stmt
|
1949
|
-
self[:body][0].merge!(
|
1925
|
+
self[:body][0].merge!(sc: sc, ec: sc)
|
1950
1926
|
end
|
1927
|
+
|
1928
|
+
attach_comments(sc, ec)
|
1951
1929
|
end
|
1952
1930
|
|
1953
|
-
def bind_end(
|
1954
|
-
merge!(
|
1931
|
+
def bind_end(ec)
|
1932
|
+
merge!(ec: ec)
|
1955
1933
|
end
|
1956
1934
|
|
1957
1935
|
def <<(statement)
|
1958
1936
|
if self[:body].any?
|
1959
|
-
merge!(statement.slice(:
|
1937
|
+
merge!(statement.slice(:el, :ec))
|
1960
1938
|
else
|
1961
|
-
merge!(statement.slice(:
|
1939
|
+
merge!(statement.slice(:sl, :el, :sc, :ec))
|
1962
1940
|
end
|
1963
1941
|
|
1964
1942
|
self[:body] << statement
|
1965
1943
|
self
|
1966
1944
|
end
|
1945
|
+
|
1946
|
+
private
|
1947
|
+
|
1948
|
+
def attach_comments(sc, ec)
|
1949
|
+
attachable =
|
1950
|
+
parser.comments.select do |comment|
|
1951
|
+
comment[:type] == :@comment && !comment[:inline] &&
|
1952
|
+
sc <= comment[:sc] && ec >= comment[:ec] &&
|
1953
|
+
!comment[:value].include?('prettier-ignore')
|
1954
|
+
end
|
1955
|
+
|
1956
|
+
return if attachable.empty?
|
1957
|
+
|
1958
|
+
parser.comments -= attachable
|
1959
|
+
self[:body] = (self[:body] + attachable).sort_by! { |node| node[:sc] }
|
1960
|
+
end
|
1967
1961
|
end
|
1968
1962
|
|
1969
1963
|
# stmts_new is a parser event that represents the beginning of a list of
|
@@ -1971,12 +1965,13 @@ class Prettier::Parser < Ripper
|
|
1971
1965
|
# stmts_add events, which we'll append onto an array body.
|
1972
1966
|
def on_stmts_new
|
1973
1967
|
Stmts.new(
|
1968
|
+
self,
|
1974
1969
|
type: :stmts,
|
1975
1970
|
body: [],
|
1976
|
-
|
1977
|
-
|
1978
|
-
|
1979
|
-
|
1971
|
+
sl: lineno,
|
1972
|
+
el: lineno,
|
1973
|
+
sc: char_pos,
|
1974
|
+
ec: char_pos
|
1980
1975
|
)
|
1981
1976
|
end
|
1982
1977
|
|
@@ -1998,10 +1993,10 @@ class Prettier::Parser < Ripper
|
|
1998
1993
|
{
|
1999
1994
|
type: :string_concat,
|
2000
1995
|
body: [left, right],
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2004
|
-
|
1996
|
+
sl: left[:sl],
|
1997
|
+
sc: left[:sc],
|
1998
|
+
el: right[:el],
|
1999
|
+
ec: right[:ec]
|
2005
2000
|
}
|
2006
2001
|
end
|
2007
2002
|
|
@@ -2014,10 +2009,10 @@ class Prettier::Parser < Ripper
|
|
2014
2009
|
{
|
2015
2010
|
type: :string,
|
2016
2011
|
body: [],
|
2017
|
-
|
2018
|
-
|
2019
|
-
|
2020
|
-
|
2012
|
+
sl: lineno,
|
2013
|
+
el: lineno,
|
2014
|
+
sc: char_pos,
|
2015
|
+
ec: char_pos
|
2021
2016
|
}
|
2022
2017
|
end
|
2023
2018
|
|
@@ -2026,11 +2021,7 @@ class Prettier::Parser < Ripper
|
|
2026
2021
|
# It accepts as arguments the parent string node as well as the additional
|
2027
2022
|
# piece of the string.
|
2028
2023
|
def on_string_add(string, piece)
|
2029
|
-
string.merge!(
|
2030
|
-
body: string[:body] << piece,
|
2031
|
-
end: piece[:end],
|
2032
|
-
char_end: piece[:char_end]
|
2033
|
-
)
|
2024
|
+
string.merge!(body: string[:body] << piece, el: piece[:el], ec: piece[:ec])
|
2034
2025
|
end
|
2035
2026
|
|
2036
2027
|
# string_dvar is a parser event that represents a very special kind of
|
@@ -2042,8 +2033,8 @@ class Prettier::Parser < Ripper
|
|
2042
2033
|
find_scanner_event(:@embvar).merge!(
|
2043
2034
|
type: :string_dvar,
|
2044
2035
|
body: [var_ref],
|
2045
|
-
|
2046
|
-
|
2036
|
+
el: var_ref[:el],
|
2037
|
+
ec: var_ref[:ec]
|
2047
2038
|
)
|
2048
2039
|
end
|
2049
2040
|
|
@@ -2055,15 +2046,15 @@ class Prettier::Parser < Ripper
|
|
2055
2046
|
beging = find_scanner_event(:@embexpr_beg)
|
2056
2047
|
ending = find_scanner_event(:@embexpr_end)
|
2057
2048
|
|
2058
|
-
stmts.bind(beging[:
|
2049
|
+
stmts.bind(beging[:ec], ending[:sc])
|
2059
2050
|
|
2060
2051
|
{
|
2061
2052
|
type: :string_embexpr,
|
2062
2053
|
body: [stmts],
|
2063
|
-
|
2064
|
-
|
2065
|
-
|
2066
|
-
|
2054
|
+
sl: beging[:sl],
|
2055
|
+
sc: beging[:sc],
|
2056
|
+
el: ending[:el],
|
2057
|
+
ec: ending[:ec]
|
2067
2058
|
}
|
2068
2059
|
end
|
2069
2060
|
|
@@ -2082,10 +2073,10 @@ class Prettier::Parser < Ripper
|
|
2082
2073
|
type: :string_literal,
|
2083
2074
|
body: string[:body],
|
2084
2075
|
quote: beging[:body],
|
2085
|
-
|
2086
|
-
|
2087
|
-
|
2088
|
-
|
2076
|
+
sl: beging[:sl],
|
2077
|
+
sc: beging[:sc],
|
2078
|
+
el: ending[:el],
|
2079
|
+
ec: ending[:ec]
|
2089
2080
|
}
|
2090
2081
|
end
|
2091
2082
|
end
|
@@ -2098,8 +2089,8 @@ class Prettier::Parser < Ripper
|
|
2098
2089
|
find_scanner_event(:@kw, 'super').merge!(
|
2099
2090
|
type: :super,
|
2100
2091
|
body: [contents],
|
2101
|
-
|
2102
|
-
|
2092
|
+
el: contents[:el],
|
2093
|
+
ec: contents[:ec]
|
2103
2094
|
)
|
2104
2095
|
end
|
2105
2096
|
|
@@ -2130,7 +2121,7 @@ class Prettier::Parser < Ripper
|
|
2130
2121
|
contents.merge(type: :symbol_literal, body: [contents])
|
2131
2122
|
else
|
2132
2123
|
beging = find_scanner_event(:@symbeg)
|
2133
|
-
contents.merge!(type: :symbol_literal,
|
2124
|
+
contents.merge!(type: :symbol_literal, sc: beging[:sc])
|
2134
2125
|
end
|
2135
2126
|
end
|
2136
2127
|
|
@@ -2149,8 +2140,8 @@ class Prettier::Parser < Ripper
|
|
2149
2140
|
def on_symbols_add(symbols, word_add)
|
2150
2141
|
symbols.merge!(
|
2151
2142
|
body: symbols[:body] << word_add,
|
2152
|
-
|
2153
|
-
|
2143
|
+
el: word_add[:el],
|
2144
|
+
ec: word_add[:ec]
|
2154
2145
|
)
|
2155
2146
|
end
|
2156
2147
|
|
@@ -2161,8 +2152,7 @@ class Prettier::Parser < Ripper
|
|
2161
2152
|
def find_colon2_before(const)
|
2162
2153
|
index =
|
2163
2154
|
scanner_events.rindex do |event|
|
2164
|
-
event[:type] == :@op && event[:body] == '::' &&
|
2165
|
-
event[:char_start] < const[:char_start]
|
2155
|
+
event[:type] == :@op && event[:body] == '::' && event[:sc] < const[:sc]
|
2166
2156
|
end
|
2167
2157
|
|
2168
2158
|
scanner_events[index]
|
@@ -2179,8 +2169,8 @@ class Prettier::Parser < Ripper
|
|
2179
2169
|
const.merge(
|
2180
2170
|
type: :top_const_field,
|
2181
2171
|
body: [const],
|
2182
|
-
|
2183
|
-
|
2172
|
+
sl: beging[:sl],
|
2173
|
+
sc: beging[:sc]
|
2184
2174
|
)
|
2185
2175
|
end
|
2186
2176
|
|
@@ -2195,8 +2185,8 @@ class Prettier::Parser < Ripper
|
|
2195
2185
|
const.merge(
|
2196
2186
|
type: :top_const_ref,
|
2197
2187
|
body: [const],
|
2198
|
-
|
2199
|
-
|
2188
|
+
sl: beging[:sl],
|
2189
|
+
sc: beging[:sc]
|
2200
2190
|
)
|
2201
2191
|
end
|
2202
2192
|
|
@@ -2208,15 +2198,15 @@ class Prettier::Parser < Ripper
|
|
2208
2198
|
if oper == :not
|
2209
2199
|
node = find_scanner_event(:@kw, 'not')
|
2210
2200
|
|
2211
|
-
paren = source[node[:
|
2201
|
+
paren = source[node[:ec]...value[:sc]].include?('(')
|
2212
2202
|
ending = paren ? find_scanner_event(:@rparen) : value
|
2213
2203
|
|
2214
2204
|
node.merge!(
|
2215
2205
|
type: :unary,
|
2216
2206
|
oper: oper,
|
2217
2207
|
body: [value],
|
2218
|
-
|
2219
|
-
|
2208
|
+
el: ending[:el],
|
2209
|
+
ec: ending[:ec],
|
2220
2210
|
paren: paren
|
2221
2211
|
)
|
2222
2212
|
else
|
@@ -2226,7 +2216,7 @@ class Prettier::Parser < Ripper
|
|
2226
2216
|
# stack. So we need to explicitly disallow those operators.
|
2227
2217
|
index =
|
2228
2218
|
scanner_events.rindex do |scanner_event|
|
2229
|
-
scanner_event[:type] == :@op &&
|
2219
|
+
scanner_event[:type] == :@op && scanner_event[:sc] < value[:sc] &&
|
2230
2220
|
!%w[.. ...].include?(scanner_event[:body])
|
2231
2221
|
end
|
2232
2222
|
|
@@ -2235,8 +2225,8 @@ class Prettier::Parser < Ripper
|
|
2235
2225
|
type: :unary,
|
2236
2226
|
oper: oper[0],
|
2237
2227
|
body: [value],
|
2238
|
-
|
2239
|
-
|
2228
|
+
el: value[:el],
|
2229
|
+
ec: value[:ec]
|
2240
2230
|
)
|
2241
2231
|
end
|
2242
2232
|
end
|
@@ -2251,8 +2241,8 @@ class Prettier::Parser < Ripper
|
|
2251
2241
|
find_scanner_event(:@kw, 'undef').merge!(
|
2252
2242
|
type: :undef,
|
2253
2243
|
body: symbol_literals,
|
2254
|
-
|
2255
|
-
|
2244
|
+
el: last[:el],
|
2245
|
+
ec: last[:ec]
|
2256
2246
|
)
|
2257
2247
|
end
|
2258
2248
|
|
@@ -2264,15 +2254,15 @@ class Prettier::Parser < Ripper
|
|
2264
2254
|
beging = find_scanner_event(:@kw, 'unless')
|
2265
2255
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
2266
2256
|
|
2267
|
-
stmts.bind(predicate[:
|
2257
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2268
2258
|
|
2269
2259
|
{
|
2270
2260
|
type: :unless,
|
2271
2261
|
body: [predicate, stmts, consequent],
|
2272
|
-
|
2273
|
-
|
2274
|
-
|
2275
|
-
|
2262
|
+
sl: beging[:sl],
|
2263
|
+
sc: beging[:sc],
|
2264
|
+
el: ending[:el],
|
2265
|
+
ec: ending[:ec]
|
2276
2266
|
}
|
2277
2267
|
end
|
2278
2268
|
|
@@ -2285,10 +2275,10 @@ class Prettier::Parser < Ripper
|
|
2285
2275
|
{
|
2286
2276
|
type: :unless_mod,
|
2287
2277
|
body: [predicate, statement],
|
2288
|
-
|
2289
|
-
|
2290
|
-
|
2291
|
-
|
2278
|
+
sl: statement[:sl],
|
2279
|
+
sc: statement[:sc],
|
2280
|
+
el: predicate[:el],
|
2281
|
+
ec: predicate[:ec]
|
2292
2282
|
}
|
2293
2283
|
end
|
2294
2284
|
|
@@ -2299,15 +2289,22 @@ class Prettier::Parser < Ripper
|
|
2299
2289
|
beging = find_scanner_event(:@kw, 'until')
|
2300
2290
|
ending = find_scanner_event(:@kw, 'end')
|
2301
2291
|
|
2302
|
-
|
2292
|
+
# Consume the do keyword if it exists so that it doesn't get confused for
|
2293
|
+
# some other block
|
2294
|
+
do_event = find_scanner_event(:@kw, 'do', consume: false)
|
2295
|
+
if do_event && do_event[:sc] > predicate[:ec] && do_event[:ec] < ending[:sc]
|
2296
|
+
scanner_events.delete(do_event)
|
2297
|
+
end
|
2298
|
+
|
2299
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2303
2300
|
|
2304
2301
|
{
|
2305
2302
|
type: :until,
|
2306
2303
|
body: [predicate, stmts],
|
2307
|
-
|
2308
|
-
|
2309
|
-
|
2310
|
-
|
2304
|
+
sl: beging[:sl],
|
2305
|
+
sc: beging[:sc],
|
2306
|
+
el: ending[:el],
|
2307
|
+
ec: ending[:ec]
|
2311
2308
|
}
|
2312
2309
|
end
|
2313
2310
|
|
@@ -2320,10 +2317,10 @@ class Prettier::Parser < Ripper
|
|
2320
2317
|
{
|
2321
2318
|
type: :until_mod,
|
2322
2319
|
body: [predicate, statement],
|
2323
|
-
|
2324
|
-
|
2325
|
-
|
2326
|
-
|
2320
|
+
sl: statement[:sl],
|
2321
|
+
sc: statement[:sc],
|
2322
|
+
el: predicate[:el],
|
2323
|
+
ec: predicate[:ec]
|
2327
2324
|
}
|
2328
2325
|
end
|
2329
2326
|
|
@@ -2334,16 +2331,16 @@ class Prettier::Parser < Ripper
|
|
2334
2331
|
def on_var_alias(left, right)
|
2335
2332
|
beging = find_scanner_event(:@kw, 'alias')
|
2336
2333
|
|
2337
|
-
paren = source[beging[:
|
2334
|
+
paren = source[beging[:ec]...left[:sc]].include?('(')
|
2338
2335
|
ending = paren ? find_scanner_event(:@rparen) : right
|
2339
2336
|
|
2340
2337
|
{
|
2341
2338
|
type: :var_alias,
|
2342
2339
|
body: [left, right],
|
2343
|
-
|
2344
|
-
|
2345
|
-
|
2346
|
-
|
2340
|
+
sl: beging[:sl],
|
2341
|
+
sc: beging[:sc],
|
2342
|
+
el: ending[:el],
|
2343
|
+
ec: ending[:ec]
|
2347
2344
|
}
|
2348
2345
|
end
|
2349
2346
|
|
@@ -2395,13 +2392,7 @@ class Prettier::Parser < Ripper
|
|
2395
2392
|
# block of code. It often will have comments attached to it, so it requires
|
2396
2393
|
# some special handling.
|
2397
2394
|
def on_void_stmt
|
2398
|
-
{
|
2399
|
-
type: :void_stmt,
|
2400
|
-
start: lineno,
|
2401
|
-
end: lineno,
|
2402
|
-
char_start: char_pos,
|
2403
|
-
char_end: char_pos
|
2404
|
-
}
|
2395
|
+
{ type: :void_stmt, sl: lineno, el: lineno, sc: char_pos, ec: char_pos }
|
2405
2396
|
end
|
2406
2397
|
|
2407
2398
|
# when is a parser event that represents another clause in a case chain.
|
@@ -2412,15 +2403,15 @@ class Prettier::Parser < Ripper
|
|
2412
2403
|
beging = find_scanner_event(:@kw, 'when')
|
2413
2404
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
2414
2405
|
|
2415
|
-
stmts.bind(predicate[:
|
2406
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2416
2407
|
|
2417
2408
|
{
|
2418
2409
|
type: :when,
|
2419
2410
|
body: [predicate, stmts, consequent],
|
2420
|
-
|
2421
|
-
|
2422
|
-
|
2423
|
-
|
2411
|
+
sl: beging[:sl],
|
2412
|
+
sc: beging[:sc],
|
2413
|
+
el: ending[:el],
|
2414
|
+
ec: ending[:ec]
|
2424
2415
|
}
|
2425
2416
|
end
|
2426
2417
|
|
@@ -2431,15 +2422,22 @@ class Prettier::Parser < Ripper
|
|
2431
2422
|
beging = find_scanner_event(:@kw, 'while')
|
2432
2423
|
ending = find_scanner_event(:@kw, 'end')
|
2433
2424
|
|
2434
|
-
|
2425
|
+
# Consume the do keyword if it exists so that it doesn't get confused for
|
2426
|
+
# some other block
|
2427
|
+
do_event = find_scanner_event(:@kw, 'do', consume: false)
|
2428
|
+
if do_event && do_event[:sc] > predicate[:ec] && do_event[:ec] < ending[:sc]
|
2429
|
+
scanner_events.delete(do_event)
|
2430
|
+
end
|
2431
|
+
|
2432
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2435
2433
|
|
2436
2434
|
{
|
2437
2435
|
type: :while,
|
2438
2436
|
body: [predicate, stmts],
|
2439
|
-
|
2440
|
-
|
2441
|
-
|
2442
|
-
|
2437
|
+
sl: beging[:sl],
|
2438
|
+
sc: beging[:sc],
|
2439
|
+
el: ending[:el],
|
2440
|
+
ec: ending[:ec]
|
2443
2441
|
}
|
2444
2442
|
end
|
2445
2443
|
|
@@ -2452,10 +2450,10 @@ class Prettier::Parser < Ripper
|
|
2452
2450
|
{
|
2453
2451
|
type: :while_mod,
|
2454
2452
|
body: [predicate, statement],
|
2455
|
-
|
2456
|
-
|
2457
|
-
|
2458
|
-
|
2453
|
+
sl: statement[:sl],
|
2454
|
+
sc: statement[:sc],
|
2455
|
+
el: predicate[:el],
|
2456
|
+
ec: predicate[:ec]
|
2459
2457
|
}
|
2460
2458
|
end
|
2461
2459
|
|
@@ -2485,11 +2483,7 @@ class Prettier::Parser < Ripper
|
|
2485
2483
|
# location information from the first piece.
|
2486
2484
|
piece.merge(type: :word, body: [piece])
|
2487
2485
|
else
|
2488
|
-
word.merge!(
|
2489
|
-
body: word[:body] << piece,
|
2490
|
-
end: piece[:end],
|
2491
|
-
char_end: piece[:char_end]
|
2492
|
-
)
|
2486
|
+
word.merge!(body: word[:body] << piece, el: piece[:el], ec: piece[:ec])
|
2493
2487
|
end
|
2494
2488
|
end
|
2495
2489
|
|
@@ -2508,8 +2502,8 @@ class Prettier::Parser < Ripper
|
|
2508
2502
|
def on_words_add(words, word_add)
|
2509
2503
|
words.merge!(
|
2510
2504
|
body: words[:body] << word_add,
|
2511
|
-
|
2512
|
-
|
2505
|
+
el: word_add[:el],
|
2506
|
+
ec: word_add[:ec]
|
2513
2507
|
)
|
2514
2508
|
end
|
2515
2509
|
|
@@ -2542,8 +2536,8 @@ class Prettier::Parser < Ripper
|
|
2542
2536
|
def on_xstring_add(xstring, piece)
|
2543
2537
|
xstring.merge!(
|
2544
2538
|
body: xstring[:body] << piece,
|
2545
|
-
|
2546
|
-
|
2539
|
+
el: piece[:el],
|
2540
|
+
ec: piece[:ec]
|
2547
2541
|
)
|
2548
2542
|
end
|
2549
2543
|
|
@@ -2568,11 +2562,7 @@ class Prettier::Parser < Ripper
|
|
2568
2562
|
heredoc.merge!(body: xstring[:body])
|
2569
2563
|
else
|
2570
2564
|
ending = find_scanner_event(:@tstring_end)
|
2571
|
-
xstring.merge!(
|
2572
|
-
type: :xstring_literal,
|
2573
|
-
end: ending[:end],
|
2574
|
-
char_end: ending[:char_end]
|
2575
|
-
)
|
2565
|
+
xstring.merge!(type: :xstring_literal, el: ending[:el], ec: ending[:ec])
|
2576
2566
|
end
|
2577
2567
|
end
|
2578
2568
|
|
@@ -2583,8 +2573,8 @@ class Prettier::Parser < Ripper
|
|
2583
2573
|
find_scanner_event(:@kw, 'yield').merge!(
|
2584
2574
|
type: :yield,
|
2585
2575
|
body: [args_add_block],
|
2586
|
-
|
2587
|
-
|
2576
|
+
el: args_add_block[:el],
|
2577
|
+
ec: args_add_block[:ec]
|
2588
2578
|
)
|
2589
2579
|
end
|
2590
2580
|
|
@@ -2604,24 +2594,3 @@ class Prettier::Parser < Ripper
|
|
2604
2594
|
find_scanner_event(:@kw, 'super').merge!(type: :zsuper)
|
2605
2595
|
end
|
2606
2596
|
end
|
2607
|
-
|
2608
|
-
# If this is the main file we're executing, then most likely this is being
|
2609
|
-
# executed from the parser.js spawn. In that case, read the ruby source from
|
2610
|
-
# stdin and report back the AST over stdout.
|
2611
|
-
|
2612
|
-
if $0 == __FILE__
|
2613
|
-
builder = Prettier::Parser.new($stdin.read)
|
2614
|
-
response = builder.parse
|
2615
|
-
|
2616
|
-
if !response || builder.error?
|
2617
|
-
warn(
|
2618
|
-
'@prettier/plugin-ruby encountered an error when attempting to parse ' \
|
2619
|
-
'the ruby source. This usually means there was a syntax error in the ' \
|
2620
|
-
'file in question. You can verify by running `ruby -i [path/to/file]`.'
|
2621
|
-
)
|
2622
|
-
|
2623
|
-
exit 1
|
2624
|
-
end
|
2625
|
-
|
2626
|
-
puts JSON.fast_generate(response)
|
2627
|
-
end
|