From 05e8d408929dcf144702008668786279fcb2f5d7 Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Wed, 26 Jul 2023 18:30:16 -0400 Subject: [PATCH 1/2] Autoload with Zeitwerk --- debug.gemspec | 1 + lib/debug/config.rb | 7 +++++-- lib/debug/open.rb | 50 ++++++++++++++++++++++++++++++++++++++++++++ lib/debug/session.rb | 6 +++--- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/debug.gemspec b/debug.gemspec index f05d0faa7..69358d5d9 100644 --- a/debug.gemspec +++ b/debug.gemspec @@ -29,4 +29,5 @@ Gem::Specification.new do |spec| spec.add_dependency "irb", ">= 1.5.0" # for binding.irb(show_code: false) spec.add_dependency "reline", ">= 0.3.1" + spec.add_development_dependency "zeitwerk", "~> 2.6.9" end diff --git a/lib/debug/config.rb b/lib/debug/config.rb index f6f1a066d..8d421c74f 100644 --- a/lib/debug/config.rb +++ b/lib/debug/config.rb @@ -142,7 +142,9 @@ def update conf end if_updated old_conf, conf, :postmortem do |_, new_p| - if defined?(SESSION) + # puts("const_defined? #{ DEBUGGER__.const_defined?(:SESSION)}, defined? #{defined?(SESSION)}") + # if defined?(SESSION) + if DEBUGGER__.const_defined?(:SESSION) SESSION.postmortem = new_p end end @@ -152,7 +154,8 @@ def update conf end if_updated old_conf, conf, :no_sigint_hook do |old, new| - if defined?(SESSION) + # if defined?(SESSION) + if DEBUGGER__.const_defined?(:SESSION) SESSION.set_no_sigint_hook old, new end end diff --git a/lib/debug/open.rb b/lib/debug/open.rb index ceb41d052..290e31756 100644 --- a/lib/debug/open.rb +++ b/lib/debug/open.rb @@ -6,6 +6,56 @@ # If RUBY_DEBUG_PORT envval is provided (digits), open TCP/IP port. # Otherwise, UNIX domain socket is used. # +require "awesome_print" +require "pry" +require "zeitwerk" + +module DEBUGGER__ + # Define these dummy constants so we silence errors like: + # expected file lib/debug/local.rb to define constant DEBUGGER__::Local, but didn't (Zeitwerk::NameError) + module Local; end + module Server; end + module ServerCdp; end + module ServerDap; end + module Version; end + + # List special cases where constants are defined in files where they wouldn't otherwise be found + autoload(:CONFIG, "#{__dir__}/config.rb") + autoload(:SESSION, "#{__dir__}/config.rb") + # autoload(:NaiveString, "#{__dir__}/server_dap.rb") + autoload(:SkipPathHelper, "#{__dir__}/thread_client.rb") + autoload(:UI_Base, "#{__dir__}/session.rb") +end + +loader = Zeitwerk::Loader.new +loader.tag = File.basename(__FILE__, ".rb") +loader.inflector = Zeitwerk::GemInflector.new(__FILE__) +# loader.push_dir(__dir__) + +loader.ignore( + "lib/debug/start.rb", + "lib/debug/open.rb", + "lib/debug/open_nonstop.rb", + "lib/debug/prelude.rb", + "lib/debug/dap_custom/traceInspector.rb" +) + +# Configure a special-case for this mangled module name +loader.push_dir(__dir__, namespace: DEBUGGER__) +# loader.inflector.inflect( +# "debug" => "DEBUGGER__" +# ) + +loader.enable_reloading +loader.setup +loader.log! +puts "Zeitwerk configured!" + +# ap({ roots: loader.send(:roots), ignored_paths: loader.send(:ignored_paths), all_paths: Zeitwerk::Loader.all_dirs }) +# loader.eager_load +# puts("loaded constants under DEBUGGER__:") +# ap(DEBUGGER__.constants) +# exit(0) require_relative 'session' return unless defined?(DEBUGGER__) diff --git a/lib/debug/session.rb b/lib/debug/session.rb index e9d95775c..e35b168ee 100644 --- a/lib/debug/session.rb +++ b/lib/debug/session.rb @@ -2212,7 +2212,7 @@ def self.open_tcp host: nil, port:, nonstop: false, **kw CONFIG.set_config(**kw) require_relative 'server' - if defined? SESSION + if DEBUGGER__.const_defined?(:SESSION) SESSION.reset_ui UI_TcpServer.new(host: host, port: port) else initialize_session{ UI_TcpServer.new(host: host, port: port) } @@ -2225,7 +2225,7 @@ def self.open_unix sock_path: nil, sock_dir: nil, nonstop: false, **kw CONFIG.set_config(**kw) require_relative 'server' - if defined? SESSION + if DEBUGGER__::const_defined?(:SESSION) SESSION.reset_ui UI_UnixDomainServer.new(sock_dir: sock_dir, sock_path: sock_path) else initialize_session{ UI_UnixDomainServer.new(sock_dir: sock_dir, sock_path: sock_path) } @@ -2376,7 +2376,7 @@ def self.log level, msg @logfile = STDERR unless defined? @logfile return if @logfile.closed? - if defined? SESSION + if DEBUGGER__::const_defined?(:SESSION) pi = SESSION.process_info process_info = pi ? "[#{pi}]" : nil end From fcb2e897f7e0c113afe4b4686d847ef68ef9fabb Mon Sep 17 00:00:00 2001 From: Alexander Momchilov Date: Fri, 28 Jul 2023 17:31:24 -0400 Subject: [PATCH 2/2] Detect inflections automatically with Syntax Tree --- Gemfile | 4 ++++ debug.gemspec | 1 - lib/debug/config.rb | 7 ++----- lib/debug/open.rb | 39 ++------------------------------------- lib/debug/session.rb | 6 +++--- 5 files changed, 11 insertions(+), 46 deletions(-) diff --git a/Gemfile b/Gemfile index c59ccbe1a..15a2a60d9 100644 --- a/Gemfile +++ b/Gemfile @@ -7,3 +7,7 @@ gem "rake-compiler" gem "test-unit", "~> 3.0" gem "test-unit-rr" gem "json-schema" + +group :development do + gem "zeitwerk", git: "https://github.com/paracycle/zeitwerk.git", branch: "uk-add-syntax-tree-inflector" +end diff --git a/debug.gemspec b/debug.gemspec index 69358d5d9..f05d0faa7 100644 --- a/debug.gemspec +++ b/debug.gemspec @@ -29,5 +29,4 @@ Gem::Specification.new do |spec| spec.add_dependency "irb", ">= 1.5.0" # for binding.irb(show_code: false) spec.add_dependency "reline", ">= 0.3.1" - spec.add_development_dependency "zeitwerk", "~> 2.6.9" end diff --git a/lib/debug/config.rb b/lib/debug/config.rb index 8d421c74f..f6f1a066d 100644 --- a/lib/debug/config.rb +++ b/lib/debug/config.rb @@ -142,9 +142,7 @@ def update conf end if_updated old_conf, conf, :postmortem do |_, new_p| - # puts("const_defined? #{ DEBUGGER__.const_defined?(:SESSION)}, defined? #{defined?(SESSION)}") - # if defined?(SESSION) - if DEBUGGER__.const_defined?(:SESSION) + if defined?(SESSION) SESSION.postmortem = new_p end end @@ -154,8 +152,7 @@ def update conf end if_updated old_conf, conf, :no_sigint_hook do |old, new| - # if defined?(SESSION) - if DEBUGGER__.const_defined?(:SESSION) + if defined?(SESSION) SESSION.set_no_sigint_hook old, new end end diff --git a/lib/debug/open.rb b/lib/debug/open.rb index 290e31756..f5d689aef 100644 --- a/lib/debug/open.rb +++ b/lib/debug/open.rb @@ -6,32 +6,10 @@ # If RUBY_DEBUG_PORT envval is provided (digits), open TCP/IP port. # Otherwise, UNIX domain socket is used. # -require "awesome_print" -require "pry" -require "zeitwerk" - -module DEBUGGER__ - # Define these dummy constants so we silence errors like: - # expected file lib/debug/local.rb to define constant DEBUGGER__::Local, but didn't (Zeitwerk::NameError) - module Local; end - module Server; end - module ServerCdp; end - module ServerDap; end - module Version; end - # List special cases where constants are defined in files where they wouldn't otherwise be found - autoload(:CONFIG, "#{__dir__}/config.rb") - autoload(:SESSION, "#{__dir__}/config.rb") - # autoload(:NaiveString, "#{__dir__}/server_dap.rb") - autoload(:SkipPathHelper, "#{__dir__}/thread_client.rb") - autoload(:UI_Base, "#{__dir__}/session.rb") -end - -loader = Zeitwerk::Loader.new -loader.tag = File.basename(__FILE__, ".rb") -loader.inflector = Zeitwerk::GemInflector.new(__FILE__) -# loader.push_dir(__dir__) +require "zeitwerk" +loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false) loader.ignore( "lib/debug/start.rb", "lib/debug/open.rb", @@ -39,24 +17,11 @@ module Version; end "lib/debug/prelude.rb", "lib/debug/dap_custom/traceInspector.rb" ) - -# Configure a special-case for this mangled module name -loader.push_dir(__dir__, namespace: DEBUGGER__) -# loader.inflector.inflect( -# "debug" => "DEBUGGER__" -# ) - loader.enable_reloading loader.setup loader.log! puts "Zeitwerk configured!" -# ap({ roots: loader.send(:roots), ignored_paths: loader.send(:ignored_paths), all_paths: Zeitwerk::Loader.all_dirs }) -# loader.eager_load -# puts("loaded constants under DEBUGGER__:") -# ap(DEBUGGER__.constants) -# exit(0) - require_relative 'session' return unless defined?(DEBUGGER__) diff --git a/lib/debug/session.rb b/lib/debug/session.rb index e35b168ee..e9d95775c 100644 --- a/lib/debug/session.rb +++ b/lib/debug/session.rb @@ -2212,7 +2212,7 @@ def self.open_tcp host: nil, port:, nonstop: false, **kw CONFIG.set_config(**kw) require_relative 'server' - if DEBUGGER__.const_defined?(:SESSION) + if defined? SESSION SESSION.reset_ui UI_TcpServer.new(host: host, port: port) else initialize_session{ UI_TcpServer.new(host: host, port: port) } @@ -2225,7 +2225,7 @@ def self.open_unix sock_path: nil, sock_dir: nil, nonstop: false, **kw CONFIG.set_config(**kw) require_relative 'server' - if DEBUGGER__::const_defined?(:SESSION) + if defined? SESSION SESSION.reset_ui UI_UnixDomainServer.new(sock_dir: sock_dir, sock_path: sock_path) else initialize_session{ UI_UnixDomainServer.new(sock_dir: sock_dir, sock_path: sock_path) } @@ -2376,7 +2376,7 @@ def self.log level, msg @logfile = STDERR unless defined? @logfile return if @logfile.closed? - if DEBUGGER__::const_defined?(:SESSION) + if defined? SESSION pi = SESSION.process_info process_info = pi ? "[#{pi}]" : nil end