Class: RBI::Rewriters::RemoveKnownDefinitions

Inherits:
Visitor
  • Object
show all
Defined in:
lib/rbi/rewriters/remove_known_definitions.rb

Overview

Remove all definitions existing in the index from the current tree

Let’s create an ‘Index` from two different `Tree`s: ~~~rb tree1 = Parse.parse_string(<<~RBI)

class Foo
  def foo; end
end

RBI

tree2 = Parse.parse_string(<<~RBI)

FOO = 10

RBI

index = Index.index(tree1, tree2) ~~~

We can use ‘RemoveKnownDefinitions` to remove the definitions found in the `index` from the `Tree` to clean: ~~~rb tree_to_clean = Parser.parse_string(<<~RBI)

class Foo
  def foo; end
  def bar; end
end
FOO = 10
BAR = 42

RBI

cleaned_tree, operations = RemoveKnownDefinitions.remove(tree_to_clean, index)

assert_equal(<<~RBI, cleaned_tree)

class Foo
  def bar; end
end
BAR = 42

RBI

assert_equal(<<~OPERATIONS, operations.join(“n”))

Deleted ::Foo#foo at -:2:2-2-16 (duplicate from -:2:2-2:16)
Deleted ::FOO at -:5:0-5:8 (duplicate from -:1:0-1:8)

OPERATIONS ~~~

Defined Under Namespace

Classes: Operation

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Visitor

#visit_file

Constructor Details

#initialize(index) ⇒ RemoveKnownDefinitions

: (Index index) -> void



53
54
55
56
57
# File 'lib/rbi/rewriters/remove_known_definitions.rb', line 53

def initialize(index)
  super()
  @index = index
  @operations = T.let([], T::Array[Operation])
end

Instance Attribute Details

#operationsObject (readonly)

: Array



50
51
52
# File 'lib/rbi/rewriters/remove_known_definitions.rb', line 50

def operations
  @operations
end

Class Method Details

.remove(tree, index) ⇒ Object

: (Tree tree, Index index) -> [Tree, Array]



61
62
63
64
65
# File 'lib/rbi/rewriters/remove_known_definitions.rb', line 61

def remove(tree, index)
  v = RemoveKnownDefinitions.new(index)
  v.visit(tree)
  [tree, v.operations]
end

Instance Method Details

#visit(node) ⇒ Object

: (Node? node) -> void



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/rbi/rewriters/remove_known_definitions.rb', line 75

def visit(node)
  return unless node

  case node
  when Scope
    visit_all(node.nodes)
    previous = previous_definition_for(node)
    delete_node(node, previous) if previous && can_delete_node?(node, previous)
  when Tree
    visit_all(node.nodes)
  when Indexable
    previous = previous_definition_for(node)
    delete_node(node, previous) if previous && can_delete_node?(node, previous)
  end
end

#visit_all(nodes) ⇒ Object

: (Array nodes) -> void



69
70
71
# File 'lib/rbi/rewriters/remove_known_definitions.rb', line 69

def visit_all(nodes)
  nodes.dup.each { |node| visit(node) }
end