rana-cli/wakatime/packages/pygments/lexers/rust.py

191 lines
6.8 KiB
Python
Raw Normal View History

2014-12-01 06:10:30 +00:00
# -*- coding: utf-8 -*-
"""
pygments.lexers.rust
~~~~~~~~~~~~~~~~~~~~
Lexers for the Rust language.
2016-06-13 14:41:17 +00:00
:copyright: Copyright 2006-2015 by the Pygments team, see AUTHORS.
2014-12-01 06:10:30 +00:00
:license: BSD, see LICENSE for details.
"""
from pygments.lexer import RegexLexer, include, bygroups, words, default
2016-06-13 14:41:17 +00:00
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
2014-12-01 06:10:30 +00:00
Number, Punctuation, Whitespace
__all__ = ['RustLexer']
class RustLexer(RegexLexer):
"""
2016-06-13 14:41:17 +00:00
Lexer for the Rust programming language (version 1.0).
2014-12-01 06:10:30 +00:00
.. versionadded:: 1.6
"""
name = 'Rust'
2016-06-13 14:41:17 +00:00
filenames = ['*.rs', '*.rs.in']
2014-12-01 06:10:30 +00:00
aliases = ['rust']
2016-06-13 14:41:17 +00:00
mimetypes = ['text/rust']
2014-12-01 06:10:30 +00:00
tokens = {
'root': [
2016-06-13 14:41:17 +00:00
# rust allows a file to start with a shebang, but if the first line
# starts with #![ then its not a shebang but a crate attribute.
(r'#![^[\r\n].*$', Comment.Preproc),
default('base'),
],
'base': [
2014-12-01 06:10:30 +00:00
# Whitespace and Comments
(r'\n', Whitespace),
(r'\s+', Whitespace),
2016-06-13 14:41:17 +00:00
(r'//!.*?\n', String.Doc),
(r'///(\n|[^/].*?\n)', String.Doc),
2014-12-01 06:10:30 +00:00
(r'//(.*?)\n', Comment.Single),
2016-06-13 14:41:17 +00:00
(r'/\*\*(\n|[^/*])', String.Doc, 'doccomment'),
(r'/\*!', String.Doc, 'doccomment'),
2014-12-01 06:10:30 +00:00
(r'/\*', Comment.Multiline, 'comment'),
# Macro parameters
(r"""\$([a-zA-Z_]\w*|\(,?|\),?|,?)""", Comment.Preproc),
# Keywords
(words((
2016-06-13 14:41:17 +00:00
'as', 'box', 'crate', 'do', 'else', 'enum', 'extern', # break and continue are in labels
2014-12-01 06:10:30 +00:00
'fn', 'for', 'if', 'impl', 'in', 'loop', 'match', 'mut', 'priv',
2016-06-13 14:41:17 +00:00
'proc', 'pub', 'ref', 'return', 'static', 'struct',
2014-12-01 06:10:30 +00:00
'trait', 'true', 'type', 'unsafe', 'while'), suffix=r'\b'),
Keyword),
(words(('alignof', 'be', 'const', 'offsetof', 'pure', 'sizeof',
'typeof', 'once', 'unsized', 'yield'), suffix=r'\b'),
Keyword.Reserved),
(r'(mod|use)\b', Keyword.Namespace),
(r'(true|false)\b', Keyword.Constant),
(r'let\b', Keyword.Declaration),
2016-06-13 14:41:17 +00:00
(words(('u8', 'u16', 'u32', 'u64', 'i8', 'i16', 'i32', 'i64', 'usize',
'isize', 'f32', 'f64', 'str', 'bool'), suffix=r'\b'),
2014-12-01 06:10:30 +00:00
Keyword.Type),
(r'self\b', Name.Builtin.Pseudo),
2016-06-13 14:41:17 +00:00
# Prelude (taken from Rusts src/libstd/prelude.rs)
2014-12-01 06:10:30 +00:00
(words((
2016-06-13 14:41:17 +00:00
# Reexported core operators
'Copy', 'Send', 'Sized', 'Sync',
'Drop', 'Fn', 'FnMut', 'FnOnce',
# Reexported functions
'drop',
# Reexported types and traits
'Box',
'ToOwned',
'Clone',
'PartialEq', 'PartialOrd', 'Eq', 'Ord',
'AsRef', 'AsMut', 'Into', 'From',
'Default',
'Iterator', 'Extend', 'IntoIterator',
'DoubleEndedIterator', 'ExactSizeIterator',
'Option',
'Some', 'None',
'Result',
'Ok', 'Err',
'SliceConcatExt',
'String', 'ToString',
'Vec',
), suffix=r'\b'),
2014-12-01 06:10:30 +00:00
Name.Builtin),
# Labels
2016-06-13 14:41:17 +00:00
(r'(break|continue)(\s*)(\'[A-Za-z_]\w*)?', bygroups(Keyword, Text.Whitespace, Name.Label)),
2014-12-01 06:10:30 +00:00
# Character Literal
2016-06-13 14:41:17 +00:00
(r"""'(\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
String.Char),
(r"""b'(\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\0"""
r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
2014-12-01 06:10:30 +00:00
String.Char),
# Binary Literal
(r'0b[01_]+', Number.Bin, 'number_lit'),
# Octal Literal
(r'0o[0-7_]+', Number.Oct, 'number_lit'),
# Hexadecimal Literal
(r'0[xX][0-9a-fA-F_]+', Number.Hex, 'number_lit'),
# Decimal Literal
(r'[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|'
2016-06-13 14:41:17 +00:00
r'\.[0-9_]*(?!\.)|[eE][+\-]?[0-9_]+)', Number.Float, 'number_lit'),
2014-12-01 06:10:30 +00:00
(r'[0-9][0-9_]*', Number.Integer, 'number_lit'),
# String Literal
2016-06-13 14:41:17 +00:00
(r'b"', String, 'bytestring'),
2014-12-01 06:10:30 +00:00
(r'"', String, 'string'),
2016-06-13 14:41:17 +00:00
(r'b?r(#*)".*?"\1', String),
# Lifetime
(r"""'static""", Name.Builtin),
(r"""'[a-zA-Z_]\w*""", Name.Attribute),
2014-12-01 06:10:30 +00:00
# Operators and Punctuation
(r'[{}()\[\],.;]', Punctuation),
(r'[+\-*/%&|<>^!~@=:?]', Operator),
# Identifier
(r'[a-zA-Z_]\w*', Name),
# Attributes
(r'#!?\[', Comment.Preproc, 'attribute['),
# Macros
(r'([A-Za-z_]\w*)(!)(\s*)([A-Za-z_]\w*)?(\s*)(\{)',
bygroups(Comment.Preproc, Punctuation, Whitespace, Name,
Whitespace, Punctuation), 'macro{'),
(r'([A-Za-z_]\w*)(!)(\s*)([A-Za-z_]\w*)?(\()',
bygroups(Comment.Preproc, Punctuation, Whitespace, Name,
Punctuation), 'macro('),
],
'comment': [
(r'[^*/]+', Comment.Multiline),
(r'/\*', Comment.Multiline, '#push'),
(r'\*/', Comment.Multiline, '#pop'),
(r'[*/]', Comment.Multiline),
],
2016-06-13 14:41:17 +00:00
'doccomment': [
(r'[^*/]+', String.Doc),
(r'/\*', String.Doc, '#push'),
(r'\*/', String.Doc, '#pop'),
(r'[*/]', String.Doc),
],
2014-12-01 06:10:30 +00:00
'number_lit': [
2016-06-13 14:41:17 +00:00
(r'[ui](8|16|32|64|size)', Keyword, '#pop'),
2014-12-01 06:10:30 +00:00
(r'f(32|64)', Keyword, '#pop'),
default('#pop'),
],
'string': [
(r'"', String, '#pop'),
2016-06-13 14:41:17 +00:00
(r"""\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
r"""|\\u\{[0-9a-fA-F]{1,6}\}""", String.Escape),
2014-12-01 06:10:30 +00:00
(r'[^\\"]+', String),
(r'\\', String),
],
2016-06-13 14:41:17 +00:00
'bytestring': [
(r"""\\x[89a-fA-F][0-9a-fA-F]""", String.Escape),
include('string'),
],
2014-12-01 06:10:30 +00:00
'macro{': [
(r'\{', Operator, '#push'),
(r'\}', Operator, '#pop'),
],
'macro(': [
(r'\(', Operator, '#push'),
(r'\)', Operator, '#pop'),
],
'attribute_common': [
(r'"', String, 'string'),
(r'\[', Comment.Preproc, 'attribute['),
(r'\(', Comment.Preproc, 'attribute('),
],
'attribute[': [
include('attribute_common'),
(r'\];?', Comment.Preproc, '#pop'),
(r'[^"\]]+', Comment.Preproc),
],
'attribute(': [
include('attribute_common'),
(r'\);?', Comment.Preproc, '#pop'),
(r'[^")]+', Comment.Preproc),
],
}