summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEarlopain <14981592+Earlopain@users.noreply.github.com>2026-01-16 10:47:18 +0100
committergit <svn-admin@ruby-lang.org>2026-01-16 20:19:26 +0000
commit87147ba5e983f554fb56f859af0d858d5eff0896 (patch)
tree092aced5e58639bd9d1240a91c4a322e697caeb2 /lib
parent1c7e19f961a3e9051cf728deeea196d4d72a89cd (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.gemspec1
-rw-r--r--lib/prism/translation/ripper.rb1
-rw-r--r--lib/prism/translation/ripper/filter.rb53
-rw-r--r--lib/prism/translation/ripper/lexer.rb16
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