diff --git a/lib/tapioca.rb b/lib/tapioca.rb index 157daa2ef..7220738ec 100644 --- a/lib/tapioca.rb +++ b/lib/tapioca.rb @@ -6,6 +6,18 @@ module Tapioca extend T::Sig + @traces = T.let([], T::Array[TracePoint]) + + sig { params(trace_name: Symbol, block: T.proc.params(arg0: TracePoint).void).void } + def self.register_trace(trace_name, &block) + @traces << TracePoint.trace(trace_name, &block) + end + + sig { void } + def self.disable_traces + @traces.each(&:disable) + end + sig do type_parameters(:Result) .params(blk: T.proc.returns(T.type_parameter(:Result))) diff --git a/lib/tapioca/cli.rb b/lib/tapioca/cli.rb index f5a2b40f7..3f162d66c 100644 --- a/lib/tapioca/cli.rb +++ b/lib/tapioca/cli.rb @@ -260,6 +260,8 @@ def gem(*gems) option :payload, type: :boolean, desc: "Check shims against Sorbet's payload", default: true option :workers, aliases: ["-w"], type: :numeric, desc: "Number of parallel workers (default: auto)" def check_shims + Tapioca.disable_traces + command = Commands::CheckShims.new( gem_rbi_dir: options[:gem_rbi_dir], dsl_rbi_dir: options[:dsl_rbi_dir], diff --git a/lib/tapioca/runtime/trackers/constant_definition.rb b/lib/tapioca/runtime/trackers/constant_definition.rb index 12b1bd347..7476187b8 100644 --- a/lib/tapioca/runtime/trackers/constant_definition.rb +++ b/lib/tapioca/runtime/trackers/constant_definition.rb @@ -20,7 +20,7 @@ class ConstantLocation < T::Struct @class_files = {}.compare_by_identity # Immediately activated upon load. Observes class/module definition. - TracePoint.trace(:class) do |tp| + Tapioca.register_trace(:class) do |tp| next if tp.self.singleton_class? key = tp.self @@ -40,7 +40,7 @@ class ConstantLocation < T::Struct (@class_files[key] ||= Set.new) << loc end - TracePoint.trace(:c_return) do |tp| + Tapioca.register_trace(:c_return) do |tp| next unless tp.method_id == :new next unless Module === tp.return_value