Skip to content

Commit 435edab

Browse files
committed
Prevent crash during ActiveRecord const check
1 parent 8c0e73a commit 435edab

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

lib/ruby_lsp/ruby_lsp_rails/server.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def execute(request, params)
8282
sig { params(model_name: String).returns(T::Hash[Symbol, T.untyped]) }
8383
def resolve_database_info_from_model(model_name)
8484
const = ActiveSupport::Inflector.safe_constantize(model_name)
85-
unless const && defined?(ActiveRecord) && const < ActiveRecord::Base && !const.abstract_class?
85+
unless active_record_model?(const)
8686
return {
8787
result: nil,
8888
}
@@ -104,6 +104,17 @@ def resolve_database_info_from_model(model_name)
104104
rescue => e
105105
{ error: e.full_message(highlight: false) }
106106
end
107+
108+
sig { params(const: T.untyped).returns(T::Boolean) }
109+
def active_record_model?(const)
110+
!!(
111+
const &&
112+
defined?(ActiveRecord) &&
113+
ActiveRecord::Base > const &&
114+
# const < ActiveRecord::Base
115+
!const.abstract_class?
116+
)
117+
end
107118
end
108119
end
109120
end

test/ruby_lsp_rails/server_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,19 @@ class ServerTest < ActiveSupport::TestCase
2424
assert_nil(response.fetch(:result))
2525
end
2626

27+
test "doesn't fail if the class overrides `<`" do
28+
class TestClassWithOverwrittenLessThan
29+
class << self
30+
def <(other)
31+
raise
32+
end
33+
end
34+
end
35+
36+
response = @server.execute("model", { name: "TestClassWithOverwrittenLessThan" })
37+
assert_nil(response.fetch(:result))
38+
end
39+
2740
test "handles older Rails version which don't have `schema_dump_path`" do
2841
ActiveRecord::Tasks::DatabaseTasks.send(:alias_method, :old_schema_dump_path, :schema_dump_path)
2942
ActiveRecord::Tasks::DatabaseTasks.undef_method(:schema_dump_path)

0 commit comments

Comments
 (0)