lib/rouge/lexers/haskell.rb in rouge-3.19.0 vs lib/rouge/lexers/haskell.rb in rouge-3.20.0

- old
+ new

@@ -15,12 +15,12 @@ def self.detect?(text) return true 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 + _ case class data default deriving do else if in infix infixl infixr + 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 @@ -52,35 +52,43 @@ end state :root do mixin :basic - rule %r/\bimport\b/, Keyword::Reserved, :import - rule %r/\bmodule\b/, Keyword::Reserved, :module - rule %r/\b(?:#{reserved.join('|')})\b/, Keyword::Reserved - # not sure why, but ^ doesn't work here - # rule %r/^[_a-z][\w']*/, Name::Function - rule %r/[_a-z][\w']*/, Name - rule %r/[A-Z][\w']*/, Keyword::Type - rule %r/'[A-Z]\w+'?/, Keyword::Type # promoted data constructor + rule %r/'(?=(?:.|\\\S+)')/, Str::Char, :character + rule %r/"/, Str, :string + rule %r/\d+e[+-]?\d+/i, Num::Float + rule %r/\d+\.\d+(e[+-]?\d+)?/i, Num::Float + rule %r/0o[0-7]+/i, Num::Oct + rule %r/0x[\da-f]+/i, Num::Hex + rule %r/\d+/, Num::Integer + + rule %r/[\w']+/ do |m| + match = m[0] + if match == "import" + token Keyword::Reserved + push :import + elsif match == "module" + token Keyword::Reserved + push :module + elsif reserved.include?(match) + token Keyword::Reserved + elsif match =~ /\A'?[A-Z]/ + token Keyword::Type + else + token Name + end + end + # lambda operator rule %r(\\(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Name::Function # special operators rule %r((<-|::|->|=>|=)(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Operator # constructor/type operators rule %r(:[:!#\$\%&*+.\\/<=>?@^\|~-]*), Operator # other operators rule %r([:!#\$\%&*+.\\/<=>?@^\|~-]+), Operator - - rule %r/\d+e[+-]?\d+/i, Num::Float - rule %r/\d+\.\d+(e[+-]?\d+)?/i, Num::Float - rule %r/0o[0-7]+/i, Num::Oct - rule %r/0x[\da-f]+/i, Num::Hex - rule %r/\d+/, Num::Integer - - rule %r/'/, Str::Char, :character - rule %r/"/, Str, :string rule %r/\[\s*\]/, Keyword::Type rule %r/\(\s*\)/, Name::Builtin # Quasiquotations