Skip to content

Commit 6707d22

Browse files
committed
Allow multiple node processors
1 parent 5c12a11 commit 6707d22

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

lib/solargraph/parser/node_processor.rb

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module NodeProcessor
99
autoload :Base, 'solargraph/parser/node_processor/base'
1010

1111
class << self
12-
# @type [Hash<Symbol, Class<NodeProcessor::Base>>]
12+
# @type [Hash<Symbol, Array<Class<NodeProcessor::Base>>>]
1313
@@processors ||= {}
1414

1515
# Register a processor for a node type.
@@ -18,7 +18,12 @@ class << self
1818
# @param cls [Class<NodeProcessor::Base>]
1919
# @return [Class<NodeProcessor::Base>]
2020
def register type, cls
21-
@@processors[type] = cls
21+
@@processors[type] ||= []
22+
@@processors[type] << cls
23+
end
24+
25+
def deregister type, cls
26+
@@processors[type].delete(cls)
2227
end
2328
end
2429

@@ -28,17 +33,24 @@ def register type, cls
2833
# @param locals [Array<Pin::BaseVariable>]
2934
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
3035
def self.process node, region = Region.new, pins = [], locals = []
36+
result = [[], []]
3137
if pins.empty?
3238
pins.push Pin::Namespace.new(
3339
location: region.source.location,
3440
name: ''
3541
)
3642
end
3743
return [pins, locals] unless Parser.is_ast_node?(node)
38-
klass = @@processors[node.type] || NodeProcessor::Base
39-
processor = klass.new(node, region, pins, locals)
40-
processor.process
41-
[processor.pins, processor.locals]
44+
node_processor_classes = @@processors[node.type] || [NodeProcessor::Base]
45+
node_processor_classes.each do |klass|
46+
processor = klass.new(node, region, pins, locals)
47+
processor.process
48+
49+
result[0] += processor.pins
50+
result[1] += processor.locals
51+
end
52+
53+
result
4254
end
4355
end
4456
end

spec/parser/node_processor_spec.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,30 @@ def foo(bar = nil, baz = nil); end
1919
pin = pins[1]
2020
expect(pin.parameters.map(&:name)).to eq(%w[bar baz])
2121
end
22+
23+
it 'allows multiple processors for the same node type' do
24+
dummy_processor1 = Class.new(Solargraph::Parser::NodeProcessor::Base) do
25+
def process
26+
pins.push Solargraph::Pin::Method.new(name: 'foo')
27+
end
28+
end
29+
30+
dummy_processor2 = Class.new(Solargraph::Parser::NodeProcessor::Base) do
31+
def process
32+
pins.push Solargraph::Pin::Method.new(name: 'bar')
33+
end
34+
end
35+
36+
Solargraph::Parser::NodeProcessor.register(:def, dummy_processor1)
37+
Solargraph::Parser::NodeProcessor.register(:def, dummy_processor2)
38+
node = Solargraph::Parser.parse(%(
39+
def some_method; end
40+
))
41+
pins, = Solargraph::Parser::NodeProcessor.process(node)
42+
expect(pins.map(&:name)).to include('foo', 'bar')
43+
44+
# Clean up the registered processors
45+
Solargraph::Parser::NodeProcessor.deregister(:def, dummy_processor1)
46+
Solargraph::Parser::NodeProcessor.deregister(:def, dummy_processor2)
47+
end
2248
end

0 commit comments

Comments
 (0)