Skip to content

Commit 9b000b5

Browse files
bors[bot]Veykril
andauthored
Merge #11827
11827: internal: Enforce Invariant that Resolver always contains a ModuleScope r=Veykril a=Veykril Co-authored-by: Lukas Wirth <[email protected]>
2 parents 9da9418 + 75689f2 commit 9b000b5

File tree

81 files changed

+504
-501
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+504
-501
lines changed

crates/base_db/src/fixture.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use tt::Subtree;
1010
use vfs::{file_set::FileSet, VfsPath};
1111

1212
use crate::{
13-
input::{CrateName, CrateOrigin},
13+
input::{CrateName, CrateOrigin, LangCrateOrigin},
1414
Change, CrateDisplayName, CrateGraph, CrateId, Dependency, Edition, Env, FileId, FilePosition,
1515
FileRange, ProcMacro, ProcMacroExpander, ProcMacroExpansionError, SourceDatabaseExt,
1616
SourceRoot, SourceRootId,
@@ -196,7 +196,7 @@ impl ChangeFixture {
196196
Env::default(),
197197
Default::default(),
198198
false,
199-
Default::default(),
199+
CrateOrigin::CratesIo { repo: None },
200200
);
201201
} else {
202202
for (from, to, prelude) in crate_deps {
@@ -233,7 +233,7 @@ impl ChangeFixture {
233233
Env::default(),
234234
Vec::new(),
235235
false,
236-
CrateOrigin::Lang,
236+
CrateOrigin::Lang(LangCrateOrigin::Core),
237237
);
238238

239239
for krate in all_crates {
@@ -270,7 +270,7 @@ impl ChangeFixture {
270270
Env::default(),
271271
proc_macro,
272272
true,
273-
CrateOrigin::Lang,
273+
CrateOrigin::CratesIo { repo: None },
274274
);
275275

276276
for krate in all_crates {
@@ -406,7 +406,11 @@ fn parse_crate(crate_str: String) -> (String, CrateOrigin, Option<String>) {
406406
};
407407
(a.to_owned(), origin, Some(version.to_string()))
408408
} else {
409-
(crate_str, CrateOrigin::Unknown, None)
409+
let crate_origin = match &*crate_str {
410+
"std" => CrateOrigin::Lang(LangCrateOrigin::Std),
411+
_ => CrateOrigin::CratesIo { repo: None },
412+
};
413+
(crate_str, crate_origin, None)
410414
}
411415
}
412416

crates/base_db/src/input.rs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,22 @@ impl ops::Deref for CrateName {
117117
}
118118

119119
/// Origin of the crates. It is used in emitting monikers.
120-
#[derive(Debug, Clone)]
120+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
121121
pub enum CrateOrigin {
122122
/// Crates that are from crates.io official registry,
123123
CratesIo { repo: Option<String> },
124124
/// Crates that are provided by the language, like std, core, proc-macro, ...
125-
Lang,
126-
/// Crates that we don't know their origin.
127-
// Ideally this enum should cover all cases, and then we remove this variant.
128-
Unknown,
125+
Lang(LangCrateOrigin),
129126
}
130127

131-
impl Default for CrateOrigin {
132-
fn default() -> Self {
133-
Self::Unknown
134-
}
128+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
129+
pub enum LangCrateOrigin {
130+
Alloc,
131+
Core,
132+
ProcMacro,
133+
Std,
134+
Test,
135+
Other,
135136
}
136137

137138
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -585,6 +586,8 @@ impl fmt::Display for CyclicDependenciesError {
585586

586587
#[cfg(test)]
587588
mod tests {
589+
use crate::CrateOrigin;
590+
588591
use super::{CfgOptions, CrateGraph, CrateName, Dependency, Edition::Edition2018, Env, FileId};
589592

590593
#[test]
@@ -600,7 +603,7 @@ mod tests {
600603
Env::default(),
601604
Default::default(),
602605
false,
603-
Default::default(),
606+
CrateOrigin::CratesIo { repo: None },
604607
);
605608
let crate2 = graph.add_crate_root(
606609
FileId(2u32),
@@ -612,7 +615,7 @@ mod tests {
612615
Env::default(),
613616
Default::default(),
614617
false,
615-
Default::default(),
618+
CrateOrigin::CratesIo { repo: None },
616619
);
617620
let crate3 = graph.add_crate_root(
618621
FileId(3u32),
@@ -624,7 +627,7 @@ mod tests {
624627
Env::default(),
625628
Default::default(),
626629
false,
627-
Default::default(),
630+
CrateOrigin::CratesIo { repo: None },
628631
);
629632
assert!(graph
630633
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
@@ -650,7 +653,7 @@ mod tests {
650653
Env::default(),
651654
Default::default(),
652655
false,
653-
Default::default(),
656+
CrateOrigin::CratesIo { repo: None },
654657
);
655658
let crate2 = graph.add_crate_root(
656659
FileId(2u32),
@@ -662,7 +665,7 @@ mod tests {
662665
Env::default(),
663666
Default::default(),
664667
false,
665-
Default::default(),
668+
CrateOrigin::CratesIo { repo: None },
666669
);
667670
assert!(graph
668671
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
@@ -685,7 +688,7 @@ mod tests {
685688
Env::default(),
686689
Default::default(),
687690
false,
688-
Default::default(),
691+
CrateOrigin::CratesIo { repo: None },
689692
);
690693
let crate2 = graph.add_crate_root(
691694
FileId(2u32),
@@ -697,7 +700,7 @@ mod tests {
697700
Env::default(),
698701
Default::default(),
699702
false,
700-
Default::default(),
703+
CrateOrigin::CratesIo { repo: None },
701704
);
702705
let crate3 = graph.add_crate_root(
703706
FileId(3u32),
@@ -709,7 +712,7 @@ mod tests {
709712
Env::default(),
710713
Default::default(),
711714
false,
712-
Default::default(),
715+
CrateOrigin::CratesIo { repo: None },
713716
);
714717
assert!(graph
715718
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
@@ -732,7 +735,7 @@ mod tests {
732735
Env::default(),
733736
Default::default(),
734737
false,
735-
Default::default(),
738+
CrateOrigin::CratesIo { repo: None },
736739
);
737740
let crate2 = graph.add_crate_root(
738741
FileId(2u32),
@@ -744,7 +747,7 @@ mod tests {
744747
Env::default(),
745748
Default::default(),
746749
false,
747-
Default::default(),
750+
CrateOrigin::CratesIo { repo: None },
748751
);
749752
assert!(graph
750753
.add_dep(

crates/base_db/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ pub use crate::{
1212
change::Change,
1313
input::{
1414
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency,
15-
Edition, Env, ProcMacro, ProcMacroExpander, ProcMacroExpansionError, ProcMacroId,
16-
ProcMacroKind, SourceRoot, SourceRootId,
15+
Edition, Env, LangCrateOrigin, ProcMacro, ProcMacroExpander, ProcMacroExpansionError,
16+
ProcMacroId, ProcMacroKind, SourceRoot, SourceRootId,
1717
},
1818
};
1919
pub use salsa::{self, Cancelled};

crates/hir/src/lib.rs

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ impl Crate {
148148
db.crate_graph()[self.id].origin.clone()
149149
}
150150

151+
pub fn is_builtin(self, db: &dyn HirDatabase) -> bool {
152+
matches!(self.origin(db), CrateOrigin::Lang(_))
153+
}
154+
151155
pub fn dependencies(self, db: &dyn HirDatabase) -> Vec<CrateDependency> {
152156
db.crate_graph()[self.id]
153157
.dependencies
@@ -1741,10 +1745,8 @@ impl BuiltinType {
17411745
BuiltinType { inner: hir_def::builtin_type::BuiltinType::Str }
17421746
}
17431747

1744-
pub fn ty(self, db: &dyn HirDatabase, module: Module) -> Type {
1745-
let resolver = module.id.resolver(db.upcast());
1746-
Type::new_with_resolver(db, &resolver, TyBuilder::builtin(self.inner))
1747-
.expect("crate not present in resolver")
1748+
pub fn ty(self, db: &dyn HirDatabase) -> Type {
1749+
Type::new_for_crate(db.crate_graph().iter().next().unwrap(), TyBuilder::builtin(self.inner))
17481750
}
17491751

17501752
pub fn name(self) -> Name {
@@ -2222,7 +2224,7 @@ impl BuiltinAttr {
22222224
Some(BuiltinAttr { krate: Some(krate.id), idx })
22232225
}
22242226

2225-
pub(crate) fn builtin(name: &str) -> Option<Self> {
2227+
fn builtin(name: &str) -> Option<Self> {
22262228
hir_def::builtin_attr::INERT_ATTRIBUTES
22272229
.iter()
22282230
.position(|tool| tool.name == name)
@@ -2261,7 +2263,7 @@ impl ToolModule {
22612263
Some(ToolModule { krate: Some(krate.id), idx })
22622264
}
22632265

2264-
pub(crate) fn builtin(name: &str) -> Option<Self> {
2266+
fn builtin(name: &str) -> Option<Self> {
22652267
hir_def::builtin_attr::TOOL_MODULES
22662268
.iter()
22672269
.position(|&tool| tool == name)
@@ -2611,14 +2613,11 @@ pub struct Type {
26112613
}
26122614

26132615
impl Type {
2614-
pub(crate) fn new_with_resolver(
2615-
db: &dyn HirDatabase,
2616-
resolver: &Resolver,
2617-
ty: Ty,
2618-
) -> Option<Type> {
2619-
let krate = resolver.krate()?;
2620-
Some(Type::new_with_resolver_inner(db, krate, resolver, ty))
2616+
pub(crate) fn new_with_resolver(db: &dyn HirDatabase, resolver: &Resolver, ty: Ty) -> Type {
2617+
let krate = resolver.krate();
2618+
Type::new_with_resolver_inner(db, krate, resolver, ty)
26212619
}
2620+
26222621
pub(crate) fn new_with_resolver_inner(
26232622
db: &dyn HirDatabase,
26242623
krate: CrateId,
@@ -2631,6 +2630,10 @@ impl Type {
26312630
Type { krate, env: environment, ty }
26322631
}
26332632

2633+
pub(crate) fn new_for_crate(krate: CrateId, ty: Ty) -> Type {
2634+
Type { krate, env: Arc::new(TraitEnvironment::empty(krate)), ty }
2635+
}
2636+
26342637
pub fn reference(inner: &Type, m: Mutability) -> Type {
26352638
inner.derived(
26362639
TyKind::Ref(
@@ -3031,10 +3034,7 @@ impl Type {
30313034
// There should be no inference vars in types passed here
30323035
let canonical = hir_ty::replace_errors_with_variables(&self.ty);
30333036

3034-
let krate = match scope.krate() {
3035-
Some(k) => k,
3036-
None => return,
3037-
};
3037+
let krate = scope.krate();
30383038
let environment = scope.resolver().generic_def().map_or_else(
30393039
|| Arc::new(TraitEnvironment::empty(krate.id)),
30403040
|d| db.trait_environment(d),
@@ -3091,10 +3091,7 @@ impl Type {
30913091
) {
30923092
let canonical = hir_ty::replace_errors_with_variables(&self.ty);
30933093

3094-
let krate = match scope.krate() {
3095-
Some(k) => k,
3096-
None => return,
3097-
};
3094+
let krate = scope.krate();
30983095
let environment = scope.resolver().generic_def().map_or_else(
30993096
|| Arc::new(TraitEnvironment::empty(krate.id)),
31003097
|d| db.trait_environment(d),

0 commit comments

Comments
 (0)