# -*- coding: utf-8 -*- #

module Rouge
  module Lexers
    class R < RegexLexer
      title "R"
      desc 'The R statistics language (r-project.org)'
      tag 'r'
      aliases 'r', 'R', 's', 'S'
      filenames '*.R', '*.r', '.Rhistory', '.Rprofile'
      mimetypes 'text/x-r-source', 'text/x-r', 'text/x-R'

      mimetypes 'text/x-r', 'application/x-r'

      KEYWORDS = %w(if else for while repeat in next break function)

      KEYWORD_CONSTANTS = %w(
        NULL Inf TRUE FALSE NaN NA
        NA_integer_ NA_real_ NA_complex_ NA_character_
      )

      BUILTIN_CONSTANTS = %w(LETTERS letters month.abb month.name pi T F)

      # These are all the functions in `base` that are implemented as a
      # `.Primitive`, minus those functions that are also keywords.
      PRIMITIVE_FUNCTIONS = %w(
        abs acos acosh all any anyNA Arg as.call as.character
        as.complex as.double as.environment as.integer as.logical
        as.null.default as.numeric as.raw asin asinh atan atanh attr
        attributes baseenv browser c call ceiling class Conj cos cosh
        cospi cummax cummin cumprod cumsum digamma dim dimnames
        emptyenv exp expression floor forceAndCall gamma gc.time
        globalenv Im interactive invisible is.array is.atomic is.call
        is.character is.complex is.double is.environment is.expression
        is.finite is.function is.infinite is.integer is.language
        is.list is.logical is.matrix is.na is.name is.nan is.null
        is.numeric is.object is.pairlist is.raw is.recursive is.single
        is.symbol lazyLoadDBfetch length lgamma list log max min
        missing Mod names nargs nzchar oldClass on.exit pos.to.env
        proc.time prod quote range Re rep retracemem return round
        seq_along seq_len seq.int sign signif sin sinh sinpi sqrt
        standardGeneric substitute sum switch tan tanh tanpi tracemem
        trigamma trunc unclass untracemem UseMethod xtfrm
      )

      def self.analyze_text(text)
        return 1 if text.shebang? 'Rscript'
      end

      state :root do
        rule /#'.*?\n/, Comment::Doc
        rule /#.*?\n/, Comment::Single
        rule /\s+/m, Text::Whitespace

        rule /`[^`]+?`/, Name
        rule /'(\\.|.)*?'/m, Str::Single
        rule /"(\\.|.)*?"/m, Str::Double

        rule /%[^%]*?%/, Operator

        rule /0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/, Num::Hex
        rule /[+-]?(\d+([.]\d+)?|[.]\d+)([eE][+-]?\d+)?[Li]?/,
          Num

        # Only recognize built-in functions when they are actually used as a
        # function call, i.e. followed by an opening parenthesis.
        # `Name::Builtin` would be more logical, but is usually not
        # highlighted specifically; thus use `Name::Function`.
        rule /\b(?<!.)(#{PRIMITIVE_FUNCTIONS.join('|')})(?=\()/, Name::Function

        rule /[a-zA-Z.]([a-zA-Z_][\w.]*)?/ do |m|
          if KEYWORDS.include? m[0]
            token Keyword
          elsif KEYWORD_CONSTANTS.include? m[0]
            token Keyword::Constant
          elsif BUILTIN_CONSTANTS.include? m[0]
            token Name::Builtin
          else
            token Name
          end
        end

        rule /[\[\]{}();,]/, Punctuation

        rule %r([-<>?*+^/!=~$@:%&|]), Operator
      end
    end
  end
end
