class RuboCop::Cop::Sorbet::ValidSorbetSigil
# typed: true
# (start of file)
# good
# typed: no
# (start of file)
# bad
class Foo; end
# (start of file)
# bad
@example RequireSigilOnAllFiles: true
# typed: true
# (start of file)
# good
class Foo; end
# (start of file)
# good
# typed: no
# (start of file)
# bad
@example RequireSigilOnAllFiles: false (default)
Adapted from: gist.github.com/clarkdave/85aca4e16f33fd52aceb6a0a29936e52<br>This cop checks that every Ruby file contains a valid Sorbet sigil.
def autocorrect(_node)
def autocorrect(_node) lambda do |corrector| return unless require_sorbet_sigil_on_all_files? return unless sorbet_typed_sigil_comment(processed_source).nil? token = processed_source.tokens.first corrector.insert_before(token.pos, "# typed: false\n") end end
def investigate(processed_source)
def investigate(processed_source) return if processed_source.tokens.empty? sorbet_sigil_line = sorbet_typed_sigil_comment(processed_source) if sorbet_sigil_line.nil? token = processed_source.tokens.first if require_sorbet_sigil_on_all_files? add_offense( token, location: token.pos, message: 'No Sorbet sigil found in file. ' \ 'Try a `typed: false` to start (you can also use `rubocop -a` to automatically add this).' ) end else strictness = sorbet_typed_strictness(sorbet_sigil_line) return if valid_sorbet_strictness?(strictness) add_offense( sorbet_sigil_line, location: sorbet_sigil_line.pos, message: "Invalid Sorbet sigil `#{strictness}`." ) end end
def require_sorbet_sigil_on_all_files?
def require_sorbet_sigil_on_all_files? !!cop_config['RequireSigilOnAllFiles'] end
def sorbet_typed_sigil_comment(processed_source)
def sorbet_typed_sigil_comment(processed_source) processed_source.tokens .take_while { |token| token.type == :tCOMMENT } .find { |token| SORBET_SIGIL_REGEX.match?(token.text) } end
def sorbet_typed_strictness(sigil_line)
def sorbet_typed_strictness(sigil_line) sigil_line.text.match(SORBET_SIGIL_REGEX)&.captures&.first end
def valid_sorbet_strictness?(strictness)
def valid_sorbet_strictness?(strictness) %w(ignore false true strict strong).include?(strictness) end