Skip to content

Commit 8b049ec

Browse files
Merge #8942
8942: Add `library` semantic token modifier to items from other crates r=arzg a=arzg Closes #5772. A lot of code here is pretty repetitive; please let me know if you have any ideas how to improve it, or whether it’s fine as-is. Side-note: How can I add tests for this? I don’t see a way for the test Rust code in `test_highlighting` to reference other crates to observe the new behaviour. Co-authored-by: Aramis Razzaghipour <[email protected]>
2 parents 6d473c0 + d75277b commit 8b049ec

File tree

10 files changed

+124
-62
lines changed

10 files changed

+124
-62
lines changed

crates/hir/src/lib.rs

+1-32
Original file line numberDiff line numberDiff line change
@@ -551,10 +551,6 @@ impl Struct {
551551
Module { id: self.id.lookup(db.upcast()).container }
552552
}
553553

554-
pub fn krate(self, db: &dyn HirDatabase) -> Option<Crate> {
555-
Some(self.module(db).krate())
556-
}
557-
558554
pub fn name(self, db: &dyn HirDatabase) -> Name {
559555
db.struct_data(self.id).name.clone()
560556
}
@@ -639,10 +635,6 @@ impl Enum {
639635
Module { id: self.id.lookup(db.upcast()).container }
640636
}
641637

642-
pub fn krate(self, db: &dyn HirDatabase) -> Option<Crate> {
643-
Some(self.module(db).krate())
644-
}
645-
646638
pub fn name(self, db: &dyn HirDatabase) -> Name {
647639
db.enum_data(self.id).name.clone()
648640
}
@@ -672,6 +664,7 @@ impl Variant {
672664
pub fn module(self, db: &dyn HirDatabase) -> Module {
673665
self.parent.module(db)
674666
}
667+
675668
pub fn parent_enum(self, _db: &dyn HirDatabase) -> Enum {
676669
self.parent
677670
}
@@ -728,10 +721,6 @@ impl Adt {
728721
}
729722
}
730723

