@@ -9,7 +9,7 @@ module NodeProcessor
9
9
autoload :Base , 'solargraph/parser/node_processor/base'
10
10
11
11
class << self
12
- # @type [Hash<Symbol, Class<NodeProcessor::Base>>]
12
+ # @type [Hash<Symbol, Array< Class<NodeProcessor::Base> >>]
13
13
@@processors ||= { }
14
14
15
15
# Register a processor for a node type.
@@ -18,7 +18,12 @@ class << self
18
18
# @param cls [Class<NodeProcessor::Base>]
19
19
# @return [Class<NodeProcessor::Base>]
20
20
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 )
22
27
end
23
28
end
24
29
@@ -28,17 +33,24 @@ def register type, cls
28
33
# @param locals [Array<Pin::BaseVariable>]
29
34
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
30
35
def self . process node , region = Region . new , pins = [ ] , locals = [ ]
36
+ result = [ [ ] , [ ] ]
31
37
if pins . empty?
32
38
pins . push Pin ::Namespace . new (
33
39
location : region . source . location ,
34
40
name : ''
35
41
)
36
42
end
37
43
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
42
54
end
43
55
end
44
56
end
0 commit comments