Skip to content

Commit 6f04f37

Browse files
authored
Merge pull request #18902 from Veykril/push-znlsxykqrkoo
internal: Add Definition::Crate
2 parents 89b3767 + e6270bd commit 6f04f37

23 files changed

+184
-133
lines changed

crates/hir/src/attrs.rs

+10
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,16 @@ impl HasAttrs for AssocItem {
8989
}
9090
}
9191

92+
impl HasAttrs for crate::Crate {
93+
fn attrs(self, db: &dyn HirDatabase) -> AttrsWithOwner {
94+
let def = AttrDefId::ModuleId(self.root_module().id);
95+
AttrsWithOwner::new(db.upcast(), def)
96+
}
97+
fn attr_id(self) -> AttrDefId {
98+
AttrDefId::ModuleId(self.root_module().id)
99+
}
100+
}
101+
92102
/// Resolves the item `link` points to in the scope of `def`.
93103
pub fn resolve_doc_path_on(
94104
db: &dyn HirDatabase,

crates/hir/src/display.rs

+23-10
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ use hir_ty::{
2323
use itertools::Itertools;
2424

2525
use crate::{
26-
Adt, AsAssocItem, AssocItem, AssocItemContainer, Const, ConstParam, Enum, ExternCrateDecl,
27-
Field, Function, GenericParam, HasCrate, HasVisibility, Impl, LifetimeParam, Macro, Module,
28-
SelfParam, Static, Struct, Trait, TraitAlias, TraitRef, TupleField, TyBuilder, Type, TypeAlias,
29-
TypeOrConstParam, TypeParam, Union, Variant,
26+
Adt, AsAssocItem, AssocItem, AssocItemContainer, Const, ConstParam, Crate, Enum,
27+
ExternCrateDecl, Field, Function, GenericParam, HasCrate, HasVisibility, Impl, LifetimeParam,
28+
Macro, Module, SelfParam, Static, Struct, Trait, TraitAlias, TraitRef, TupleField, TyBuilder,
29+
Type, TypeAlias, TypeOrConstParam, TypeParam, Union, Variant,
3030
};
3131

3232
impl HirDisplay for Function {
@@ -846,14 +846,27 @@ impl HirDisplay for TypeAlias {
846846

847847
impl HirDisplay for Module {
848848
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
849-
// FIXME: Module doesn't have visibility saved in data.
849+
match self.parent(f.db) {
850+
Some(m) => write_visibility(m.id, self.visibility(f.db), f)?,
851+
None => {
852+
return match self.krate(f.db).display_name(f.db) {
853+
Some(name) => write!(f, "extern crate {name}"),
854+
None => f.write_str("extern crate {unknown}"),
855+
}
856+
}
857+
}
850858
match self.name(f.db) {
851859
Some(name) => write!(f, "mod {}", name.display(f.db.upcast(), f.edition())),
852-
None if self.is_crate_root() => match self.krate(f.db).display_name(f.db) {
853-
Some(name) => write!(f, "extern crate {name}"),
854-
None => f.write_str("extern crate {unknown}"),
855-
},
856-
None => f.write_str("mod {unnamed}"),
860+
None => f.write_str("mod {unknown}"),
861+
}
862+
}
863+
}
864+
865+
impl HirDisplay for Crate {
866+
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
867+
match self.display_name(f.db) {
868+
Some(name) => write!(f, "extern crate {name}"),
869+
None => f.write_str("extern crate {unknown}"),
857870
}
858871
}
859872
}

crates/ide-db/src/defs.rs

+17-4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub enum Definition {
3232
Field(Field),
3333
TupleField(TupleField),
3434
Module(Module),
35+
Crate(Crate),
3536
Function(Function),
3637
Adt(Adt),
3738
Variant(Variant),
@@ -62,14 +63,19 @@ impl Definition {
6263
pub fn krate(&self, db: &RootDatabase) -> Option<Crate> {
6364
Some(match self {
6465
Definition::Module(m) => m.krate(),
66+
&Definition::Crate(it) => it,
6567
_ => self.module(db)?.krate(),
6668
})
6769
}
6870

71+
/// Returns the module this definition resides in.
72+
///
73+
/// As such, for modules themselves this will return the parent module.
6974
pub fn module(&self, db: &RootDatabase) -> Option<Module> {
7075
let module = match self {
7176
Definition::Macro(it) => it.module(db),
7277
Definition::Module(it) => it.parent(db)?,
78+
Definition::Crate(_) => return None,
7379
Definition::Field(it) => it.parent_def(db).module(db),
7480
Definition::Function(it) => it.module(db),
7581
Definition::Adt(it) => it.module(db),
@@ -108,6 +114,7 @@ impl Definition {
108114
match self {
109115
Definition::Macro(it) => Some(it.module(db).into()),
110116
Definition::Module(it) => it.parent(db).map(Definition::Module),
117+
Definition::Crate(_) => None,
111118
Definition::Field(it) => Some(it.parent_def(db).into()),
112119
Definition::Function(it) => container_to_definition(it.container(db)),
113120
Definition::Adt(it) => Some(it.module(db).into()),
@@ -137,6 +144,7 @@ impl Definition {
137144
let vis = match self {
138145
Definition::Field(sf) => sf.visibility(db),
139146
Definition::Module(it) => it.visibility(db),
147+
Definition::Crate(_) => return None,
140148
Definition::Function(it) => it.visibility(db),
141149
Definition::Adt(it) => it.visibility(db),
142150
Definition::Const(it) => it.visibility(db),
@@ -146,8 +154,8 @@ impl Definition {
146154
Definition::TypeAlias(it) => it.visibility(db),
147155
Definition::Variant(it) => it.visibility(db),
148156
Definition::ExternCrateDecl(it) => it.visibility(db),
157+
Definition::Macro(it) => it.visibility(db),
149158
Definition::BuiltinType(_) | Definition::TupleField(_) => Visibility::Public,
150-
Definition::Macro(_) => return None,
151159
Definition::BuiltinAttr(_)
152160
| Definition::BuiltinLifetime(_)
153161
| Definition::ToolModule(_)
@@ -167,6 +175,9 @@ impl Definition {
167175
Definition::Macro(it) => it.name(db),
168176
Definition::Field(it) => it.name(db),
169177
Definition::Module(it) => it.name(db)?,
178+
Definition::Crate(it) => {
179+
Name::new_symbol_root(it.display_name(db)?.crate_name().symbol().clone())
180+
}
170181
Definition::Function(it) => it.name(db),
171182
Definition::Adt(it) => it.name(db),
172183
Definition::Variant(it) => it.name(db),
@@ -202,6 +213,7 @@ impl Definition {
202213
Definition::Macro(it) => it.docs(db),
203214
Definition::Field(it) => it.docs(db),
204215
Definition::Module(it) => it.docs(db),
216+
Definition::Crate(it) => it.docs(db),
205217
Definition::Function(it) => it.docs(db),
206218
Definition::Adt(it) => it.docs(db),
207219
Definition::Variant(it) => it.docs(db),
@@ -282,6 +294,7 @@ impl Definition {
282294
Definition::Field(it) => it.display(db, edition).to_string(),
283295
Definition::TupleField(it) => it.display(db, edition).to_string(),
284296
Definition::Module(it) => it.display(db, edition).to_string(),
297+
Definition::Crate(it) => it.display(db, edition).to_string(),
285298
Definition::Function(it) => it.display(db, edition).to_string(),
286299
Definition::Adt(it) => it.display(db, edition).to_string(),
287300
Definition::Variant(it) => it.display(db, edition).to_string(),
@@ -415,7 +428,7 @@ impl IdentClass {
415428
}
416429
IdentClass::NameRefClass(NameRefClass::ExternCrateShorthand { decl, krate }) => {
417430
res.push((Definition::ExternCrateDecl(decl), None));
418-
res.push((Definition::Module(krate.root_module()), None));
431+
res.push((Definition::Crate(krate), None));
419432
}
420433
IdentClass::Operator(
421434
OperatorClass::Await(func)
@@ -456,7 +469,7 @@ impl IdentClass {
456469
}
457470
IdentClass::NameRefClass(NameRefClass::ExternCrateShorthand { decl, krate }) => {
458471
res.push(Definition::ExternCrateDecl(decl));
459-
res.push(Definition::Module(krate.root_module()));
472+
res.push(Definition::Crate(krate));
460473
}
461474
IdentClass::Operator(_) => (),
462475
}
@@ -800,7 +813,7 @@ impl NameRefClass {
800813
let extern_crate = sema.to_def(&extern_crate_ast)?;
801814
let krate = extern_crate.resolved_crate(sema.db)?;
802815
Some(if extern_crate_ast.rename().is_some() {
803-
NameRefClass::Definition(Definition::Module(krate.root_module()), None)
816+
NameRefClass::Definition(Definition::Crate(krate), None)
804817
} else {
805818
NameRefClass::ExternCrateShorthand { krate, decl: extern_crate }
806819
})

crates/ide-db/src/documentation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ macro_rules! impl_has_docs {
178178

179179
impl_has_docs![
180180
Variant, Field, Static, Const, Trait, TraitAlias, TypeAlias, Macro, Function, Adt, Module,
181-
Impl,
181+
Impl, Crate,
182182
];
183183

184184
macro_rules! impl_has_docs_enum {

crates/ide-db/src/rename.rs

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ impl Definition {
134134
FieldSource::Pos(_) => None,
135135
}
136136
}
137+
Definition::Crate(_) => None,
137138
Definition::Module(module) => {
138139
let src = module.declaration_source(sema.db)?;
139140
let name = src.value.name()?;

crates/ide/src/doc_links.rs

+2
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ pub(crate) fn resolve_doc_path_for_def(
199199
) -> Option<Definition> {
200200
match def {
201201
Definition::Module(it) => it.resolve_doc_path(db, link, ns),
202+
Definition::Crate(it) => it.resolve_doc_path(db, link, ns),
202203
Definition::Function(it) => it.resolve_doc_path(db, link, ns),
203204
Definition::Adt(it) => it.resolve_doc_path(db, link, ns),
204205
Definition::Variant(it) => it.resolve_doc_path(db, link, ns),
@@ -594,6 +595,7 @@ fn filename_and_frag_for_def(
594595
Adt::Enum(e) => format!("enum.{}.html", e.name(db).unescaped().display(db.upcast())),
595596
Adt::Union(u) => format!("union.{}.html", u.name(db).unescaped().display(db.upcast())),
596597
},
598+
Definition::Crate(_) => String::from("index.html"),
597599
Definition::Module(m) => match m.name(db) {
598600
// `#[doc(keyword = "...")]` is internal used only by rust compiler
599601
Some(name) => {

crates/ide/src/hover/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6112,7 +6112,7 @@ use foo::bar::{self$0};
61126112
```
61136113
61146114
```rust
6115-
mod bar
6115+
pub mod bar
61166116
```
61176117
61186118
---

crates/ide/src/moniker.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ pub(crate) fn def_to_kind(db: &RootDatabase, def: Definition) -> SymbolInformati
191191
MacroKind::ProcMacro => Macro,
192192
},
193193
Definition::Field(..) | Definition::TupleField(..) => Field,
194-
Definition::Module(..) => Module,
194+
Definition::Module(..) | Definition::Crate(..) => Module,
195195
Definition::Function(it) => {
196196
if it.as_assoc_item(db).is_some() {
197197
if it.has_self_param(db) {

crates/ide/src/navigation_target.rs

+7
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ impl TryToNav for Definition {
225225
Definition::Local(it) => Some(it.to_nav(db)),
226226
Definition::Label(it) => it.try_to_nav(db),
227227
Definition::Module(it) => Some(it.to_nav(db)),
228+
Definition::Crate(it) => Some(it.to_nav(db)),
228229
Definition::Macro(it) => it.try_to_nav(db),
229230
Definition::Field(it) => it.try_to_nav(db),
230231
Definition::SelfType(it) => it.try_to_nav(db),
@@ -398,6 +399,12 @@ impl ToNav for hir::Module {
398399
}
399400
}
400401

402+
impl ToNav for hir::Crate {
403+
fn to_nav(&self, db: &RootDatabase) -> UpmappingResult<NavigationTarget> {
404+
self.root_module().to_nav(db)
405+
}
406+
}
407+
401408
impl TryToNav for hir::Impl {
402409
fn try_to_nav(&self, db: &RootDatabase) -> Option<UpmappingResult<NavigationTarget>> {
403410
let InFile { file_id, value } = self.source(db)?;

crates/ide/src/syntax_highlighting/highlight.rs

+3
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,9 @@ pub(super) fn highlight_def(
386386
Definition::Field(_) | Definition::TupleField(_) => {
387387
Highlight::new(HlTag::Symbol(SymbolKind::Field))
388388
}
389+
Definition::Crate(_) => {
390+
Highlight::new(HlTag::Symbol(SymbolKind::Module)) | HlMod::CrateRoot
391+
}
389392
Definition::Module(module) => {
390393
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Module));
391394
if module.is_crate_root() {

crates/ide/src/syntax_highlighting/inject.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,9 @@ fn find_doc_string_in_attr(attr: &hir::Attr, it: &ast::Attr) -> Option<ast::Stri
287287

288288
fn module_def_to_hl_tag(def: Definition) -> HlTag {
289289
let symbol = match def {
290-
Definition::Module(_) | Definition::ExternCrateDecl(_) => SymbolKind::Module,
290+
Definition::Module(_) | Definition::Crate(_) | Definition::ExternCrateDecl(_) => {
291+
SymbolKind::Module
292+
}
291293
Definition::Function(_) => SymbolKind::Function,
292294
Definition::Adt(hir::Adt::Struct(_)) => SymbolKind::Struct,
293295
Definition::Adt(hir::Adt::Enum(_)) => SymbolKind::Enum,

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,17 @@
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="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">foo</span> <span class="brace">{</span>
48+
<pre><code><span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration public">foo</span> <span class="brace">{</span>
4949
<span class="parenthesis">(</span><span class="punctuation">$</span>foo<span class="colon">:</span>ident<span class="parenthesis">)</span> <span class="operator">=</span><span class="operator">&gt;</span> <span class="brace">{</span>
5050
<span class="keyword">mod</span> y <span class="brace">{</span>
5151
<span class="keyword">pub</span> <span class="keyword">struct</span> <span class="punctuation">$</span>foo<span class="semicolon">;</span>
5252
<span class="brace">}</span>
5353
<span class="brace">}</span><span class="semicolon">;</span>
5454
<span class="brace">}</span>
5555
<span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
56-
<span class="macro">foo</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="struct declaration macro public">Foo</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
56+
<span class="macro public">foo</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="struct declaration macro public">Foo</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
5757
<span class="keyword">mod</span> <span class="module declaration">module</span> <span class="brace">{</span>
58-
<span class="macro">foo</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="struct declaration macro public">Bar</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
58+
<span class="macro public">foo</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="struct declaration macro public">Bar</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
5959
<span class="keyword">fn</span> <span class="function declaration">func</span><span class="parenthesis">(</span><span class="punctuation">_</span><span class="colon">:</span> <span class="module">y</span><span class="operator">::</span><span class="struct public">Bar</span><span class="parenthesis">)</span> <span class="brace">{</span>
6060
<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="brace">{</span>
6161
<span class="keyword">struct</span> <span class="struct declaration">Innerest</span><span class="angle">&lt;</span><span class="keyword">const</span> <span class="const_param const declaration">C</span><span class="colon">:</span> <span class="unresolved_reference">usize</span><span class="angle">&gt;</span> <span class="brace">{</span> <span class="field declaration">field</span><span class="colon">:</span> <span class="bracket">[</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span> <span class="brace">{</span><span class="const_param const">C</span><span class="brace">}</span><span class="bracket">]</span> <span class="brace">}</span>

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

+3-3
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="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">id</span> <span class="brace">{</span>
48+
<pre><code><span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration public">id</span> <span class="brace">{</span>
4949
<span class="parenthesis">(</span><span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>tt<span class="colon">:</span>tt<span class="parenthesis">)</span><span class="punctuation">*</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="operator">&gt;</span> <span class="brace">{</span>
5050
<span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>tt<span class="parenthesis">)</span><span class="punctuation">*</span>
5151
<span class="brace">}</span><span class="semicolon">;</span>
@@ -57,7 +57,7 @@
5757
<span class="keyword const">const</span> <span class="brace">{</span>
5858
<span class="keyword">const</span> <span class="punctuation">|</span><span class="punctuation">|</span> <span class="brace">{</span><span class="brace">}</span>
5959
<span class="brace">}</span>
60-
<span class="macro">id</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span>
60+
<span class="macro public">id</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span>
6161
<span class="constant const macro">CONST_ITEM</span><span class="semicolon macro">;</span>
6262
<span class="const_param const macro">CONST_PARAM</span><span class="semicolon macro">;</span>
6363
<span class="keyword const macro">const</span> <span class="brace macro">{</span>
@@ -78,7 +78,7 @@
7878
<span class="keyword const">const</span> <span class="keyword">fn</span> <span class="function associated const declaration static trait">assoc_const_fn</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
7979
<span class="brace">}</span>
8080

81-
<span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">unsafe_deref</span> <span class="brace">{</span>
81+
<span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration public">unsafe_deref</span> <span class="brace">{</span>
8282
<span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="operator">&gt;</span> <span class="brace">{</span>
8383
<span class="punctuation">*</span><span class="parenthesis">(</span><span class="punctuation">&</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="keyword">as</span> <span class="punctuation">*</span><span class="keyword">const</span> <span class="parenthesis">(</span><span class="parenthesis">)</span><span class="parenthesis">)</span>
8484
<span class="brace">}</span><span class="semicolon">;</span>

0 commit comments

Comments
 (0)