diff options
author | Seivan Heidari <[email protected]> | 2019-10-27 16:57:11 +0000 |
---|---|---|
committer | Seivan Heidari <[email protected]> | 2019-10-27 16:57:11 +0000 |
commit | 0ddf47a7ab9d0f616e7296fa9a0b0eb786e4ee59 (patch) | |
tree | 80234db0e3af0d5f0b428a18f1b66f8fa2ba3bea /editors/code/src | |
parent | 5957b851e4451050151722598fa1ff9d41ccf0ff (diff) |
Introducing a Scopes Mapper to map from RA scopes to TextMate scopes with fallbacks.
Current scopes defined:
```
['keyword.unsafe', ['storage.modifier', 'keyword.other', 'keyword.control']],
['function', ['entity.name.function']],
['parameter', ['variable.parameter']],
['type', ['entity.name.type']],
['builtin', ['variable.language', 'support.type', 'support.type']],
['text', ['string', 'string.quoted', 'string.regexp']],
['attribute', ['keyword']],
['literal', ['string', 'string.quoted', 'string.regexp']],
['macro', ['support.other']],
['variable.mut', ['variable']],
['field', ['variable.object.property']],
['module', ['entity.name.section']]
```
Need to complement with further fallbacks as some themes fail.
Diffstat (limited to 'editors/code/src')
-rw-r--r-- | editors/code/src/config.ts | 2 | ||||
-rw-r--r-- | editors/code/src/highlighting.ts | 11 | ||||
-rw-r--r-- | editors/code/src/scopes.ts | 18 | ||||
-rw-r--r-- | editors/code/src/scopes_mapper.ts | 42 |
4 files changed, 60 insertions, 13 deletions
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index 9f8c810b6..a3fe39098 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts | |||
@@ -1,5 +1,6 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | import * as scopes from './scopes'; | 2 | import * as scopes from './scopes'; |
3 | import * as scopesMapper from './scopes_mapper'; | ||
3 | import { Server } from './server'; | 4 | import { Server } from './server'; |
4 | 5 | ||
5 | const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG; | 6 | const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG; |
@@ -49,6 +50,7 @@ export class Config { | |||
49 | 50 | ||
50 | Server.highlighter.removeHighlights(); | 51 | Server.highlighter.removeHighlights(); |
51 | scopes.load() | 52 | scopes.load() |
53 | scopesMapper.load() | ||
52 | if (config.has('highlightingOn')) { | 54 | if (config.has('highlightingOn')) { |
53 | 55 | ||
54 | this.highlightingOn = config.get('highlightingOn') as boolean; | 56 | this.highlightingOn = config.get('highlightingOn') as boolean; |
diff --git a/editors/code/src/highlighting.ts b/editors/code/src/highlighting.ts index 4b961170b..bc19fae2f 100644 --- a/editors/code/src/highlighting.ts +++ b/editors/code/src/highlighting.ts | |||
@@ -2,7 +2,7 @@ import seedrandom = require('seedrandom'); | |||
2 | import * as vscode from 'vscode'; | 2 | import * as vscode from 'vscode'; |
3 | import * as lc from 'vscode-languageclient'; | 3 | import * as lc from 'vscode-languageclient'; |
4 | import * as scopes from './scopes' | 4 | import * as scopes from './scopes' |
5 | 5 | import * as scopesMapper from './scopes_mapper'; | |
6 | 6 | ||
7 | import { Server } from './server'; | 7 | import { Server } from './server'; |
8 | 8 | ||
@@ -65,10 +65,13 @@ export class Highlighter { | |||
65 | tag: string, | 65 | tag: string, |
66 | textDecoration?: string | 66 | textDecoration?: string |
67 | ): [string, vscode.TextEditorDecorationType] => { | 67 | ): [string, vscode.TextEditorDecorationType] => { |
68 | const scope = scopes.find(tag) | ||
69 | 68 | ||
70 | if (scope) { | 69 | const foundRule = scopesMapper.toRule(tag, scopes.find) || scopes.find(tag) |
71 | const decor = createDecorationFromTextmate(scope); | 70 | |
71 | |||
72 | |||
73 | if (foundRule) { | ||
74 | const decor = createDecorationFromTextmate(foundRule); | ||
72 | return [tag, decor]; | 75 | return [tag, decor]; |
73 | } | 76 | } |
74 | else { | 77 | else { |
diff --git a/editors/code/src/scopes.ts b/editors/code/src/scopes.ts index c9c01ba1d..470ee716f 100644 --- a/editors/code/src/scopes.ts +++ b/editors/code/src/scopes.ts | |||
@@ -16,16 +16,16 @@ export interface TextMateRuleSettings { | |||
16 | } | 16 | } |
17 | 17 | ||
18 | // Current theme colors | 18 | // Current theme colors |
19 | const colors = new Map<string, TextMateRuleSettings>() | 19 | const rules = new Map<string, TextMateRuleSettings>() |
20 | 20 | ||
21 | export function find(scope: string): TextMateRuleSettings | undefined { | 21 | export function find(scope: string): TextMateRuleSettings | undefined { |
22 | return colors.get(scope) | 22 | return rules.get(scope) |
23 | } | 23 | } |
24 | 24 | ||
25 | // Load all textmate scopes in the currently active theme | 25 | // Load all textmate scopes in the currently active theme |
26 | export function load() { | 26 | export function load() { |
27 | // Remove any previous theme | 27 | // Remove any previous theme |
28 | colors.clear() | 28 | rules.clear() |
29 | // Find out current color theme | 29 | // Find out current color theme |
30 | const themeName = vscode.workspace.getConfiguration('workbench').get('colorTheme') | 30 | const themeName = vscode.workspace.getConfiguration('workbench').get('colorTheme') |
31 | 31 | ||
@@ -95,21 +95,21 @@ function loadColors(textMateRules: TextMateRule[]): void { | |||
95 | for (const rule of textMateRules) { | 95 | for (const rule of textMateRules) { |
96 | 96 | ||
97 | if (typeof rule.scope === 'string') { | 97 | if (typeof rule.scope === 'string') { |
98 | const existingRule = colors.get(rule.scope); | 98 | const existingRule = rules.get(rule.scope); |
99 | if (existingRule) { | 99 | if (existingRule) { |
100 | colors.set(rule.scope, mergeRuleSettings(existingRule, rule.settings)) | 100 | rules.set(rule.scope, mergeRuleSettings(existingRule, rule.settings)) |
101 | } | 101 | } |
102 | else { | 102 | else { |
103 | colors.set(rule.scope, rule.settings) | 103 | rules.set(rule.scope, rule.settings) |
104 | } | 104 | } |
105 | } else if (rule.scope instanceof Array) { | 105 | } else if (rule.scope instanceof Array) { |
106 | for (const scope of rule.scope) { | 106 | for (const scope of rule.scope) { |
107 | const existingRule = colors.get(scope); | 107 | const existingRule = rules.get(scope); |
108 | if (existingRule) { | 108 | if (existingRule) { |
109 | colors.set(scope, mergeRuleSettings(existingRule, rule.settings)) | 109 | rules.set(scope, mergeRuleSettings(existingRule, rule.settings)) |
110 | } | 110 | } |
111 | else { | 111 | else { |
112 | colors.set(scope, rule.settings) | 112 | rules.set(scope, rule.settings) |
113 | } | 113 | } |
114 | } | 114 | } |
115 | } | 115 | } |
diff --git a/editors/code/src/scopes_mapper.ts b/editors/code/src/scopes_mapper.ts new file mode 100644 index 000000000..995adae2d --- /dev/null +++ b/editors/code/src/scopes_mapper.ts | |||
@@ -0,0 +1,42 @@ | |||
1 | import * as vscode from 'vscode' | ||
2 | import { TextMateRuleSettings } from './scopes' | ||
3 | |||
4 | |||
5 | |||
6 | |||
7 | let mappings = new Map<string, string[]>() | ||
8 | |||
9 | |||
10 | const defaultMapping = new Map<string, string[]>([ | ||
11 | ['keyword.unsafe', ['storage.modifier', 'keyword.other', 'keyword.control']], | ||
12 | ['function', ['entity.name.function']], | ||
13 | ['parameter', ['variable.parameter']], | ||
14 | ['type', ['entity.name.type']], | ||
15 | ['builtin', ['variable.language', 'support.type', 'support.type']], | ||
16 | ['text', ['string', 'string.quoted', 'string.regexp']], | ||
17 | ['attribute', ['keyword']], | ||
18 | ['literal', ['string', 'string.quoted', 'string.regexp']], | ||
19 | ['macro', ['support.other']], | ||
20 | ['variable.mut', ['variable']], | ||
21 | ['field', ['variable.object.property']], | ||
22 | ['module', ['entity.name.section']] | ||
23 | ] | ||
24 | ) | ||
25 | function find(scope: string): string[] { | ||
26 | return mappings.get(scope) || [] | ||
27 | } | ||
28 | |||
29 | export function toRule(scope: string, intoRule: (scope: string) => TextMateRuleSettings | undefined): TextMateRuleSettings | undefined { | ||
30 | return find(scope).map(intoRule).find(rule => rule !== null) | ||
31 | } | ||
32 | |||
33 | |||
34 | export function load() { | ||
35 | const configuration = vscode.workspace | ||
36 | .getConfiguration('rust-analyzer') | ||
37 | .get('scopeMappings') as Map<string, string[]> | undefined || new Map() | ||
38 | |||
39 | mappings = new Map([...Array.from(defaultMapping.entries()), ...Array.from(configuration.entries())]); | ||
40 | |||
41 | |||
42 | } \ No newline at end of file | ||