From 37ed2f35badfb41cd6c50ef04d6fd6a6ce67e0d1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 1 Jan 2019 23:21:16 +0300 Subject: rename MFileId -> HirFileId --- crates/ra_hir/src/ids.rs | 52 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir/src/ids.rs') diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index 881303861..3eba35a24 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs @@ -1,4 +1,6 @@ -use crate::{FileId, MacroCallId}; +use crate::{FileId, MacroCallId, HirDatabase}; + +use ra_syntax::SourceFileNode; /// hir makes a heavy use of ids: integer (u32) handlers to various things. You /// can think of id as a pointer (but without a lifetime) or a file descriptor @@ -20,13 +22,53 @@ use crate::{FileId, MacroCallId}; /// (because everything bottoms out at the real `FileId`) and small /// (`MacroCallId` uses location interner). #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum MFileId { +pub struct HirFileId(HirFileIdRepr); + +impl HirFileId { + pub(crate) fn original_file_id(self, db: &impl HirDatabase) -> FileId { + match self.0 { + HirFileIdRepr::File(file_id) => file_id, + HirFileIdRepr::Macro(macro_call_id) => { + let loc = macro_call_id.loc(db); + loc.source_item_id.file_id.original_file_id(db) + } + } + } + + pub(crate) fn as_original_file(self) -> FileId { + match self.0 { + HirFileIdRepr::File(file_id) => file_id, + HirFileIdRepr::Macro(_r) => panic!("macro generated file: {:?}", self), + } + } + pub(crate) fn source_file_query(db: &impl HirDatabase, file_id: HirFileId) -> SourceFileNode { + match file_id.0 { + HirFileIdRepr::File(file_id) => db.source_file(file_id), + HirFileIdRepr::Macro(m) => { + if let Some(exp) = db.expand_macro_invocation(m) { + return exp.file(); + } + // returning an empty string looks fishy... + SourceFileNode::parse("") + } + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +enum HirFileIdRepr { File(FileId), Macro(MacroCallId), } -impl From for MFileId { - fn from(file_id: FileId) -> MFileId { - MFileId::File(file_id) +impl From for HirFileId { + fn from(file_id: FileId) -> HirFileId { + HirFileId(HirFileIdRepr::File(file_id)) + } +} + +impl From for HirFileId { + fn from(macro_call_id: MacroCallId) -> HirFileId { + HirFileId(HirFileIdRepr::Macro(macro_call_id)) } } -- cgit v1.2.3