syntax_suggest 1.1.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0aa200b221c59254250acfa3343365ead0a7e8a0e699aec254e248a880bf4084
4
- data.tar.gz: e343f13b8cfb3091b7e6f2ee97575fbe7e8e9b24d0f36168524a098e5d596098
3
+ metadata.gz: 7b3d83011e29784a7ea97dcae359b654ec8be6382c9fda7a5114353050ef5bf2
4
+ data.tar.gz: a2452866035aa4751948ac4f30cb7699352bc0778fb4b5bcae3ce3f421b901de
5
5
  SHA512:
6
- metadata.gz: 5b5fe319b21f699251eb9d2a1580808fd8b454c8c5d04f1e0ac63619898c429726579596e2f182d98299f2850387ee34b245b6e4a9cfcfb17a1c76e160000a01
7
- data.tar.gz: f1181078cb45c2c333fc96ff04efd0513b0da4088623ce9899eeda0ada7ba342d7a146bde872515678005cad6f200fe6116f4d33f600cd98f4aa520a13ccda21
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.5.2
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.5.2
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.5.2
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,11 @@
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
+
3
9
  ## 1.1.0
4
10
 
5
11
  - Handle if/else with comment or empty line in branch (https://github.com/ruby/syntax_suggest/pull/193)
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.1.0)
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
@@ -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"
@@ -47,9 +47,9 @@ module SyntaxSuggest
47
47
  # ## Heredocs
48
48
  #
49
49
  # A heredoc is an way of defining a multi-line string. They can cause many
50
- # problems. If left as a single line, Ripper would try to parse the contents
50
+ # problems. If left as a single line, the parser would try to parse the contents
51
51
  # as ruby code rather than as a string. Even without this problem, we still
52
- # hit an issue with indentation
52
+ # hit an issue with indentation:
53
53
  #
54
54
  # 1 foo = <<~HEREDOC
55
55
  # 2 "Be yourself; everyone else is already taken.""
@@ -224,7 +224,7 @@ module SyntaxSuggest
224
224
  #
225
225
  def join_consecutive!
226
226
  consecutive_groups = @document.select(&:ignore_newline_not_beg?).map do |code_line|
227
- take_while_including(code_line.index..-1) do |line|
227
+ take_while_including(code_line.index..) do |line|
228
228
  line.ignore_newline_not_beg?
229
229
  end
230
230
  end
@@ -245,7 +245,7 @@ module SyntaxSuggest
245
245
  # expect(lines[1].to_s).to eq("")
246
246
  def join_trailing_slash!
247
247
  trailing_groups = @document.select(&:trailing_slash?).map do |code_line|
248
- take_while_including(code_line.index..-1) { |x| x.trailing_slash? }
248
+ take_while_including(code_line.index..) { |x| x.trailing_slash? }
249
249
  end
250
250
  join_groups(trailing_groups)
251
251
  self
@@ -279,7 +279,7 @@ module SyntaxSuggest
279
279
  )
280
280
 
281
281
  # Hide the rest of the lines
282
- lines[1..-1].each do |line|
282
+ lines[1..].each do |line|
283
283
  # The above lines already have newlines in them, if add more
284
284
  # then there will be double newline, use an empty line instead
285
285
  @document[line.index] = CodeLine.new(line: "", index: line.index, lex: [])
@@ -293,7 +293,7 @@ module SyntaxSuggest
293
293
  # Like `take_while` except when it stops
294
294
  # iterating, it also returns the line
295
295
  # that caused it to stop
296
- def take_while_including(range = 0..-1)
296
+ def take_while_including(range = 0..)
297
297
  take_next_and_stop = false
298
298
  @document[range].take_while do |line|
299
299
  next if take_next_and_stop
@@ -81,7 +81,7 @@ module SyntaxSuggest
81
81
  # lines then the result cannot be invalid
82
82
  #
83
83
  # That means there's no reason to re-check all
84
- # lines with ripper (which is expensive).
84
+ # lines with the parser (which is expensive).
85
85
  # Benchmark in commit message
86
86
  @valid = if lines.all? { |l| l.hidden? || l.empty? }
87
87
  true
@@ -117,7 +117,7 @@ module SyntaxSuggest
117
117
 
118
118
  if ENV["SYNTAX_SUGGEST_DEBUG"]
119
119
  puts "```"
120
- puts @queue.peek.to_s
120
+ puts @queue.peek
121
121
  puts "```"
122
122
  puts " @frontier indent: #{frontier_indent}"
123
123
  puts " @unvisited indent: #{unvisited_indent}"
@@ -180,12 +180,19 @@ module SyntaxSuggest
180
180
  # EOM
