Class: Archruby::Ruby::TypeInference::TypeInferenceChecker

Inherits:
Object
  • Object
show all
Defined in:
lib/archruby/ruby/type_inference/type_inference_checker.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dependencies, method_definitions) ⇒ TypeInferenceChecker

Returns a new instance of TypeInferenceChecker.



8
9
10
11
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 8

def initialize(dependencies, method_definitions)
  @dependencies = dependencies
  @method_definitions = method_definitions
end

Instance Attribute Details

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



6
7
8
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 6

def dependencies
  @dependencies
end

#method_definitionsObject (readonly)

Returns the value of attribute method_definitions.



6
7
8
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 6

def method_definitions
  @method_definitions
end

Instance Method Details

#add_dependency_based_on_callsObject



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 21

def add_dependency_based_on_calls
  @method_definitions.each do |class_name, method_definitions|
    method_definitions.each do |method_definition|
      method_definition.method_calls.each do |method_call|
        receiver_class = method_call.class_name
        method_name = method_call.method_name
        dependencies = extract_param_classes(method_definition.args, method_call.params)
        add_new_dependencies(receiver_class, dependencies, method_name)
      end
    end
  end
end

#add_dependency_based_on_internal_callsObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 34

def add_dependency_based_on_internal_calls
  3.times do
    @method_definitions.each do |class_name, method_definitions|
      method_definitions.each do |method_definition|
        method_definition.method_calls.each do |method_call|
          receiver_class = method_call.class_name
          method_name = method_call.method_name
          formal_params = extract_formal_parameter(method_call.params)
          dependencies = extract_param_classes(method_definition.args, formal_params)
          add_new_dependencies(receiver_class, dependencies, method_name)
        end
      end
    end
  end
end

#add_new_dependencies(receiver_class, dependencies, method_name) ⇒ Object



75
76
77
78
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 75

def add_new_dependencies(receiver_class, dependencies, method_name)
  add_to_dependencies(receiver_class, dependencies)
  add_to_method_definitions(receiver_class, dependencies, method_name)
end

#add_new_params_dependency(method_definition, dependencies) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 105

def add_new_params_dependency(method_definition, dependencies)
  args = method_definition.args.keys
  dependencies.each_with_index do |deps, i|
    # aqui mantemos a ordem dos parametros formais
    formal_parameter_name = method_definition.args[args[i]]
    if formal_parameter_name
      deps.each do |dep|
        begin
          formal_parameter_name.add(dep)
        rescue
          binding.pry
        end
      end
    end
  end
end

#add_to_dependencies(receiver_class, dependencies) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 80

def add_to_dependencies(receiver_class, dependencies)
  dep_class = @dependencies[receiver_class]
  if dep_class.nil?
    @dependencies[receiver_class] = Set.new
    dep_class = @dependencies[receiver_class]
  end
  # utilizamos o flatten pois aqui não importa a posição
  # do parametro formal
  dependencies.flatten.each do |dependency|
    dep_class.add(dependency)
  end
end

#add_to_method_definitions(receiver_class, dependencies, method_name) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 93

def add_to_method_definitions(receiver_class, dependencies, method_name)
  method_definitions = @method_definitions[receiver_class]
  if method_definitions
    method_definitions.each do |method_definition|
      if method_definition.method_name == method_name
        add_new_params_dependency(method_definition, dependencies)
        break
      end
    end
  end
end

#extract_formal_parameter(params) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 65

def extract_formal_parameter(params)
  formal_params = []
  params.each do |param|
    if param.class == Symbol
      formal_params << param
    end
  end
  formal_params
end

#extract_param_classes(method_args, params) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 50

def extract_param_classes(method_args, params)
  dependencies = []
  params.each do |param|
    if param.class == Symbol
      type = method_args[param]
      type = type.to_a
      dependencies << type
    elsif param.class == String
      type = [param]
      dependencies << type
    end
  end
  dependencies
end

#total_depsObject



13
14
15
16
17
18
19
# File 'lib/archruby/ruby/type_inference/type_inference_checker.rb', line 13

def total_deps
  total_dep = 0
  @dependencies.each do |class_name, deps|
    total_dep += deps.size
  end
  total_dep
end