2134: More match ast r=matklad a=kjeremy Use `match_ast!` in more places 2137: Add link to the vscode VIM extension compatibility warning. r=matklad a=krk Fixes https://github.com/rust-analyzer/rust-analyzer/issues/1831 Co-authored-by: kjeremy <kjeremy@gmail.com> Co-authored-by: krk <keremkat@gmail.com>
This commit is contained in:
commit
37eaa840bb
@ -12,7 +12,7 @@
|
||||
use ra_db::FileId;
|
||||
use ra_syntax::{
|
||||
ast::{self, AstNode},
|
||||
AstPtr,
|
||||
match_ast, AstPtr,
|
||||
SyntaxKind::*,
|
||||
SyntaxNode, SyntaxNodePtr, TextRange, TextUnit,
|
||||
};
|
||||
@ -37,24 +37,34 @@ fn try_get_resolver_for_node(
|
||||
file_id: FileId,
|
||||
node: &SyntaxNode,
|
||||
) -> Option<Resolver> {
|
||||
if let Some(module) = ast::Module::cast(node.clone()) {
|
||||
let src = crate::Source { file_id: file_id.into(), ast: module };
|
||||
Some(crate::Module::from_declaration(db, src)?.resolver(db))
|
||||
} else if let Some(file) = ast::SourceFile::cast(node.clone()) {
|
||||
let src =
|
||||
crate::Source { file_id: file_id.into(), ast: crate::ModuleSource::SourceFile(file) };
|
||||
Some(crate::Module::from_definition(db, src)?.resolver(db))
|
||||
} else if let Some(s) = ast::StructDef::cast(node.clone()) {
|
||||
let src = crate::Source { file_id: file_id.into(), ast: s };
|
||||
Some(Struct::from_source(db, src)?.resolver(db))
|
||||
} else if let Some(e) = ast::EnumDef::cast(node.clone()) {
|
||||
let src = crate::Source { file_id: file_id.into(), ast: e };
|
||||
Some(Enum::from_source(db, src)?.resolver(db))
|
||||
} else if node.kind() == FN_DEF || node.kind() == CONST_DEF || node.kind() == STATIC_DEF {
|
||||
Some(def_with_body_from_child_node(db, file_id, node)?.resolver(db))
|
||||
} else {
|
||||
// FIXME add missing cases
|
||||
None
|
||||
match_ast! {
|
||||
match node {
|
||||
ast::Module(it) => {
|
||||
let src = crate::Source { file_id: file_id.into(), ast: it };
|
||||
Some(crate::Module::from_declaration(db, src)?.resolver(db))
|
||||
},
|
||||
ast::SourceFile(it) => {
|
||||
let src =
|
||||
crate::Source { file_id: file_id.into(), ast: crate::ModuleSource::SourceFile(it) };
|
||||
Some(crate::Module::from_definition(db, src)?.resolver(db))
|
||||
},
|
||||
ast::StructDef(it) => {
|
||||
let src = crate::Source { file_id: file_id.into(), ast: it };
|
||||
Some(Struct::from_source(db, src)?.resolver(db))
|
||||
},
|
||||
ast::EnumDef(it) => {
|
||||
let src = crate::Source { file_id: file_id.into(), ast: it };
|
||||
Some(Enum::from_source(db, src)?.resolver(db))
|
||||
},
|
||||
_ => {
|
||||
if node.kind() == FN_DEF || node.kind() == CONST_DEF || node.kind() == STATIC_DEF {
|
||||
Some(def_with_body_from_child_node(db, file_id, node)?.resolver(db))
|
||||
} else {
|
||||
// FIXME add missing cases
|
||||
None
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,16 +78,14 @@ fn def_with_body_from_child_node(
|
||||
let ctx = LocationCtx::new(db, module.id, file_id.into());
|
||||
|
||||
node.ancestors().find_map(|node| {
|
||||
if let Some(def) = ast::FnDef::cast(node.clone()) {
|
||||
return Some(Function { id: ctx.to_def(&def) }.into());
|
||||
match_ast! {
|
||||
match node {
|
||||
ast::FnDef(def) => { Some(Function {id: ctx.to_def(&def) }.into()) },
|
||||
ast::ConstDef(def) => { Some(Const { id: ctx.to_def(&def) }.into()) },
|
||||
ast::StaticDef(def) => { Some(Static { id: ctx.to_def(&def) }.into()) },
|
||||
_ => { None },
|
||||
}
|
||||
}
|
||||
if let Some(def) = ast::ConstDef::cast(node.clone()) {
|
||||
return Some(Const { id: ctx.to_def(&def) }.into());
|
||||
}
|
||||
if let Some(def) = ast::StaticDef::cast(node) {
|
||||
return Some(Static { id: ctx.to_def(&def) }.into());
|
||||
}
|
||||
None
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
use ra_db::SourceDatabase;
|
||||
use ra_syntax::{
|
||||
ast::{self, AstNode, AttrsOwner, ModuleItemOwner, NameOwner},
|
||||
SyntaxNode, TextRange,
|
||||
match_ast, SyntaxNode, TextRange,
|
||||
};
|
||||
|
||||
use crate::{db::RootDatabase, FileId};
|
||||
@ -29,12 +29,12 @@ pub(crate) fn runnables(db: &RootDatabase, file_id: FileId) -> Vec<Runnable> {
|
||||
}
|
||||
|
||||
fn runnable(db: &RootDatabase, file_id: FileId, item: SyntaxNode) -> Option<Runnable> {
|
||||
if let Some(fn_def) = ast::FnDef::cast(item.clone()) {
|
||||
runnable_fn(fn_def)
|
||||
} else if let Some(m) = ast::Module::cast(item) {
|
||||
runnable_mod(db, file_id, m)
|
||||
} else {
|
||||
None
|
||||
match_ast! {
|
||||
match item {
|
||||
ast::FnDef(it) => { runnable_fn(it) },
|
||||
ast::Module(it) => { runnable_mod(db, file_id, it) },
|
||||
_ => { None },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
use crate::{
|
||||
ast::{self, child_opt, children, AstChildren, AstNode, AstToken},
|
||||
match_ast,
|
||||
syntax_node::{SyntaxElementChildren, SyntaxNodeChildren},
|
||||
};
|
||||
|
||||
@ -68,11 +69,12 @@ impl Iterator for ItemOrMacroIter {
|
||||
fn next(&mut self) -> Option<ItemOrMacro> {
|
||||
loop {
|
||||
let n = self.0.next()?;
|
||||
if let Some(item) = ast::ModuleItem::cast(n.clone()) {
|
||||
return Some(ItemOrMacro::Item(item));
|
||||
}
|
||||
if let Some(call) = ast::MacroCall::cast(n) {
|
||||
return Some(ItemOrMacro::Macro(call));
|
||||
match_ast! {
|
||||
match n {
|
||||
ast::ModuleItem(it) => { return Some(ItemOrMacro::Item(it)) },
|
||||
ast::MacroCall(it) => { return Some(ItemOrMacro::Macro(it)) },
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ export function activate(context: vscode.ExtensionContext) {
|
||||
});
|
||||
} catch (_) {
|
||||
vscode.window.showWarningMessage(
|
||||
'Enhanced typing feature is disabled because of incompatibility with VIM extension'
|
||||
'Enhanced typing feature is disabled because of incompatibility with VIM extension, consider turning off rust-analyzer.enableEnhancedTyping: https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/README.md#settings'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user