#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum ModuleOrigin {
- /// It should not be `None` after collecting definitions.
- Root(Option<FileId>),
+ CrateRoot {
+ definition: FileId,
+ },
/// Note that non-inline modules, by definition, live inside non-macro file.
File {
declaration: AstId<ast::Module>,
impl Default for ModuleOrigin {
fn default() -> Self {
- ModuleOrigin::Root(None)
+ ModuleOrigin::CrateRoot { definition: FileId(0) }
}
}
impl ModuleOrigin {
- fn root(file_id: FileId) -> Self {
- ModuleOrigin::Root(Some(file_id))
- }
-
pub(crate) fn not_sure_file(file: Option<FileId>, declaration: AstId<ast::Module>) -> Self {
match file {
None => ModuleOrigin::Inline { definition: declaration },
match self {
ModuleOrigin::File { declaration: module, .. }
| ModuleOrigin::Inline { definition: module, .. } => Some(*module),
- ModuleOrigin::Root(_) => None,
+ ModuleOrigin::CrateRoot { .. } => None,
}
}
pub(crate) fn file_id(&self) -> Option<FileId> {
match self {
- ModuleOrigin::File { definition: file_id, .. } | ModuleOrigin::Root(Some(file_id)) => {
- Some(*file_id)
+ ModuleOrigin::File { definition, .. } | ModuleOrigin::CrateRoot { definition } => {
+ Some(*definition)
}
_ => None,
}
/// That is, a file or a `mod foo {}` with items.
fn definition_source(&self, db: &impl DefDatabase) -> InFile<ModuleSource> {
match self {
- ModuleOrigin::File { definition: file_id, .. } | ModuleOrigin::Root(Some(file_id)) => {
- let file_id = *file_id;
+ ModuleOrigin::File { definition, .. } | ModuleOrigin::CrateRoot { definition } => {
+ let file_id = *definition;
let sf = db.parse(file_id).tree();
return InFile::new(file_id.into(), ModuleSource::SourceFile(sf));
}
- ModuleOrigin::Root(None) => unreachable!(),
ModuleOrigin::Inline { definition } => {
InFile::new(definition.file_id, ModuleSource::Module(definition.to_node(db)))
}