Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix root namespace #472

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/tapioca/compilers/symbol_table/symbol_generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,11 @@ def generate

private

sig { params(name: T.nilable(String)).void }
def add_to_symbol_queue(name)
return unless name

name = name.delete_prefix("::")
@symbol_queue << name unless symbols.include?(name) || symbol_ignored?(name)
end

Expand Down
17 changes: 16 additions & 1 deletion lib/tapioca/sorbet_ext/name_patch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,22 @@ module Types
class Simple
module NamePatch
def name
@name ||= ::Tapioca::Reflection.name_of(@raw_type).freeze
@qualified_name ||= qualified_name_of(@raw_type).freeze
end

private

NAME_METHOD = Module.instance_method(:name)

def qualified_name_of(constant)
name = NAME_METHOD.bind(constant).call
return if name.nil?

if name.start_with?("::")
name
else
"::#{name}"
end
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ module HelperMethods
sig { returns(T.untyped) }
def current_user_name; end

sig { params(user_id: Integer).void }
sig { params(user_id: ::Integer).void }
def notify_user(user_id); end
end

Expand Down Expand Up @@ -206,7 +206,7 @@ module HelperMethods
sig { returns(T.untyped) }
def current_user_name; end

sig { params(user_id: Integer).void }
sig { params(user_id: ::Integer).void }
def notify_user(user_id); end
end

Expand Down Expand Up @@ -251,7 +251,7 @@ module HelperMethods
sig { params(user: T.untyped).returns(T.untyped) }
def greet(user); end

sig { params(user_id: Integer).void }
sig { params(user_id: ::Integer).void }
def notify_user(user_id); end
end

Expand Down
2 changes: 1 addition & 1 deletion spec/tapioca/compilers/dsl/action_mailer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def notify_customer(customer_id)
# typed: strong

class NotifierMailer
sig { params(customer_id: Integer).returns(::ActionMailer::MessageDelivery) }
sig { params(customer_id: ::Integer).returns(::ActionMailer::MessageDelivery) }
def self.notify_customer(customer_id); end
end
RBI
Expand Down
4 changes: 2 additions & 2 deletions spec/tapioca/compilers/dsl/active_job_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ def perform(user_id)
# typed: strong

class NotifyJob
sig { params(user_id: Integer).returns(T.any(NotifyJob, FalseClass)) }
sig { params(user_id: ::Integer).returns(T.any(NotifyJob, FalseClass)) }
def self.perform_later(user_id); end

sig { params(user_id: Integer).void }
sig { params(user_id: ::Integer).void }
def self.perform_now(user_id); end
end
RBI
Expand Down
16 changes: 8 additions & 8 deletions spec/tapioca/compilers/dsl/active_record_columns_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -575,10 +575,10 @@ class Post < ActiveRecord::Base
RUBY

expected = indented(<<~RBI, 4)
sig { returns(T.nilable(CustomType)) }
sig { returns(T.nilable(::CustomType)) }
def cost; end

sig { params(value: T.nilable(CustomType)).returns(T.nilable(CustomType)) }
sig { params(value: T.nilable(::CustomType)).returns(T.nilable(::CustomType)) }
def cost=(value); end
RBI

Expand Down Expand Up @@ -624,10 +624,10 @@ class Post < ActiveRecord::Base
RUBY

expected = indented(<<~RBI, 4)
sig { returns(T.nilable(T.any(CustomType, Numeric))) }
sig { returns(T.nilable(T.any(::CustomType, ::Numeric))) }
def cost; end

sig { params(value: T.nilable(T.any(CustomType, Numeric))).returns(T.nilable(T.any(CustomType, Numeric))) }
sig { params(value: T.nilable(T.any(::CustomType, ::Numeric))).returns(T.nilable(T.any(::CustomType, ::Numeric))) }
def cost=(value); end
RBI

Expand Down Expand Up @@ -672,10 +672,10 @@ class Post < ActiveRecord::Base
RUBY

expected = indented(<<~RBI, 4)
sig { returns(T.nilable(CustomType)) }
sig { returns(T.nilable(::CustomType)) }
def cost; end

sig { params(value: T.nilable(CustomType)).returns(T.nilable(CustomType)) }
sig { params(value: T.nilable(::CustomType)).returns(T.nilable(::CustomType)) }
def cost=(value); end
RBI

Expand Down Expand Up @@ -717,10 +717,10 @@ class Post < ActiveRecord::Base
RUBY

