syntax_suggest 1.0.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a639824437777dc3bf6d77a9cf9eddd4621c6c2017531fd28d4cca6761c3a40e
4
- data.tar.gz: 5631275dc4982eacbc44f994a46f9649d4fd848c0934c8a561f12facb5342c6c
3
+ metadata.gz: 7b3d83011e29784a7ea97dcae359b654ec8be6382c9fda7a5114353050ef5bf2
4
+ data.tar.gz: a2452866035aa4751948ac4f30cb7699352bc0778fb4b5bcae3ce3f421b901de
5
5
  SHA512:
6
- metadata.gz: 3f0a4fd6d41d847338f937e72d330665628d1b515a00f97c5492275e40b5c70d7381fdea0cd603341b15f1aea6d6a6d11a20bd8e4313ed2175876d59e2341c1d
7
- data.tar.gz: d03f166ad6bac24822dfded00ed84a6bd96eaf4c059ed9abcacab065abd3edc28abfbbfaca9316ae0a84c3da13e155cac0c305f4bdd7070e0af0f958d4c4e781
6
+ metadata.gz: 52168116c672ee83619f59d1f158101adb64c650770424c3bd855fafb71131f72663c8afd060f8512bbe908fae2ecb8dea5a65c9384b980843c89901f70e202a
7
+ data.tar.gz: 5edfacbb66e7b37dc36f1b57de325ffea4656102b3a4638249577fb8c12460c2e05a3f7761675966e845214db891c83f5b51eef963d35da506478af7f0837874
@@ -13,7 +13,7 @@ jobs:
13
13
  !contains(github.event.pull_request.body, '[skip ci]') &&
14
14
  !contains(github.event.pull_request.labels.*.name, 'skip changelog')
15
15
  steps:
16
- - uses: actions/checkout@v3.3.0
16
+ - uses: actions/checkout@v4.1.1
17
17
  - name: Check that CHANGELOG is touched
18
18
  run: |
19
19
  git fetch origin ${{ github.base_ref }} --depth 1 && \
@@ -9,31 +9,32 @@ jobs:
9
9
  runs-on: ubuntu-latest
10
10
  steps:
11
11
  - name: Checkout code
12
- uses: actions/checkout@v3.3.0
12
+ uses: actions/checkout@v4.1.1
13
13
  - name: Set up Ruby
14
14
  uses: ruby/setup-ruby@v1
15
15
  with:
16
- ruby-version: 3.1
16
+ ruby-version: ruby
17
17
  bundler-cache: true
18
18
  - name: Linting
19
19
  run: bundle exec standardrb
20
+ env:
21
+ RUBYOPT: --disable=syntax_suggest
22
+
23
+ ruby-versions:
24
+ uses: ruby/actions/.github/workflows/ruby_versions.yml@master
25
+ with:
26
+ engine: cruby
20
27
 
21
28
  test:
29
+ needs: ruby-versions
22
30
  runs-on: ubuntu-latest
23
31
  strategy:
24
32
  fail-fast: false
25
33
  matrix:
26
- ruby:
27
- - 2.5
28
- - 2.6
29
- - 2.7
30
- - '3.0'
31
- - 3.1
32
- - 3.2
33
- - head
34
+ ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
34
35
  steps:
35
36
  - name: Checkout code
36
- uses: actions/checkout@v3.3.0
37
+ uses: actions/checkout@v4.1.1
37
38
  - name: Set up Ruby
38
39
  uses: ruby/setup-ruby@v1
39
40
  with:
@@ -42,3 +43,22 @@ jobs:
42
43
  - name: test
43
44
  run: bin/rake test
44
45
  continue-on-error: ${{ matrix.ruby == 'head' }}
46
+
47
+ test-disable-prism:
48
+ needs: ruby-versions
49
+ runs-on: ubuntu-latest
50
+ strategy:
51
+ fail-fast: false
52
+ matrix:
53
+ ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
54
+ steps:
55
+ - name: Checkout code
56
+ uses: actions/checkout@v4.1.1
57
+ - name: Set up Ruby
58
+ uses: ruby/setup-ruby@v1
59
+ with:
60
+ ruby-version: ${{ matrix.ruby }}
61
+ bundler-cache: true
62
+ - name: test
63
+ run: SYNTAX_SUGGEST_DISABLE_PRISM=1 bin/rake test
64
+ continue-on-error: ${{ matrix.ruby == 'head' }}
data/.standard.yml CHANGED
@@ -1 +1 @@
1
- ruby_version: 2.5.9
1
+ ruby_version: 3.0.0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  ## HEAD (unreleased)
2
2
 
