lib/rouge/lexers/kotlin.rb in rouge-3.2.1 vs lib/rouge/lexers/kotlin.rb in rouge-3.3.0

- old
+ new

@@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # +# frozen_string_literal: true module Rouge module Lexers class Kotlin < RegexLexer # https://kotlinlang.org/docs/reference/grammar.html @@ -22,46 +23,70 @@ true try typealias typeof val var vararg when where while yield ) name = %r'@?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}][\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*' + name_backtick = %r'#{name}|`#{name}`' - id = %r'(#{name}|`#{name}`)' + id = %r'(#{name_backtick})' state :root do - rule %r'^\s*\[.*?\]', Name::Attribute - rule %r'[^\S\n]+', Text - rule %r'\\\n', Text # line continuation - rule %r'//.*?$', Comment::Single - rule %r'/[*].*?[*]/'m, Comment::Multiline - rule %r'\n', Text - rule %r'::|!!|\?[:.]', Operator - rule %r"(\.\.)", Operator - rule %r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation - rule %r'[{}]', Punctuation - rule %r'@"(""|[^"])*"'m, Str - rule %r'""".*?"""'m, Str - rule %r'"(\\\\|\\"|[^"\n])*["\n]'m, Str - rule %r"'\\.'|'[^\\]'", Str::Char - rule %r"[0-9](\.[0-9]+)?([eE][+-][0-9]+)?[flFL]?|0[xX][0-9a-fA-F]+[Ll]?", Num + rule %r'(\))(\s*)(:)(\s+)(#{name_backtick})(<)' do + groups Punctuation, Text, Punctuation, Text, Name::Class, Punctuation + push :generic_parameters + end + rule %r'(\))(\s*)(:)(\s+)(#{name_backtick})' do + groups Punctuation, Text, Punctuation, Text, Name::Class + end rule %r'\b(companion)(\s+)(object)\b' do groups Keyword, Text, Keyword end rule %r'\b(class|data\s+class|interface|object)(\s+)' do groups Keyword::Declaration, Text push :class end + rule %r'\b(fun)(\s+)' do + groups Keyword, Text + push :function + end + rule %r'(#{name_backtick})(:)(\s+)(#{name_backtick})(<)' do + groups Name::Variable, Punctuation, Text, Name::Class, Punctuation + push :generic_parameters + end + rule %r'(#{name_backtick})(:)(\s+)(#{name_backtick})' do + groups Name::Variable, Punctuation, Text, Name::Class + end rule %r'\b(package|import)(\s+)' do groups Keyword, Text push :package end + rule %r'\b(val|var)(\s+)(\()' do + groups Keyword::Declaration, Text, Punctuation + push :destructure + end rule %r'\b(val|var)(\s+)' do groups Keyword::Declaration, Text push :property end rule %r/\bfun\b/, Keyword rule /\b(?:#{keywords.join('|')})\b/, Keyword + rule %r'^\s*\[.*?\]', Name::Attribute + rule %r'[^\S\n]+', Text + rule %r'\\\n', Text # line continuation + rule %r'//.*?$', Comment::Single + rule %r'/[*].*?[*]/'m, Comment::Multiline + rule %r'\n', Text + rule %r'::|!!|\?[:.]', Operator + rule %r"(\.\.)", Operator + rule %r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation + rule %r'[{}]', Punctuation + rule %r'@"(""|[^"])*"'m, Str + rule %r'""".*?"""'m, Str + rule %r'"(\\\\|\\"|[^"\n])*["\n]'m, Str + rule %r"'\\.'|'[^\\]'", Str::Char + rule %r"[0-9](\.[0-9]+)?([eE][+-][0-9]+)?[flFL]?|0[xX][0-9a-fA-F]+[Ll]?", Num + rule /@#{id}/, Name::Decorator rule id, Name end state :package do rule /\S+/, Name::Namespace, :pop! @@ -69,11 +94,34 @@ state :class do rule id, Name::Class, :pop! end + state :function do + rule %r'(<)', Punctuation, :generic_parameters + rule %r'(\s+)', Text + rule %r'(#{name_backtick})(\.)' do + groups Name::Class, Punctuation + end + rule id, Name::Function, :pop! + end + + state :generic_parameters do + rule id, Name::Class + rule %r'(,)', Punctuation + rule %r'(\s+)', Text + rule %r'(>)', Punctuation, :pop! + end + state :property do rule id, Name::Property, :pop! + end + + state :destructure do + rule %r'(,)', Punctuation + rule %r'(\))', Punctuation, :pop! + rule %r'(\s+)', Text + rule id, Name::Property end end end end