Module: Tapioca::Runtime::Trackers::ConstantDefinition

Extended by:
Reflection, Tracker
Defined in:
lib/tapioca/runtime/trackers/constant_definition.rb

Overview

Registers a TracePoint immediately upon load to track points at which classes and modules are opened for definition. This is used to track correspondence between classes/modules and files, as this information isn’t available in the ruby runtime without extra accounting.

Constant Summary

Constants included from Reflection

Reflection::ANCESTORS_METHOD, Reflection::CLASS_METHOD, Reflection::CONSTANTS_METHOD, Reflection::EQUAL_METHOD, Reflection::METHOD_METHOD, Reflection::NAME_METHOD, Reflection::OBJECT_ID_METHOD, Reflection::PRIVATE_INSTANCE_METHODS_METHOD, Reflection::PROTECTED_INSTANCE_METHODS_METHOD, Reflection::PUBLIC_INSTANCE_METHODS_METHOD, Reflection::REQUIRED_FROM_LABELS, Reflection::SINGLETON_CLASS_METHOD, Reflection::SUPERCLASS_METHOD, Reflection::SignatureBlockError, Reflection::UNDEFINED_CONSTANT

Class Method Summary collapse

Methods included from Tracker

disable!, enabled?, extended, with_disabled_tracker

Methods included from Reflection

abstract_type_of, ancestors_of, are_equal?, attached_class_of, class_of, const_source_location, constant_defined?, constantize, constants_of, descendants_of, file_candidates_for, final_module?, inherited_ancestors_of, method_of, name_of, name_of_type, object_id_of, private_instance_methods_of, protected_instance_methods_of, public_instance_methods_of, qualified_name_of, resolve_loc, sealed_module?, signature_of, signature_of!, singleton_class_of, superclass_of

Class Method Details

.build_source_location(tp, locations) ⇒ Object



58
59
60
61
62
63
64
65
# File 'lib/tapioca/runtime/trackers/constant_definition.rb', line 58

def build_source_location(tp, locations)
  loc = resolve_loc(locations)
  file = loc&.file
  line = loc&.line
  lineno = file && File.identical?(file, tp.path) ? tp.lineno : (line || 0)

  SourceLocation.from_loc([file || "", lineno])
end

.disable!Object



52
53
54
55
56
# File 'lib/tapioca/runtime/trackers/constant_definition.rb', line 52

def disable!
  @class_tracepoint.disable
  @creturn_tracepoint.disable
  super
end

.files_for(klass) ⇒ Object

Returns the files in which this class or module was opened. Doesn’t know about situations where the class was opened prior to requireing, or where metaprogramming was used via eval, etc. : (T::Module klass) -> Set



87
88
89
# File 'lib/tapioca/runtime/trackers/constant_definition.rb', line 87

def files_for(klass)
  locations_for(klass).map(&:file).to_set
end

.locations_for(klass) ⇒ Object

: (T::Module klass) -> Set



92
93
94
# File 'lib/tapioca/runtime/trackers/constant_definition.rb', line 92

def locations_for(klass)
  @class_files.fetch(klass, Set.new)
end

.register(constant, loc) ⇒ Object



67
68
69
70
71
# File 'lib/tapioca/runtime/trackers/constant_definition.rb', line 67

def register(constant, loc)
  return unless loc

  (@class_files[constant] ||= Set.new) << loc
end

.register_cname(cname, namespace, locations) ⇒ Object



73
74
75
76
77
78
79
80
81
# File 'lib/tapioca/runtime/trackers/constant_definition.rb', line 73

def register_cname(cname, namespace, locations)
  return if namespace.autoload?(cname)

  key = Reflection.constantize(cname, namespace: namespace, inherit: true)
  return unless Module === key

  loc = Reflection.resolve_loc(locations)
  ConstantDefinition.register(key, loc)
end