|
8 | 8 | module ReplTypeCompletor |
9 | 9 | class TypeAnalyzer |
10 | 10 | class DigTarget |
11 | | - def initialize(parents, receiver, &block) |
12 | | - @dig_ids = parents.to_h { [_1.__id__, true] } |
13 | | - @target_id = receiver.__id__ |
14 | | - @block = block |
| 11 | + def initialize(parents) |
| 12 | + @dig_ids = Set.new(parents.map(&:__id__)) |
| 13 | + @events = {} |
15 | 14 | end |
16 | 15 |
|
17 | | - def dig?(node) = @dig_ids[node.__id__] |
18 | | - def target?(node) = @target_id == node.__id__ |
19 | | - def resolve(type, scope) |
20 | | - @block.call type, scope |
| 16 | + def on(target, &block) |
| 17 | + @dig_ids << target.__id__ |
| 18 | + @events[target.__id__] = block |
| 19 | + end |
| 20 | + |
| 21 | + def dig?(node) = @dig_ids.include?(node.__id__) |
| 22 | + def target?(node) = @events.key?(node.__id__) |
| 23 | + def trigger(node, type, scope) |
| 24 | + @events[node.__id__]&.call type, scope |
21 | 25 | end |
22 | 26 | end |
23 | 27 |
|
@@ -46,7 +50,7 @@ def evaluate(node, scope) |
46 | 50 | else |
47 | 51 | result = Types::NIL |
48 | 52 | end |
49 | | - @dig_targets.resolve result, scope if @dig_targets.target? node |
| 53 | + @dig_targets.trigger node, result, scope |
50 | 54 | result |
51 | 55 | end |
52 | 56 |
|
@@ -241,7 +245,7 @@ def evaluate_call_node(node, scope) |
241 | 245 | # method(args, &:completion_target) |
242 | 246 | call_block_proc = ->(block_args, _self_type) do |
243 | 247 | block_receiver = block_args.first || Types::OBJECT |
244 | | - @dig_targets.resolve block_receiver, scope |
| 248 | + @dig_targets.trigger block_sym_node, block_receiver, scope |
245 | 249 | Types::OBJECT |
246 | 250 | end |
247 | 251 | else |
@@ -890,7 +894,7 @@ def evaluate_constant_node_info(node, scope) |
890 | 894 | name = node.name.to_s |
891 | 895 | type = scope[name] |
892 | 896 | end |
893 | | - @dig_targets.resolve type, scope if @dig_targets.target? node |
| 897 | + @dig_targets.trigger node, type, scope |
894 | 898 | [type, receiver, parent_module, name] |
895 | 899 | end |
896 | 900 |
|
@@ -1164,9 +1168,11 @@ def method_call(receiver, method_name, args, kwargs, block, scope, name_match: t |
1164 | 1168 | end |
1165 | 1169 |
|
1166 | 1170 | def self.calculate_target_type_scope(binding, parents, target) |
1167 | | - dig_targets = DigTarget.new(parents, target) do |type, scope| |
| 1171 | + dig_targets = DigTarget.new(parents) |
| 1172 | + dig_targets.on target do |type, scope| |
1168 | 1173 | return type, scope |
1169 | 1174 | end |
| 1175 | + yield dig_targets if block_given? |
1170 | 1176 | program = parents.first |
1171 | 1177 | scope = Scope.from_binding(binding, program.locals) |
1172 | 1178 | new(dig_targets).evaluate program, scope |
|
0 commit comments