mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
move reparsers to grammar
This commit is contained in:
parent
5a6eda528c
commit
9f6883fbf1
2 changed files with 27 additions and 33 deletions
|
@ -36,14 +36,8 @@ mod type_args;
|
||||||
mod type_params;
|
mod type_params;
|
||||||
mod types;
|
mod types;
|
||||||
|
|
||||||
pub(crate) use self::{
|
|
||||||
expressions::block,
|
|
||||||
items::{
|
|
||||||
enum_variant_list, extern_item_list, impl_item_list, match_arm_list, mod_item_list,
|
|
||||||
named_field_def_list, named_field_list, token_tree, trait_item_list, use_tree_list,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
SyntaxNode,
|
||||||
SyntaxKind::{self, *},
|
SyntaxKind::{self, *},
|
||||||
parsing::{
|
parsing::{
|
||||||
token_set::TokenSet,
|
token_set::TokenSet,
|
||||||
|
@ -51,13 +45,37 @@ use crate::{
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub(crate) fn root(p: &mut Parser) {
|
pub(super) fn root(p: &mut Parser) {
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
p.eat(SHEBANG);
|
p.eat(SHEBANG);
|
||||||
items::mod_contents(p, false);
|
items::mod_contents(p, false);
|
||||||
m.complete(p, SOURCE_FILE);
|
m.complete(p, SOURCE_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(super) fn reparser(node: &SyntaxNode) -> Option<fn(&mut Parser)> {
|
||||||
|
let res = match node.kind() {
|
||||||
|
BLOCK => expressions::block,
|
||||||
|
NAMED_FIELD_DEF_LIST => items::named_field_def_list,
|
||||||
|
NAMED_FIELD_LIST => items::named_field_list,
|
||||||
|
ENUM_VARIANT_LIST => items::enum_variant_list,
|
||||||
|
MATCH_ARM_LIST => items::match_arm_list,
|
||||||
|
USE_TREE_LIST => items::use_tree_list,
|
||||||
|
EXTERN_ITEM_LIST => items::extern_item_list,
|
||||||
|
TOKEN_TREE if node.first_child().unwrap().kind() == L_CURLY => items::token_tree,
|
||||||
|
ITEM_LIST => {
|
||||||
|
let parent = node.parent().unwrap();
|
||||||
|
match parent.kind() {
|
||||||
|
IMPL_BLOCK => items::impl_item_list,
|
||||||
|
TRAIT_DEF => items::trait_item_list,
|
||||||
|
MODULE => items::mod_item_list,
|
||||||
|
_ => return None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => return None,
|
||||||
|
};
|
||||||
|
Some(res)
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||||
enum BlockLike {
|
enum BlockLike {
|
||||||
Block,
|
Block,
|
||||||
|
|
|
@ -81,31 +81,7 @@ fn is_contextual_kw(text: &str) -> bool {
|
||||||
type ParseFn = fn(&mut Parser);
|
type ParseFn = fn(&mut Parser);
|
||||||
fn find_reparsable_node(node: &SyntaxNode, range: TextRange) -> Option<(&SyntaxNode, ParseFn)> {
|
fn find_reparsable_node(node: &SyntaxNode, range: TextRange) -> Option<(&SyntaxNode, ParseFn)> {
|
||||||
let node = algo::find_covering_node(node, range);
|
let node = algo::find_covering_node(node, range);
|
||||||
return node.ancestors().filter_map(|node| reparser(node).map(|r| (node, r))).next();
|
node.ancestors().find_map(grammar::reparser).map(|r| (node, r))
|
||||||
|
|
||||||
fn reparser(node: &SyntaxNode) -> Option<ParseFn> {
|
|
||||||
let res = match node.kind() {
|
|
||||||
BLOCK => grammar::block,
|
|
||||||
NAMED_FIELD_DEF_LIST => grammar::named_field_def_list,
|
|
||||||
NAMED_FIELD_LIST => grammar::named_field_list,
|
|
||||||
ENUM_VARIANT_LIST => grammar::enum_variant_list,
|
|
||||||
MATCH_ARM_LIST => grammar::match_arm_list,
|
|
||||||
USE_TREE_LIST => grammar::use_tree_list,
|
|
||||||
EXTERN_ITEM_LIST => grammar::extern_item_list,
|
|
||||||
TOKEN_TREE if node.first_child().unwrap().kind() == L_CURLY => grammar::token_tree,
|
|
||||||
ITEM_LIST => {
|
|
||||||
let parent = node.parent().unwrap();
|
|
||||||
match parent.kind() {
|
|
||||||
IMPL_BLOCK => grammar::impl_item_list,
|
|
||||||
TRAIT_DEF => grammar::trait_item_list,
|
|
||||||
MODULE => grammar::mod_item_list,
|
|
||||||
_ => return None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => return None,
|
|
||||||
};
|
|
||||||
Some(res)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_balanced(tokens: &[Token]) -> bool {
|
fn is_balanced(tokens: &[Token]) -> bool {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue