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