#!/usr/bin/env python import re from pygments.lexer import ( RegexLexer, bygroups, default, include, ) from pygments.token import ( Comment, Generic, Keyword, Name, Number, Operator, Punctuation, String, Text, Whitespace, ) __all__ = ['SwiftLexer', 'SILLexer', 'SwiftConsoleLexer'] class SwiftLexer(RegexLexer): name = 'Swift' aliases = ['swift'] filenames = ['*.swift'] flags = re.MULTILINE | re.DOTALL _isa = r'([a-zA-Z_][a-zA-Z0-9_]*)(\s*)(:)(\s*)([A-Z0-9_][a-zA-Z0-9_]*)' _isa_comma = r'([a-zA-Z_][a-zA-Z0-9_]*)(\s*)(:)(\s*)' + \ '([A-Z0-9_][a-zA-Z0-9_]*)(,\s?)' _name = u'([@a-zA-Z_\U00000100-\U00100000]' + \ u'[a-zA-Z0-9_\U00000100-\U00100000]*)' tokens = { 'root': [ (r'^', Punctuation, 'root2'), ], 'root2': [ (r'\n', Text, '#pop'), include('func-class-list'), (r'\bimport\s+', Keyword.Namespace, 'import'), (r'\b(class|struct|protocol|extension)\s', Keyword.Declaration, 'class-decl'), include('body'), ], 'func-class-list': [ (r'\b(func|init|deinit|class func|public func)\s', Keyword.Declaration, 'func-decl'), ], 'comment': [ (r'//.*?\n', Comment.Single, '#pop'), (r'/\*', Comment.Multiline, 'comment-multiline'), ], 'token-list': [ (r'\$([0-9]+)', Name.Variable), # Tokens ], 'body': [ include('comment'), include('name'), (r'\.{3}', Generic.Emph), # emphasize ellipses (r'[\~\^\*!%&<>+=/?-]|\.{2}', Operator), include('token-list'), (r'[\[\]\(\)\{\}\|:;,.#]', Punctuation), (r'[0-9]+\.[0-9]+', Number.Float), (r'0x[0-9a-fA-F]+', Number.Hex), (r'[0-9]+', Number.Integer), (r'\s', Whitespace), (r'\(', Punctuation, 'tuple'), (r'(\b[A-Z][a-zA-Z0-9_]*\s?)(\()', bygroups(Name.Constant, Punctuation), 'type-cast'), (r'(\b[A-Z][a-zA-Z0-9_]*)(\.)([a-z][a-zA-Z0-9_]*)', bygroups(Name.Constant, Punctuation, Name), 'arg-list'), (r'"', String, 'string'), (r'\'', String.Char, 'string'), (r'(\bnew\b\s?)', Keyword.Reserved, 'class-name'), (r'\b(true|false)\b', Keyword.Reserved), (r'\b(if|else)\s', Keyword.Reserved), (r'\b(return|break)\b', Keyword.Reserved), (r'(\bset\b)(\s?)(\()', bygroups( Keyword.Declaration, Whitespace, Punctuation), 'arg-list'), (r'(set|get)(:)', bygroups(Keyword.Reserved, Punctuation)), (r'\b(self|Self)\b', Name.Builtin.Pseudo), (r'\bid\b', Name.Builtin), (r'\b(var|let)\s', Keyword.Declaration, 'var-decl'), (r'\bfor\s', Keyword.Reserved, 'for-loop'), ], 'body2': [ (r'}', Punctuation, '#pop'), include('body'), ], 'isa': [ (_isa, bygroups( Name, Whitespace, Punctuation, Whitespace, Name.Constant)), ], 'class-isa': [ (_isa, bygroups(Name.Class, Whitespace, Punctuation, Whitespace, Name.Constant)), ], 'var-isa': [ (_isa, bygroups(Name.Variable, Whitespace, Punctuation, Whitespace, Name.Constant)), ], 'var-isa-pop': [ (_isa, bygroups(Name.Variable, Whitespace, Punctuation, Whitespace, Name.Constant), '#pop'), ], 'var-isa-comma': [ (_isa_comma, bygroups(Name.Variable, Whitespace, Punctuation, Whitespace, Name.Constant, Punctuation)), ], 'var-name': [ (r'[a-zA-Z_][a-zA-Z0-9_?]*', Name.Variable), ], 'tuple': [ (r'\(', Punctuation, 'in-tuple'), ], 'in-tuple': [ (r'\)', Punctuation, '#pop'), include('class-name'), include('name'), include('isa'), include('root2'), ], 'name': [ (_name, Name), (r'`[^\n`]*`', Name), (r'@_specialize', Name), ], 'comment-multiline': [ (r'[^*/]', Comment.Multiline), (r'/\*', Comment.Multiline, '#push'), (r'\*/', Comment.Multiline, '#pop'), (r'[*/]', Comment.Multiline), ], 'import': [ (_name, Name.Namespace), (r'(func|var|class)\s+', Keyword.Declaration), (r'\.', Punctuation), (r',\s*', Punctuation), (r'\(', Punctuation, 'import'), (r'\)', Punctuation, '#pop'), (r'=', Operator), (r' ', Text.Whitespace), default('#pop'), # ('\n', Punctuation, '#pop'), ], 'generic-type': [ (r'\s', Whitespace), (r'>', Punctuation, '#pop'), include('class-name'), include('isa'), include('root2'), ], 'class-name': [ (r'[_A-Z][a-zA-Z0-9_?]*', Name.Constant), (r'(\[)([0-9]+)(\])', bygroups(Operator, Number.Integer, Operator)), (r'<', Punctuation, 'generic-type'), (r'\.\(', Punctuation, 'arg-list'), (r'\(', Punctuation, 'type-cast'), (r'\)', Punctuation, '#pop'), ], 'label': [ (r'[a-zA-Z_][a-zA-Z0-9_]*:(?=\s*\n)', Name.Label), ], 'ws-pop': [ (r'\s?[\s\n]', Whitespace, '#pop'), ], 'var-decl': [ (r'(\[)([\w\s,]*)(\])(\s+)', bygroups( Punctuation, Name.Attribute, Punctuation, Whitespace)), (':\s*', Punctuation), include('tuple'), include('var-isa-comma'), include('var-isa-pop'), include('var-name'), (r',\s+', Punctuation, 'var-decl'), include('ws-pop'), ], 'for-loop': [ (r'\sin\s', Keyword.Reserved), include('isa'), include('name'), include('ws-pop'), include('root2'), ], 'func-decl': [ (r'(\[)([\w\s,]*)(\])(\s+)', bygroups( Punctuation, Name.Attribute, Punctuation, Whitespace)), (r'\s?\bthrows\b', Keyword.Reserved), (r'\s?\brethrows\b', Keyword.Reserved), (r'\s?\breturn\b', Keyword.Reserved, 'root2'), (r'<', Punctuation, 'generic-type'), (r'\(\s?', Punctuation, 'arg-list'), (r'\s?->\s?', Operator, 'return-type'), (r'\s?(\w+|[\*\+\-\=]{1,2})(\s*)', bygroups( Name.Function, Punctuation)), (r'\s?' + _name + r'(\s*)', bygroups( Name.Function, Punctuation)), (r'\s?\{', Punctuation, '#pop'), default('#pop'), ], 'return-type': [ include('tuple'), include('class-name'), (r'\bid\b', Name.Builtin), (r'\s?\)', Punctuation, '#pop'), (r'\s?\[', Punctuation), (r'\s?\]\s*', Punctuation, '#pop'), default('#pop'), ], 'name-list': [ (_name, Name.Namespace), (r',\s*', Punctuation), (r' ', Text.Whitespace), (r'(\()(\d+\.\d+)(\))', bygroups( Punctuation, Number.Float, Punctuation)), default('#pop'), ], 'class-decl': [ (r'\{', Punctuation, '#pop'), (r'(\[)([\w\s,]*)(\])(\s+)', bygroups( Punctuation, Name.Attribute, Punctuation, Whitespace)), include('class-isa'), (r'(\*?)([a-zA-Z_][a-zA-Z0-9_?]*)', bygroups( Punctuation, Name.Class)), (r'\.', Punctuation), (r'<', Punctuation, 'generic-type'), (r':', Punctuation, 'name-list'), (r'\s', Whitespace), (r'\s?(,)(\s*)([A-Z0-9_][a-zA-Z0-9_]*)', bygroups( Punctuation, Whitespace, Name.Constant)), (r'<', Punctuation, 'generic-type'), (r'where', Keyword.Reserved), default("#pop"), ], 'arg-list': [ (r',\s?', Punctuation), (r'\)', Punctuation, '#pop'), (r'\s?\bthrows\b', Keyword.Reserved), (r'\s?\brethrows\b', Keyword.Reserved), include('isa'), (r'\s?->\s?', Operator, 'return-type'), include('root2'), ], 'type-cast': [ (r'\)', Punctuation, '#pop'), include('root2'), ], 'in-interpolated': [ ('\)', String.Interpol, '#pop'), include('root2'), ], 'string': [ (r'"', String, '#pop'), (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape), (r'\\\(', String.Interpol, 'in-interpolated'), (r'[^\\"]+', String), (r'\\', String), ], } class SILLexer(RegexLexer): name = 'SIL' aliases = ['sil'] filenames = ['*.sil'] flags = re.MULTILINE | re.DOTALL _isa = SwiftLexer._isa _isa_comma = SwiftLexer._isa_comma _name = SwiftLexer._name tokens = SwiftLexer.tokens.copy() tokens['token-list'] = [ (r'[%]([a-zA-Z0-9]+)', Name.Variable), # Tokens (r'\$[*]?([a-zA-Z0-9]+)', Name.Variable), # Tokens (r'\$[*]?\(([a-zA-Z0-9, ]+\))', Name.Variable), # Tokens ] class SwiftConsoleLexer(RegexLexer): name = 'SwiftConsole' aliases = ['swift-console'] filenames = ['*.swiftc'] flags = re.MULTILINE | re.DOTALL _isa = SwiftLexer._isa _isa_comma = SwiftLexer._isa_comma _name = SwiftLexer._name tokens = SwiftLexer.tokens.copy() tokens['root'] = [ (r'Welcome to swift. Type \':help\' for assistance.', Generic.Prompt), (r'(\(swift\) | )', Generic.Prompt, 'root2'), (r'\(swift\)', Generic.Prompt), (r' ', Generic.Prompt), (r'//.*?\n', Generic.Output), (r':[0-9]*:[0-9]*:.*?\n', Generic.Heading), (r'~*?\^\s?~*?\n', Generic.Heading), (r'.*?\n', Generic.Output), ]