181
181
  # expect(lines.first.trailing_slash?).to eq(true)
182
182
  #
183
- def trailing_slash?
184
- last = @lex.last
185
- return false unless last
186
- return false unless last.type == :on_sp
183
+ if SyntaxSuggest.use_prism_parser?
184
+ def trailing_slash?
185
+ last = @lex.last
186
+ last&.type == :on_tstring_end
187
+ end
188
+ else
189
+ def trailing_slash?
190
+ last = @lex.last
191
+ return false unless last
192
+ return false unless last.type == :on_sp
187
193
 
188
- last.token == TRAILING_SLASH
194
+ last.token == TRAILING_SLASH
195
+ end
189
196
  end
190
197
 
191
198
  # Endless method detection
@@ -43,7 +43,7 @@ module SyntaxSuggest
43
43
 
44
44
  def initialize(source, record_dir: DEFAULT_VALUE)
45
45
  record_dir = if record_dir == DEFAULT_VALUE
46
- ENV["SYNTAX_SUGGEST_RECORD_DIR"] || ENV["SYNTAX_SUGGEST_DEBUG"] ? "tmp" : nil
46
+ (ENV["SYNTAX_SUGGEST_RECORD_DIR"] || ENV["SYNTAX_SUGGEST_DEBUG"]) ? "tmp" : nil
47
47
  else
48
48
  record_dir
49
49
  end
@@ -73,7 +73,7 @@ module SyntaxSuggest
73
73
  if ENV["SYNTAX_SUGGEST_DEBUG"]
74
74
  puts "\n\n==== #{filename} ===="
75
75
  puts "\n```#{block.starts_at}..#{block.ends_at}"
76
- puts block.to_s
76
+ puts block
77
77
  puts "```"
78
78
  puts " block indent: #{block.current_indent}"
79
79
  end
@@ -21,7 +21,7 @@ if SyntaxError.method_defined?(:detailed_message)
21
21
  attr_reader :string
22
22
  end
23
23
 
24
- # SyntaxSuggest.record_dir [Private]
24
+ # SyntaxSuggest.module_for_detailed_message [Private]
25
25
  #
26
26
  # Used to monkeypatch SyntaxError via Module.prepend
27
27
  def self.module_for_detailed_message
@@ -14,7 +14,7 @@ module SyntaxSuggest
14
14
  @filename = filename
15
15
  @code_lines = code_lines
16
16
 
17
- @terminal = terminal == DEFAULT_VALUE ? io.isatty : terminal
17
+ @terminal = (terminal == DEFAULT_VALUE) ? io.isatty : terminal
18
18
  end
19
19
 
20
20
  def document_ok?
@@ -2,7 +2,21 @@
2
2
 
3
3
  require_relative "left_right_lex_count"
4
4
 
5
+ if !SyntaxSuggest.use_prism_parser?
6
+ require_relative "ripper_errors"
7
+ end
8
+
5
9
  module SyntaxSuggest
10
+ class GetParseErrors
11
+ def self.errors(source)
12
+ if SyntaxSuggest.use_prism_parser?
13
+ Prism.parse(source).errors.map(&:message)
14
+ else
15
+ RipperErrors.new(source).call.errors
16
+ end
17
+ end
18
+ end
19
+
6
20
  # Explains syntax errors based on their source
7
21
  #
8
22
  # example:
@@ -15,8 +29,8 @@ module SyntaxSuggest
15
29
  # # => "Unmatched keyword, missing `end' ?"
16
30
  #
17
31
  # When the error cannot be determined by lexical counting
18
- # then ripper is run against the input and the raw ripper
19
- # errors returned.
32
+ # then the parser is run against the input and the raw
33
+ # errors are returned.
20
34
  #
21
35
  # Example:
22
36
  #
@@ -91,10 +105,10 @@ module SyntaxSuggest
91
105
  # Returns an array of syntax error messages
92
106
  #
93
107
  # If no missing pairs are found it falls back
94
- # on the original ripper error messages
108
+ # on the original error messages
95
109
  def errors
96
110
  if missing.empty?
97
- return RipperErrors.new(@code_lines.map(&:original).join).call.errors
111
+ return GetParseErrors.errors(@code_lines.map(&:original).join).uniq
98
112
  end
99
113
 
100
114
  missing.map { |miss| why(miss) }
@@ -3,34 +3,53 @@
3
3
  module SyntaxSuggest
4
4
  # Ripper.lex is not guaranteed to lex the entire source document
5
5
  #
