127 lines
4 KiB
Ruby
127 lines
4 KiB
Ruby
# -*- coding: utf-8 -*- #
|
|
# frozen_string_literal: true
|
|
|
|
module Rouge
|
|
module Lexers
|
|
class Kotlin < RegexLexer
|
|
# https://kotlinlang.org/docs/reference/grammar.html
|
|
|
|
title "Kotlin"
|
|
desc "Kotlin Programming Language (http://kotlinlang.org)"
|
|
|
|
tag 'kotlin'
|
|
filenames '*.kt', '*.kts'
|
|
mimetypes 'text/x-kotlin'
|
|
|
|
keywords = %w(
|
|
abstract annotation as break by catch class companion const
|
|
constructor continue crossinline do dynamic else enum
|
|
external false final finally for fun get if import in infix
|
|
inline inner interface internal is lateinit noinline null
|
|
object open operator out override package private protected
|
|
public reified return sealed set super tailrec this throw
|
|
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_backtick})'
|
|
|
|
state :root do
|
|
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!
|
|
end
|
|
|
|
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
|