Module: MetzScan::Analyzers::SubclassOverridePressure::Metadata

Included in:
MetzScan::Analyzers::SubclassOverridePressure
Defined in:
lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb

Instance Method Summary collapse

Instance Method Details

#abstract_hook_body?(body_kind) ⇒ Boolean

Returns:

  • (Boolean)


68
69
70
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 68

def abstract_hook_body?(body_kind)
  %w[abstract_raise empty default_value].include?(body_kind)
end

#body_fact_metadata(family) ⇒ Object



34
35
36
37
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 34

def (family)
  { "base_method_body_kind" => family.base_method_body_kind,
    "overrides_calling_super_count" => family.overrides_calling_super_count }
end

#category_metadata(category) ⇒ Object



18
19
20
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 18

def (category)
  { "project_analyzer_category" => category, "subclass_override_category" => category }
end

#core_project_analyzer_metadata(family) ⇒ Object



14
15
16
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 14

def (family)
  (subclass_override_category(family)).merge((family))
end

#count_metadata(family) ⇒ Object



39
40
41
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 39

def (family)
  { "descendant_count" => family.descendants.size, "override_count" => family.overrides.size }
end

#family_identity_metadata(family) ⇒ Object



28
29
30
31
32
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 28

def (family)
  { "base_name" => family.base.name, "method_name" => family.method_name,
    "method_identity" => family.method_identity, "receiver_kind" => family.receiver_kind,
    "root_kind" => family.root_kind }
end

#family_metadata(family) ⇒ Object



22
23
24
25
26
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 22

def (family)
  (family)
    .merge((family))
    .merge((family))
end

#override_identity_location(declaration) ⇒ Object



53
54
55
56
57
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 53

def override_identity_location(declaration)
  { "owner_name" => declaration.owner_name, "path" => declaration.path, "line" => declaration.line,
    "receiver_kind" => receiver_kind_for(declaration),
    "method_identity" => method_identity_for(declaration) }
end

#override_location(family, declaration) ⇒ Object



47
48
49
50
51
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 47

def override_location(family, declaration)
  override_identity_location(declaration)
    .merge("calls_super" => family.override_body_facts.fetch(declaration.owner_name).calls_super)
    .compact
end

#override_locations(family) ⇒ Object



43
44
45
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 43

def override_locations(family)
  family.overrides.map { |declaration| override_location(family, declaration) }
end

#project_analyzer_metadata_for(family) ⇒ Object



7
8
9
10
11
12
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 7

def (family)
  (family)
    .merge("overriding_descendants" => family.overrides.map(&:owner_name),
           "override_locations" => override_locations(family))
    .compact
end

#subclass_override_category(family) ⇒ Object



59
60
61
62
63
64
65
66
# File 'lib/metz_scan/analyzers/subclass_override_pressure/metadata.rb', line 59

def subclass_override_category(family)
  return "broad_root_override" if family.root_kind
  return "abstract_hook_override" if abstract_hook_body?(family.base_method_body_kind)
  return "cooperative_override" if family.overrides_calling_super_count.positive?
  return "replacement_override" unless family.base_method_body_kind == "unknown"

  "subclass_override"
end