This file is indexed.

/usr/lib/ruby/vendor_ruby/rugments/lexers/haskell.rb is in ruby-rugments 1.0.0~beta8-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
module Rugments
  module Lexers
    class Haskell < RegexLexer
      title 'Haskell'
      desc 'The Haskell programming language (haskell.org)'

      tag 'haskell'
      aliases 'hs'
      filenames '*.hs'
      mimetypes 'text/x-haskell'

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

      reserved = %w(
        _ case class data default deriving do else if in
        infix[lr]? instance let newtype of then type where
      )

      ascii = %w(
        NUL SOH [SE]TX EOT ENQ ACK BEL BS HT LF VT FF CR S[OI] DLE
        DC[1-4] NAK SYN ETB CAN EM SUB ESC [FGRU]S SP DEL
      )

      state :basic do
        rule /\s+/m, Text
        rule /{-#/, Comment::Preproc, :comment_preproc
        rule /{-/, Comment::Multiline, :comment
        rule /^--\s+\|.*?$/, Comment::Doc
        # this is complicated in order to support custom symbols
        # like -->
        rule /--(?![!#\$\%&*+.\/<=>?@\^\|_~]).*?$/, Comment::Single
      end

      # nested commenting
      state :comment do
        rule /-}/, Comment::Multiline, :pop!
        rule /{-/, Comment::Multiline, :comment
        rule /[^-{}]+/, Comment::Multiline
        rule /[-{}]/, Comment::Multiline
      end

      state :comment_preproc do
        rule /-}/, Comment::Preproc, :pop!
        rule /{-/, Comment::Preproc, :comment
        rule /[^-{}]+/, Comment::Preproc
        rule /[-{}]/, Comment::Preproc
      end

      state :root do
        mixin :basic

        rule /\bimport\b/, Keyword::Reserved, :import
        rule /\bmodule\b/, Keyword::Reserved, :module
        rule /\berror\b/, Name::Exception
        rule /\b(?:#{reserved.join('|')})\b/, Keyword::Reserved
        # not sure why, but ^ doesn't work here
        # rule /^[_a-z][\w']*/, Name::Function
        rule /[_a-z][\w']*/, Name
        rule /[A-Z][\w']*/, Keyword::Type

        # lambda operator
        rule %r{\\(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)}, Name::Function
        # special operators
        rule %r{(<-|::|->|=>|=)(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)}, Operator
        # constructor/type operators
        rule %r{:[:!#\$\%&*+.\\/<=>?@^\|~-]*}, Operator
        # other operators
        rule %r{[:!#\$\%&*+.\\/<=>?@^\|~-]+}, Operator

        rule /\d+e[+-]?\d+/i, Num::Float
        rule /\d+\.\d+(e[+-]?\d+)?/i, Num::Float
        rule /0o[0-7]+/i, Num::Oct
        rule /0x[\da-f]+/i, Num::Hex
        rule /\d+/, Num::Integer

        rule /'/, Str::Char, :character
        rule /"/, Str, :string

        rule /\[\s*\]/, Keyword::Type
        rule /\(\s*\)/, Name::Builtin
        rule /[\[\](),;`{}]/, Punctuation
      end

      state :import do
        rule /\s+/, Text
        rule /"/, Str, :string
        rule /\bqualified\b/, Keyword
        # import X as Y
        rule /([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][a-zA-Z0-9_.]*)/ do
          groups(
            Name::Namespace, # X
            Text, Keyword, # as
            Text, Name # Y
          )
          pop!
        end

        # import X hiding (functions)
        rule /([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()/ do
          groups(
            Name::Namespace, # X
            Text, Keyword, # hiding
            Text, Punctuation # (
          )
          goto :funclist
        end

        # import X (functions)
        rule /([A-Z][\w.]*)(\s+)(\()/ do
          groups(
            Name::Namespace, # X
            Text,
            Punctuation # (
          )
          goto :funclist
        end

        rule /[\w.]+/, Name::Namespace, :pop!
      end

      state :module do
        rule /\s+/, Text
        # module Foo (functions)
        rule /([A-Z][\w.]*)(\s+)(\()/ do
          groups Name::Namespace, Text, Punctuation
          push :funclist
        end

        rule /\bwhere\b/, Keyword::Reserved, :pop!

        rule /[A-Z][a-zA-Z0-9_.]*/, Name::Namespace, :pop!
      end

      state :funclist do
        mixin :basic
        rule /[A-Z]\w*/, Keyword::Type
        rule /(_[\w\']+|[a-z][\w\']*)/, Name::Function
        rule /,/, Punctuation
        rule /[:!#\$\%&*+.\\\/<=>?@^\|~-]+/, Operator
        rule /\(/, Punctuation, :funclist
        rule /\)/, Punctuation, :pop!
      end

      state :character do
        rule /\\/ do
          token Str::Escape
          push :character_end
          push :escape
        end

        rule /./ do
          token Str::Char
          goto :character_end
        end
      end

      state :character_end do
        rule /'/, Str::Char, :pop!
        rule /./, Error, :pop!
      end

      state :string do
        rule /"/, Str, :pop!
        rule /\\/, Str::Escape, :escape
        rule /[^\\"]+/, Str
      end

      state :escape do
        rule /[abfnrtv"'&\\]/, Str::Escape, :pop!
        rule /\^[\]\[A-Z@\^_]/, Str::Escape, :pop!
        rule /#{ascii.join('|')}/, Str::Escape, :pop!
        rule /o[0-7]+/i, Str::Escape, :pop!
        rule /x[\da-f]/i, Str::Escape, :pop!
        rule /\d+/, Str::Escape, :pop!
        rule /\s+\\/, Str::Escape, :pop!
      end
    end
  end
end