expected = indented(<<~RUBY, 4)
sig { returns(T.nilable(ValueType[Integer])) }
sig { returns(T.nilable(ValueType[::Integer])) }
def cost; end

sig { params(value: T.nilable(ValueType[Integer])).returns(T.nilable(ValueType[Integer])) }
sig { params(value: T.nilable(ValueType[::Integer])).returns(T.nilable(ValueType[::Integer])) }
def cost=(value); end
RUBY

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def self.account; end
sig { params(value: T.untyped).returns(T.untyped) }
def self.account=(value); end

sig { params(user_id: Integer).void }
sig { params(user_id: ::Integer).void }
def self.authenticate(user_id); end

sig { returns(T.untyped) }
Expand Down
6 changes: 3 additions & 3 deletions spec/tapioca/compilers/dsl/sidekiq_worker_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,13 @@ def perform(customer_id)
# typed: strong

class NotifierWorker
sig { params(customer_id: Integer).returns(String) }
sig { params(customer_id: ::Integer).returns(String) }
def self.perform_async(customer_id); end

sig { params(interval: T.any(DateTime, Time), customer_id: Integer).returns(String) }
sig { params(interval: T.any(DateTime, Time), customer_id: ::Integer).returns(String) }
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

String, DateTime, Time not affected by the name patch.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, this is interesting. I would have expected this to have been fixed too.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason these aren't changing is because they're hard-coded in the code: https://github.com/Shopify/tapioca/blob/main/lib/tapioca/compilers/dsl/sidekiq_worker.rb#L59.

The Integer param is derived from the live ruby code:
https://github.com/Shopify/tapioca/blob/main/lib/tapioca/compilers/dsl/sidekiq_worker.rb#L59

I wonder if there should be some helper that allows us to specify these manual types via code and have it get compiled to a string.

def self.perform_at(interval, customer_id); end

sig { params(interval: Numeric, customer_id: Integer).returns(String) }
sig { params(interval: Numeric, customer_id: ::Integer).returns(String) }
def self.perform_in(interval, customer_id); end
end
RBI
Expand Down
66 changes: 33 additions & 33 deletions spec/tapioca/compilers/symbol_table_compiler_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ module Bar
end

Bar::Arr = T.let(T.unsafe(nil), Array)
Bar::Foo = T.type_alias { T.any(String, Symbol) }
Bar::Foo = T.type_alias { T.any(::String, ::Symbol) }
RBI

assert_equal(output, compile)
Expand All @@ -113,7 +113,7 @@ class B; end
module Bar; end
module Bar::A; end
class Bar::A::B; end
Bar::A::Foo = T.type_alias { T.any(Bar::A, Bar::A::B, String, Symbol) }
Bar::A::Foo = T.type_alias { T.any(::Bar::A, ::Bar::A::B, ::String, ::Symbol) }
RBI

assert_equal(output, compile)
Expand Down Expand Up @@ -2268,9 +2268,9 @@ class Adt::Foo
end

class Bar < ::T::Struct
prop :bar, String
const :baz, T::Hash[String, T.untyped]
const :foo, Integer
prop :bar, ::String
const :baz, T::Hash[::String, T.untyped]
const :foo, ::Integer
prop :quux, T.untyped, default: T.unsafe(nil)

class << self
Expand All @@ -2288,25 +2288,25 @@ def do_it; end
end

class Buzz
prop :bar, String
const :baz, T.proc.params(arg0: String).void
const :foo, Integer
prop :bar, ::String
const :baz, T.proc.params(arg0: ::String).void
const :foo, ::Integer
end

class Foo
sig { params(a: Integer, b: String).returns(Integer) }
sig { params(a: ::Integer, b: ::String).returns(::Integer) }
def bar(a, b:); end

sig { type_parameters(:U).params(a: T.type_parameter(:U)).returns(T.type_parameter(:U)) }
def baz(a); end

sig { params(a: Integer, b: String).void }
sig { params(a: ::Integer, b: ::String).void }
def foo(a, b:); end

sig { params(a: Integer, b: Integer, c: Integer, d: Integer, e: Integer, f: Integer, blk: T.proc.void).void }
sig { params(a: ::Integer, b: ::Integer, c: ::Integer, d: ::Integer, e: ::Integer, f: ::Integer, blk: T.proc.void).void }
def many_kinds_of_args(*a, b, c, d:, e: T.unsafe(nil), **f, &blk); end

