module.exports = function(hljs) { var KEYWORDS = { keyword: 'abstract as val var vararg get set class object open private protected public noinline ' + 'crossinline dynamic final enum if else do while for when throw try catch finally ' + 'import package is in fun override companion reified inline lateinit init' + 'interface annotation data sealed internal infix operator out by constructor super ' + // to be deleted soon 'trait volatile transient native default', built_in: 'Byte Short Char Int Long Boolean Float Double Void Unit Nothing', literal: 'true false null' }; var KEYWORDS_WITH_LABEL = { className: 'keyword', begin: /\b(break|continue|return|this)\b/, starts: { contains: [ { className: 'symbol', begin: /@\w+/ } ] } }; var LABEL = { className: 'symbol', begin: hljs.UNDERSCORE_IDENT_RE + '@' }; // for string templates var SUBST = { className: 'subst', variants: [ {begin: '\\$' + hljs.UNDERSCORE_IDENT_RE}, {begin: '\\${', end: '}', contains: [hljs.APOS_STRING_MODE, hljs.C_NUMBER_MODE]} ] }; var STRING = { className: 'string', variants: [ { begin: '"""', end: '"""', contains: [SUBST] }, // Can't use built-in modes easily, as we want to use STRING in the meta // context as 'meta-string' and there's no syntax to remove explicitly set // classNames in built-in modes. { begin: '\'', end: '\'', illegal: /\n/, contains: [hljs.BACKSLASH_ESCAPE] }, { begin: '"', end: '"', illegal: /\n/, contains: [hljs.BACKSLASH_ESCAPE, SUBST] } ] }; var ANNOTATION_USE_SITE = { className: 'meta', begin: '@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*' + hljs.UNDERSCORE_IDENT_RE + ')?' }; var ANNOTATION = { className: 'meta', begin: '@' + hljs.UNDERSCORE_IDENT_RE, contains: [ { begin: /\(/, end: /\)/, contains: [ hljs.inherit(STRING, {className: 'meta-string'}) ] } ] }; return { keywords: KEYWORDS, contains : [ hljs.COMMENT( '/\\*\\*', '\\*/', { relevance : 0, contains : [{ className : 'doctag', begin : '@[A-Za-z]+' }] } ), hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE, KEYWORDS_WITH_LABEL, LABEL, ANNOTATION_USE_SITE, ANNOTATION, { className: 'function', beginKeywords: 'fun', end: '[(]|$', returnBegin: true, excludeEnd: true, keywords: KEYWORDS, illegal: /fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/, relevance: 5, contains: [ { begin: hljs.UNDERSCORE_IDENT_RE + '\\s*\\(', returnBegin: true, relevance: 0, contains: [hljs.UNDERSCORE_TITLE_MODE] }, { className: 'type', begin: //, keywords: 'reified', relevance: 0 }, { className: 'params', begin: /\(/, end: /\)/, endsParent: true, keywords: KEYWORDS, relevance: 0, contains: [ { begin: /:/, end: /[=,\/]/, endsWithParent: true, contains: [ {className: 'type', begin: hljs.UNDERSCORE_IDENT_RE}, hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE ], relevance: 0 }, hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE, ANNOTATION_USE_SITE, ANNOTATION, STRING, hljs.C_NUMBER_MODE ] }, hljs.C_BLOCK_COMMENT_MODE ] }, { className: 'class', beginKeywords: 'class interface trait', end: /[:\{(]|$/, // remove 'trait' when removed from KEYWORDS excludeEnd: true, illegal: 'extends implements', contains: [ {beginKeywords: 'public protected internal private constructor'}, hljs.UNDERSCORE_TITLE_MODE, { className: 'type', begin: //, excludeBegin: true, excludeEnd: true, relevance: 0 }, { className: 'type', begin: /[,:]\s*/, end: /[<\(,]|$/, excludeBegin: true, returnEnd: true }, ANNOTATION_USE_SITE, ANNOTATION ] }, STRING, { className: 'meta', begin: "^#!/usr/bin/env", end: '$', illegal: '\n' }, hljs.C_NUMBER_MODE ] }; };