/* Language: Swift Description: Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns. Author: Chris Eidhof Contributors: Nate Cook , Alexander Lichter Website: https://swift.org Category: common, system */ function swift(hljs) { var SWIFT_KEYWORDS = { // override the pattern since the default of of /\w+/ is not sufficient to // capture the keywords that start with the character "#" $pattern: /[\w#]+/, keyword: '#available #colorLiteral #column #else #elseif #endif #file ' + '#fileLiteral #function #if #imageLiteral #line #selector #sourceLocation ' + '_ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype ' + 'associativity break case catch class continue convenience default defer deinit didSet do ' + 'dynamic dynamicType else enum extension fallthrough false fileprivate final for func ' + 'get guard if import in indirect infix init inout internal is lazy left let ' + 'mutating nil none nonmutating open operator optional override postfix precedence ' + 'prefix private protocol Protocol public repeat required rethrows return ' + 'right self Self set some static struct subscript super switch throw throws true ' + 'try try! try? Type typealias unowned var weak where while willSet', literal: 'true false nil', built_in: 'abs advance alignof alignofValue anyGenerator assert assertionFailure ' + 'bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC ' + 'bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros ' + 'debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords ' + 'enumerate equal fatalError filter find getBridgedObjectiveCType getVaList ' + 'indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC ' + 'isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare ' + 'map max maxElement min minElement numericCast overlaps partition posix ' + 'precondition preconditionFailure print println quickSort readLine reduce reflect ' + 'reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split ' + 'startsWith stride strideof strideofValue swap toString transcode ' + 'underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap ' + 'unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer ' + 'withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers ' + 'withUnsafePointer withUnsafePointers withVaList zip' }; var TYPE = { className: 'type', begin: '\\b[A-Z][\\w\u00C0-\u02B8\']*', relevance: 0 }; // slightly more special to swift var OPTIONAL_USING_TYPE = { className: 'type', begin: '\\b[A-Z][\\w\u00C0-\u02B8\']*[!?]' }; var BLOCK_COMMENT = hljs.COMMENT( '/\\*', '\\*/', { contains: ['self'] } ); var SUBST = { className: 'subst', begin: /\\\(/, end: '\\)', keywords: SWIFT_KEYWORDS, contains: [] // assigned later }; var STRING = { className: 'string', contains: [hljs.BACKSLASH_ESCAPE, SUBST], variants: [ {begin: /"""/, end: /"""/}, {begin: /"/, end: /"/}, ] }; // https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal // TODO: Update for leading `-` after lookbehind is supported everywhere var decimalDigits = '([0-9]_*)+'; var hexDigits = '([0-9a-fA-F]_*)+'; var NUMBER = { className: 'number', relevance: 0, variants: [ // decimal floating-point-literal (subsumes decimal-literal) { begin: `\\b(${decimalDigits})(\\.(${decimalDigits}))?` + `([eE][+-]?(${decimalDigits}))?\\b` }, // hexadecimal floating-point-literal (subsumes hexadecimal-literal) { begin: `\\b0x(${hexDigits})(\\.(${hexDigits}))?` + `([pP][+-]?(${decimalDigits}))?\\b` }, // octal-literal { begin: /\b0o([0-7]_*)+\b/ }, // binary-literal { begin: /\b0b([01]_*)+\b/ }, ] }; SUBST.contains = [NUMBER]; return { name: 'Swift', keywords: SWIFT_KEYWORDS, contains: [ STRING, hljs.C_LINE_COMMENT_MODE, BLOCK_COMMENT, OPTIONAL_USING_TYPE, TYPE, NUMBER, { className: 'function', beginKeywords: 'func', end: /\{/, excludeEnd: true, contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /[A-Za-z$_][0-9A-Za-z$_]*/ }), { begin: // }, { className: 'params', begin: /\(/, end: /\)/, endsParent: true, keywords: SWIFT_KEYWORDS, contains: [ 'self', NUMBER, STRING, hljs.C_BLOCK_COMMENT_MODE, {begin: ':'} // relevance booster ], illegal: /["']/ } ], illegal: /\[|%/ }, { className: 'class', beginKeywords: 'struct protocol class extension enum', keywords: SWIFT_KEYWORDS, end: '\\{', excludeEnd: true, contains: [ hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}) ] }, { className: 'meta', // @attributes begin: '(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|' + '@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|' + '@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|' + '@infix|@prefix|@postfix|@autoclosure|@testable|@available|' + '@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|' + '@propertyWrapper|@main)\\b' }, { beginKeywords: 'import', end: /$/, contains: [hljs.C_LINE_COMMENT_MODE, BLOCK_COMMENT], relevance: 0 } ] }; } module.exports = swift;