refactor: leverage HasAttrs
for code brevity
This commit is contained in:
parent
2e7d2c2d04
commit
356d12eae4
@ -315,26 +315,14 @@ impl AttrsWithOwner {
|
|||||||
let src = it.parent().child_source(db);
|
let src = it.parent().child_source(db);
|
||||||
RawAttrs::from_attrs_owner(
|
RawAttrs::from_attrs_owner(
|
||||||
db.upcast(),
|
db.upcast(),
|
||||||
src.with_value(src.value[it.local_id()].as_ref().either(
|
src.with_value(&src.value[it.local_id()]),
|
||||||
|it| match it {
|
|
||||||
ast::TypeOrConstParam::Type(it) => it as _,
|
|
||||||
ast::TypeOrConstParam::Const(it) => it as _,
|
|
||||||
},
|
|
||||||
|it| it as _,
|
|
||||||
)),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
GenericParamId::TypeParamId(it) => {
|
GenericParamId::TypeParamId(it) => {
|
||||||
let src = it.parent().child_source(db);
|
let src = it.parent().child_source(db);
|
||||||
RawAttrs::from_attrs_owner(
|
RawAttrs::from_attrs_owner(
|
||||||
db.upcast(),
|
db.upcast(),
|
||||||
src.with_value(src.value[it.local_id()].as_ref().either(
|
src.with_value(&src.value[it.local_id()]),
|
||||||
|it| match it {
|
|
||||||
ast::TypeOrConstParam::Type(it) => it as _,
|
|
||||||
ast::TypeOrConstParam::Const(it) => it as _,
|
|
||||||
},
|
|
||||||
|it| it as _,
|
|
||||||
)),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
GenericParamId::LifetimeParamId(it) => {
|
GenericParamId::LifetimeParamId(it) => {
|
||||||
@ -412,28 +400,14 @@ impl AttrsWithOwner {
|
|||||||
},
|
},
|
||||||
AttrDefId::ImplId(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),
|
AttrDefId::ImplId(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),
|
||||||
AttrDefId::GenericParamId(id) => match id {
|
AttrDefId::GenericParamId(id) => match id {
|
||||||
GenericParamId::ConstParamId(id) => {
|
GenericParamId::ConstParamId(id) => id
|
||||||
id.parent().child_source(db).map(|source| match &source[id.local_id()] {
|
.parent()
|
||||||
Either::Left(ast::TypeOrConstParam::Type(id)) => {
|
.child_source(db)
|
||||||
ast::AnyHasAttrs::new(id.clone())
|
.map(|source| ast::AnyHasAttrs::new(source[id.local_id()].clone())),
|
||||||
}
|
GenericParamId::TypeParamId(id) => id
|
||||||
Either::Left(ast::TypeOrConstParam::Const(id)) => {
|
.parent()
|
||||||
ast::AnyHasAttrs::new(id.clone())
|
.child_source(db)
|
||||||
}
|
.map(|source| ast::AnyHasAttrs::new(source[id.local_id()].clone())),
|
||||||
Either::Right(id) => ast::AnyHasAttrs::new(id.clone()),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
GenericParamId::TypeParamId(id) => {
|
|
||||||
id.parent().child_source(db).map(|source| match &source[id.local_id()] {
|
|
||||||
Either::Left(ast::TypeOrConstParam::Type(id)) => {
|
|
||||||
ast::AnyHasAttrs::new(id.clone())
|
|
||||||
}
|
|
||||||
Either::Left(ast::TypeOrConstParam::Const(id)) => {
|
|
||||||
ast::AnyHasAttrs::new(id.clone())
|
|
||||||
}
|
|
||||||
Either::Right(id) => ast::AnyHasAttrs::new(id.clone()),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
GenericParamId::LifetimeParamId(id) => id
|
GenericParamId::LifetimeParamId(id) => id
|
||||||
.parent
|
.parent
|
||||||
.child_source(db)
|
.child_source(db)
|
||||||
|
@ -129,6 +129,13 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<L, R> HasAttrs for Either<L, R>
|
||||||
|
where
|
||||||
|
L: HasAttrs,
|
||||||
|
R: HasAttrs,
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
mod support {
|
mod support {
|
||||||
use super::{AstChildren, AstNode, SyntaxKind, SyntaxNode, SyntaxToken};
|
use super::{AstChildren, AstNode, SyntaxKind, SyntaxNode, SyntaxToken};
|
||||||
|
|
||||||
|
@ -680,6 +680,36 @@ impl TypeOrConstParam {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl AstNode for TypeOrConstParam {
|
||||||
|
fn can_cast(kind: SyntaxKind) -> bool
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
{
|
||||||
|
matches!(kind, SyntaxKind::TYPE_PARAM | SyntaxKind::CONST_PARAM)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cast(syntax: SyntaxNode) -> Option<Self>
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
{
|
||||||
|
let res = match syntax.kind() {
|
||||||
|
SyntaxKind::TYPE_PARAM => TypeOrConstParam::Type(ast::TypeParam { syntax }),
|
||||||
|
SyntaxKind::CONST_PARAM => TypeOrConstParam::Const(ast::ConstParam { syntax }),
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
Some(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn syntax(&self) -> &SyntaxNode {
|
||||||
|
match self {
|
||||||
|
TypeOrConstParam::Type(it) => it.syntax(),
|
||||||
|
TypeOrConstParam::Const(it) => it.syntax(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HasAttrs for TypeOrConstParam {}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum TraitOrAlias {
|
pub enum TraitOrAlias {
|
||||||
Trait(ast::Trait),
|
Trait(ast::Trait),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user