Skip to content

Commit a900652

Browse files
authored
Merge pull request #1604 from apiology/fix_word_array_in_array_parsing
Fix array-within-word-array parsing
2 parents 18845c9 + a5dcc55 commit a900652

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

lib/yard/parser/ruby/ruby_parser.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ def on_aref_field(*args)
390390

391391
def on_array(other)
392392
node = AstNode.node_class_for(:array).new(:array, [other])
393-
map = @map[MAPPINGS[node.type]]
393+
map = @map[MAPPINGS[node.type]] if other.nil? || other.type == :list
394394
if map && !map.empty?
395395
lstart, sstart = *map.pop
396396
node.source_range = Range.new(sstart, @ns_charno - 1)

spec/parser/ruby/ruby_parser_spec.rb

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,11 @@ def hello; end
283283
src = "%#{tok}{\na b c\n d e f\n}"
284284
expect(stmt(src).source).to eq src
285285
end
286+
287+
it "shows proper source for %#{tok}[] array" do
288+
src = "%#{tok}[\na b c\n d e f\n]"
289+
expect(stmt(src).source).to eq src
290+
end
286291
end
287292

288293
{'i' => :qsymbols_literal, 'I' => :symbols_literal,
@@ -300,6 +305,33 @@ def hello; end
300305
end
301306
end
302307

308+
it "parses %#{id}{...} literals" do
309+
[
310+
"TEST = %#{id}{A B C}",
311+
"TEST = %#{id}{ A B C }",
312+
"TEST = %#{id}{ \nA \nB \nC \n}",
313+
"TEST = %#{id}{\n\nAD\n\nB\n\nC\n\n}",
314+
"TEST = %#{id}{\n A\n B\n C\n }",
315+
].each do |str|
316+
node = stmt(str).jump(sym)
317+
expect(node.source).to eq(str[/(\%#{id}\{.+\})/m, 1])
318+
end
319+
end
320+
321+
it "parses %#{id}[...] literals" do
322+
[
323+
"TEST = %#{id}[A B C]",
324+
"TEST = %#{id}[ A B C ]",
325+
"TEST = %#{id}[ \nA \nB \nC \n]",
326+
"TEST = %#{id}[\n\nAD\n\nB\n\nC\n\n]",
327+
"TEST = %#{id}[\n A\n B\n C\n ]",
328+
"TEST = %#{id}[\n A]",
329+
].each do |str|
330+
node = stmt(str).jump(sym)
331+
expect(node.source).to eq(str[/(\%#{id}\[.+\])/m, 1])
332+
end
333+
end
334+
303335
it "tokenizing %#{id}(...) returns correct tokens" do
304336
toks = tokenize("TEST = %#{id}(A B C)").flatten
305337
expect(toks.count(:tstring_content)).to eq(3)
@@ -327,7 +359,7 @@ def method
327359
# Method comment not docstring
328360
end
329361
eof
330-
362+
331363
tokens = tokenize(src.gsub(/^ +/, ''))
332364
expect(tokens).to eq(tokens.sort_by {|t| t.last })
333365
expect(tokens.map {|t| t.first }).to eq %i(kw sp ident nl comment kw nl)
@@ -370,6 +402,27 @@ class Foo
370402
expect(s.jump(:array).source).to eq "['foo', 'bar']"
371403
end
372404

405+
it "parses [[]] as array of arrays" do
406+
s = stmt(<<-eof)
407+
class Foo
408+
FOO = [['foo', 'bar']]
409+
end
410+
eof
411+
expect(s.jump(:array).source).to eq "[['foo', 'bar']]"
412+
end
413+
414+
it "parses %w() array inside another empty array" do
415+
s = stmts(<<-eof)
416+
FOO = [%w( foo bar )]
417+
eof
418+
expect(s[0].jump(:array).source).to eq '[%w( foo bar )]'
419+
end
420+
421+
it "parses %w() array inside another populated array" do
422+
s = stmts("FOO = ['1', %w[]]")
423+
expect(s[0].jump(:array).source).to eq "['1', %w[]]"
424+
end
425+
373426
it "shows source for unary minus" do
374427
expect(stmt("X = - 1").jump(:unary).source).to eq '- 1'
375428
end

0 commit comments

Comments
 (0)