1 import * as vscode from 'vscode';
2 import { TextMateRuleSettings } from './load_theme_colors';
4 let mappings = new Map<string, string[]>();
6 const defaultMapping = new Map<string, string[]>([
13 'comment.block.documentation',
16 ['string', ['string']],
17 ['keyword', ['keyword']],
18 ['keyword.control', ['keyword.control', 'keyword', 'keyword.other']],
21 ['storage.modifier', 'keyword.other', 'keyword.control', 'keyword'],
23 ['function', ['entity.name.function']],
24 ['parameter', ['variable.parameter']],
25 ['constant', ['constant', 'variable']],
26 ['type', ['entity.name.type']],
27 ['builtin', ['variable.language', 'support.type', 'support.type']],
28 ['text', ['string', 'string.quoted', 'string.regexp']],
29 ['attribute', ['keyword']],
30 ['literal', ['string', 'string.quoted', 'string.regexp']],
31 ['macro', ['entity.name.function', 'keyword.other', 'entity.name.macro']],
32 ['variable', ['variable']],
33 ['variable.mut', ['variable', 'storage.modifier']],
37 'variable.object.property',
38 'meta.field.declaration',
39 'meta.definition.property',
43 ['module', ['entity.name.section', 'entity.other']],
46 export function find(scope: string): string[] {
47 return mappings.get(scope) || [];
50 export function toRule(
52 intoRule: (scope: string) => TextMateRuleSettings | undefined,
53 ): TextMateRuleSettings | undefined {
56 .filter(rule => rule !== undefined)[0];
59 function isString(value: any): value is string {
60 return typeof value === 'string';
63 function isArrayOfString(value: any): value is string[] {
64 return Array.isArray(value) && value.every(item => isString(item));
67 export function load() {
68 const rawConfig: { [key: string]: any } =
70 .getConfiguration('rust-analyzer')
71 .get('scopeMappings') || {};
73 mappings = Object.entries(rawConfig)
74 .filter(([_, value]) => isString(value) || isArrayOfString(value))
75 .reduce((list, [key, value]: [string, string | string[]]) => {
76 return list.set(key, isString(value) ? [value] : value);