Skip to content

Commit b7e194e

Browse files
committed
internal: Add StaticLifetime to hir API
1 parent 2dca543 commit b7e194e

File tree

14 files changed

+70
-40
lines changed

14 files changed

+70
-40
lines changed

src/tools/rust-analyzer/crates/hir/src/lib.rs

+9
Original file line numberDiff line numberDiff line change
@@ -2563,6 +2563,15 @@ impl HasVisibility for TypeAlias {
25632563
}
25642564
}
25652565

2566+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2567+
pub struct StaticLifetime;
2568+
2569+
impl StaticLifetime {
2570+
pub fn name(self) -> Name {
2571+
known::STATIC_LIFETIME
2572+
}
2573+
}
2574+
25662575
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
25672576
pub struct BuiltinType {
25682577
pub(crate) inner: hir_def::builtin_type::BuiltinType,

src/tools/rust-analyzer/crates/ide-db/src/defs.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use hir::{
1111
Adt, AsAssocItem, AsExternAssocItem, AssocItem, AttributeTemplate, BuiltinAttr, BuiltinType,
1212
Const, Crate, DefWithBody, DeriveHelper, DocLinkDef, ExternAssocItem, ExternCrateDecl, Field,
1313
Function, GenericParam, HasVisibility, HirDisplay, Impl, Label, Local, Macro, Module,
14-
ModuleDef, Name, PathResolution, Semantics, Static, ToolModule, Trait, TraitAlias, TupleField,
15-
TypeAlias, Variant, VariantDef, Visibility,
14+
ModuleDef, Name, PathResolution, Semantics, Static, StaticLifetime, ToolModule, Trait,
15+
TraitAlias, TupleField, TypeAlias, Variant, VariantDef, Visibility,
1616
};
1717
use stdx::{format_to, impl_from};
1818
use syntax::{
@@ -39,12 +39,13 @@ pub enum Definition {
3939
Trait(Trait),
4040
TraitAlias(TraitAlias),
4141
TypeAlias(TypeAlias),
42-
BuiltinType(BuiltinType),
4342
SelfType(Impl),
4443
GenericParam(GenericParam),
4544
Local(Local),
4645
Label(Label),
4746
DeriveHelper(DeriveHelper),
47+
BuiltinType(BuiltinType),
48+
BuiltinLifetime(StaticLifetime),
4849
BuiltinAttr(BuiltinAttr),
4950
ToolModule(ToolModule),
5051
ExternCrateDecl(ExternCrateDecl),
@@ -83,6 +84,7 @@ impl Definition {
8384
Definition::DeriveHelper(it) => it.derive().module(db),
8485
Definition::BuiltinAttr(_)
8586
| Definition::BuiltinType(_)
87+
| Definition::BuiltinLifetime(_)
8688
| Definition::TupleField(_)
8789
| Definition::ToolModule(_) => return None,
8890
};
@@ -112,6 +114,7 @@ impl Definition {
112114
Definition::BuiltinType(_) | Definition::TupleField(_) => Visibility::Public,
113115
Definition::Macro(_) => return None,
114116
Definition::BuiltinAttr(_)
117+
| Definition::BuiltinLifetime(_)
115118
| Definition::ToolModule(_)
116119
| Definition::SelfType(_)
117120
| Definition::Local(_)
@@ -141,6 +144,7 @@ impl Definition {
141144
Definition::Local(it) => it.name(db),
142145
Definition::GenericParam(it) => it.name(db),
143146
Definition::Label(it) => it.name(db),
147+
Definition::BuiltinLifetime(StaticLifetime) => hir::known::STATIC_LIFETIME,
144148
Definition::BuiltinAttr(_) => return None, // FIXME
145149
Definition::ToolModule(_) => return None, // FIXME
146150
Definition::DeriveHelper(it) => it.name(db),
@@ -174,6 +178,7 @@ impl Definition {
174178
doc_owner.docs(fd.0.db)
175179
})
176180
}
181+
Definition::BuiltinLifetime(StaticLifetime) => None,
177182
Definition::Local(_) => None,
178183
Definition::SelfType(impl_def) => {
179184
impl_def.self_ty(db).as_adt().map(|adt| adt.docs(db))?
@@ -228,6 +233,7 @@ impl Definition {
228233
Definition::TraitAlias(it) => it.display(db).to_string(),
229234
Definition::TypeAlias(it) => it.display(db).to_string(),
230235
Definition::BuiltinType(it) => it.name().display(db).to_string(),
236+
Definition::BuiltinLifetime(it) => it.name().display(db).to_string(),
231237
Definition::Local(it) => {
232238
let ty = it.ty(db);
233239
let ty_display = ty.display_truncated(db, None);
@@ -693,6 +699,9 @@ impl NameRefClass {
693699
) -> Option<NameRefClass> {
694700
let _p = tracing::span!(tracing::Level::INFO, "NameRefClass::classify_lifetime", ?lifetime)
695701
.entered();
702+
if lifetime.text() == "'static" {
703+
return Some(NameRefClass::Definition(Definition::BuiltinLifetime(StaticLifetime)));
704+
}
696705
let parent = lifetime.syntax().parent()?;
697706
match parent.kind() {
698707
SyntaxKind::BREAK_EXPR | SyntaxKind::CONTINUE_EXPR => {

src/tools/rust-analyzer/crates/ide-db/src/rename.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,12 @@ impl Definition {
196196
.and_then(syn_ctx_is_root)
197197
}
198198
}
199-
Definition::BuiltinType(_) => return None,
200-
Definition::SelfType(_) => return None,
201-
Definition::BuiltinAttr(_) => return None,
202-
Definition::ToolModule(_) => return None,
203-
Definition::TupleField(_) => return None,
199+
Definition::BuiltinType(_)
200+
| Definition::BuiltinLifetime(_)
201+
| Definition::BuiltinAttr(_)
202+
| Definition::SelfType(_)
203+
| Definition::ToolModule(_)
204+
| Definition::TupleField(_) => return None,
204205
// FIXME: This should be doable in theory
205206
Definition::DeriveHelper(_) => return None,
206207
};

src/tools/rust-analyzer/crates/ide/src/doc_links.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,9 @@ pub(crate) fn resolve_doc_path_for_def(
214214
Definition::SelfType(it) => it.resolve_doc_path(db, link, ns),
215215
Definition::ExternCrateDecl(it) => it.resolve_doc_path(db, link, ns),
216216
Definition::BuiltinAttr(_)
217-
| Definition::ToolModule(_)
218217
| Definition::BuiltinType(_)
218+
| Definition::BuiltinLifetime(_)
219+
| Definition::ToolModule(_)
219220
| Definition::TupleField(_)
220221
| Definition::Local(_)
221222
| Definition::GenericParam(_)
@@ -648,6 +649,7 @@ fn filename_and_frag_for_def(
648649
| Definition::TupleField(_)
649650
| Definition::Label(_)
650651
| Definition::BuiltinAttr(_)
652+
| Definition::BuiltinLifetime(_)
651653
| Definition::ToolModule(_)
652654
| Definition::DeriveHelper(_) => return None,
653655
};

src/tools/rust-analyzer/crates/ide/src/hover/render.rs

+1-9
Original file line numberDiff line numberDiff line change
@@ -756,15 +756,7 @@ fn closure_ty(
756756
}
757757

758758
fn definition_mod_path(db: &RootDatabase, def: &Definition) -> Option<String> {
759-
if matches!(
760-
def,
761-
Definition::GenericParam(_)
762-
| Definition::BuiltinType(_)
763-
| Definition::Local(_)
764-
| Definition::Label(_)
765-
| Definition::BuiltinAttr(_)
766-
| Definition::ToolModule(_)
767-
) {
759+
if matches!(def, Definition::GenericParam(_) | Definition::Local(_) | Definition::Label(_)) {
768760
return None;
769761
}
770762
def.module(db).map(|module| path(db, module, definition_owner_name(db, def)))

src/tools/rust-analyzer/crates/ide/src/hover/tests.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -4441,7 +4441,7 @@ fn foo() {
44414441
```rust
44424442
'label
44434443
```
4444-
"#]],
4444+
"#]],
44454445
);
44464446
}
44474447

@@ -4455,7 +4455,17 @@ fn hover_lifetime() {
44554455
```rust
44564456
'lifetime
44574457
```
4458-
"#]],
4458+
"#]],
4459+
);
4460+
check(
4461+
r#"fn foo(_: &'static$0 ()) {}"#,
4462+
expect![[r#"
4463+
*'static*
4464+
4465+
```rust
4466+
'static
4467+
```
4468+
"#]],
44594469
);
44604470
}
44614471

src/tools/rust-analyzer/crates/ide/src/moniker.rs

+2
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ pub(crate) fn def_to_kind(db: &RootDatabase, def: Definition) -> SymbolInformati
211211
}
212212
}
213213
Definition::BuiltinType(..) => Type,
214+
Definition::BuiltinLifetime(_) => TypeParameter,
214215
Definition::SelfType(..) => TypeAlias,
215216
Definition::GenericParam(..) => TypeParameter,
216217
Definition::Local(it) => {
@@ -316,6 +317,7 @@ pub(crate) fn def_to_moniker(
316317
Definition::GenericParam(_)
317318
| Definition::Label(_)
318319
| Definition::DeriveHelper(_)
320+
| Definition::BuiltinLifetime(_)
319321
| Definition::BuiltinAttr(_)
320322
| Definition::ToolModule(_) => return None,
321323

src/tools/rust-analyzer/crates/ide/src/navigation_target.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,11 @@ impl TryToNav for Definition {
235235
Definition::TraitAlias(it) => it.try_to_nav(db),
236236
Definition::TypeAlias(it) => it.try_to_nav(db),
237237
Definition::ExternCrateDecl(it) => Some(it.try_to_nav(db)?),
238-
Definition::BuiltinType(_) | Definition::TupleField(_) => None,
239-
Definition::ToolModule(_) => None,
240-
Definition::BuiltinAttr(_) => None,
238+
Definition::BuiltinLifetime(_)
239+
| Definition::BuiltinType(_)
240+
| Definition::TupleField(_)
241+
| Definition::ToolModule(_)
242+
| Definition::BuiltinAttr(_) => None,
241243
// FIXME: The focus range should be set to the helper declaration
242244
Definition::DeriveHelper(it) => it.derive().try_to_nav(db),
243245
}

src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/highlight.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ pub(super) fn highlight_def(
484484
h
485485
}
486486
Definition::BuiltinType(_) => Highlight::new(HlTag::BuiltinType),
487+
Definition::BuiltinLifetime(_) => Highlight::new(HlTag::Symbol(SymbolKind::LifetimeParam)),
487488
Definition::Static(s) => {
488489
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Static));
489490

@@ -542,13 +543,14 @@ pub(super) fn highlight_def(
542543
let def_crate = def.krate(db);
543544
let is_from_other_crate = def_crate != Some(krate);
544545
let is_from_builtin_crate = def_crate.map_or(false, |def_crate| def_crate.is_builtin(db));
545-
let is_builtin_type = matches!(def, Definition::BuiltinType(_));
546-
let is_public = def.visibility(db) == Some(hir::Visibility::Public);
547-
548-
match (is_from_other_crate, is_builtin_type, is_public) {
549-
(true, false, _) => h |= HlMod::Library,
550-
(false, _, true) => h |= HlMod::Public,
551-
_ => {}
546+
let is_builtin = matches!(
547+
def,
548+
Definition::BuiltinType(_) | Definition::BuiltinLifetime(_) | Definition::BuiltinAttr(_)
549+
);
550+
match is_from_other_crate {
551+
true if !is_builtin => h |= HlMod::Library,
552+
false if def.visibility(db) == Some(hir::Visibility::Public) => h |= HlMod::Public,
553+
_ => (),
552554
}
553555

554556
if is_from_builtin_crate {

src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs

+1
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ fn module_def_to_hl_tag(def: Definition) -> HlTag {
299299
Definition::Trait(_) => SymbolKind::Trait,
300300
Definition::TraitAlias(_) => SymbolKind::TraitAlias,
301301
Definition::TypeAlias(_) => SymbolKind::TypeAlias,
302+
Definition::BuiltinLifetime(_) => SymbolKind::LifetimeParam,
302303
Definition::BuiltinType(_) => return HlTag::BuiltinType,
303304
Definition::Macro(_) => SymbolKind::Macro,
304305
Definition::Field(_) | Definition::TupleField(_) => SymbolKind::Field,

src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_attributes.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4646
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4747
</style>
48-
<pre><code><span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="builtin_attr attribute library">allow</span><span class="parenthesis attribute">(</span><span class="none attribute">dead_code</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>
48+
<pre><code><span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="builtin_attr attribute">allow</span><span class="parenthesis attribute">(</span><span class="none attribute">dead_code</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>
4949
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="tool_module attribute library">rustfmt</span><span class="operator attribute">::</span><span class="tool_module attribute library">skip</span><span class="attribute_bracket attribute">]</span>
5050
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="module attribute crate_root library">proc_macros</span><span class="operator attribute">::</span><span class="attribute attribute library">identity</span><span class="attribute_bracket attribute">]</span>
5151
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="attribute attribute default_library library">derive</span><span class="parenthesis attribute">(</span><span class="derive attribute default_library library">Default</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>

0 commit comments

Comments
 (0)