Simplify
This commit is contained in:
parent
2ad71f1350
commit
ec677e35d0
@ -16,15 +16,12 @@ pub mod quote;
|
|||||||
pub mod eager;
|
pub mod eager;
|
||||||
pub mod mod_path;
|
pub mod mod_path;
|
||||||
|
|
||||||
use base_db::ProcMacroKind;
|
|
||||||
use either::Either;
|
|
||||||
|
|
||||||
pub use mbe::{ExpandError, ExpandResult, Origin};
|
pub use mbe::{ExpandError, ExpandResult, Origin};
|
||||||
use mod_path::ModPath;
|
|
||||||
|
|
||||||
use std::{hash::Hash, iter, sync::Arc};
|
use std::{hash::Hash, iter, sync::Arc};
|
||||||
|
|
||||||
use base_db::{impl_intern_key, salsa, CrateId, FileId, FileRange};
|
use base_db::{impl_intern_key, salsa, CrateId, FileId, FileRange, ProcMacroKind};
|
||||||
|
use either::Either;
|
||||||
use syntax::{
|
use syntax::{
|
||||||
algo::{self, skip_trivia_token},
|
algo::{self, skip_trivia_token},
|
||||||
ast::{self, AstNode, HasDocComments},
|
ast::{self, AstNode, HasDocComments},
|
||||||
@ -37,6 +34,7 @@ use crate::{
|
|||||||
builtin_derive_macro::BuiltinDeriveExpander,
|
builtin_derive_macro::BuiltinDeriveExpander,
|
||||||
builtin_fn_macro::{BuiltinFnLikeExpander, EagerExpander},
|
builtin_fn_macro::{BuiltinFnLikeExpander, EagerExpander},
|
||||||
db::TokenExpander,
|
db::TokenExpander,
|
||||||
|
mod_path::ModPath,
|
||||||
proc_macro::ProcMacroExpander,
|
proc_macro::ProcMacroExpander,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -61,11 +59,13 @@ enum HirFileIdRepr {
|
|||||||
FileId(FileId),
|
FileId(FileId),
|
||||||
MacroFile(MacroFile),
|
MacroFile(MacroFile),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<FileId> for HirFileId {
|
impl From<FileId> for HirFileId {
|
||||||
fn from(id: FileId) -> Self {
|
fn from(id: FileId) -> Self {
|
||||||
HirFileId(HirFileIdRepr::FileId(id))
|
HirFileId(HirFileIdRepr::FileId(id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<MacroFile> for HirFileId {
|
impl From<MacroFile> for HirFileId {
|
||||||
fn from(id: MacroFile) -> Self {
|
fn from(id: MacroFile) -> Self {
|
||||||
HirFileId(HirFileIdRepr::MacroFile(id))
|
HirFileId(HirFileIdRepr::MacroFile(id))
|
||||||
@ -151,8 +151,8 @@ impl HirFileId {
|
|||||||
HirFileIdRepr::FileId(file_id) => file_id,
|
HirFileIdRepr::FileId(file_id) => file_id,
|
||||||
HirFileIdRepr::MacroFile(macro_file) => {
|
HirFileIdRepr::MacroFile(macro_file) => {
|
||||||
let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_file.macro_call_id);
|
let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_file.macro_call_id);
|
||||||
let file_id = match &loc.eager {
|
let file_id = match loc.eager {
|
||||||
Some(EagerCallInfo { included_file: Some(file), .. }) => (*file).into(),
|
Some(EagerCallInfo { included_file: Some(file), .. }) => file.into(),
|
||||||
_ => loc.kind.file_id(),
|
_ => loc.kind.file_id(),
|
||||||
};
|
};
|
||||||
file_id.original_file(db)
|
file_id.original_file(db)
|
||||||
@ -249,10 +249,7 @@ impl HirFileId {
|
|||||||
HirFileIdRepr::FileId(_) => false,
|
HirFileIdRepr::FileId(_) => false,
|
||||||
HirFileIdRepr::MacroFile(macro_file) => {
|
HirFileIdRepr::MacroFile(macro_file) => {
|
||||||
let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_file.macro_call_id);
|
let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_file.macro_call_id);
|
||||||
match loc.def.kind {
|
matches!(loc.def.kind, MacroDefKind::ProcMacro(_, ProcMacroKind::CustomDerive, _))
|
||||||
MacroDefKind::ProcMacro(_, ProcMacroKind::CustomDerive, _) => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -302,15 +299,15 @@ impl MacroDefId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn ast_id(&self) -> Either<AstId<ast::Macro>, AstId<ast::Fn>> {
|
pub fn ast_id(&self) -> Either<AstId<ast::Macro>, AstId<ast::Fn>> {
|
||||||
let id = match &self.kind {
|
let id = match self.kind {
|
||||||
MacroDefKind::ProcMacro(.., id) => return Either::Right(*id),
|
MacroDefKind::ProcMacro(.., id) => return Either::Right(id),
|
||||||
MacroDefKind::Declarative(id)
|
MacroDefKind::Declarative(id)
|
||||||
| MacroDefKind::BuiltIn(_, id)
|
| MacroDefKind::BuiltIn(_, id)
|
||||||
| MacroDefKind::BuiltInAttr(_, id)
|
| MacroDefKind::BuiltInAttr(_, id)
|
||||||
| MacroDefKind::BuiltInDerive(_, id)
|
| MacroDefKind::BuiltInDerive(_, id)
|
||||||
| MacroDefKind::BuiltInEager(_, id) => id,
|
| MacroDefKind::BuiltInEager(_, id) => id,
|
||||||
};
|
};
|
||||||
Either::Left(*id)
|
Either::Left(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_proc_macro(&self) -> bool {
|
pub fn is_proc_macro(&self) -> bool {
|
||||||
@ -359,20 +356,15 @@ impl MacroCallKind {
|
|||||||
/// get only the specific derive that is being referred to.
|
/// get only the specific derive that is being referred to.
|
||||||
pub fn original_call_range(self, db: &dyn db::AstDatabase) -> FileRange {
|
pub fn original_call_range(self, db: &dyn db::AstDatabase) -> FileRange {
|
||||||
let mut kind = self;
|
let mut kind = self;
|
||||||
loop {
|
let file_id = loop {
|
||||||
match kind.file_id().0 {
|
match kind.file_id().0 {
|
||||||
HirFileIdRepr::MacroFile(file) => {
|
HirFileIdRepr::MacroFile(file) => {
|
||||||
kind = db.lookup_intern_macro_call(file.macro_call_id).kind;
|
kind = db.lookup_intern_macro_call(file.macro_call_id).kind;
|
||||||
}
|
}
|
||||||
_ => break,
|
HirFileIdRepr::FileId(file_id) => break file_id,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// `call_id` is now the outermost macro call, so its location is in a real file.
|
|
||||||
let file_id = match kind.file_id().0 {
|
|
||||||
HirFileIdRepr::FileId(it) => it,
|
|
||||||
HirFileIdRepr::MacroFile(_) => unreachable!("encountered unexpected macro file"),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let range = match kind {
|
let range = match kind {
|
||||||
MacroCallKind::FnLike { ast_id, .. } => ast_id.to_node(db).syntax().text_range(),
|
MacroCallKind::FnLike { ast_id, .. } => ast_id.to_node(db).syntax().text_range(),
|
||||||
MacroCallKind::Derive { ast_id, derive_attr_index, .. } => {
|
MacroCallKind::Derive { ast_id, derive_attr_index, .. } => {
|
||||||
@ -574,7 +566,6 @@ impl ExpansionInfo {
|
|||||||
/// `AstId` points to an AST node in any file.
|
/// `AstId` points to an AST node in any file.
|
||||||
///
|
///
|
||||||
/// It is stable across reparses, and can be used as salsa key/value.
|
/// It is stable across reparses, and can be used as salsa key/value.
|
||||||
// FIXME: isn't this just a `Source<FileAstId<N>>` ?
|
|
||||||
pub type AstId<N> = InFile<FileAstId<N>>;
|
pub type AstId<N> = InFile<FileAstId<N>>;
|
||||||
|
|
||||||
impl<N: AstNode> AstId<N> {
|
impl<N: AstNode> AstId<N> {
|
||||||
@ -602,7 +593,6 @@ impl<T> InFile<T> {
|
|||||||
InFile { file_id, value }
|
InFile { file_id, value }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Similarly, naming here is stupid...
|
|
||||||
pub fn with_value<U>(&self, value: U) -> InFile<U> {
|
pub fn with_value<U>(&self, value: U) -> InFile<U> {
|
||||||
InFile::new(self.file_id, value)
|
InFile::new(self.file_id, value)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user