sig { returns(T.proc.params(x: String).void) }
sig { returns(T.proc.params(x: ::String).void) }
def some_attribute; end

class << self
Expand All @@ -2324,8 +2324,8 @@ class Generics::ComplexGenericType
B = type_template(:out)
C = type_template
D = type_member(fixed: Integer)
E = type_member(fixed: Integer, upper: T::Array[Numeric])
F = type_member(fixed: Integer, lower: T.any(Complex, T::Hash[Symbol, T::Array[Integer]]), upper: T.nilable(Numeric))
E = type_member(fixed: Integer, upper: T::Array[::Numeric])
F = type_member(fixed: Integer, lower: T.any(::Complex, T::Hash[::Symbol, T::Array[::Integer]]), upper: T.nilable(::Numeric))

class << self
extend T::Generic
Expand Down Expand Up @@ -2355,30 +2355,30 @@ def complex(foo); end
def something(foo); end
end

Generics::SimpleGenericType::NullGenericType = T.let(T.unsafe(nil), Generics::SimpleGenericType[Integer])
Generics::SimpleGenericType::NullGenericType = T.let(T.unsafe(nil), Generics::SimpleGenericType[::Integer])

module Quux
interface!

sig { abstract.returns(Integer) }
sig { abstract.returns(::Integer) }
def something; end
end

class Quux::Concrete
include ::Quux

sig { returns(String) }
sig { returns(::String) }
def bar; end

sig { params(baz: T::Hash[String, Object]).returns(T::Hash[String, Object]) }
sig { params(baz: T::Hash[::String, ::Object]).returns(T::Hash[::String, ::Object]) }
def baz=(baz); end

sig { returns(T::Array[Integer]) }
sig { returns(T::Array[::Integer]) }
def foo; end

def foo=(_arg0); end

sig { override.returns(Integer) }
sig { override.returns(::Integer) }
def something; end
end
RBI
Expand All @@ -2399,7 +2399,7 @@ def foo(params)

output = template(<<~RBI)
class Foo
sig { params(params: {"foo" => Integer, bar: String, :"foo bar" => Class}).void }
sig { params(params: {"foo" => ::Integer, bar: ::String, :"foo bar" => ::Class}).void }
def foo(params); end
end
RBI
Expand Down Expand Up @@ -2562,19 +2562,19 @@ class Foo < T::Struct

output = template(<<~RBI)
class Foo < ::T::Struct
prop :a, T.nilable(Integer), default: T.unsafe(nil)
prop :a, T.nilable(::Integer), default: T.unsafe(nil)
prop :b, T::Boolean, default: T.unsafe(nil)
prop :c, T::Boolean, default: T.unsafe(nil)
prop :d, Symbol, default: T.unsafe(nil)
prop :e, String, default: T.unsafe(nil)
prop :f, Integer, default: T.unsafe(nil)
prop :g, Float, default: T.unsafe(nil)
prop :h, T::Array[String], default: T.unsafe(nil)
prop :i, T::Hash[String, Integer], default: T.unsafe(nil)
prop :k, Foo, default: T.unsafe(nil)
prop :l, T::Array[Foo], default: T.unsafe(nil)
prop :m, T::Hash[Foo, Foo], default: T.unsafe(nil)
prop :n, Foo, default: T.unsafe(nil)
prop :d, ::Symbol, default: T.unsafe(nil)
prop :e, ::String, default: T.unsafe(nil)
prop :f, ::Integer, default: T.unsafe(nil)
prop :g, ::Float, default: T.unsafe(nil)
prop :h, T::Array[::String], default: T.unsafe(nil)
prop :i, T::Hash[::String, ::Integer], default: T.unsafe(nil)
prop :k, ::Foo, default: T.unsafe(nil)
prop :l, T::Array[::Foo], default: T.unsafe(nil)
prop :m, T::Hash[::Foo, ::Foo], default: T.unsafe(nil)
prop :n, ::Foo, default: T.unsafe(nil)

class << self
def inherited(s); end
Expand Down Expand Up @@ -2720,7 +2720,7 @@ def a; end
sig { returns(T::Hash[T.attached_class, T::Array[T.attached_class]]) }
def b; end

sig { returns(Foo::FooAttachedClass) }
sig { returns(::Foo::FooAttachedClass) }
def c; end
end
end
Expand Down