731-
pub fn krate(self, db: &dyn HirDatabase) -> Crate {
732-
self.module(db).krate()
733-
}
734-
735724
pub fn name(self, db: &dyn HirDatabase) -> Name {
736725
match self {
737726
Adt::Struct(s) => s.name(db),
@@ -820,10 +809,6 @@ impl Function {
820809
self.id.lookup(db.upcast()).module(db.upcast()).into()
821810
}
822811

823-
pub fn krate(self, db: &dyn HirDatabase) -> Option<Crate> {
824-
Some(self.module(db).krate())
825-
}
826-
827812
pub fn name(self, db: &dyn HirDatabase) -> Name {
828813
db.function_data(self.id).name.clone()
829814
}
@@ -1013,10 +998,6 @@ impl Const {
1013998
Module { id: self.id.lookup(db.upcast()).module(db.upcast()) }
1014999
}
10151000

1016-
pub fn krate(self, db: &dyn HirDatabase) -> Option<Crate> {
1017-
Some(self.module(db).krate())
1018-
}
1019-
10201001
pub fn name(self, db: &dyn HirDatabase) -> Option<Name> {
10211002
db.const_data(self.id).name.clone()
10221003
}
@@ -1044,10 +1025,6 @@ impl Static {
10441025
Module { id: self.id.lookup(db.upcast()).module(db.upcast()) }
10451026
}
10461027

1047-
pub fn krate(self, db: &dyn HirDatabase) -> Option<Crate> {
1048-
Some(self.module(db).krate())
1049-
}
1050-
10511028
pub fn name(self, db: &dyn HirDatabase) -> Option<Name> {
10521029
db.static_data(self.id).name.clone()
10531030
}
@@ -1111,10 +1088,6 @@ impl TypeAlias {
11111088
Module { id: self.id.lookup(db.upcast()).module(db.upcast()) }
11121089
}
11131090

1114-
pub fn krate(self, db: &dyn HirDatabase) -> Crate {
1115-
self.module(db).krate()
1116-
}
1117-
11181091
pub fn type_ref(self, db: &dyn HirDatabase) -> Option<TypeRef> {
11191092
db.type_alias_data(self.id).type_ref.as_deref().cloned()
11201093
}
@@ -1666,10 +1639,6 @@ impl Impl {
16661639
self.id.lookup(db.upcast()).container.into()
16671640
}
16681641

1669-
pub fn krate(self, db: &dyn HirDatabase) -> Crate {
1670-
Crate { id: self.module(db).id.krate() }
1671-
}
1672-
16731642
pub fn is_builtin_derive(self, db: &dyn HirDatabase) -> Option<InFile<ast::Attr>> {
16741643
let src = self.source(db)?;
16751644
let item = src.file_id.is_builtin_derive(db.upcast())?;

crates/ide/src/inlay_hints.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ fn hint_iterator(
219219
) -> Option<SmolStr> {
220220
let db = sema.db;
221221
let strukt = ty.strip_references().as_adt()?;
222-
let krate = strukt.krate(db);
222+
let krate = strukt.module(db).krate();
223223
if krate != famous_defs.core()? {
224224
return None;
225225
}

crates/ide/src/runnables.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ pub(crate) fn runnable_fn(sema: &Semantics<RootDatabase>, def: hir::Function) ->
227227
let func = def.source(sema.db)?;
228228
let name_string = def.name(sema.db).to_string();
229229

230-
let root = def.krate(sema.db)?.root_module(sema.db);
230+
let root = def.module(sema.db).krate().root_module(sema.db);
231231

232232
let kind = if name_string == "main" && def.module(sema.db) == root {
233233
RunnableKind::Bin

crates/ide/src/syntax_highlighting.rs

+3
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ pub(crate) fn highlight(
8080
&mut hl,
8181
&sema,
8282
InFile::new(file_id.into(), &root),
83+
sema.scope(&root).krate(),
8384
range_to_highlight,
8485
syntactic_name_ref_highlighting,
8586
);
@@ -90,6 +91,7 @@ fn traverse(
9091
hl: &mut Highlights,
9192
sema: &Semantics<RootDatabase>,
9293
root: InFile<&SyntaxNode>,
94+
krate: Option<hir::Crate>,
9395
range_to_highlight: TextRange,
9496
syntactic_name_ref_highlighting: bool,
9597
) {
@@ -209,6 +211,7 @@ fn traverse(
209211

210212
if let Some((mut highlight, binding_hash)) = highlight::element(
211213
&sema,
214+
krate,
212215
&mut bindings_shadow_count,
213216
syntactic_name_ref_highlighting,
214217
element_to_highlight.clone(),

crates/ide/src/syntax_highlighting/highlight.rs

+57-27
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::{
1919

2020
pub(super) fn element(
2121
sema: &Semantics<RootDatabase>,
22+
krate: Option<hir::Crate>,
2223
bindings_shadow_count: &mut FxHashMap<hir::Name, u32>,
2324
syntactic_name_ref_highlighting: bool,
2425
element: SyntaxElement,
@@ -46,8 +47,10 @@ pub(super) fn element(
4647

4748
match name_kind {
4849
Some(NameClass::ExternCrate(_)) => SymbolKind::Module.into(),
49-
Some(NameClass::Definition(def)) => highlight_def(db, def) | HlMod::Definition,
50-
Some(NameClass::ConstReference(def)) => highlight_def(db, def),
50+
Some(NameClass::Definition(def)) => {
51+
highlight_def(db, krate, def) | HlMod::Definition
52+
}
53+
Some(NameClass::ConstReference(def)) => highlight_def(db, krate, def),
5154
Some(NameClass::PatFieldShorthand { field_ref, .. }) => {
5255
let mut h = HlTag::Symbol(SymbolKind::Field).into();
5356
if let Definition::Field(field) = field_ref {
@@ -82,7 +85,7 @@ pub(super) fn element(
8285
}
8386
};
8487

85-
let mut h = highlight_def(db, def);
88+
let mut h = highlight_def(db, krate, def);
8689

8790
if let Definition::Local(local) = &def {
8891
if is_consumed_lvalue(name_ref.syntax().clone().into(), local, db) {
@@ -136,9 +139,11 @@ pub(super) fn element(
136139
let lifetime = element.into_node().and_then(ast::Lifetime::cast).unwrap();
137140

138141
match NameClass::classify_lifetime(sema, &lifetime) {
139-
Some(NameClass::Definition(def)) => highlight_def(db, def) | HlMod::Definition,
142+
Some(NameClass::Definition(def)) => {
143+
highlight_def(db, krate, def) | HlMod::Definition
144+
}
140145
None => match NameRefClass::classify_lifetime(sema, &lifetime) {
141-
Some(NameRefClass::Definition(def)) => highlight_def(db, def),
146+
Some(NameRefClass::Definition(def)) => highlight_def(db, krate, def),
142147
_ => SymbolKind::LifetimeParam.into(),
143148
},
144149
_ => Highlight::from(SymbolKind::LifetimeParam) | HlMod::Definition,
@@ -277,12 +282,12 @@ pub(super) fn element(
277282
hash((name, shadow_count))
278283
}
279284
}
280-
fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
281-
match def {
282-
Definition::Macro(_) => HlTag::Symbol(SymbolKind::Macro),
283-
Definition::Field(_) => HlTag::Symbol(SymbolKind::Field),
285+
fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition) -> Highlight {
286+
let mut h = match def {
287+
Definition::Macro(_) => Highlight::new(HlTag::Symbol(SymbolKind::Macro)),
288+
Definition::Field(_) => Highlight::new(HlTag::Symbol(SymbolKind::Field)),
284289
Definition::ModuleDef(def) => match def {
285-
hir::ModuleDef::Module(_) => HlTag::Symbol(SymbolKind::Module),
290+
hir::ModuleDef::Module(_) => Highlight::new(HlTag::Symbol(SymbolKind::Module)),
286291
hir::ModuleDef::Function(func) => {
287292
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Function));
288293
if let Some(item) = func.as_assoc_item(db) {
@@ -314,14 +319,22 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
314319
if func.is_async(db) {
315320
h |= HlMod::Async;
316321
}
317-
return h;
322+
323+
h
318324
}
319-
hir::ModuleDef::Adt(hir::Adt::Struct(_)) => HlTag::Symbol(SymbolKind::Struct),
320-
hir::ModuleDef::Adt(hir::Adt::Enum(_)) => HlTag::Symbol(SymbolKind::Enum),
321-
hir::ModuleDef::Adt(hir::Adt::Union(_)) => HlTag::Symbol(SymbolKind::Union),
322-
hir::ModuleDef::Variant(_) => HlTag::Symbol(SymbolKind::Variant),
325+
hir::ModuleDef::Adt(adt) => {
326+
let h = match adt {
327+
hir::Adt::Struct(_) => HlTag::Symbol(SymbolKind::Struct),
328+
hir::Adt::Enum(_) => HlTag::Symbol(SymbolKind::Enum),
329+
hir::Adt::Union(_) => HlTag::Symbol(SymbolKind::Union),
330+
};
331+
332+
Highlight::new(h)
333+
}
334+
hir::ModuleDef::Variant(_) => Highlight::new(HlTag::Symbol(SymbolKind::Variant)),
323335
hir::ModuleDef::Const(konst) => {
324336
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Const));
337+
325338
if let Some(item) = konst.as_assoc_item(db) {
326339
h |= HlMod::Associated;
327340
match item.container(db) {
@@ -336,18 +349,20 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
336349
}
337350
}
338351

339-
return h;
352+
h
340353
}
341354
hir::ModuleDef::Trait(trait_) => {
342355
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Trait));
343356

344357
if trait_.is_unsafe(db) {
345358
h |= HlMod::Unsafe;
346359
}
347-
return h;
360+
361+
h
348362
}
349363
hir::ModuleDef::TypeAlias(type_) => {
350364
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::TypeAlias));
365+
351366
if let Some(item) = type_.as_assoc_item(db) {
352367
h |= HlMod::Associated;
353368
match item.container(db) {
@@ -361,23 +376,30 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
361376
}
362377
}
363378
}
364-
return h;
379+
380+
h
365381
}
366-
hir::ModuleDef::BuiltinType(_) => HlTag::BuiltinType,
382+
hir::ModuleDef::BuiltinType(_) => Highlight::new(HlTag::BuiltinType),
367383
hir::ModuleDef::Static(s) => {
368384
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Static));
385+
369386
if s.is_mut(db) {
370387
h |= HlMod::Mutable;
371388
h |= HlMod::Unsafe;
372389
}
373-
return h;
390+
391+
h
374392
}
375393
},
376-
Definition::SelfType(_) => HlTag::Symbol(SymbolKind::Impl),
394+
Definition::SelfType(_) => Highlight::new(HlTag::Symbol(SymbolKind::Impl)),
377395
Definition::GenericParam(it) => match it {
378-
hir::GenericParam::TypeParam(_) => HlTag::Symbol(SymbolKind::TypeParam),
379-
hir::GenericParam::ConstParam(_) => HlTag::Symbol(SymbolKind::ConstParam),
380-
hir::GenericParam::LifetimeParam(_) => HlTag::Symbol(SymbolKind::LifetimeParam),
396+
hir::GenericParam::TypeParam(_) => Highlight::new(HlTag::Symbol(SymbolKind::TypeParam)),
397+
hir::GenericParam::ConstParam(_) => {
398+
Highlight::new(HlTag::Symbol(SymbolKind::ConstParam))
399+
}
400+
hir::GenericParam::LifetimeParam(_) => {
401+
Highlight::new(HlTag::Symbol(SymbolKind::LifetimeParam))
402+
}
381403
},
382404
Definition::Local(local) => {
383405
let tag = if local.is_self(db) {
@@ -395,11 +417,19 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
395417
if ty.as_callable(db).is_some() || ty.impls_fnonce(db) {
396418
h |= HlMod::Callable;
397419
}
398-
return h;
420+
h
399421
}
400-
Definition::Label(_) => HlTag::Symbol(SymbolKind::Label),
422+
Definition::Label(_) => Highlight::new(HlTag::Symbol(SymbolKind::Label)),
423+
};
424+
425+
let is_from_other_crate = def.module(db).map(hir::Module::krate) != krate;
426+
let is_builtin_type = matches!(def, Definition::ModuleDef(hir::ModuleDef::BuiltinType(_)));
427+
428+
if is_from_other_crate && !is_builtin_type {
429+
h |= HlMod::Library;
401430
}
402-
.into()
431+
432+
h
403433
}
404434

405435
fn highlight_func_by_name_ref(

crates/ide/src/syntax_highlighting/tags.rs

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ pub enum HlMod {
6767
Trait,
6868
/// Used with keywords like `async` and `await`.
6969
Async,
70+
/// Used for items from other crates.
71+
Library,
7072
// Keep this last!
7173
/// Used for unsafe functions, unsafe traits, mutable statics, union accesses and unsafe operations.
7274
Unsafe,
@@ -189,6 +191,7 @@ impl HlMod {
189191
HlMod::Static,
190192
HlMod::Trait,
191193
HlMod::Async,
194+
HlMod::Library,
192195
HlMod::Unsafe,
193196
];
194197

@@ -207,6 +210,7 @@ impl HlMod {
207210
HlMod::Static => "static",
208211
HlMod::Trait => "trait",
209212
HlMod::Async => "async",
213+
HlMod::Library => "library",
210214
HlMod::Unsafe => "unsafe",
211215
}
212216
}

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,20 @@
248248
<span class="brace">}</span>
249249

250250
<span class="keyword unsafe">unsafe</span> <span class="keyword">trait</span> <span class="trait declaration unsafe">Dangerous</span> <span class="brace">{</span><span class="brace">}</span>
251-
<span class="keyword">impl</span> <span class="trait unsafe">Dangerous</span> <span class="keyword">for</span> <span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span></code></pre>
251+
<span class="keyword">impl</span> <span class="trait unsafe">Dangerous</span> <span class="keyword">for</span> <span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
252+
253+
<span class="keyword">fn</span> <span class="function declaration">use_foo_items</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
254+
<span class="keyword">let</span> <span class="variable declaration">bob</span> <span class="operator">=</span> <span class="module library">foo</span><span class="operator">::</span><span class="struct library">Person</span> <span class="brace">{</span>
255+
<span class="field library">name</span><span class="colon">:</span> <span class="string_literal">"Bob"</span><span class="comma">,</span>
256+
<span class="field library">age</span><span class="colon">:</span> <span class="module library">foo</span><span class="operator">::</span><span class="module library">consts</span><span class="operator">::</span><span class="constant library">NUMBER</span><span class="comma">,</span>
257+
<span class="brace">}</span><span class="semicolon">;</span>
258+
259+
<span class="keyword">let</span> <span class="variable declaration">control_flow</span> <span class="operator">=</span> <span class="module library">foo</span><span class="operator">::</span><span class="function library">identity</span><span class="parenthesis">(</span><span class="module library">foo</span><span class="operator">::</span><span class="enum library">ControlFlow</span><span class="operator">::</span><span class="enum_variant library">Continue</span><span class="parenthesis">)</span><span class="semicolon">;</span>
260+
261+
<span class="keyword control">if</span> <span class="keyword">let</span> <span class="module library">foo</span><span class="operator">::</span><span class="enum library">ControlFlow</span><span class="operator">::</span><span class="enum_variant library">Die</span> <span class="operator">=</span> <span class="variable">control_flow</span> <span class="brace">{</span>
262+
foo::<span class="macro">die!</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
263+
<span class="brace">}</span>
264+
<span class="brace">}</span>
265+
266+
267+
</code></pre>

0 commit comments

Comments
 (0)