mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-26 20:09:19 +00:00
make illegal states unrepresentable
only declarative macros have def-site token map
This commit is contained in:
parent
7d9ea39de6
commit
95dc8ef265
3 changed files with 48 additions and 49 deletions
|
@ -351,7 +351,7 @@ pub struct ExpansionInfo {
|
|||
/// The `macro_rules!` arguments.
|
||||
def: Option<InFile<ast::TokenTree>>,
|
||||
|
||||
macro_def: Arc<(db::TokenExpander, mbe::TokenMap)>,
|
||||
macro_def: Arc<db::TokenExpander>,
|
||||
macro_arg: Arc<(tt::Subtree, mbe::TokenMap)>,
|
||||
exp_map: Arc<mbe::TokenMap>,
|
||||
}
|
||||
|
@ -368,7 +368,7 @@ impl ExpansionInfo {
|
|||
assert_eq!(token.file_id, self.arg.file_id);
|
||||
let range = token.value.text_range().checked_sub(self.arg.value.text_range().start())?;
|
||||
let token_id = self.macro_arg.1.token_by_range(range)?;
|
||||
let token_id = self.macro_def.0.map_id_down(token_id);
|
||||
let token_id = self.macro_def.map_id_down(token_id);
|
||||
|
||||
let range = self.exp_map.range_by_token(token_id)?.by_kind(token.value.kind())?;
|
||||
|
||||
|
@ -383,17 +383,16 @@ impl ExpansionInfo {
|
|||
) -> Option<(InFile<SyntaxToken>, Origin)> {
|
||||
let token_id = self.exp_map.token_by_range(token.value.text_range())?;
|
||||
|
||||
let (token_id, origin) = self.macro_def.0.map_id_up(token_id);
|
||||
let (token_id, origin) = self.macro_def.map_id_up(token_id);
|
||||
let (token_map, tt) = match origin {
|
||||
mbe::Origin::Call => (&self.macro_arg.1, self.arg.clone()),
|
||||
mbe::Origin::Def => (
|
||||
&self.macro_def.1,
|
||||
self.def
|
||||
.as_ref()
|
||||
.expect("`Origin::Def` used with non-`macro_rules!` macro")
|
||||
.as_ref()
|
||||
.map(|tt| tt.syntax().clone()),
|
||||
),
|
||||
mbe::Origin::Def => match (&*self.macro_def, self.def.as_ref()) {
|
||||
(db::TokenExpander::MacroRules { def_site_token_map, .. }, Some(tt))
|
||||
| (db::TokenExpander::MacroDef { def_site_token_map, .. }, Some(tt)) => {
|
||||
(def_site_token_map, tt.as_ref().map(|tt| tt.syntax().clone()))
|
||||
}
|
||||
_ => panic!("`Origin::Def` used with non-`macro_rules!` macro"),
|
||||
},
|
||||
};
|
||||
|
||||
let range = token_map.range_by_token(token_id)?.by_kind(token.value.kind())?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue