minor: dedup

This commit is contained in:
Aleksey Kladov 2021-12-28 16:50:13 +03:00
parent 726da9884b
commit 56b51852c2

View file

@ -10,7 +10,7 @@ use hir_def::{
resolver::{self, HasResolver, Resolver, TypeNs}, resolver::{self, HasResolver, Resolver, TypeNs},
AsMacroCall, FunctionId, TraitId, VariantId, AsMacroCall, FunctionId, TraitId, VariantId,
}; };
use hir_expand::{name::AsName, ExpansionInfo, MacroCallLoc}; use hir_expand::{name::AsName, ExpansionInfo, MacroCallId, MacroCallLoc};
use hir_ty::{associated_type_shorthand_candidates, Interner}; use hir_ty::{associated_type_shorthand_candidates, Interner};
use itertools::Itertools; use itertools::Itertools;
use rustc_hash::{FxHashMap, FxHashSet}; use rustc_hash::{FxHashMap, FxHashSet};
@ -448,13 +448,7 @@ impl<'db> SemanticsImpl<'db> {
} }
fn resolve_derive_macro(&self, attr: &ast::Attr) -> Option<Vec<MacroDef>> { fn resolve_derive_macro(&self, attr: &ast::Attr) -> Option<Vec<MacroDef>> {
let item = attr.syntax().parent().and_then(ast::Item::cast)?; let macro_call_ids = self.derive_macro_calls(attr)?;
let file_id = self.find_file(item.syntax()).file_id;
let item = InFile::new(file_id, &item);
let src = InFile::new(file_id, attr.clone());
self.with_ctx(|ctx| {
let macro_call_ids = ctx.attr_to_derive_macro_call(item, src)?;
let res = macro_call_ids let res = macro_call_ids
.iter() .iter()
.map(|&call| { .map(|&call| {
@ -463,16 +457,10 @@ impl<'db> SemanticsImpl<'db> {
}) })
.collect(); .collect();
Some(res) Some(res)
})
} }
fn expand_derive_macro(&self, attr: &ast::Attr) -> Option<Vec<SyntaxNode>> { fn expand_derive_macro(&self, attr: &ast::Attr) -> Option<Vec<SyntaxNode>> {
let item = attr.syntax().parent().and_then(ast::Item::cast)?; let macro_call_ids = self.derive_macro_calls(attr)?;
let file_id = self.find_file(item.syntax()).file_id;
let item = InFile::new(file_id, &item);
let src = InFile::new(file_id, attr.clone());
self.with_ctx(|ctx| {
let macro_call_ids = ctx.attr_to_derive_macro_call(item, src)?;
let expansions: Vec<_> = macro_call_ids let expansions: Vec<_> = macro_call_ids
.iter() .iter()
@ -483,11 +471,22 @@ impl<'db> SemanticsImpl<'db> {
Some(node) Some(node)
}) })
.collect(); .collect();
if expansions.is_empty() { if expansions.is_empty() {
None None
} else { } else {
Some(expansions) Some(expansions)
} }
}
fn derive_macro_calls(&self, attr: &ast::Attr) -> Option<Vec<MacroCallId>> {
let item = attr.syntax().parent().and_then(ast::Item::cast)?;
let file_id = self.find_file(item.syntax()).file_id;
let item = InFile::new(file_id, &item);
let src = InFile::new(file_id, attr.clone());
self.with_ctx(|ctx| {
let res = ctx.attr_to_derive_macro_call(item, src)?;
Some(res.to_vec())
}) })
} }