xref: /expo/docs/components/base/languages/kotlin.ts (revision b32521e7)
1export function installKotlin(Prism: any) {
2  Prism.languages.kotlin = Prism.languages.extend('clike', {
3    keyword: {
4      // The lookbehind prevents wrong highlighting of e.g. kotlin.properties.get
5      pattern:
6        /(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,
7      lookbehind: true,
8    },
9    function: [
10      {
11        pattern: /(?:`[^\r\n`]+`|\w+)(?=\s*\()/,
12        greedy: true,
13      },
14      {
15        pattern: /(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,
16        lookbehind: true,
17        greedy: true,
18      },
19    ],
20    number:
21      /\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,
22    operator:
23      /\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/,
24  });
25
26  delete Prism.languages.kotlin['class-name'];
27
28  Prism.languages.insertBefore('kotlin', 'string', {
29    'raw-string': {
30      pattern: /("""|''')[\s\S]*?\1/,
31      alias: 'string',
32      // See interpolation below
33    },
34  });
35  Prism.languages.insertBefore('kotlin', 'keyword', {
36    annotation: {
37      pattern: /\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,
38      alias: 'builtin',
39    },
40  });
41  Prism.languages.insertBefore('kotlin', 'function', {
42    label: {
43      pattern: /\w+@|@\w+/,
44      alias: 'symbol',
45    },
46  });
47
48  const interpolation = [
49    {
50      pattern: /\$\{[^}]+\}/,
51      inside: {
52        delimiter: {
53          pattern: /^\$\{|\}$/,
54          alias: 'variable',
55        },
56        rest: Prism.languages.kotlin,
57      },
58    },
59    {
60      pattern: /\$\w+/,
61      alias: 'variable',
62    },
63  ];
64
65  Prism.languages.kotlin['raw-string'].inside = {
66    interpolation,
67  };
68
69  Prism.languages.kotlin['string'].inside = Prism.languages.kotlin['raw-string'].inside;
70
71  Prism.languages.kt = Prism.languages.kotlin;
72  Prism.languages.kts = Prism.languages.kotlin;
73}
74