Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions lib/chewy/index/witchcraft.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
begin
require 'method_source'
require 'parser/current'
begin
require 'prism'
rescue LoadError
require 'parser/current'
end
require 'unparser'
rescue LoadError
nil
Expand All @@ -24,7 +28,11 @@ def witchcraft!
def check_requirements!
messages = []
messages << "MethodSource gem is required for the Witchcraft, please add `gem 'method_source'` to your Gemfile" unless Proc.method_defined?(:source)
messages << "Parser gem is required for the Witchcraft, please add `gem 'parser'` to your Gemfile" unless '::Parser'.safe_constantize
if RUBY_VERSION >= '3.3'
messages << "Prism gem is required for the Witchcraft, please add `gem 'prism'` to your Gemfile" unless '::Prism'.safe_constantize
else
messages << "Parser gem is required for the Witchcraft, please add `gem 'parser'` to your Gemfile" unless '::Parser'.safe_constantize
end
messages << "Unparser gem is required for the Witchcraft, please add `gem 'unparser'` to your Gemfile" unless '::Unparser'.safe_constantize
messages = messages.join("\n")

Expand Down Expand Up @@ -164,8 +172,7 @@ def proc_fields_for(parent, nesting)
end

def source_for(proc, nesting)
ast = Parser::CurrentRuby.parse(proc.source)
lambdas = exctract_lambdas(ast)
lambdas = exctract_lambdas(ast_from_proc(proc))

raise "No lambdas found, try to reformat your code:\n`#{proc.source}`" unless lambdas

Expand All @@ -192,6 +199,14 @@ def source_for(proc, nesting)
Unparser.unparse(source)
end

def ast_from_proc(proc)
if defined?(Prism)
Prism::Translation::ParserCurrent.parse(proc.source)
else
Parser::CurrentRuby.parse(proc.source)
end
end

def exctract_lambdas(node)
return unless node.is_a?(Parser::AST::Node)

Expand Down