From cb863390f23bc2eac6561d55def9bd3ba54605fc Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 15 Jan 2021 18:57:32 +0100 Subject: Handle self/super/crate in PathSegment as NameRef --- crates/syntax/src/algo.rs | 2 +- crates/syntax/src/ast/generated/nodes.rs | 6 +++--- crates/syntax/src/ast/node_ext.rs | 22 ++++++++++++++++++---- crates/syntax/src/validation.rs | 2 +- 4 files changed, 23 insertions(+), 9 deletions(-) (limited to 'crates/syntax/src') diff --git a/crates/syntax/src/algo.rs b/crates/syntax/src/algo.rs index 384d031e7..39da45cc0 100644 --- a/crates/syntax/src/algo.rs +++ b/crates/syntax/src/algo.rs @@ -883,7 +883,7 @@ use crate::AstNode; replacements: - Line 2: Node(NAME_REF@5..14) -> crate + Line 2: Token(IDENT@5..14 "text_edit") -> crate Line 2: Token(IDENT@16..24 "TextEdit") -> AstNode Line 2: Token(WHITESPACE@25..27 "\n\n") -> "\n" diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index 9c96d3d07..1d722db3c 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -18,6 +18,9 @@ pub struct NameRef { } impl NameRef { pub fn ident_token(&self) -> Option { support::token(&self.syntax, T![ident]) } + pub fn self_token(&self) -> Option { support::token(&self.syntax, T![self]) } + pub fn super_token(&self) -> Option { support::token(&self.syntax, T![super]) } + pub fn crate_token(&self) -> Option { support::token(&self.syntax, T![crate]) } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Lifetime { @@ -42,9 +45,6 @@ pub struct PathSegment { pub(crate) syntax: SyntaxNode, } impl PathSegment { - pub fn crate_token(&self) -> Option { support::token(&self.syntax, T![crate]) } - pub fn self_token(&self) -> Option { support::token(&self.syntax, T![self]) } - pub fn super_token(&self) -> Option { support::token(&self.syntax, T![super]) } pub fn coloncolon_token(&self) -> Option { support::token(&self.syntax, T![::]) } pub fn name_ref(&self) -> Option { support::child(&self.syntax) } pub fn generic_arg_list(&self) -> Option { support::child(&self.syntax) } diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 27381ba80..b8ce71d27 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -156,14 +156,28 @@ impl ast::PathSegment { .expect("segments are always nested in paths") } + pub fn crate_token(&self) -> Option { + self.name_ref().and_then(|it| it.crate_token()) + } + + pub fn self_token(&self) -> Option { + self.name_ref().and_then(|it| it.self_token()) + } + + pub fn super_token(&self) -> Option { + self.name_ref().and_then(|it| it.super_token()) + } + pub fn kind(&self) -> Option { let res = if let Some(name_ref) = self.name_ref() { - PathSegmentKind::Name(name_ref) + match name_ref.syntax().first_token().map(|it| it.kind()) { + Some(T![self]) => PathSegmentKind::SelfKw, + Some(T![super]) => PathSegmentKind::SuperKw, + Some(T![crate]) => PathSegmentKind::CrateKw, + _ => PathSegmentKind::Name(name_ref), + } } else { match self.syntax().first_child_or_token()?.kind() { - T![self] => PathSegmentKind::SelfKw, - T![super] => PathSegmentKind::SuperKw, - T![crate] => PathSegmentKind::CrateKw, T![<] => { // or // T is any TypeRef, Trait has to be a PathType diff --git a/crates/syntax/src/validation.rs b/crates/syntax/src/validation.rs index bfa2dc4ba..7901580ee 100644 --- a/crates/syntax/src/validation.rs +++ b/crates/syntax/src/validation.rs @@ -256,7 +256,7 @@ fn validate_path_keywords(segment: ast::PathSegment, errors: &mut Vec