Record eager expansion errors in EagerCallInfo

This commit is contained in:
Lukas Wirth 2023-04-16 16:11:59 +02:00
parent 6ae8d49e15
commit 71b50f9f09
4 changed files with 14 additions and 12 deletions

View File

@ -451,8 +451,7 @@ fn macro_expand(
if let Some(eager) = &loc.eager { if let Some(eager) = &loc.eager {
return ExpandResult { return ExpandResult {
value: Some(eager.arg_or_expansion.clone()), value: Some(eager.arg_or_expansion.clone()),
// FIXME: There could be errors here! err: eager.error.clone(),
err: None,
}; };
} }

View File

@ -60,10 +60,11 @@ pub fn expand_eager_macro(
let arg_id = db.intern_macro_call(MacroCallLoc { let arg_id = db.intern_macro_call(MacroCallLoc {
def, def,
krate, krate,
eager: Some(EagerCallInfo { eager: Some(Box::new(EagerCallInfo {
arg_or_expansion: Arc::new(parsed_args.clone()), arg_or_expansion: Arc::new(parsed_args.clone()),
included_file: None, included_file: None,
}), error: None,
})),
kind: MacroCallKind::FnLike { ast_id: call_id, expand_to: ExpandTo::Expr }, kind: MacroCallKind::FnLike { ast_id: call_id, expand_to: ExpandTo::Expr },
}); });
@ -88,10 +89,11 @@ pub fn expand_eager_macro(
let loc = MacroCallLoc { let loc = MacroCallLoc {
def, def,
krate, krate,
eager: Some(EagerCallInfo { eager: Some(Box::new(EagerCallInfo {
arg_or_expansion: Arc::new(res.value.subtree), arg_or_expansion: Arc::new(res.value.subtree),
included_file: res.value.included_file, included_file: res.value.included_file,
}), error: err.clone(),
})),
kind: MacroCallKind::FnLike { ast_id: call_id, expand_to }, kind: MacroCallKind::FnLike { ast_id: call_id, expand_to },
}; };

View File

@ -52,7 +52,7 @@
pub type ExpandResult<T> = ValueResult<T, ExpandError>; pub type ExpandResult<T> = ValueResult<T, ExpandError>;
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub enum ExpandError { pub enum ExpandError {
UnresolvedProcMacro(CrateId), UnresolvedProcMacro(CrateId),
Mbe(mbe::ExpandError), Mbe(mbe::ExpandError),
@ -114,7 +114,7 @@ pub struct MacroFile {
pub struct MacroCallLoc { pub struct MacroCallLoc {
pub def: MacroDefId, pub def: MacroDefId,
pub(crate) krate: CrateId, pub(crate) krate: CrateId,
eager: Option<EagerCallInfo>, eager: Option<Box<EagerCallInfo>>,
pub kind: MacroCallKind, pub kind: MacroCallKind,
} }
@ -141,6 +141,7 @@ struct EagerCallInfo {
/// NOTE: This can be *either* the expansion result, *or* the argument to the eager macro! /// NOTE: This can be *either* the expansion result, *or* the argument to the eager macro!
arg_or_expansion: Arc<tt::Subtree>, arg_or_expansion: Arc<tt::Subtree>,
included_file: Option<(FileId, TokenMap)>, included_file: Option<(FileId, TokenMap)>,
error: Option<ExpandError>,
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
@ -206,8 +207,8 @@ pub fn original_file(self, db: &dyn db::ExpandDatabase) -> FileId {
HirFileIdRepr::FileId(id) => break id, HirFileIdRepr::FileId(id) => break id,
HirFileIdRepr::MacroFile(MacroFile { macro_call_id }) => { HirFileIdRepr::MacroFile(MacroFile { macro_call_id }) => {
let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_call_id); let loc: MacroCallLoc = db.lookup_intern_macro_call(macro_call_id);
file_id = match loc.eager { file_id = match loc.eager.as_deref() {
Some(EagerCallInfo { included_file: Some((file, _)), .. }) => file.into(), Some(&EagerCallInfo { included_file: Some((file, _)), .. }) => file.into(),
_ => loc.kind.file_id(), _ => loc.kind.file_id(),
}; };
} }
@ -320,7 +321,7 @@ pub fn is_include_macro(&self, db: &dyn db::ExpandDatabase) -> bool {
match self.macro_file() { match self.macro_file() {
Some(macro_file) => { Some(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);
matches!(loc.eager, Some(EagerCallInfo { included_file: Some(..), .. })) matches!(loc.eager.as_deref(), Some(EagerCallInfo { included_file: Some(..), .. }))
} }
_ => false, _ => false,
} }

View File

@ -69,7 +69,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
} }
} }
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub enum ExpandError { pub enum ExpandError {
BindingError(Box<Box<str>>), BindingError(Box<Box<str>>),
LeftoverTokens, LeftoverTokens,