|
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 |
|
@@ -242,7 +246,7 @@ def evaluate_call_node(node, scope)
|
242 | 246 | # method(args, &:completion_target)
|
243 | 247 | call_block_proc = ->(block_args, _self_type) do
|
244 | 248 | block_receiver = block_args.first || Types::OBJECT
|
245 |
| - @dig_targets.resolve block_receiver, scope |
| 249 | + @dig_targets.trigger block_sym_node, block_receiver, scope |
246 | 250 | Types::OBJECT
|
247 | 251 | end
|
248 | 252 | else
|
@@ -892,7 +896,7 @@ def evaluate_constant_node_info(node, scope)
|
892 | 896 | name = node.name.to_s
|
893 | 897 | type = scope[name]
|
894 | 898 | end
|
895 |
| - @dig_targets.resolve type, scope if @dig_targets.target? node |
| 899 | + @dig_targets.trigger node, type, scope |
896 | 900 | [type, receiver, parent_module, name]
|
897 | 901 | end
|
898 | 902 |
|
@@ -1167,9 +1171,11 @@ def method_call(receiver, method_name, args, kwargs, block, scope, name_match: t
|
1167 | 1171 | end
|
1168 | 1172 |
|
1169 | 1173 | def self.calculate_target_type_scope(binding, parents, target)
|
1170 |
| - dig_targets = DigTarget.new(parents, target) do |type, scope| |
| 1174 | + dig_targets = DigTarget.new(parents) |
| 1175 | + dig_targets.on target do |type, scope| |
1171 | 1176 | return type, scope
|
1172 | 1177 | end
|
| 1178 | + yield dig_targets if block_given? |
1173 | 1179 | program = parents.first
|
1174 | 1180 | scope = Scope.from_binding(binding, program.locals)
|
1175 | 1181 | new(dig_targets).evaluate program, scope
|
|
0 commit comments