aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-12-15 09:00:11 +0000
committerGitHub <[email protected]>2019-12-15 09:00:11 +0000
commit3e8f9eb6c45b6bde294c79deea0e5bb02c084ae0 (patch)
tree91e2b4c2738c89f22209bdb5925f0ba50f02349c /crates/ra_ide
parentd6223253b628b279f9ddae8f83f7173d01f6b32c (diff)
parentfeb5a4a8b8b0a30d71cf34c7927bd41cbae4e104 (diff)
Merge #2559
2559: Add some granularity to syntax highlighting. r=matklad a=omerbenamram Hi, I wanted to start using `rust-analyzer` a bit more frequently - one of the main blockers for me so far was the highlighting. I just discovered it's possible to override the default colors with `ralsp.<something>` setting without waiting for #2061! However, the current implementation was lumping a bunch of different tokens into `type` and `literal`. The golden standard IMO is what Clion is currently doing (and is my current daily driver for rust). Clion allows users to control the coloring for specific literal kinds, and the default is to distinguish between them (numerics get a different color from strings, and special colors for bytestrings). I've also splitted the builtin types, which are also allowed to be highlighted speratly. My goal is to match the default experience I'm getting with clion. The only blockers now I think is that `rust-analyzer` doesn't corrently infer types in some situations, so the highlighting information is incorrect in those cases. This is what it looks like so far (with colors overriden to match clion's theme): ![image](https://user-images.githubusercontent.com/2467993/70848219-ccd97900-1e76-11ea-89e1-2e467cfcc9fb.png) If there are any other changes you feel is necessary let me know. I did leave the default colors to match the current behavior, since I'm not familiar with the colors for this theme, I added some random (different) colors in the test to check that it indeed was working. Co-authored-by: Omer Ben-Amram <[email protected]>
Diffstat (limited to 'crates/ra_ide')
-rw-r--r--crates/ra_ide/src/snapshots/highlighting.html26
-rw-r--r--crates/ra_ide/src/snapshots/rainbow_highlighting.html2
-rw-r--r--crates/ra_ide/src/syntax_highlighting.rs16
3 files changed, 27 insertions, 17 deletions
diff --git a/crates/ra_ide/src/snapshots/highlighting.html b/crates/ra_ide/src/snapshots/highlighting.html
index 4166a8f90..40605d9ef 100644
--- a/crates/ra_ide/src/snapshots/highlighting.html
+++ b/crates/ra_ide/src/snapshots/highlighting.html
@@ -10,8 +10,10 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
10.builtin { color: #DD6718; } 10.builtin { color: #DD6718; }
11.text { color: #DCDCCC; } 11.text { color: #DCDCCC; }
12.type { color: #7CB8BB; } 12.type { color: #7CB8BB; }
13.type\.param { color: #20999D; }
13.attribute { color: #94BFF3; } 14.attribute { color: #94BFF3; }
14.literal { color: #BFEBBF; } 15.literal { color: #BFEBBF; }
16.literal\.numeric { color: #6A8759; }
15.macro { color: #94BFF3; } 17.macro { color: #94BFF3; }
16.variable { color: #DCDCCC; } 18.variable { color: #DCDCCC; }
17.variable\.mut { color: #DCDCCC; text-decoration: underline; } 19.variable\.mut { color: #DCDCCC; text-decoration: underline; }
@@ -22,36 +24,36 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
22</style> 24</style>
23<pre><code><span class="attribute">#</span><span class="attribute">[</span><span class="attribute">derive</span><span class="attribute">(</span><span class="attribute">Clone</span><span class="attribute">,</span><span class="attribute"> </span><span class="attribute">Debug</span><span class="attribute">)</span><span class="attribute">]</span> 25<pre><code><span class="attribute">#</span><span class="attribute">[</span><span class="attribute">derive</span><span class="attribute">(</span><span class="attribute">Clone</span><span class="attribute">,</span><span class="attribute"> </span><span class="attribute">Debug</span><span class="attribute">)</span><span class="attribute">]</span>
24<span class="keyword">struct</span> <span class="type">Foo</span> { 26<span class="keyword">struct</span> <span class="type">Foo</span> {
25 <span class="keyword">pub</span> <span class="field">x</span>: <span class="type">i32</span>, 27 <span class="keyword">pub</span> <span class="field">x</span>: <span class="type.builtin">i32</span>,
26 <span class="keyword">pub</span> <span class="field">y</span>: <span class="type">i32</span>, 28 <span class="keyword">pub</span> <span class="field">y</span>: <span class="type.builtin">i32</span>,
27} 29}
28 30
29<span class="keyword">fn</span> <span class="function">foo</span>&lt;<span class="type">T</span>&gt;() -&gt; <span class="type">T</span> { 31<span class="keyword">fn</span> <span class="function">foo</span>&lt;<span class="type.param">T</span>&gt;() -&gt; <span class="type.param">T</span> {
30 <span class="macro">unimplemented</span><span class="macro">!</span>(); 32 <span class="macro">unimplemented</span><span class="macro">!</span>();
31 <span class="function">foo</span>::&lt;<span class="type">i32</span>&gt;(); 33 <span class="function">foo</span>::&lt;<span class="type.builtin">i32</span>&gt;();
32} 34}
33 35
34<span class="comment">// comment</span> 36<span class="comment">// comment</span>
35<span class="keyword">fn</span> <span class="function">main</span>() { 37<span class="keyword">fn</span> <span class="function">main</span>() {
36 <span class="macro">println</span><span class="macro">!</span>(<span class="string">"Hello, {}!"</span>, <span class="literal">92</span>); 38 <span class="macro">println</span><span class="macro">!</span>(<span class="string">"Hello, {}!"</span>, <span class="literal.numeric">92</span>);
37 39
38 <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">vec</span> = <span class="text">Vec</span>::<span class="text">new</span>(); 40 <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">vec</span> = <span class="text">Vec</span>::<span class="text">new</span>();
39 <span class="keyword.control">if</span> <span class="keyword">true</span> { 41 <span class="keyword.control">if</span> <span class="keyword">true</span> {
40 <span class="variable.mut">vec</span>.<span class="text">push</span>(<span class="type">Foo</span> { <span class="field">x</span>: <span class="literal">0</span>, <span class="field">y</span>: <span class="literal">1</span> }); 42 <span class="variable.mut">vec</span>.<span class="text">push</span>(<span class="type">Foo</span> { <span class="field">x</span>: <span class="literal.numeric">0</span>, <span class="field">y</span>: <span class="literal.numeric">1</span> });
41 } 43 }
42 <span class="keyword.unsafe">unsafe</span> { <span class="variable.mut">vec</span>.<span class="text">set_len</span>(<span class="literal">0</span>); } 44 <span class="keyword.unsafe">unsafe</span> { <span class="variable.mut">vec</span>.<span class="text">set_len</span>(<span class="literal.numeric">0</span>); }
43 45
44 <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">x</span> = <span class="literal">42</span>; 46 <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">x</span> = <span class="literal.numeric">42</span>;
45 <span class="keyword">let</span> <span class="variable.mut">y</span> = &<span class="keyword">mut</span> <span class="variable.mut">x</span>; 47 <span class="keyword">let</span> <span class="variable.mut">y</span> = &<span class="keyword">mut</span> <span class="variable.mut">x</span>;
46 <span class="keyword">let</span> <span class="variable">z</span> = &<span class="variable.mut">y</span>; 48 <span class="keyword">let</span> <span class="variable">z</span> = &<span class="variable.mut">y</span>;
47 49
48 <span class="variable.mut">y</span>; 50 <span class="variable.mut">y</span>;
49} 51}
50 52
51<span class="keyword">enum</span> <span class="type">E</span>&lt;<span class="type">X</span>&gt; { 53<span class="keyword">enum</span> <span class="type">E</span>&lt;<span class="type.param">X</span>&gt; {
52 <span class="constant">V</span>(<span class="type">X</span>) 54 <span class="constant">V</span>(<span class="type.param">X</span>)
53} 55}
54 56
55<span class="keyword">impl</span>&lt;<span class="type">X</span>&gt; <span class="type">E</span>&lt;<span class="type">X</span>&gt; { 57<span class="keyword">impl</span>&lt;<span class="type.param">X</span>&gt; <span class="type">E</span>&lt;<span class="type.param">X</span>&gt; {
56 <span class="keyword">fn</span> <span class="function">new</span>&lt;<span class="type">T</span>&gt;() -&gt; <span class="type">E</span>&lt;<span class="type">T</span>&gt; {} 58 <span class="keyword">fn</span> <span class="function">new</span>&lt;<span class="type.param">T</span>&gt;() -&gt; <span class="type">E</span>&lt;<span class="type.param">T</span>&gt; {}
57}</code></pre> \ No newline at end of file 59}</code></pre> \ No newline at end of file
diff --git a/crates/ra_ide/src/snapshots/rainbow_highlighting.html b/crates/ra_ide/src/snapshots/rainbow_highlighting.html
index 9dfbc8047..ecf26c708 100644
--- a/crates/ra_ide/src/snapshots/rainbow_highlighting.html
+++ b/crates/ra_ide/src/snapshots/rainbow_highlighting.html
@@ -10,8 +10,10 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
10.builtin { color: #DD6718; } 10.builtin { color: #DD6718; }
11.text { color: #DCDCCC; } 11.text { color: #DCDCCC; }
12.type { color: #7CB8BB; } 12.type { color: #7CB8BB; }
13.type\.param { color: #20999D; }
13.attribute { color: #94BFF3; } 14.attribute { color: #94BFF3; }
14.literal { color: #BFEBBF; } 15.literal { color: #BFEBBF; }
16.literal\.numeric { color: #6A8759; }
15.macro { color: #94BFF3; } 17.macro { color: #94BFF3; }
16.variable { color: #DCDCCC; } 18.variable { color: #DCDCCC; }
17.variable\.mut { color: #DCDCCC; text-decoration: underline; } 19.variable\.mut { color: #DCDCCC; text-decoration: underline; }
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs
index 7ecb1a027..235e09ffc 100644
--- a/crates/ra_ide/src/syntax_highlighting.rs
+++ b/crates/ra_ide/src/syntax_highlighting.rs
@@ -108,14 +108,17 @@ pub(crate) fn highlight(db: &RootDatabase, file_id: FileId) -> Vec<HighlightedRa
108 match name_kind { 108 match name_kind {
109 Some(name_kind) => highlight_name(db, name_kind), 109 Some(name_kind) => highlight_name(db, name_kind),
110 None => name.syntax().parent().map_or("function", |x| match x.kind() { 110 None => name.syntax().parent().map_or("function", |x| match x.kind() {
111 TYPE_PARAM | STRUCT_DEF | ENUM_DEF | TRAIT_DEF | TYPE_ALIAS_DEF => "type", 111 STRUCT_DEF | ENUM_DEF | TRAIT_DEF | TYPE_ALIAS_DEF => "type",
112 TYPE_PARAM => "type.param",
112 RECORD_FIELD_DEF => "field", 113 RECORD_FIELD_DEF => "field",
113 _ => "function", 114 _ => "function",
114 }), 115 }),
115 } 116 }
116 } 117 }
117 INT_NUMBER | FLOAT_NUMBER | CHAR | BYTE => "literal", 118 INT_NUMBER | FLOAT_NUMBER => "literal.numeric",
118 LIFETIME => "parameter", 119 BYTE => "literal.byte",
120 CHAR => "literal.char",
121 LIFETIME => "type.lifetime",
119 T![unsafe] => "keyword.unsafe", 122 T![unsafe] => "keyword.unsafe",
120 k if is_control_keyword(k) => "keyword.control", 123 k if is_control_keyword(k) => "keyword.control",
121 k if k.is_keyword() => "keyword", 124 k if k.is_keyword() => "keyword",
@@ -224,8 +227,9 @@ fn highlight_name(db: &RootDatabase, name_kind: NameKind) -> &'static str {
224 Def(hir::ModuleDef::Static(_)) => "constant", 227 Def(hir::ModuleDef::Static(_)) => "constant",
225 Def(hir::ModuleDef::Trait(_)) => "type", 228 Def(hir::ModuleDef::Trait(_)) => "type",
226 Def(hir::ModuleDef::TypeAlias(_)) => "type", 229 Def(hir::ModuleDef::TypeAlias(_)) => "type",
227 Def(hir::ModuleDef::BuiltinType(_)) => "type", 230 Def(hir::ModuleDef::BuiltinType(_)) => "type.builtin",
228 SelfType(_) | TypeParam(_) => "type", 231 SelfType(_) => "type.self",
232 TypeParam(_) => "type.param",
229 Local(local) => { 233 Local(local) => {
230 if local.is_mut(db) { 234 if local.is_mut(db) {
231 "variable.mut" 235 "variable.mut"
@@ -255,8 +259,10 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
255.builtin { color: #DD6718; } 259.builtin { color: #DD6718; }
256.text { color: #DCDCCC; } 260.text { color: #DCDCCC; }
257.type { color: #7CB8BB; } 261.type { color: #7CB8BB; }
262.type\\.param { color: #20999D; }
258.attribute { color: #94BFF3; } 263.attribute { color: #94BFF3; }
259.literal { color: #BFEBBF; } 264.literal { color: #BFEBBF; }
265.literal\\.numeric { color: #6A8759; }
260.macro { color: #94BFF3; } 266.macro { color: #94BFF3; }
261.variable { color: #DCDCCC; } 267.variable { color: #DCDCCC; }
262.variable\\.mut { color: #DCDCCC; text-decoration: underline; } 268.variable\\.mut { color: #DCDCCC; text-decoration: underline; }