Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make dead code indexing use a Model to index modules #563

Merged
merged 2 commits into from
Jun 20, 2024
Merged
Show file tree
Hide file tree
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
9 changes: 9 additions & 0 deletions lib/spoom/deadcode/index.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,15 @@ def finalize!(plugins: [])
)
define(definition)
plugins.each { |plugin| plugin.internal_on_define_class(symbol_def, definition) }
when Model::Module
definition = Definition.new(
kind: Definition::Kind::Module,
name: symbol.name,
full_name: symbol.full_name,
location: symbol_def.location,
)
define(definition)
plugins.each { |plugin| plugin.internal_on_define_module(symbol_def, definition) }
end
end
end
Expand Down
15 changes: 0 additions & 15 deletions lib/spoom/deadcode/indexer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -238,16 +238,13 @@ def visit_module_node(node)
@names_nesting.clear
@names_nesting << full_name

define_module(T.must(constant_path.split("::").last), full_name, node)

visit(node.body)

# Restore the name nesting once we finished visited the class
@names_nesting.clear
@names_nesting = old_nesting
else
@names_nesting << constant_path
define_module(T.must(constant_path.split("::").last), @names_nesting.join("::"), node)

# We do not call `super` here because we don't want to visit the `constant` again
visit(node.body)
Expand Down Expand Up @@ -372,18 +369,6 @@ def define_method(name, full_name, node)
@plugins.each { |plugin| plugin.internal_on_define_method(self, definition) }
end

sig { params(name: String, full_name: String, node: Prism::Node).void }
def define_module(name, full_name, node)
definition = Definition.new(
kind: Definition::Kind::Module,
name: name,
full_name: full_name,
location: node_location(node),
)
@index.define(definition)
@plugins.each { |plugin| plugin.internal_on_define_module(self, definition) }
end

# Reference indexing

sig { params(name: String, node: Prism::Node).void }
Expand Down
16 changes: 8 additions & 8 deletions lib/spoom/deadcode/plugins/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -243,22 +243,22 @@ def internal_on_define_method(indexer, definition)
#
# ~~~rb
# class MyPlugin < Spoom::Deadcode::Plugins::Base
# def on_define_module(indexer, definition)
# definition.ignored! if definition.name == "Foo"
# def on_define_module(symbol_def, definition)
# definition.ignored! if symbol_def.name == "Foo"
# end
# end
# ~~~
sig { params(indexer: Indexer, definition: Definition).void }
def on_define_module(indexer, definition)
sig { params(symbol_def: Model::Module, definition: Definition).void }
def on_define_module(symbol_def, definition)
# no-op
end

# Do not override this method, use `on_define_module` instead.
sig { params(indexer: Indexer, definition: Definition).void }
def internal_on_define_module(indexer, definition)
definition.ignored! if ignored_module_name?(definition.name)
sig { params(symbol_def: Model::Module, definition: Definition).void }
def internal_on_define_module(symbol_def, definition)
definition.ignored! if ignored_module_name?(symbol_def.name)

on_define_module(indexer, definition)
on_define_module(symbol_def, definition)
end

# Called when a send is being processed
Expand Down
17 changes: 7 additions & 10 deletions lib/spoom/deadcode/plugins/namespaces.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,19 @@ class Namespaces < Base

sig { override.params(symbol_def: Model::Class, definition: Definition).void }
def on_define_class(symbol_def, definition)
definition.ignored! unless symbol_def.children.empty?
definition.ignored! if used_as_namespace?(symbol_def)
end

sig { override.params(indexer: Indexer, definition: Definition).void }
def on_define_module(indexer, definition)
definition.ignored! if used_as_namespace?(indexer)
sig { override.params(symbol_def: Model::Module, definition: Definition).void }
def on_define_module(symbol_def, definition)
definition.ignored! if used_as_namespace?(symbol_def)
end

private

sig { params(indexer: Indexer).returns(T::Boolean) }
def used_as_namespace?(indexer)
node = indexer.current_node
return false unless node.is_a?(Prism::ClassNode) || node.is_a?(Prism::ModuleNode)

!!node.body
sig { params(symbol_def: Model::Namespace).returns(T::Boolean) }
def used_as_namespace?(symbol_def)
symbol_def.children.any?
end
end
end
Expand Down
14 changes: 7 additions & 7 deletions lib/spoom/deadcode/plugins/rails.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ class Rails < Base

sig { override.params(symbol_def: Model::Class, definition: Definition).void }
def on_define_class(symbol_def, definition)
definition.ignored! if symbol_def.location.file.match?(%r{app/helpers/.*\.rb$})
definition.ignored! if file_is_helper?(symbol_def)
end

sig { override.params(indexer: Indexer, definition: Definition).void }
def on_define_module(indexer, definition)
definition.ignored! if file_is_helper?(indexer)
sig { override.params(symbol_def: Model::Module, definition: Definition).void }
def on_define_module(symbol_def, definition)
definition.ignored! if file_is_helper?(symbol_def)
end

private

sig { params(indexer: Indexer).returns(T::Boolean) }
def file_is_helper?(indexer)
indexer.path.match?(%r{app/helpers/.*\.rb$})
sig { params(symbol_def: Model::Namespace).returns(T::Boolean) }
def file_is_helper?(symbol_def)
symbol_def.location.file.match?(%r{app/helpers/.*\.rb$})
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions test/spoom/deadcode/plugins/base_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ def method2; end

def test_on_define_module
plugin = Class.new(Base) do
def on_define_module(indexer, definition)
definition.ignored! if definition.name == "Module1"
def on_define_module(symbol_def, definition)
definition.ignored! if symbol_def.name == "Module1"
end
end

Expand Down
Loading