6
- # lex = LexAll.new(source: source)
7
- # lex.each do |value|
8
- # puts value.line
9
- # end
6
+ # This class guarantees the whole document is lex-ed by iteratively
7
+ # lexing the document where ripper stopped.
8
+ #
9
+ # Prism likely doesn't have the same problem. Once ripper support is removed
10
+ # we can likely reduce the complexity here if not remove the whole concept.
11
+ #
12
+ # Example usage:
13
+ #
14
+ # lex = LexAll.new(source: source)
15
+ # lex.each do |value|
16
+ # puts value.line
17
+ # end
10
18
  class LexAll
11
19
  include Enumerable
12
20
 
13
21
  def initialize(source:, source_lines: nil)
14
- @lex = Ripper::Lexer.new(source, "-", 1).parse.sort_by(&:pos)
15
- lineno = @lex.last.pos.first + 1
22
+ @lex = self.class.lex(source, 1)
23
+ lineno = @lex.last[0][0] + 1
16
24
  source_lines ||= source.lines
17
25
  last_lineno = source_lines.length
18
26
 
19
27
  until lineno >= last_lineno
20
- lines = source_lines[lineno..-1]
28
+ lines = source_lines[lineno..]
21
29
 
22
30
  @lex.concat(
23
- Ripper::Lexer.new(lines.join, "-", lineno + 1).parse.sort_by(&:pos)
31
+ self.class.lex(lines.join, lineno + 1)
24
32
  )
25
- lineno = @lex.last.pos.first + 1
33
+
34
+ lineno = @lex.last[0].first + 1
26
35
  end
27
36
 
28
37
  last_lex = nil
29
38
  @lex.map! { |elem|
30
- last_lex = LexValue.new(elem.pos.first, elem.event, elem.tok, elem.state, last_lex)
39
+ last_lex = LexValue.new(elem[0].first, elem[1], elem[2], elem[3], last_lex)
31
40
  }
32
41
  end
33
42
 
43
+ if SyntaxSuggest.use_prism_parser?
44
+ def self.lex(source, line_number)
45
+ Prism.lex_compat(source, line: line_number).value.sort_by { |values| values[0] }
46
+ end
47
+ else
48
+ def self.lex(source, line_number)
49
+ Ripper::Lexer.new(source, "-", line_number).parse.sort_by(&:pos)
50
+ end
51
+ end
52
+
34
53
  def to_a
35
54
  @lex
36
55
  end
@@ -13,7 +13,7 @@ module SyntaxSuggest
13
13
  # # => "/tmp/scratch.rb"
14
14
  #
15
15
  class PathnameFromMessage
16
- EVAL_RE = /^\(eval\):\d+/
16
+ EVAL_RE = /^\(eval.*\):\d+/
17
17
  STREAMING_RE = /^-:\d+/
18
18
  attr_reader :name
19
19
 
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SyntaxSuggest
4
- # Capture parse errors from ripper
4
+ # Capture parse errors from Ripper
5
+ #
6
+ # Prism returns the errors with their messages, but Ripper
7
+ # does not. To get them we must make a custom subclass.
5
8
  #
6
9
  # Example:
7
10
  #
@@ -118,7 +118,7 @@ module SyntaxSuggest
118
118
  # Returns an array of all the CodeLines that exist after
119
119
  # the currently scanned block
120
120
  private def after_lines
121
- @code_lines[@after_index.next..-1] || []
121
+ @code_lines[@after_index.next..] || []
122
122
  end
123
123
 
124
124
  private def current
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SyntaxSuggest
4
- VERSION = "1.1.0"
4
+ VERSION = "2.0.0"
5
5
  end
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.description = 'When you get an "unexpected end" in your syntax this gem helps you find it'
17
17
  spec.homepage = "https://github.com/ruby/syntax_suggest.git"
18
18
  spec.license = "MIT"
19
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
19
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
20
20
 
21
21
  spec.metadata["homepage_uri"] = spec.homepage
22
22
  spec.metadata["source_code_uri"] = "https://github.com/ruby/syntax_suggest.git"
@@ -27,6 +27,6 @@ Gem::Specification.new do |spec|
27
27
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|assets)/}) }
28
28
  end
29
29
  spec.bindir = "exe"
30
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.executables = ["syntax_suggest"]
31
31
  spec.require_paths = ["lib"]
32
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syntax_suggest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - schneems
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-08 00:00:00.000000000 Z
11
+ date: 2023-12-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: When you get an "unexpected end" in your syntax this gem helps you find
14
14
  it
@@ -81,14 +81,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 2.5.0
84
+ version: 3.0.0
85
85
  required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  requirements: []
91
- rubygems_version: 3.3.26
91
+ rubygems_version: 3.4.22
92
92
  signing_key:
93
93
  specification_version: 4
94
94
  summary: Find syntax errors in your source in a snap