Skip to content

Commit 4ba3f0f

Browse files
authored
Merge pull request #265 from pocke/absolute_type_name
absolute type name
2 parents 81cae00 + 43543f7 commit 4ba3f0f

File tree

8 files changed

+154
-132
lines changed

8 files changed

+154
-132
lines changed

lib/rbs_rails/active_record.rb

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ class Generator
1717
def initialize(klass, dependencies:)
1818
@klass = klass
1919
@dependencies = dependencies
20-
@klass_name = Util.module_name(klass)
20+
@klass_name = Util.module_name(klass, abs: false)
2121

22-
namespaces = klass_name.split('::').tap{ |names| names.pop }
22+
namespaces = klass_name(abs: false).split('::').tap{ |names| names.pop }
2323
@dependencies << namespaces.join('::') unless namespaces.empty?
2424
end
2525

@@ -30,7 +30,7 @@ def generate
3030
private def klass_decl
3131
<<~RBS
3232
#{header}
33-
extend _ActiveRecord_Relation_ClassMethods[#{klass_name}, #{relation_class_name}, #{pk_type}]
33+
extend ::_ActiveRecord_Relation_ClassMethods[#{klass_name}, #{relation_class_name}, #{pk_type}]
3434
3535
#{columns}
3636
#{associations}
@@ -62,7 +62,7 @@ def generate
6262

6363
private def generated_relation_methods_decl
6464
<<~RBS
65-
module GeneratedRelationMethods
65+
module #{generated_relation_methods_name(abs: false)}
6666
#{enum_scope_methods(singleton: false)}
6767
#{scopes(singleton: false)}
6868
#{delegated_type_scope(singleton: false)}
@@ -72,33 +72,33 @@ module GeneratedRelationMethods
7272

7373
private def relation_decl
7474
<<~RBS
75-
class #{relation_class_name} < ::ActiveRecord::Relation
76-
include GeneratedRelationMethods
77-
include _ActiveRecord_Relation[#{klass_name}, #{pk_type}]
78-
include Enumerable[#{klass_name}]
75+
class #{relation_class_name(abs: false)} < ::ActiveRecord::Relation
76+
include #{generated_relation_methods_name}
77+
include ::_ActiveRecord_Relation[#{klass_name}, #{pk_type}]
78+
include ::Enumerable[#{klass_name}]
7979
end
8080
RBS
8181
end
8282

8383
private def collection_proxy_decl
8484
<<~RBS
8585
class ActiveRecord_Associations_CollectionProxy < ::ActiveRecord::Associations::CollectionProxy
86-
include GeneratedRelationMethods
87-
include _ActiveRecord_Relation[#{klass_name}, #{pk_type}]
86+
include #{generated_relation_methods_name}
87+
include ::_ActiveRecord_Relation[#{klass_name}, #{pk_type}]
8888
end
8989
RBS
9090
end
9191

9292
private def header
9393
namespace = +''
94-
klass_name.split('::').map do |mod_name|
94+
klass_name(abs: false).split('::').map do |mod_name|
9595
namespace += "::#{mod_name}"
9696
mod_object = Object.const_get(namespace)
9797
case mod_object
9898
when Class
9999
# @type var superclass: Class
100100
superclass = _ = mod_object.superclass
101-
superclass_name = Util.module_name(superclass)
101+
superclass_name = Util.module_name(superclass, abs: false)
102102
@dependencies << superclass_name
103103

104104
"class #{mod_name} < ::#{superclass_name}"
@@ -111,7 +111,7 @@ class ActiveRecord_Associations_CollectionProxy < ::ActiveRecord::Associations::
111111
end
112112

113113
private def footer
114-
"end\n" * klass_name.split('::').size
114+
"end\n" * klass_name(abs: false).split('::').size
115115
end
116116

117117
private def associations
@@ -133,9 +133,9 @@ class ActiveRecord_Associations_CollectionProxy < ::ActiveRecord::Associations::
133133

134134
<<~RUBY.chomp
135135
def #{a.name}: () -> #{collection_type}
136-
def #{a.name}=: (#{collection_type} | Array[#{type}]) -> (#{collection_type} | Array[#{type}])
137-
def #{singular_name}_ids: () -> Array[Integer]
138-
def #{singular_name}_ids=: (Array[Integer]) -> Array[Integer]
136+
def #{a.name}=: (#{collection_type} | ::Array[#{type}]) -> (#{collection_type} | ::Array[#{type}])
137+
def #{singular_name}_ids: () -> ::Array[::Integer]
138+
def #{singular_name}_ids=: (::Array[::Integer]) -> ::Array[::Integer]
139139
RUBY
140140
end.join("\n")
141141
end
@@ -190,17 +190,17 @@ def reload_#{a.name}: () -> #{type_optional}
190190
case reflection.macro
191191
when :has_one_attached
192192
<<~EOS
193-
def #{name}: () -> ActiveStorage::Attached::One
194-
def #{name}=: (ActionDispatch::Http::UploadedFile) -> ActionDispatch::Http::UploadedFile
195-
| (Rack::Test::UploadedFile) -> Rack::Test::UploadedFile
196-
| (ActiveStorage::Blob) -> ActiveStorage::Blob
197-
| (String) -> String
198-
| ({ io: IO, filename: String, content_type: String? }) -> { io: IO, filename: String, content_type: String? }
193+
def #{name}: () -> ::ActiveStorage::Attached::One
194+
def #{name}=: (::ActionDispatch::Http::UploadedFile) -> ::ActionDispatch::Http::UploadedFile
195+
| (::Rack::Test::UploadedFile) -> ::Rack::Test::UploadedFile
196+
| (::ActiveStorage::Blob) -> ::ActiveStorage::Blob
197+
| (::String) -> ::String
198+
| ({ io: ::IO, filename: ::String, content_type: ::String? }) -> { io: ::IO, filename: ::String, content_type: ::String? }
199199
| (nil) -> nil
200200
EOS
201201
when :has_many_attached
202202
<<~EOS
203-
def #{name}: () -> ActiveStorage::Attached::Many
203+
def #{name}: () -> ::ActiveStorage::Attached::Many
204204
def #{name}=: (untyped) -> untyped
205205
EOS
206206
else
@@ -460,7 +460,7 @@ def authenticate_#{attribute}: (String) -> (#{klass_name} | false)
460460
private def parse_model_file
461461
return @parse_model_file if defined?(@parse_model_file)
462462

463-
path = Rails.root.join('app/models/', klass_name.underscore + '.rb')
463+
path = Rails.root.join('app/models/', klass_name(abs: false).underscore + '.rb')
464464
return @parse_model_file = nil unless path.exist?
465465
return [] unless path.exist?
466466

@@ -479,15 +479,24 @@ def authenticate_#{attribute}: (String) -> (#{klass_name} | false)
479479
end
480480
end
481481

482-
private def relation_class_name
483-
"ActiveRecord_Relation"
482+
private def relation_class_name(abs: true)
483+
abs ? "#{klass_name}::ActiveRecord_Relation" : "ActiveRecord_Relation"
484484
end
485485

486+
private def klass_name(abs: true)
487+
abs ? "::#{@klass_name}" : @klass_name
488+
end
489+
490+
private def generated_relation_methods_name(abs: true)
491+
abs ? "#{klass_name}::GeneratedRelationMethods" : "GeneratedRelationMethods"
492+
end
493+
494+
486495
private def columns
487496
mod_sig = +"module GeneratedAttributeMethods\n"
488497
mod_sig << klass.columns.map do |col|
489498
class_name = if enum_definitions.any? { |hash| hash.key?(col.name) || hash.key?(col.name.to_sym) }
490-
'String'
499+
'::String'
491500
else
492501
sql_type_to_class(col.type)
493502
end
@@ -502,12 +511,12 @@ def #{col.name}_change: () -> [#{class_name_opt}, #{class_name_opt}]
502511
def #{col.name}_will_change!: () -> void
503512
def #{col.name}_was: () -> #{class_name_opt}
504513
def #{col.name}_previously_changed?: () -> bool
505-
def #{col.name}_previous_change: () -> Array[#{class_name_opt}]?
514+
def #{col.name}_previous_change: () -> ::Array[#{class_name_opt}]?
506515
def #{col.name}_previously_was: () -> #{class_name_opt}
507516
def #{col.name}_before_last_save: () -> #{class_name_opt}
508-
def #{col.name}_change_to_be_saved: () -> Array[#{class_name_opt}]?
517+
def #{col.name}_change_to_be_saved: () -> ::Array[#{class_name_opt}]?
509518
def #{col.name}_in_database: () -> #{class_name_opt}
510-
def saved_change_to_#{col.name}: () -> Array[#{class_name_opt}]?
519+
def saved_change_to_#{col.name}: () -> ::Array[#{class_name_opt}]?
511520
def saved_change_to_#{col.name}?: () -> bool
512521
def will_save_change_to_#{col.name}?: () -> bool
513522
def restore_#{col.name}!: () -> void
@@ -528,33 +537,33 @@ def clear_#{col.name}_change: () -> void
528537
private def sql_type_to_class(t)
529538
case t
530539
when :integer
531-
'Integer'
540+
'::Integer'
532541
when :float
533-
'Float'
542+
'::Float'
534543
when :decimal
535-
'BigDecimal'
544+
'::BigDecimal'
536545
when :string, :text, :citext, :uuid, :binary
537-
'String'
546+
'::String'
538547
when :datetime
539-
'ActiveSupport::TimeWithZone'
548+
'::ActiveSupport::TimeWithZone'
540549
when :boolean
541550
"bool"
542551
when :jsonb, :json
543552
"untyped"
544553
when :date
545-
'Date'
554+
'::Date'
546555
when :time
547-
'Time'
556+
'::Time'
548557
when :inet
549-
"IPAddr"
558+
"::IPAddr"
550559
else
551560
# Unknown column type, give up
552561
'untyped'
553562
end
554563
end
555564

556565
private
557-
attr_reader :klass, :klass_name
566+
attr_reader :klass
558567
end
559568
end
560569
end

lib/rbs_rails/dependency_builder.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def initialize
1010
def build
1111
dep_rbs = +""
1212
deps.uniq!
13-
while dep = deps.shift
13+
while dep = shift
1414
next unless done.add?(dep)
1515

1616
case dep_object = Object.const_get(dep)
@@ -39,5 +39,9 @@ def build
3939
Util.format_rbs(dep_rbs)
4040
end
4141
end
42+
43+
private def shift
44+
deps.shift&.sub(/^::/, '')
45+
end
4246
end
4347
end

lib/rbs_rails/util.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ module Util
44

55
extend self
66

7-
def module_name(mod)
8-
MODULE_NAME.bind_call(mod)
7+
def module_name(mod, abs: true)
8+
name = MODULE_NAME.bind_call(mod)
9+
name ="::#{name}" if abs
10+
name
911
end
1012

1113
def format_rbs(rbs)

sig/rbs_rails/active_record.rbs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class RbsRails::ActiveRecord::Generator
77
@parse_model_file: nil | Parser::AST::Node
88
@dependencies: Array[String]
99
@enum_definitions: Array[Hash[Symbol, untyped]]
10+
@klass_name: String
1011

1112
IGNORED_ENUM_KEYS: Array[Symbol]
1213

@@ -68,7 +69,11 @@ class RbsRails::ActiveRecord::Generator
6869
def traverse: (Parser::AST::Node node) { (Parser::AST::Node) -> untyped } -> untyped
6970
| (Parser::AST::Node node) -> Enumerator[Parser::AST::Node, untyped]
7071

71-
def relation_class_name: () -> untyped
72+
def relation_class_name: (?abs: boolish) -> String
73+
74+
def klass_name: (?abs: boolish) -> String
75+
76+
def generated_relation_methods_name: (?abs: boolish) -> String
7277

7378
def columns: () -> untyped
7479

@@ -79,6 +84,4 @@ class RbsRails::ActiveRecord::Generator
7984
private
8085

8186
attr_reader klass: singleton(ActiveRecord::Base)
82-
83-
attr_reader klass_name: String
8487
end

sig/rbs_rails/dependency_builder.rbs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ module RbsRails
66
def initialize: () -> void
77

88
def build: () -> (String | nil)
9+
10+
private
11+
12+
def shift: () -> (String | nil)
913
end
1014
end

sig/rbs_rails/util.rbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module RbsRails
44

55
extend Util
66

7-
def module_name: (Module) -> String
7+
def module_name: (Module, ?abs: boolish) -> String
88

99
def format_rbs: (String) -> String
1010
end

0 commit comments

Comments
 (0)