module T::Private::Methods::SignatureValidation
def self.validate_override_mode(signature, super_signature)
def self.validate_override_mode(signature, super_signature) case signature.mode when *Modes::OVERRIDE_MODES if !Modes::OVERRIDABLE_MODES.include?(super_signature.mode) raise "You declared `#{signature.method_name}` as #{pretty_mode(signature)}, but the method it overrides is not declared as `overridable`.\n" \ " Parent definition: #{method_loc_str(super_signature.method)}\n" \ " Child definition: #{method_loc_str(signature.method)}\n" end when *Modes::IMPLEMENT_MODES if super_signature.mode != Modes.abstract raise "You declared `#{signature.method_name}` as #{pretty_mode(signature)}, but the method it overrides is not declared as abstract.\n" \ " Either mark #{super_signature.method_name} as `abstract.` in the parent: #{method_loc_str(super_signature.method)}\n" \ " ... or mark #{signature.method_name} as `override.` in the child: #{method_loc_str(signature.method)}\n" end when *Modes::NON_OVERRIDE_MODES if super_signature.mode == Modes.standard # Peaceful elsif super_signature.mode == Modes.abstract raise "You must use `.implementation` when overriding the abstract method `#{signature.method_name}`.\n" \ " Abstract definition: #{method_loc_str(super_signature.method)}\n" \ " Implementation definition: #{method_loc_str(signature.method)}\n" elsif super_signature.mode != Modes.untyped raise "You must use `.override` when overriding the existing method `#{signature.method_name}`.\n" \ " Parent definition: #{method_loc_str(super_signature.method)}\n" \ " Child definition: #{method_loc_str(signature.method)}\n" end else raise "Unexpected mode: #{signature.mode}. Please report to #dev-productivity." end end