class RuboCop::Cop::Naming::AsciiIdentifiers

Checks for non-ascii characters in identifier and constant names. Identifiers are always checked and whether constants are checked can be controlled using AsciiConstants config.

@example

# bad
def καλημερα # Greek alphabet (non-ascii)
end

# bad
def こんにちはと言う # Japanese character (non-ascii)
end

# bad
def hello_🍣 # Emoji (non-ascii)
end

# good
def say_hello
end

# bad
신장 = 10 # Hangul character (non-ascii)

# good
height = 10

# bad
params[:عرض_gteq] # Arabic character (non-ascii)

# good
params[:width_gteq]

@example AsciiConstants: true (default)

# bad
class Foö
end

FOÖ = "foo"

@example AsciiConstants: false

# good
class Foö
end

FOÖ = "foo"

Constants

CONSTANT_MSG
IDENTIFIER_MSG

Public Instance Methods

on_new_investigation() click to toggle source
# File lib/rubocop/cop/naming/ascii_identifiers.rb, line 59
def on_new_investigation
  processed_source.tokens.each do |token|
    next if !should_check?(token) || token.text.ascii_only?

    message = token.type == :tIDENTIFIER ? IDENTIFIER_MSG : CONSTANT_MSG
    add_offense(first_offense_range(token), message: message)
  end
end

Private Instance Methods

first_non_ascii_chars(string) click to toggle source
# File lib/rubocop/cop/naming/ascii_identifiers.rb, line 84
def first_non_ascii_chars(string)
  string.match(/[^[:ascii:]]+/).to_s
end
first_offense_range(identifier) click to toggle source
# File lib/rubocop/cop/naming/ascii_identifiers.rb, line 74
def first_offense_range(identifier)
  expression    = identifier.pos
  first_offense = first_non_ascii_chars(identifier.text)

  start_position = expression.begin_pos + identifier.text.index(first_offense)
  end_position   = start_position + first_offense.length

  range_between(start_position, end_position)
end
should_check?(token) click to toggle source
# File lib/rubocop/cop/naming/ascii_identifiers.rb, line 70
def should_check?(token)
  token.type == :tIDENTIFIER || (token.type == :tCONSTANT && cop_config['AsciiConstants'])
end