Skip to content

Commit a886179

Browse files
committed
Handle line numbers in constant searching
1 parent 2d5f9fc commit a886179

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

lib/syntax_tree/index.rb

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ def location_for(iseq)
178178
end
179179

180180
def find_constant_path(insns, index)
181+
index -= 1 while insns[index].is_a?(Integer)
181182
insn = insns[index]
182183

183184
if insn.is_a?(Array) && insn[0] == :opt_getconstant_path
@@ -191,8 +192,12 @@ def find_constant_path(insns, index)
191192
names = []
192193

193194
index -= 1
194-
until insns[index][0] == :opt_getinlinecache
195-
names.unshift(insns[index][1]) if insns[index][0] == :getconstant
195+
until insns[index].is_a?(Array) &&
196+
insns[index][0] == :opt_getinlinecache
197+
if insns[index].is_a?(Array) && insns[index][0] == :getconstant
198+
names.unshift(insns[index][1])
199+
end
200+
196201
index -= 1
197202
end
198203

@@ -207,9 +212,20 @@ def index_iseq(iseq, file_comments)
207212
queue = [[iseq, []]]
208213

209214
while (current_iseq, current_nesting = queue.shift)
215+
line = current_iseq[8]
210216
insns = current_iseq[13]
217+
211218
insns.each_with_index do |insn, index|
212-
next unless insn.is_a?(Array)
219+
case insn
220+
when Integer
221+
line = insn
222+
next
223+
when Array
224+
# continue on
225+
else
226+
# skip everything else
227+
next
228+
end
213229

214230
case insn[0]
215231
when :defineclass
@@ -226,10 +242,12 @@ def index_iseq(iseq, file_comments)
226242
# If there is a superclass, then we're going to find it here and
227243
# then update the constant_index as necessary.
228244
if flags & VM_DEFINECLASS_FLAG_HAS_SUPERCLASS > 0
229-
constant_index, superclass = find_constant_path(insns, index - 1)
245+
constant_index, superclass =
246+
find_constant_path(insns, index - 1)
230247

231248
if superclass.empty?
232-
raise NotImplementedError, "superclass with non constant path"
249+
raise NotImplementedError,
250+
"superclass with non constant path on line #{line}"
233251
end
234252
end
235253

test/index_test.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ def test_class
3535
def test_class_paths_2
3636
index_each("class Foo::Bar; end") do |entry|
3737
assert_equal :Bar, entry.name
38-
assert_equal [[:Foo, :Bar]], entry.nesting
38+
assert_equal [%i[Foo Bar]], entry.nesting
3939
end
4040
end
4141

4242
def test_class_paths_3
4343
index_each("class Foo::Bar::Baz; end") do |entry|
4444
assert_equal :Baz, entry.name
45-
assert_equal [[:Foo, :Bar, :Baz]], entry.nesting
45+
assert_equal [%i[Foo Bar Baz]], entry.nesting
4646
end
4747
end
4848

@@ -56,7 +56,7 @@ def test_class_nested
5656
def test_class_paths_nested
5757
index_each("class Foo; class Bar::Baz::Qux; end; end") do |entry|
5858
assert_equal :Qux, entry.name
59-
assert_equal [[:Foo], [:Bar, :Baz, :Qux]], entry.nesting
59+
assert_equal [[:Foo], %i[Bar Baz Qux]], entry.nesting
6060
end
6161
end
6262

@@ -71,8 +71,8 @@ def test_class_superclass
7171
def test_class_path_superclass
7272
index_each("class Foo::Bar < Baz::Qux; end") do |entry|
7373
assert_equal :Bar, entry.name
74-
assert_equal [[:Foo, :Bar]], entry.nesting
75-
assert_equal [:Baz, :Qux], entry.superclass
74+
assert_equal [%i[Foo Bar]], entry.nesting
75+
assert_equal %i[Baz Qux], entry.superclass
7676
end
7777
end
7878

0 commit comments

Comments
 (0)