3
+ ## 2.0.0
4
+
5
+ - Changed: No longer supports EOL versions of Ruby. (https://github.com/ruby/syntax_suggest/pull/210)
6
+ - Added: Support prism parser (https://github.com/ruby/syntax_suggest/pull/208).
7
+ - Added: Handle Ruby 3.3 new eval source location format (https://github.com/ruby/syntax_suggest/pull/200).
8
+
9
+ ## 1.1.0
10
+
11
+ - Handle if/else with comment or empty line in branch (https://github.com/ruby/syntax_suggest/pull/193)
12
+ - Use `SYNTAX_SUGGEST_DEBUG` instead of `DEBUG` env var value in timeout warning message (https://github.com/ruby/syntax_suggest/pull/194)
13
+ - Reduce line output for increased clarity (https://github.com/ruby/syntax_suggest/pull/190)
14
+
3
15
  ## 1.0.4
4
16
 
5
17
  - Fix rendering a file without a newline ending (https://github.com/ruby/syntax_suggest/pull/182)
data/Gemfile CHANGED
@@ -12,3 +12,4 @@ gem "standard"
12
12
  gem "ruby-prof"
13
13
 
14
14
  gem "benchmark-ips"
15
+ gem "prism"
data/Gemfile.lock CHANGED
@@ -1,61 +1,79 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- syntax_suggest (1.0.4)
4
+ syntax_suggest (2.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.2)
10
- benchmark-ips (2.9.2)
11
- diff-lcs (1.4.4)
12
- parallel (1.21.0)
13
- parser (3.0.2.0)
10
+ benchmark-ips (2.12.0)
11
+ diff-lcs (1.5.0)
12
+ json (2.7.0)
13
+ language_server-protocol (3.17.0.3)
14
+ lint_roller (1.1.0)
15
+ parallel (1.23.0)
16
+ parser (3.2.2.4)
14
17
  ast (~> 2.4.1)
15
- rainbow (3.0.0)
18
+ racc
19
+ prism (0.18.0)
20
+ racc (1.7.3)
21
+ rainbow (3.1.1)
16
22
  rake (12.3.3)
17
- regexp_parser (2.1.1)
18
- rexml (3.2.5)
19
- rspec (3.10.0)
20
- rspec-core (~> 3.10.0)
21
- rspec-expectations (~> 3.10.0)
22
- rspec-mocks (~> 3.10.0)
23
- rspec-core (3.10.0)
24
- rspec-support (~> 3.10.0)
25
- rspec-expectations (3.10.0)
23
+ regexp_parser (2.8.3)
24
+ rexml (3.2.6)
25
+ rspec (3.12.0)
26
+ rspec-core (~> 3.12.0)
27
+ rspec-expectations (~> 3.12.0)
28
+ rspec-mocks (~> 3.12.0)
29
+ rspec-core (3.12.2)
30
+ rspec-support (~> 3.12.0)
31
+ rspec-expectations (3.12.3)
26
32
  diff-lcs (>= 1.2.0, < 2.0)
27
- rspec-support (~> 3.10.0)
28
- rspec-mocks (3.10.0)
33
+ rspec-support (~> 3.12.0)
34
+ rspec-mocks (3.12.6)
29
35
  diff-lcs (>= 1.2.0, < 2.0)
30
- rspec-support (~> 3.10.0)
31
- rspec-support (3.10.0)
32
- rubocop (1.20.0)
36
+ rspec-support (~> 3.12.0)
37
+ rspec-support (3.12.1)
38
+ rubocop (1.57.2)
39
+ json (~> 2.3)
40
+ language_server-protocol (>= 3.17.0)
33
41
  parallel (~> 1.10)
34
- parser (>= 3.0.0.0)
42
+ parser (>= 3.2.2.4)
35
43
  rainbow (>= 2.2.2, < 4.0)
36
44
  regexp_parser (>= 1.8, < 3.0)
37
- rexml
38
- rubocop-ast (>= 1.9.1, < 2.0)
45
+ rexml (>= 3.2.5, < 4.0)
46
+ rubocop-ast (>= 1.28.1, < 2.0)
39
47
  ruby-progressbar (~> 1.7)
40
- unicode-display_width (>= 1.4.0, < 3.0)
41
- rubocop-ast (1.12.0)
42
- parser (>= 3.0.1.1)
43
- rubocop-performance (1.11.5)
48
+ unicode-display_width (>= 2.4.0, < 3.0)
49
+ rubocop-ast (1.30.0)
50
+ parser (>= 3.2.1.0)
51
+ rubocop-performance (1.19.1)
44
52
  rubocop (>= 1.7.0, < 2.0)
45
53
  rubocop-ast (>= 0.4.0)
46
- ruby-prof (1.4.3)
47
- ruby-progressbar (1.11.0)
48
- stackprof (0.2.16)
49
- standard (1.3.0)
50
- rubocop (= 1.20.0)
51
- rubocop-performance (= 1.11.5)
52
- unicode-display_width (2.1.0)
54
+ ruby-prof (1.6.3)
55
+ ruby-progressbar (1.13.0)
56
+ stackprof (0.2.25)
57
+ standard (1.32.1)
58
+ language_server-protocol (~> 3.17.0.2)
59
+ lint_roller (~> 1.0)
60
+ rubocop (~> 1.57.2)
61
+ standard-custom (~> 1.0.0)
62
+ standard-performance (~> 1.2)
63
+ standard-custom (1.0.2)
64
+ lint_roller (~> 1.0)
65
+ rubocop (~> 1.50)
66
+ standard-performance (1.2.1)
67
+ lint_roller (~> 1.1)
68
+ rubocop-performance (~> 1.19.1)
69
+ unicode-display_width (2.5.0)
53
70
 
54
71
  PLATFORMS
55
72
  ruby
56
73
 
57
74
  DEPENDENCIES
58
75
  benchmark-ips
76
+ prism
59
77
  rake (~> 12.0)
60
78
  rspec (~> 3.0)
61
79
  ruby-prof
@@ -64,4 +82,4 @@ DEPENDENCIES
64
82
  syntax_suggest!
65
83
 
66
84
  BUNDLED WITH
67
- 2.3.14
85
+ 2.4.21
data/README.md CHANGED
@@ -122,7 +122,7 @@ Unmatched `(', missing `)' ?
122
122
  5 end
123
123
  ```
124
124
 
125
- - Any ambiguous or unknown errors will be annotated by the original ripper error output:
125
+ - Any ambiguous or unknown errors will be annotated by the original parser error output:
126
126
 
127
127
  <!--
128
128
  class Dog
@@ -133,7 +133,7 @@ end
133
133
  -->
134
134
 
135
135
  ```
136
- syntax error, unexpected end-of-input
136
+ Expected an expression after the operator
137
137
 
138
138
  1 class Dog
139
139
  2 def meals_last_month
@@ -5,9 +5,28 @@ require_relative "version"
5
5
  require "tmpdir"
6
6
  require "stringio"
7
7
  require "pathname"
8
- require "ripper"
9
8
  require "timeout"
10
9
 
10
+ # We need Ripper loaded for `Prism.lex_compat` even if we're using Prism
11
+ # for lexing and parsing
12
+ require "ripper"
13
+
14
+ # Prism is the new parser, replacing Ripper
15
+ #
16
+ # We need to "dual boot" both for now because syntax_suggest
17
+ # supports older rubies that do not ship with syntax suggest.
18
+ #
19
+ # We also need the ability to control loading of this library
20
+ # so we can test that both modes work correctly in CI.
21
+ if (value = ENV["SYNTAX_SUGGEST_DISABLE_PRISM"])
22
+ warn "Skipping loading prism due to SYNTAX_SUGGEST_DISABLE_PRISM=#{value}"
23
+ else
24
+ begin
25
+ require "prism"
26
+ rescue LoadError
27
+ end
28
+ end
29
+
11
30
  module SyntaxSuggest
12
31
  # Used to indicate a default value that cannot
13
32
  # be confused with another input.
@@ -16,6 +35,14 @@ module SyntaxSuggest
16
35
  class Error < StandardError; end
17
36
  TIMEOUT_DEFAULT = ENV.fetch("SYNTAX_SUGGEST_TIMEOUT", 1).to_i
18
37
 
38
+ # SyntaxSuggest.use_prism_parser? [Private]
39
+ #
40
+ # Tells us if the prism parser is available for use
41
+ # or if we should fallback to `Ripper`
42
+ def self.use_prism_parser?
43
+ defined?(Prism)
44
+ end
45
+
19
46
  # SyntaxSuggest.handle_error [Public]
20
47
  #
21
48
  # Takes a `SyntaxError` exception, uses the
@@ -78,7 +105,7 @@ module SyntaxSuggest
78
105
  code_lines: search.code_lines
79
106
  ).call
80
107
  rescue Timeout::Error => e
81
- io.puts "Search timed out SYNTAX_SUGGEST_TIMEOUT=#{timeout}, run with DEBUG=1 for more info"
108
+ io.puts "Search timed out SYNTAX_SUGGEST_TIMEOUT=#{timeout}, run with SYNTAX_SUGGEST_DEBUG=1 for more info"
82
109
  io.puts e.backtrace.first(3).join($/)
83
110
  end
84
111
 
@@ -129,11 +156,20 @@ module SyntaxSuggest
129
156
  # SyntaxSuggest.invalid? [Private]
130
157
  #
131
158
  # Opposite of `SyntaxSuggest.valid?`
132
- def self.invalid?(source)
133
- source = source.join if source.is_a?(Array)
134
- source = source.to_s
159
+ if defined?(Prism)
160
+ def self.invalid?(source)
161
+ source = source.join if source.is_a?(Array)
162
+ source = source.to_s
135
163
 
136
- Ripper.new(source).tap(&:parse).error?
164
+ Prism.parse(source).failure?
165
+ end
166
+ else
167
+ def self.invalid?(source)
168
+ source = source.join if source.is_a?(Array)
169
+ source = source.to_s
170
+
171
+ Ripper.new(source).tap(&:parse).error?
172
+ end
137
173
  end
138
174
 
139
175
  # SyntaxSuggest.valid? [Private]
@@ -191,7 +227,6 @@ require_relative "lex_all"
191
227
  require_relative "code_line"
192
228
  require_relative "code_block"
193
229
  require_relative "block_expand"
194
- require_relative "ripper_errors"
195
230
  require_relative "priority_queue"
196
231
  require_relative "unvisited_lines"
197
232
  require_relative "around_block_scan"
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "scan_history"
4
+
3
5
  module SyntaxSuggest
4
6
  # This class is useful for exploring contents before and after
5
7
  # a block
@@ -24,22 +26,17 @@ module SyntaxSuggest
24
26
  # puts scan.before_index # => 0
25
27
  # puts scan.after_index # => 3
26
28
  #
27
- # Contents can also be filtered using AroundBlockScan#skip
28
- #
29
- # To grab the next surrounding indentation use AroundBlockScan#scan_adjacent_indent
30
29
  class AroundBlockScan
31
30
  def initialize(code_lines:, block:)
32
31
  @code_lines = code_lines
33
- @orig_before_index = block.lines.first.index
34
- @orig_after_index = block.lines.last.index
35
32
  @orig_indent = block.current_indent
36
- @skip_array = []
37
- @after_array = []
38
- @before_array = []
39
- @stop_after_kw = false
40
33
 
41
- @force_add_hidden = false
34
+ @stop_after_kw = false
42
35
  @force_add_empty = false
36
+ @force_add_hidden = false
37
+ @target_indent = nil
38
+
39
+ @scanner = ScanHistory.new(code_lines: code_lines, block: block)
43
40
  end
44
41
 
45
42
  # When using this flag, `scan_while` will
@@ -89,150 +86,35 @@ module SyntaxSuggest
89
86
  # stopping if we've found a keyword/end mis-match in one direction
90
87
  # or the other.
91
88
  def scan_while
92
- stop_next = false
93
- kw_count = 0
94
- end_count = 0
95
- index = before_lines.reverse_each.take_while do |line|
96
- next false if stop_next
97
- next true if @force_add_hidden && line.hidden?
98
- next true if @force_add_empty && line.empty?
99
-
100
- kw_count += 1 if line.is_kw?
101
- end_count += 1 if line.is_end?
102
- if @stop_after_kw && kw_count > end_count
103
- stop_next = true
104
- end
105
-
106
- yield line
107
- end.last&.index
108
-
109
- if index && index < before_index
110
- @before_index = index
111
- end
112
-
113
- stop_next = false
114
- kw_count = 0
115
- end_count = 0
116
- index = after_lines.take_while do |line|
117
- next false if stop_next
118
- next true if @force_add_hidden && line.hidden?
119
- next true if @force_add_empty && line.empty?
120
-
121
- kw_count += 1 if line.is_kw?
122
- end_count += 1 if line.is_end?
123
- if @stop_after_kw && end_count > kw_count
124
- stop_next = true
125
- end
126
-
127
- yield line
128
- end.last&.index
129
-
130
- if index && index > after_index
131
- @after_index = index
132
- end
133
- self
134
- end
135
-
136
- # Shows surrounding kw/end pairs
137
- #
138
- # The purpose of showing these extra pairs is due to cases
139
- # of ambiguity when only one visible line is matched.
140
- #
141
- # For example:
142
- #
143
- # 1 class Dog
144
- # 2 def bark
145
- # 4 def eat
146
- # 5 end
147
- # 6 end
148
- #
149
- # In this case either line 2 could be missing an `end` or
150
- # line 4 was an extra line added by mistake (it happens).
151
- #
152
- # When we detect the above problem it shows the issue
153
- # as only being on line 2
154
- #
155
- # 2 def bark
156
- #
157
- # Showing "neighbor" keyword pairs gives extra context:
158
- #
159
- # 2 def bark
160
- # 4 def eat
161
- # 5 end
162
- #
163
- def capture_neighbor_context
164
- lines = []
165
- kw_count = 0
166
- end_count = 0
167
- before_lines.reverse_each do |line|
168
- next if line.empty?
169
- break if line.indent < @orig_indent
170
- next if line.indent != @orig_indent
171
-
172
- kw_count += 1 if line.is_kw?
173
- end_count += 1 if line.is_end?
174
- if kw_count != 0 && kw_count == end_count
175
- lines << line
176
- break
177
- end
178
-
179
- lines << line
180
- end
89
+ stop_next_up = false
90
+ stop_next_down = false
181
91
 
182
- lines.reverse!
92
+ @scanner.scan(
93
+ up: ->(line, kw_count, end_count) {
94
+ next false if stop_next_up
95
+ next true if @force_add_hidden && line.hidden?
96
+ next true if @force_add_empty && line.empty?
183
97
 
184
- kw_count = 0
185
- end_count = 0
186
- after_lines.each do |line|
187
- next if line.empty?
188
- break if line.indent < @orig_indent
189
- next if line.indent != @orig_indent
98
+ if @stop_after_kw && kw_count > end_count
99
+ stop_next_up = true
100
+ end
190
101
 
191
- kw_count += 1 if line.is_kw?
192
- end_count += 1 if line.is_end?
193
- if kw_count != 0 && kw_count == end_count
194
- lines << line
195
- break
196
- end
197
-
198
- lines << line
199
- end
102
+ yield line
103
+ },
104
+ down: ->(line, kw_count, end_count) {
105
+ next false if stop_next_down
106
+ next true if @force_add_hidden && line.hidden?
107
+ next true if @force_add_empty && line.empty?
200
108
 
201
- lines
202
- end
109
+ if @stop_after_kw && end_count > kw_count
110
+ stop_next_down = true
111
+ end
203
112
 
204
- # Shows the context around code provided by "falling" indentation
205
- #
206
- # Converts:
207
- #
208
- # it "foo" do
209
- #
210
- # into:
211
- #
212
- # class OH
213
- # def hello
214
- # it "foo" do
215
- # end
216
- # end
217
- #
218
- def on_falling_indent
219
- last_indent = @orig_indent
220
- before_lines.reverse_each do |line|
221
- next if line.empty?
222
- if line.indent < last_indent
223
113
  yield line
224
- last_indent = line.indent
225
- end
226
- end
114
+ }
115
+ )
227
116
 
228
- last_indent = @orig_indent
229
- after_lines.each do |line|
230
- next if line.empty?
231
- if line.indent < last_indent
232
- yield line
233
- last_indent = line.indent
234
- end
235
- end
117
+ self
236
118
  end
237
119
 
238
120
  # Scanning is intentionally conservative because
@@ -266,39 +148,46 @@ module SyntaxSuggest
266
148
 
267
149
  return self if kw_count == end_count # nothing to balance
268
150
 
269
- # More ends than keywords, check if we can balance expanding up
270
- if (end_count - kw_count) == 1 && next_up
271
- return self unless next_up.is_kw?
272
- return self unless next_up.indent >= @orig_indent
273
-
274
- @before_index = next_up.index
151
+ @scanner.commit_if_changed # Rollback point if we don't find anything to optimize
275
152
 
276
- # More keywords than ends, check if we can balance by expanding down
277
- elsif (kw_count - end_count) == 1 && next_down
278
- return self unless next_down.is_end?
279
- return self unless next_down.indent >= @orig_indent
153
+ # Try to eat up empty lines
154
+ @scanner.scan(
155
+ up: ->(line, _, _) { line.hidden? || line.empty? },
156
+ down: ->(line, _, _) { line.hidden? || line.empty? }
157
+ )
280
158
 
281
- @after_index = next_down.index
159
+ # More ends than keywords, check if we can balance expanding up
160
+ next_up = @scanner.next_up
161
+ next_down = @scanner.next_down
162
+ case end_count - kw_count
163
+ when 1
164
+ if next_up&.is_kw? && next_up.indent >= @target_indent
165
+ @scanner.scan(
166
+ up: ->(line, _, _) { line == next_up },
167
+ down: ->(line, _, _) { false }
168
+ )
169
+ @scanner.commit_if_changed
170
+ end
171
+ when -1
172
+ if next_down&.is_end? && next_down.indent >= @target_indent
173
+ @scanner.scan(
174
+ up: ->(line, _, _) { false },
175
+ down: ->(line, _, _) { line == next_down }
176
+ )
177
+ @scanner.commit_if_changed
178
+ end
282
179
  end
180
+ # Rollback any uncommitted changes
181
+ @scanner.stash_changes
182
+
283
183
  self
284
184
  end
285
185
 
286
186
  # Finds code lines at the same or greater indentation and adds them
287
187
  # to the block
288
188
  def scan_neighbors_not_empty
289
- scan_while { |line| line.not_empty? && line.indent >= @orig_indent }
290
- end
291
-
292
- # Returns the next line to be scanned above the current block.
293
- # Returns `nil` if at the top of the document already
294
- def next_up
295
- @code_lines[before_index.pred]
296
- end
297
-
298
- # Returns the next line to be scanned below the current block.
299
- # Returns `nil` if at the bottom of the document already
300
- def next_down
301
- @code_lines[after_index.next]
189
+ @target_indent = @orig_indent
190
+ scan_while { |line| line.not_empty? && line.indent >= @target_indent }
302
191
  end
303
192
 
304
193
  # Scan blocks based on indentation of next line above/below block
@@ -310,30 +199,13 @@ module SyntaxSuggest
310
199
  # the `def/end` lines surrounding a method.
311
200
  def scan_adjacent_indent
312
201
  before_after_indent = []
313
- before_after_indent << (next_up&.indent || 0)
314
- before_after_indent << (next_down&.indent || 0)
315
202
 
316
- indent = before_after_indent.min
317
- scan_while { |line| line.not_empty? && line.indent >= indent }
203
+ before_after_indent << (@scanner.next_up&.indent || 0)
204
+ before_after_indent << (@scanner.next_down&.indent || 0)
318
205
 
319
- self
320
- end
206
+ @target_indent = before_after_indent.min
207
+ scan_while { |line| line.not_empty? && line.indent >= @target_indent }
321
208
 
322
- # TODO: Doc or delete
323
- #
324
- # I don't remember why this is needed, but it's called in code_context.
325
- # It's related to the implementation of `capture_neighbor_context` somehow
326
- # and that display improvement is only triggered when there's one visible line
327
- #
328
- # I think the primary purpose is to not include the current line in the
329
- # logic evaluation of `capture_neighbor_context`. If that's true, then
330
- # we should fix that method to handle this logic instead of only using
331
- # it in one place and together.
332
- def start_at_next_line
333
- before_index
334
- after_index
335
- @before_index -= 1
336
- @after_index += 1
337
209
  self
338
210
  end
339
211
 
@@ -349,29 +221,12 @@ module SyntaxSuggest
349
221
  # Returns the lines matched by the current scan as an
350
222
  # array of CodeLines
351
223
  def lines
352
- @code_lines[before_index..after_index]
353
- end
354
-
355
- # Gives the index of the first line currently scanned
356
- def before_index
357
- @before_index ||= @orig_before_index
358
- end
359
-
360
- # Gives the index of the last line currently scanned
361
- def after_index
362
- @after_index ||= @orig_after_index
363
- end
364
-
365
- # Returns an array of all the CodeLines that exist before
366
- # the currently scanned block
367
- private def before_lines
368
- @code_lines[0...before_index] || []
224
+ @scanner.lines
369
225
  end
370
226
 
371
- # Returns an array of all the CodeLines that exist after
372
- # the currently scanned block
373
- private def after_lines
374
- @code_lines[after_index.next..-1] || []
227
+ # Managable rspec errors
228
+ def inspect
229
+ "#<#{self.class}:0x0000123843lol >"
375
230
  end
376
231
  end
377
232
  end