Skip to content

Commit 529b7a4

Browse files
bors[bot]lhvy
andauthored
Merge #10398
10398: Give defaultLibrary semantic token modifier to items from standard library r=Veykril a=lhvy Fixes #8999, fixes #2155 `builtInCrates` could be an alternate name to `defaultLibrary`, which one is better? > P.S. I'm participating in [Hacktoberfest 2021](https://hacktoberfest.digitalocean.com/). If this PR is up to standard and merged, I'd appreciate if the `hacktoberfest-accepted` label could be added. Thanks! Co-authored-by: lhvy <[email protected]> Co-authored-by: Lucas <[email protected]>
2 parents 26a1076 + 0b2ba8b commit 529b7a4

File tree

12 files changed

+163
-46
lines changed

12 files changed

+163
-46
lines changed

crates/ide/src/syntax_highlighting.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ pub struct HlRange {
134134
// consuming:: Emitted for locals that are being consumed when use in a function call.
135135
// controlFlow:: Emitted for control-flow related tokens, this includes the `?` operator.
136136
// declaration:: Emitted for names of definitions, like `foo` in `fn foo() {}`.
137+
// defaultLibrary:: Emitted for items from built-in crates (std, core, alloc, test and proc_macro).
137138
// documentation:: Emitted for documentation comments.
138139
// injected:: Emitted for doc-string injected highlighting like rust source blocks in documentation.
139140
// intraDocLink:: Emitted for intra doc links in doc-strings.

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use hir::{AsAssocItem, HasVisibility, Semantics};
44
use ide_db::{
55
defs::{Definition, NameClass, NameRefClass},
6-
helpers::try_resolve_derive_input_at,
6+
helpers::{try_resolve_derive_input_at, FamousDefs},
77
RootDatabase, SymbolKind,
88
};
99
use rustc_hash::FxHashMap;
@@ -25,7 +25,6 @@ pub(super) fn element(
2525
syntactic_name_ref_highlighting: bool,
2626
element: SyntaxElement,
2727
) -> Option<(Highlight, Option<u64>)> {
28-
let db = sema.db;
2928
let mut binding_hash = None;
3029
let highlight: Highlight = match element.kind() {
3130
FN => {
@@ -79,10 +78,10 @@ pub(super) fn element(
7978

8079
match NameClass::classify_lifetime(sema, &lifetime) {
8180
Some(NameClass::Definition(def)) => {
82-
highlight_def(db, krate, def) | HlMod::Definition
81+
highlight_def(sema, krate, def) | HlMod::Definition
8382
}
8483
None => match NameRefClass::classify_lifetime(sema, &lifetime) {
85-
Some(NameRefClass::Definition(def)) => highlight_def(db, krate, def),
84+
Some(NameRefClass::Definition(def)) => highlight_def(sema, krate, def),
8685
_ => SymbolKind::LifetimeParam.into(),
8786
},
8887
_ => Highlight::from(SymbolKind::LifetimeParam) | HlMod::Definition,
@@ -93,7 +92,7 @@ pub(super) fn element(
9392
element.ancestors().nth(2).and_then(ast::Attr::cast).zip(element.as_token())
9493
{
9594
match try_resolve_derive_input_at(sema, &attr, token) {
96-
Some(makro) => highlight_def(sema.db, krate, Definition::Macro(makro)),
95+
Some(makro) => highlight_def(sema, krate, Definition::Macro(makro)),
9796
None => HlTag::None.into(),
9897
}
9998
} else {
@@ -275,7 +274,7 @@ fn highlight_name_ref(
275274
}
276275
};
277276

278-
let mut h = highlight_def(db, krate, def);
277+
let mut h = highlight_def(sema, krate, def);
279278

280279
match def {
281280
Definition::Local(local)
@@ -334,15 +333,15 @@ fn highlight_name(
334333
};
335334
match name_kind {
336335
Some(NameClass::Definition(def)) => {
337-
let mut h = highlight_def(db, krate, def) | HlMod::Definition;
336+
let mut h = highlight_def(sema, krate, def) | HlMod::Definition;
338337
if let Definition::ModuleDef(hir::ModuleDef::Trait(trait_)) = &def {
339338
if trait_.is_unsafe(db) {
340339
h |= HlMod::Unsafe;
341340
}
342341
}
343342
h
344343
}
345-
Some(NameClass::ConstReference(def)) => highlight_def(db, krate, def),
344+
Some(NameClass::ConstReference(def)) => highlight_def(sema, krate, def),
346345
Some(NameClass::PatFieldShorthand { field_ref, .. }) => {
347346
let mut h = HlTag::Symbol(SymbolKind::Field).into();
348347
if let hir::VariantDef::Union(_) = field_ref.parent_def(db) {
@@ -366,7 +365,12 @@ fn calc_binding_hash(name: &hir::Name, shadow_count: u32) -> u64 {
366365
hash((name, shadow_count))
367366
}
368367

369-
fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition) -> Highlight {
368+
fn highlight_def(
369+
sema: &Semantics<RootDatabase>,
370+
krate: Option<hir::Crate>,
371+
def: Definition,
372+
) -> Highlight {
373+
let db = sema.db;
370374
let mut h = match def {
371375
Definition::Macro(_) => Highlight::new(HlTag::Symbol(SymbolKind::Macro)),
372376
Definition::Field(_) => Highlight::new(HlTag::Symbol(SymbolKind::Field)),
@@ -504,7 +508,14 @@ fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition)
504508
Definition::Label(_) => Highlight::new(HlTag::Symbol(SymbolKind::Label)),
505509
};
506510

507-
let is_from_other_crate = def.module(db).map(hir::Module::krate) != krate;
511+
let famous_defs = FamousDefs(&sema, krate);
512+
let def_crate = def.module(db).map(hir::Module::krate).or_else(|| match def {
513+
Definition::ModuleDef(hir::ModuleDef::Module(module)) => Some(module.krate()),
514+
_ => None,
515+
});
516+
let is_from_other_crate = def_crate != krate;
517+
let is_from_builtin_crate =
518+
def_crate.map_or(false, |def_crate| famous_defs.builtin_crates().any(|it| def_crate == it));
508519
let is_builtin_type = matches!(def, Definition::ModuleDef(hir::ModuleDef::BuiltinType(_)));
509520
let is_public = def.visibility(db) == Some(hir::Visibility::Public);
510521

@@ -514,6 +525,10 @@ fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition)
514525
_ => {}
515526
}
516527

528+
if is_from_builtin_crate {
529+
h |= HlMod::DefaultLibrary;
530+
}
531+
517532
h
518533
}
519534

@@ -546,7 +561,10 @@ fn highlight_method_call(
546561
h |= HlMod::Trait;
547562
}
548563

549-
let is_from_other_crate = Some(func.module(sema.db).krate()) != krate;
564+
let famous_defs = FamousDefs(&sema, krate);
565+
let def_crate = func.module(sema.db).krate();
566+
let is_from_other_crate = Some(def_crate) != krate;
567+
let is_from_builtin_crate = famous_defs.builtin_crates().any(|it| def_crate == it);
550568
let is_public = func.visibility(sema.db) == hir::Visibility::Public;
551569

552570
if is_from_other_crate {
@@ -555,6 +573,10 @@ fn highlight_method_call(
555573
h |= HlMod::Public;
556574
}
557575

576+
if is_from_builtin_crate {
577+
h |= HlMod::DefaultLibrary;
578+
}
579+
558580
if let Some(self_param) = func.self_param(sema.db) {
559581
match self_param.access(sema.db) {
560582
hir::Access::Shared => h |= HlMod::Reference,

crates/ide/src/syntax_highlighting/tags.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ pub enum HlMod {
5555
Consuming,
5656
/// Used with keywords like `if` and `break`.
5757
ControlFlow,
58+
/// Used for items from built-in crates (std, core, alloc, test and proc_macro).
59+
DefaultLibrary,
5860
/// `foo` in `fn foo(x: i32)` is a definition, `foo` in `foo(90 + 2)` is
5961
/// not.
6062
Definition,
@@ -187,42 +189,44 @@ impl fmt::Display for HlTag {
187189
impl HlMod {
188190
const ALL: &'static [HlMod; HlMod::Unsafe as u8 as usize + 1] = &[
189191
HlMod::Associated,
192+
HlMod::Async,
190193
HlMod::Attribute,
191194
HlMod::Callable,
192195
HlMod::Consuming,
193196
HlMod::ControlFlow,
197+
HlMod::DefaultLibrary,
194198
HlMod::Definition,
195199
HlMod::Documentation,
196200
HlMod::Injected,
197201
HlMod::IntraDocLink,
202+
HlMod::Library,
198203
HlMod::Mutable,
204+
HlMod::Public,
199205
HlMod::Reference,
200206
HlMod::Static,
201207
HlMod::Trait,
202-
HlMod::Async,
203-
HlMod::Library,
204-
HlMod::Public,
205208
HlMod::Unsafe,
206209
];
207210

208211
fn as_str(self) -> &'static str {
209212
match self {
210213
HlMod::Associated => "associated",
214+
HlMod::Async => "async",
211215
HlMod::Attribute => "attribute",
212216
HlMod::Callable => "callable",
213217
HlMod::Consuming => "consuming",
214218
HlMod::ControlFlow => "control",
219+
HlMod::DefaultLibrary => "default_library",
215220
HlMod::Definition => "declaration",
216221
HlMod::Documentation => "documentation",
217222
HlMod::Injected => "injected",
218223
HlMod::IntraDocLink => "intra_doc_link",
224+
HlMod::Library => "library",
219225
HlMod::Mutable => "mutable",
226+
HlMod::Public => "public",
220227
HlMod::Reference => "reference",
221228
HlMod::Static => "static",
222229
HlMod::Trait => "trait",
223-
HlMod::Async => "async",
224-
HlMod::Library => "library",
225-
HlMod::Public => "public",
226230
HlMod::Unsafe => "unsafe",
227231
}
228232
}

crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
<span class="keyword">struct</span> <span class="struct declaration">foo</span> <span class="brace">{</span><span class="brace">}</span>
4646

4747
<span class="keyword">impl</span> <span class="struct">foo</span> <span class="brace">{</span>
48-
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration static public">is_static</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
49-
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration reference public">is_not_static</span><span class="parenthesis">(</span><span class="operator">&</span><span class="self_keyword declaration reference">self</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
48+
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration public static">is_static</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
49+
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration public reference">is_not_static</span><span class="parenthesis">(</span><span class="operator">&</span><span class="self_keyword declaration reference">self</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
5050
<span class="brace">}</span>
5151

5252
<span class="keyword">trait</span> <span class="trait declaration">t</span> <span class="brace">{</span>
@@ -55,7 +55,7 @@
5555
<span class="brace">}</span>
5656

5757
<span class="keyword">impl</span> <span class="trait">t</span> <span class="keyword">for</span> <span class="struct">foo</span> <span class="brace">{</span>
58-
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration static trait public">is_static</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
59-
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration reference trait public">is_not_static</span><span class="parenthesis">(</span><span class="operator">&</span><span class="self_keyword declaration reference">self</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
58+
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration public static trait">is_static</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
59+
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration public reference trait">is_not_static</span><span class="parenthesis">(</span><span class="operator">&</span><span class="self_keyword declaration reference">self</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
6060
<span class="brace">}</span>
6161
</code></pre>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
<style>
3+
body { margin: 0; }
4+
pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padding: 0.4em; }
5+
6+
.lifetime { color: #DFAF8F; font-style: italic; }
7+
.label { color: #DFAF8F; font-style: italic; }
8+
.comment { color: #7F9F7F; }
9+
.documentation { color: #629755; }
10+
.intra_doc_link { font-style: italic; }
11+
.injected { opacity: 0.65 ; }
12+
.struct, .enum { color: #7CB8BB; }
13+
.enum_variant { color: #BDE0F3; }
14+
.string_literal { color: #CC9393; }
15+
.field { color: #94BFF3; }
16+
.function { color: #93E0E3; }
17+
.function.unsafe { color: #BC8383; }
18+
.trait.unsafe { color: #BC8383; }
19+
.operator.unsafe { color: #BC8383; }
20+
.mutable.unsafe { color: #BC8383; text-decoration: underline; }
21+
.keyword.unsafe { color: #BC8383; font-weight: bold; }
22+
.parameter { color: #94BFF3; }
23+
.text { color: #DCDCCC; }
24+
.type { color: #7CB8BB; }
25+
.builtin_type { color: #8CD0D3; }
26+
.type_param { color: #DFAF8F; }
27+
.attribute { color: #94BFF3; }
28+
.numeric_literal { color: #BFEBBF; }
29+
.bool_literal { color: #BFE6EB; }
30+
.macro { color: #94BFF3; }
31+
.module { color: #AFD8AF; }
32+
.value_param { color: #DCDCCC; }
33+
.variable { color: #DCDCCC; }
34+
.format_specifier { color: #CC696B; }
35+
.mutable { text-decoration: underline; }
36+
.escape_sequence { color: #94BFF3; }
37+
.keyword { color: #F0DFAF; font-weight: bold; }
38+
.control { font-style: italic; }
39+
.reference { font-style: italic; font-weight: bold; }
40+
41+
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
42+
</style>
43+
<pre><code><span class="keyword">use</span> <span class="module default_library library">core</span><span class="operator">::</span><span class="module default_library library">iter</span><span class="semicolon">;</span>
44+
45+
<span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
46+
<span class="keyword">let</span> <span class="variable declaration">foo</span> <span class="operator">=</span> <span class="enum_variant default_library library">Some</span><span class="parenthesis">(</span><span class="numeric_literal">92</span><span class="parenthesis">)</span><span class="semicolon">;</span>
47+
<span class="keyword">let</span> <span class="variable declaration">nums</span> <span class="operator">=</span> <span class="module default_library library">iter</span><span class="operator">::</span><span class="function default_library library">repeat</span><span class="parenthesis">(</span><span class="variable">foo</span><span class="operator">.</span><span class="function associated consuming default_library library">unwrap</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="semicolon">;</span>
48+
<span class="brace">}</span>
49+
</code></pre>

crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
<span class="comment documentation">/// #</span><span class="none injected"> </span><span class="attribute attribute injected">#</span><span class="attribute attribute injected">!</span><span class="attribute attribute injected">[</span><span class="builtin_attr attribute injected">allow</span><span class="parenthesis attribute injected">(</span><span class="none attribute injected">unused_mut</span><span class="parenthesis attribute injected">)</span><span class="attribute attribute injected">]</span>
7676
<span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="keyword injected">mut</span><span class="none injected"> </span><span class="variable declaration injected mutable">foo</span><span class="colon injected">:</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="operator injected">::</span><span class="function injected">new</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
7777
<span class="comment documentation">/// ```</span>
78-
<span class="keyword">pub</span> <span class="keyword">const</span> <span class="keyword">fn</span> <span class="function associated declaration static public">new</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">-&gt;</span> <span class="struct">Foo</span> <span class="brace">{</span>
78+
<span class="keyword">pub</span> <span class="keyword">const</span> <span class="keyword">fn</span> <span class="function associated declaration public static">new</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">-&gt;</span> <span class="struct">Foo</span> <span class="brace">{</span>
7979
<span class="struct">Foo</span> <span class="brace">{</span> <span class="field">bar</span><span class="colon">:</span> <span class="bool_literal">true</span> <span class="brace">}</span>
8080
<span class="brace">}</span>
8181

@@ -109,7 +109,7 @@
109109
<span class="comment documentation">/// ```sh</span>
110110
<span class="comment documentation">/// echo 1</span>
111111
<span class="comment documentation">/// ```</span>
112-
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration reference public">foo</span><span class="parenthesis">(</span><span class="operator">&</span><span class="self_keyword declaration reference">self</span><span class="parenthesis">)</span> <span class="operator">-&gt;</span> <span class="builtin_type">bool</span> <span class="brace">{</span>
112+
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function associated declaration public reference">foo</span><span class="parenthesis">(</span><span class="operator">&</span><span class="self_keyword declaration reference">self</span><span class="parenthesis">)</span> <span class="operator">-&gt;</span> <span class="builtin_type">bool</span> <span class="brace">{</span>
113113
<span class="bool_literal">true</span>
114114
<span class="brace">}</span>
115115
<span class="brace">}</span>

crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@
4040

4141
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4242
</style>
43-
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module library">std</span><span class="semicolon">;</span>
44-
<span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module library">alloc</span> <span class="keyword">as</span> <span class="module declaration library">abc</span><span class="semicolon">;</span>
43+
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module default_library library">std</span><span class="semicolon">;</span>
44+
<span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module default_library library">alloc</span> <span class="keyword">as</span> <span class="module default_library declaration library">abc</span><span class="semicolon">;</span>
4545
</code></pre>

0 commit comments

Comments
 (0)