mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-28 09:44:08 +00:00
match_ast!
takes a pattern to allow underscore usage
This commit is contained in:
parent
9915103c9e
commit
901c7c7277
@ -102,10 +102,10 @@ fn shorten_paths(node: &SyntaxNode, path: &ast::Path) {
|
|||||||
match child {
|
match child {
|
||||||
// Don't modify `use` items, as this can break the `use` item when injecting a new
|
// Don't modify `use` items, as this can break the `use` item when injecting a new
|
||||||
// import into the use tree.
|
// import into the use tree.
|
||||||
ast::Use(_it) => continue,
|
ast::Use(_) => continue,
|
||||||
// Don't descend into submodules, they don't have the same `use` items in scope.
|
// Don't descend into submodules, they don't have the same `use` items in scope.
|
||||||
// FIXME: This isn't true due to `super::*` imports?
|
// FIXME: This isn't true due to `super::*` imports?
|
||||||
ast::Module(_it) => continue,
|
ast::Module(_) => continue,
|
||||||
ast::Path(p) => if maybe_replace_path(p.clone(), path.clone()).is_none() {
|
ast::Path(p) => if maybe_replace_path(p.clone(), path.clone()).is_none() {
|
||||||
shorten_paths(p.syntax(), path);
|
shorten_paths(p.syntax(), path);
|
||||||
},
|
},
|
||||||
|
@ -517,7 +517,7 @@ impl<'a> CompletionContext<'a> {
|
|||||||
|
|
||||||
(ty, name)
|
(ty, name)
|
||||||
},
|
},
|
||||||
ast::ArgList(_it) => {
|
ast::ArgList(_) => {
|
||||||
cov_mark::hit!(expected_type_fn_param);
|
cov_mark::hit!(expected_type_fn_param);
|
||||||
ActiveParameter::at_token(
|
ActiveParameter::at_token(
|
||||||
&self.sema,
|
&self.sema,
|
||||||
@ -608,9 +608,9 @@ impl<'a> CompletionContext<'a> {
|
|||||||
.map(|c| (Some(c.return_type()), None))
|
.map(|c| (Some(c.return_type()), None))
|
||||||
.unwrap_or((None, None))
|
.unwrap_or((None, None))
|
||||||
},
|
},
|
||||||
ast::ParamList(__) => (None, None),
|
ast::ParamList(_) => (None, None),
|
||||||
ast::Stmt(__) => (None, None),
|
ast::Stmt(_) => (None, None),
|
||||||
ast::Item(__) => (None, None),
|
ast::Item(_) => (None, None),
|
||||||
_ => {
|
_ => {
|
||||||
match node.parent() {
|
match node.parent() {
|
||||||
Some(n) => {
|
Some(n) => {
|
||||||
@ -702,10 +702,10 @@ impl<'a> CompletionContext<'a> {
|
|||||||
|
|
||||||
Some(match_ast! {
|
Some(match_ast! {
|
||||||
match parent {
|
match parent {
|
||||||
ast::LifetimeParam(_it) => LifetimeContext::LifetimeParam(sema.find_node_at_offset_with_macros(original_file, offset)),
|
ast::LifetimeParam(_) => LifetimeContext::LifetimeParam(sema.find_node_at_offset_with_macros(original_file, offset)),
|
||||||
ast::BreakExpr(_it) => LifetimeContext::LabelRef,
|
ast::BreakExpr(_) => LifetimeContext::LabelRef,
|
||||||
ast::ContinueExpr(_it) => LifetimeContext::LabelRef,
|
ast::ContinueExpr(_) => LifetimeContext::LabelRef,
|
||||||
ast::Label(_it) => LifetimeContext::LabelDef,
|
ast::Label(_) => LifetimeContext::LabelDef,
|
||||||
_ => LifetimeContext::Lifetime,
|
_ => LifetimeContext::Lifetime,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -753,7 +753,7 @@ impl<'a> CompletionContext<'a> {
|
|||||||
path_ctx.kind = path.syntax().ancestors().find_map(|it| {
|
path_ctx.kind = path.syntax().ancestors().find_map(|it| {
|
||||||
match_ast! {
|
match_ast! {
|
||||||
match it {
|
match it {
|
||||||
ast::PathType(_it) => Some(PathKind::Type),
|
ast::PathType(_) => Some(PathKind::Type),
|
||||||
ast::PathExpr(it) => {
|
ast::PathExpr(it) => {
|
||||||
path_ctx.has_call_parens = it.syntax().parent().map_or(false, |it| ast::CallExpr::can_cast(it.kind()));
|
path_ctx.has_call_parens = it.syntax().parent().map_or(false, |it| ast::CallExpr::can_cast(it.kind()));
|
||||||
Some(PathKind::Expr)
|
Some(PathKind::Expr)
|
||||||
@ -772,9 +772,9 @@ impl<'a> CompletionContext<'a> {
|
|||||||
Some(PathKind::Pat)
|
Some(PathKind::Pat)
|
||||||
},
|
},
|
||||||
ast::MacroCall(it) => it.excl_token().and(Some(PathKind::Mac)),
|
ast::MacroCall(it) => it.excl_token().and(Some(PathKind::Mac)),
|
||||||
ast::Meta(_it) => Some(PathKind::Attr),
|
ast::Meta(_) => Some(PathKind::Attr),
|
||||||
ast::Visibility(it) => Some(PathKind::Vis { has_in_token: it.in_token().is_some() }),
|
ast::Visibility(it) => Some(PathKind::Vis { has_in_token: it.in_token().is_some() }),
|
||||||
ast::UseTree(_it) => Some(PathKind::Use),
|
ast::UseTree(_) => Some(PathKind::Use),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -851,9 +851,9 @@ fn pattern_context_for(pat: ast::Pat) -> PatternContext {
|
|||||||
});
|
});
|
||||||
return (PatternRefutability::Irrefutable, param.ty().is_some())
|
return (PatternRefutability::Irrefutable, param.ty().is_some())
|
||||||
},
|
},
|
||||||
ast::MatchArm(__) => PatternRefutability::Refutable,
|
ast::MatchArm(_) => PatternRefutability::Refutable,
|
||||||
ast::Condition(__) => PatternRefutability::Refutable,
|
ast::Condition(_) => PatternRefutability::Refutable,
|
||||||
ast::ForExpr(__) => PatternRefutability::Irrefutable,
|
ast::ForExpr(_) => PatternRefutability::Irrefutable,
|
||||||
_ => PatternRefutability::Irrefutable,
|
_ => PatternRefutability::Irrefutable,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -100,7 +100,7 @@ pub(crate) fn determine_prev_sibling(name_like: &ast::NameLike) -> Option<Immedi
|
|||||||
let res = match_ast! {
|
let res = match_ast! {
|
||||||
match prev_sibling {
|
match prev_sibling {
|
||||||
// vis followed by random ident will always error the parser
|
// vis followed by random ident will always error the parser
|
||||||
ast::Visibility(_it) => ImmediatePrevSibling::Visibility,
|
ast::Visibility(_) => ImmediatePrevSibling::Visibility,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -112,7 +112,7 @@ pub(crate) fn determine_prev_sibling(name_like: &ast::NameLike) -> Option<Immedi
|
|||||||
let node = it.expr().filter(|_| it.semicolon_token().is_none())?.syntax().clone();
|
let node = it.expr().filter(|_| it.semicolon_token().is_none())?.syntax().clone();
|
||||||
match_ast! {
|
match_ast! {
|
||||||
match node {
|
match node {
|
||||||
ast::IfExpr(_it) => ImmediatePrevSibling::IfExpr,
|
ast::IfExpr(_) => ImmediatePrevSibling::IfExpr,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -128,7 +128,7 @@ pub(crate) fn determine_prev_sibling(name_like: &ast::NameLike) -> Option<Immedi
|
|||||||
} else {
|
} else {
|
||||||
return None
|
return None
|
||||||
},
|
},
|
||||||
ast::Attr(_it) => ImmediatePrevSibling::Attribute,
|
ast::Attr(_) => ImmediatePrevSibling::Attribute,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -200,31 +200,31 @@ pub(crate) fn determine_location(
|
|||||||
|
|
||||||
let res = match_ast! {
|
let res = match_ast! {
|
||||||
match parent {
|
match parent {
|
||||||
ast::IdentPat(_it) => ImmediateLocation::IdentPat,
|
ast::IdentPat(_) => ImmediateLocation::IdentPat,
|
||||||
ast::Rename(_it) => ImmediateLocation::Rename,
|
ast::Rename(_) => ImmediateLocation::Rename,
|
||||||
ast::StmtList(_it) => ImmediateLocation::StmtList,
|
ast::StmtList(_) => ImmediateLocation::StmtList,
|
||||||
ast::SourceFile(_it) => ImmediateLocation::ItemList,
|
ast::SourceFile(_) => ImmediateLocation::ItemList,
|
||||||
ast::ItemList(_it) => ImmediateLocation::ItemList,
|
ast::ItemList(_) => ImmediateLocation::ItemList,
|
||||||
ast::RefExpr(_it) => ImmediateLocation::RefExpr,
|
ast::RefExpr(_) => ImmediateLocation::RefExpr,
|
||||||
ast::Variant(_it) => ImmediateLocation::Variant,
|
ast::Variant(_) => ImmediateLocation::Variant,
|
||||||
ast::RecordField(it) => if it.ty().map_or(false, |it| it.syntax().text_range().contains(offset)) {
|
ast::RecordField(it) => if it.ty().map_or(false, |it| it.syntax().text_range().contains(offset)) {
|
||||||
return None;
|
return None;
|
||||||
} else {
|
} else {
|
||||||
ImmediateLocation::RecordField
|
ImmediateLocation::RecordField
|
||||||
},
|
},
|
||||||
ast::RecordExprFieldList(_it) => sema
|
ast::RecordExprFieldList(_) => sema
|
||||||
.find_node_at_offset_with_macros(original_file, offset)
|
.find_node_at_offset_with_macros(original_file, offset)
|
||||||
.map(ImmediateLocation::RecordExprUpdate)?,
|
.map(ImmediateLocation::RecordExprUpdate)?,
|
||||||
ast::TupleField(_it) => ImmediateLocation::TupleField,
|
ast::TupleField(_) => ImmediateLocation::TupleField,
|
||||||
ast::TupleFieldList(_it) => ImmediateLocation::TupleField,
|
ast::TupleFieldList(_) => ImmediateLocation::TupleField,
|
||||||
ast::TypeBound(_it) => ImmediateLocation::TypeBound,
|
ast::TypeBound(_) => ImmediateLocation::TypeBound,
|
||||||
ast::TypeBoundList(_it) => ImmediateLocation::TypeBound,
|
ast::TypeBoundList(_) => ImmediateLocation::TypeBound,
|
||||||
ast::AssocItemList(it) => match it.syntax().parent().map(|it| it.kind()) {
|
ast::AssocItemList(it) => match it.syntax().parent().map(|it| it.kind()) {
|
||||||
Some(IMPL) => ImmediateLocation::Impl,
|
Some(IMPL) => ImmediateLocation::Impl,
|
||||||
Some(TRAIT) => ImmediateLocation::Trait,
|
Some(TRAIT) => ImmediateLocation::Trait,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
},
|
},
|
||||||
ast::GenericArgList(_it) => sema
|
ast::GenericArgList(_) => sema
|
||||||
.find_node_at_offset_with_macros(original_file, offset)
|
.find_node_at_offset_with_macros(original_file, offset)
|
||||||
.map(ImmediateLocation::GenericArgList)?,
|
.map(ImmediateLocation::GenericArgList)?,
|
||||||
ast::Module(it) => {
|
ast::Module(it) => {
|
||||||
|
@ -657,7 +657,7 @@ impl ReferenceCategory {
|
|||||||
|
|
||||||
let mode = r.syntax().ancestors().find_map(|node| {
|
let mode = r.syntax().ancestors().find_map(|node| {
|
||||||
match_ast! {
|
match_ast! {
|
||||||
match (node) {
|
match node {
|
||||||
ast::BinExpr(expr) => {
|
ast::BinExpr(expr) => {
|
||||||
if matches!(expr.op_kind()?, ast::BinaryOp::Assignment { .. }) {
|
if matches!(expr.op_kind()?, ast::BinaryOp::Assignment { .. }) {
|
||||||
// If the variable or field ends on the LHS's end then it's a Write (covers fields and locals).
|
// If the variable or field ends on the LHS's end then it's a Write (covers fields and locals).
|
||||||
|
@ -242,7 +242,7 @@ macro_rules! match_ast {
|
|||||||
(match $node:ident { $($tt:tt)* }) => { match_ast!(match ($node) { $($tt)* }) };
|
(match $node:ident { $($tt:tt)* }) => { match_ast!(match ($node) { $($tt)* }) };
|
||||||
|
|
||||||
(match ($node:expr) {
|
(match ($node:expr) {
|
||||||
$( ast::$ast:ident($it:ident) => $res:expr, )*
|
$( ast::$ast:ident($it:pat) => $res:expr, )*
|
||||||
_ => $catch_all:expr $(,)?
|
_ => $catch_all:expr $(,)?
|
||||||
}) => {{
|
}) => {{
|
||||||
$( if let Some($it) = ast::$ast::cast($node.clone()) { $res } else )*
|
$( if let Some($it) = ast::$ast::cast($node.clone()) { $res } else )*
|
||||||
|
@ -275,7 +275,7 @@ fn validate_path_keywords(segment: ast::PathSegment, errors: &mut Vec<SyntaxErro
|
|||||||
return Some(tree_path);
|
return Some(tree_path);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ast::UseTreeList(_it) => continue,
|
ast::UseTreeList(_) => continue,
|
||||||
ast::Path(parent) => path = parent,
|
ast::Path(parent) => path = parent,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user