second commit
This commit is contained in:
251
env/lib/python3.11/site-packages/pygments/lexers/fantom.py
vendored
Normal file
251
env/lib/python3.11/site-packages/pygments/lexers/fantom.py
vendored
Normal file
@ -0,0 +1,251 @@
|
||||
"""
|
||||
pygments.lexers.fantom
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Lexer for the Fantom language.
|
||||
|
||||
:copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
"""
|
||||
|
||||
from string import Template
|
||||
|
||||
from pygments.lexer import RegexLexer, include, bygroups, using, \
|
||||
this, default, words
|
||||
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
|
||||
Number, Punctuation, Literal, Whitespace
|
||||
|
||||
__all__ = ['FantomLexer']
|
||||
|
||||
|
||||
class FantomLexer(RegexLexer):
|
||||
"""
|
||||
For Fantom source code.
|
||||
"""
|
||||
name = 'Fantom'
|
||||
aliases = ['fan']
|
||||
filenames = ['*.fan']
|
||||
mimetypes = ['application/x-fantom']
|
||||
url = 'https://www.fantom.org'
|
||||
version_added = '1.5'
|
||||
|
||||
# often used regexes
|
||||
def s(str):
|
||||
return Template(str).substitute(
|
||||
dict(
|
||||
pod=r'[\"\w\.]+',
|
||||
eos=r'\n|;',
|
||||
id=r'[a-zA-Z_]\w*',
|
||||
# all chars which can be part of type definition. Starts with
|
||||
# either letter, or [ (maps), or | (funcs)
|
||||
type=r'(?:\[|[a-zA-Z_]|\|)[:\w\[\]|\->?]*?',
|
||||
)
|
||||
)
|
||||
|
||||
tokens = {
|
||||
'comments': [
|
||||
(r'(?s)/\*.*?\*/', Comment.Multiline), # Multiline
|
||||
(r'//.*?$', Comment.Single), # Single line
|
||||
# TODO: highlight references in fandocs
|
||||
(r'\*\*.*?$', Comment.Special), # Fandoc
|
||||
(r'#.*$', Comment.Single) # Shell-style
|
||||
],
|
||||
'literals': [
|
||||
(r'\b-?[\d_]+(ns|ms|sec|min|hr|day)', Number), # Duration
|
||||
(r'\b-?[\d_]*\.[\d_]+(ns|ms|sec|min|hr|day)', Number), # Duration with dot
|
||||
(r'\b-?(\d+)?\.\d+(f|F|d|D)?', Number.Float), # Float/Decimal
|
||||
(r'\b-?0x[0-9a-fA-F_]+', Number.Hex), # Hex
|
||||
(r'\b-?[\d_]+', Number.Integer), # Int
|
||||
(r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char), # Char
|
||||
(r'"', Punctuation, 'insideStr'), # Opening quote
|
||||
(r'`', Punctuation, 'insideUri'), # Opening accent
|
||||
(r'\b(true|false|null)\b', Keyword.Constant), # Bool & null
|
||||
(r'(?:(\w+)(::))?(\w+)(<\|)(.*?)(\|>)', # DSL
|
||||
bygroups(Name.Namespace, Punctuation, Name.Class,
|
||||
Punctuation, String, Punctuation)),
|
||||
(r'(?:(\w+)(::))?(\w+)?(#)(\w+)?', # Type/slot literal
|
||||
bygroups(Name.Namespace, Punctuation, Name.Class,
|
||||
Punctuation, Name.Function)),
|
||||
(r'\[,\]', Literal), # Empty list
|
||||
(s(r'($type)(\[,\])'), # Typed empty list
|
||||
bygroups(using(this, state='inType'), Literal)),
|
||||
(r'\[:\]', Literal), # Empty Map
|
||||
(s(r'($type)(\[:\])'),
|
||||
bygroups(using(this, state='inType'), Literal)),
|
||||
],
|
||||
'insideStr': [
|
||||
(r'\\\\', String.Escape), # Escaped backslash
|
||||
(r'\\"', String.Escape), # Escaped "
|
||||
(r'\\`', String.Escape), # Escaped `
|
||||
(r'\$\w+', String.Interpol), # Subst var
|
||||
(r'\$\{.*?\}', String.Interpol), # Subst expr
|
||||
(r'"', Punctuation, '#pop'), # Closing quot
|
||||
(r'.', String) # String content
|
||||
],
|
||||
'insideUri': [ # TODO: remove copy/paste str/uri
|
||||
(r'\\\\', String.Escape), # Escaped backslash
|
||||
(r'\\"', String.Escape), # Escaped "
|
||||
(r'\\`', String.Escape), # Escaped `
|
||||
(r'\$\w+', String.Interpol), # Subst var
|
||||
(r'\$\{.*?\}', String.Interpol), # Subst expr
|
||||
(r'`', Punctuation, '#pop'), # Closing tick
|
||||
(r'.', String.Backtick) # URI content
|
||||
],
|
||||
'protectionKeywords': [
|
||||
(r'\b(public|protected|private|internal)\b', Keyword),
|
||||
],
|
||||
'typeKeywords': [
|
||||
(r'\b(abstract|final|const|native|facet|enum)\b', Keyword),
|
||||
],
|
||||
'methodKeywords': [
|
||||
(r'\b(abstract|native|once|override|static|virtual|final)\b',
|
||||
Keyword),
|
||||
],
|
||||
'fieldKeywords': [
|
||||
(r'\b(abstract|const|final|native|override|static|virtual|'
|
||||
r'readonly)\b', Keyword)
|
||||
],
|
||||
'otherKeywords': [
|
||||
(words((
|
||||
'try', 'catch', 'throw', 'finally', 'for', 'if', 'else', 'while',
|
||||
'as', 'is', 'isnot', 'switch', 'case', 'default', 'continue',
|
||||
'break', 'do', 'return', 'get', 'set'), prefix=r'\b', suffix=r'\b'),
|
||||
Keyword),
|
||||
(r'\b(it|this|super)\b', Name.Builtin.Pseudo),
|
||||
],
|
||||
'operators': [
|
||||
(r'\+\+|\-\-|\+|\-|\*|/|\|\||&&|<=>|<=|<|>=|>|=|!|\[|\]', Operator)
|
||||
],
|
||||
'inType': [
|
||||
(r'[\[\]|\->:?]', Punctuation),
|
||||
(s(r'$id'), Name.Class),
|
||||
default('#pop'),
|
||||
|
||||
],
|
||||
'root': [
|
||||
include('comments'),
|
||||
include('protectionKeywords'),
|
||||
include('typeKeywords'),
|
||||
include('methodKeywords'),
|
||||
include('fieldKeywords'),
|
||||
include('literals'),
|
||||
include('otherKeywords'),
|
||||
include('operators'),
|
||||
(r'using\b', Keyword.Namespace, 'using'), # Using stmt
|
||||
(r'@\w+', Name.Decorator, 'facet'), # Symbol
|
||||
(r'(class|mixin)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Class),
|
||||
'inheritance'), # Inheritance list
|
||||
|
||||
# Type var := val
|
||||
(s(r'($type)([ \t]+)($id)(\s*)(:=)'),
|
||||
bygroups(using(this, state='inType'), Whitespace,
|
||||
Name.Variable, Whitespace, Operator)),
|
||||
|
||||
# var := val
|
||||
(s(r'($id)(\s*)(:=)'),
|
||||
bygroups(Name.Variable, Whitespace, Operator)),
|
||||
|
||||
# .someId( or ->someId( ###
|
||||
(s(r'(\.|(?:\->))($id)(\s*)(\()'),
|
||||
bygroups(Operator, Name.Function, Whitespace, Punctuation),
|
||||
'insideParen'),
|
||||
|
||||
# .someId or ->someId
|
||||
(s(r'(\.|(?:\->))($id)'),
|
||||
bygroups(Operator, Name.Function)),
|
||||
|
||||
# new makeXXX (
|
||||
(r'(new)(\s+)(make\w*)(\s*)(\()',
|
||||
bygroups(Keyword, Whitespace, Name.Function, Whitespace, Punctuation),
|
||||
'insideMethodDeclArgs'),
|
||||
|
||||
# Type name (
|
||||
(s(r'($type)([ \t]+)' # Return type and whitespace
|
||||
r'($id)(\s*)(\()'), # method name + open brace
|
||||
bygroups(using(this, state='inType'), Whitespace,
|
||||
Name.Function, Whitespace, Punctuation),
|
||||
'insideMethodDeclArgs'),
|
||||
|
||||
# ArgType argName,
|
||||
(s(r'($type)(\s+)($id)(\s*)(,)'),
|
||||
bygroups(using(this, state='inType'), Whitespace, Name.Variable,
|
||||
Whitespace, Punctuation)),
|
||||
|
||||
# ArgType argName)
|
||||
# Covered in 'insideParen' state
|
||||
|
||||
# ArgType argName -> ArgType|
|
||||
(s(r'($type)(\s+)($id)(\s*)(\->)(\s*)($type)(\|)'),
|
||||
bygroups(using(this, state='inType'), Whitespace, Name.Variable,
|
||||
Whitespace, Punctuation, Whitespace, using(this, state='inType'),
|
||||
Punctuation)),
|
||||
|
||||
# ArgType argName|
|
||||
(s(r'($type)(\s+)($id)(\s*)(\|)'),
|
||||
bygroups(using(this, state='inType'), Whitespace, Name.Variable,
|
||||
Whitespace, Punctuation)),
|
||||
|
||||
# Type var
|
||||
(s(r'($type)([ \t]+)($id)'),
|
||||
bygroups(using(this, state='inType'), Whitespace,
|
||||
Name.Variable)),
|
||||
|
||||
(r'\(', Punctuation, 'insideParen'),
|
||||
(r'\{', Punctuation, 'insideBrace'),
|
||||
(r'\s+', Whitespace),
|
||||
(r'.', Text)
|
||||
],
|
||||
'insideParen': [
|
||||
(r'\)', Punctuation, '#pop'),
|
||||
include('root'),
|
||||
],
|
||||
'insideMethodDeclArgs': [
|
||||
(r'\)', Punctuation, '#pop'),
|
||||
(s(r'($type)(\s+)($id)(\s*)(\))'),
|
||||
bygroups(using(this, state='inType'), Whitespace, Name.Variable,
|
||||
Whitespace, Punctuation), '#pop'),
|
||||
include('root'),
|
||||
],
|
||||
'insideBrace': [
|
||||
(r'\}', Punctuation, '#pop'),
|
||||
include('root'),
|
||||
],
|
||||
'inheritance': [
|
||||
(r'\s+', Whitespace), # Whitespace
|
||||
(r':|,', Punctuation),
|
||||
(r'(?:(\w+)(::))?(\w+)',
|
||||
bygroups(Name.Namespace, Punctuation, Name.Class)),
|
||||
(r'\{', Punctuation, '#pop')
|
||||
],
|
||||
'using': [
|
||||
(r'[ \t]+', Whitespace), # consume whitespaces
|
||||
(r'(\[)(\w+)(\])',
|
||||
bygroups(Punctuation, Comment.Special, Punctuation)), # ffi
|
||||
(r'(\")?([\w.]+)(\")?',
|
||||
bygroups(Punctuation, Name.Namespace, Punctuation)), # podname
|
||||
(r'::', Punctuation, 'usingClass'),
|
||||
default('#pop')
|
||||
],
|
||||
'usingClass': [
|
||||
(r'[ \t]+', Whitespace), # consume whitespaces
|
||||
(r'(as)(\s+)(\w+)',
|
||||
bygroups(Keyword.Declaration, Whitespace, Name.Class), '#pop:2'),
|
||||
(r'[\w$]+', Name.Class),
|
||||
default('#pop:2') # jump out to root state
|
||||
],
|
||||
'facet': [
|
||||
(r'\s+', Whitespace),
|
||||
(r'\{', Punctuation, 'facetFields'),
|
||||
default('#pop')
|
||||
],
|
||||
'facetFields': [
|
||||
include('comments'),
|
||||
include('literals'),
|
||||
include('operators'),
|
||||
(r'\s+', Whitespace),
|
||||
(r'(\s*)(\w+)(\s*)(=)', bygroups(Whitespace, Name, Whitespace, Operator)),
|
||||
(r'\}', Punctuation, '#pop'),
|
||||
(r'\s+', Whitespace),
|
||||
(r'.', Text)
|
||||
],
|
||||
}
|
Reference in New Issue
Block a user