diff options
| author | Earlopain <14981592+Earlopain@users.noreply.github.com> | 2026-01-16 10:47:18 +0100 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2026-01-16 20:19:26 +0000 |
| commit | 87147ba5e983f554fb56f859af0d858d5eff0896 (patch) | |
| tree | 092aced5e58639bd9d1240a91c4a322e697caeb2 /lib | |
| parent | 1c7e19f961a3e9051cf728deeea196d4d72a89cd (diff) | |
[ruby/prism] Make the ripper shim work with rdoc
The filter class is a 1:1 copy of ruby.
rdoc has 32 test failures. It seems to expect `on_sp` in some cases to render code as written.
https://github.com/ruby/prism/commit/74bb12c825
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/prism/prism.gemspec | 1 | ||||
| -rw-r--r-- | lib/prism/translation/ripper.rb | 1 | ||||
| -rw-r--r-- | lib/prism/translation/ripper/filter.rb | 53 | ||||
| -rw-r--r-- | lib/prism/translation/ripper/lexer.rb | 16 |
4 files changed, 61 insertions, 10 deletions
diff --git a/lib/prism/prism.gemspec b/lib/prism/prism.gemspec index 463387e55c..283c7b04aa 100644 --- a/lib/prism/prism.gemspec +++ b/lib/prism/prism.gemspec @@ -104,6 +104,7 @@ Gem::Specification.new do |spec| "lib/prism/translation/parser/compiler.rb", "lib/prism/translation/parser/lexer.rb", "lib/prism/translation/ripper.rb", + "lib/prism/translation/ripper/filter.rb", "lib/prism/translation/ripper/lexer.rb", "lib/prism/translation/ripper/sexp.rb", "lib/prism/translation/ripper/shim.rb", diff --git a/lib/prism/translation/ripper.rb b/lib/prism/translation/ripper.rb index 6552d2dbb8..c8f9fa7731 100644 --- a/lib/prism/translation/ripper.rb +++ b/lib/prism/translation/ripper.rb @@ -437,6 +437,7 @@ module Prism end end + autoload :Filter, "prism/translation/ripper/filter" autoload :Lexer, "prism/translation/ripper/lexer" autoload :SexpBuilder, "prism/translation/ripper/sexp" autoload :SexpBuilderPP, "prism/translation/ripper/sexp" diff --git a/lib/prism/translation/ripper/filter.rb b/lib/prism/translation/ripper/filter.rb new file mode 100644 index 0000000000..19deef2d37 --- /dev/null +++ b/lib/prism/translation/ripper/filter.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +module Prism + module Translation + class Ripper + class Filter # :nodoc: + # :stopdoc: + def initialize(src, filename = '-', lineno = 1) + @__lexer = Lexer.new(src, filename, lineno) + @__line = nil + @__col = nil + @__state = nil + end + + def filename + @__lexer.filename + end + + def lineno + @__line + end + + def column + @__col + end + + def state + @__state + end + + def parse(init = nil) + data = init + @__lexer.lex.each do |pos, event, tok, state| + @__line, @__col = *pos + @__state = state + data = if respond_to?(event, true) + then __send__(event, tok, data) + else on_default(event, tok, data) + end + end + data + end + + private + + def on_default(event, token, data) + data + end + # :startdoc: + end + end + end +end diff --git a/lib/prism/translation/ripper/lexer.rb b/lib/prism/translation/ripper/lexer.rb index 787181b5a7..bd40fb4c5a 100644 --- a/lib/prism/translation/ripper/lexer.rb +++ b/lib/prism/translation/ripper/lexer.rb @@ -100,21 +100,17 @@ module Prism end end - def initialize(...) - super - @lex_compat = Prism.lex_compat(@source, filepath: filename, line: lineno) + # Pretty much just the same as Prism.lex_compat. + def lex(raise_errors: false) + Ripper.lex(@source, filename, lineno, raise_errors: raise_errors) end # Returns the lex_compat result wrapped in `Elem`. Errors are omitted. # Since ripper is a streaming parser, tokens are expected to be emitted in the order # that the parser encounters them. This is not implemented. - def parse(raise_errors: false) - if @lex_compat.failure? && raise_errors - raise SyntaxError, @lex_compat.errors.first.message - else - @lex_compat.value.map do |position, event, token, state| - Elem.new(position, event, token, state.to_int) - end + def parse(...) + lex(...).map do |position, event, token, state| + Elem.new(position, event, token, state.to_int) end end |
