mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-08-22 11:24:24 +00:00
fix: Recognize Self
as a proper keyword
This commit is contained in:
parent
8f504dc873
commit
c0d6471143
27 changed files with 98 additions and 49 deletions
|
@ -1,5 +1,6 @@
|
|||
//! Generated by `sourcegen_ast`, do not edit by hand.
|
||||
|
||||
#![allow(non_snake_case)]
|
||||
use crate::{
|
||||
ast::{self, support, AstChildren, AstNode},
|
||||
SyntaxKind::{self, *},
|
||||
|
@ -24,6 +25,7 @@ impl NameRef {
|
|||
pub fn self_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![self]) }
|
||||
pub fn super_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![super]) }
|
||||
pub fn crate_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![crate]) }
|
||||
pub fn Self_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![Self]) }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
|
|
|
@ -185,7 +185,7 @@ pub(crate) fn generic_arg_list() -> ast::GenericArgList {
|
|||
}
|
||||
|
||||
pub fn path_segment(name_ref: ast::NameRef) -> ast::PathSegment {
|
||||
ast_from_text(&format!("use {};", name_ref))
|
||||
ast_from_text(&format!("type __ = {};", name_ref))
|
||||
}
|
||||
|
||||
pub fn path_segment_ty(type_ref: ast::Type, trait_ref: Option<ast::PathType>) -> ast::PathSegment {
|
||||
|
@ -209,7 +209,7 @@ pub fn path_segment_crate() -> ast::PathSegment {
|
|||
}
|
||||
|
||||
pub fn path_unqualified(segment: ast::PathSegment) -> ast::Path {
|
||||
ast_from_text(&format!("use {}", segment))
|
||||
ast_from_text(&format!("type __ = {};", segment))
|
||||
}
|
||||
|
||||
pub fn path_qualified(qual: ast::Path, segment: ast::PathSegment) -> ast::Path {
|
||||
|
@ -217,7 +217,7 @@ pub fn path_qualified(qual: ast::Path, segment: ast::PathSegment) -> ast::Path {
|
|||
}
|
||||
// FIXME: path concatenation operation doesn't make sense as AST op.
|
||||
pub fn path_concat(first: ast::Path, second: ast::Path) -> ast::Path {
|
||||
ast_from_text(&format!("{}::{}", first, second))
|
||||
ast_from_text(&format!("type __ = {}::{};", first, second))
|
||||
}
|
||||
|
||||
pub fn path_from_segments(
|
||||
|
@ -234,7 +234,7 @@ pub fn path_from_segments(
|
|||
|
||||
pub fn join_paths(paths: impl IntoIterator<Item = ast::Path>) -> ast::Path {
|
||||
let paths = paths.into_iter().map(|it| it.syntax().clone()).join("::");
|
||||
ast_from_text(&format!("use {};", paths))
|
||||
ast_from_text(&format!("type __ = {};", paths))
|
||||
}
|
||||
|
||||
// FIXME: should not be pub
|
||||
|
@ -782,6 +782,7 @@ pub fn struct_(
|
|||
))
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn ast_from_text<N: AstNode>(text: &str) -> N {
|
||||
let parse = SourceFile::parse(text);
|
||||
let node = match parse.tree().syntax().descendants().find_map(N::cast) {
|
||||
|
|
|
@ -183,6 +183,7 @@ impl ast::Attr {
|
|||
pub enum PathSegmentKind {
|
||||
Name(ast::NameRef),
|
||||
Type { type_ref: Option<ast::Type>, trait_ref: Option<ast::PathType> },
|
||||
SelfTypeKw,
|
||||
SelfKw,
|
||||
SuperKw,
|
||||
CrateKw,
|
||||
|
@ -204,6 +205,10 @@ impl ast::PathSegment {
|
|||
self.name_ref().and_then(|it| it.self_token())
|
||||
}
|
||||
|
||||
pub fn self_type_token(&self) -> Option<SyntaxToken> {
|
||||
self.name_ref().and_then(|it| it.Self_token())
|
||||
}
|
||||
|
||||
pub fn super_token(&self) -> Option<SyntaxToken> {
|
||||
self.name_ref().and_then(|it| it.super_token())
|
||||
}
|
||||
|
@ -211,6 +216,7 @@ impl ast::PathSegment {
|
|||
pub fn kind(&self) -> Option<PathSegmentKind> {
|
||||
let res = if let Some(name_ref) = self.name_ref() {
|
||||
match name_ref.syntax().first_token().map(|it| it.kind()) {
|
||||
Some(T![Self]) => PathSegmentKind::SelfTypeKw,
|
||||
Some(T![self]) => PathSegmentKind::SelfKw,
|
||||
Some(T![super]) => PathSegmentKind::SuperKw,
|
||||
Some(T![crate]) => PathSegmentKind::CrateKw,
|
||||
|
|
|
@ -67,8 +67,8 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
|
|||
keywords: &[
|
||||
"as", "async", "await", "box", "break", "const", "continue", "crate", "dyn", "else",
|
||||
"enum", "extern", "false", "fn", "for", "if", "impl", "in", "let", "loop", "macro",
|
||||
"match", "mod", "move", "mut", "pub", "ref", "return", "self", "static", "struct", "super",
|
||||
"trait", "true", "try", "type", "unsafe", "use", "where", "while", "yield",
|
||||
"match", "mod", "move", "mut", "pub", "ref", "return", "self", "Self", "static", "struct",
|
||||
"super", "trait", "true", "try", "type", "unsafe", "use", "where", "while", "yield",
|
||||
],
|
||||
contextual_keywords: &["auto", "default", "existential", "union", "raw", "macro_rules"],
|
||||
literals: &["INT_NUMBER", "FLOAT_NUMBER", "CHAR", "BYTE", "STRING", "BYTE_STRING"],
|
||||
|
|
|
@ -297,6 +297,7 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
|
|||
}
|
||||
|
||||
let ast = quote! {
|
||||
#![allow(non_snake_case)]
|
||||
use crate::{
|
||||
SyntaxNode, SyntaxToken, SyntaxKind::{self, *},
|
||||
ast::{self, AstNode, AstChildren, support},
|
||||
|
@ -356,21 +357,24 @@ fn generate_syntax_kinds(grammar: KindsSrc<'_>) -> String {
|
|||
let punctuation =
|
||||
grammar.punct.iter().map(|(_token, name)| format_ident!("{}", name)).collect::<Vec<_>>();
|
||||
|
||||
let full_keywords_values = &grammar.keywords;
|
||||
let full_keywords =
|
||||
full_keywords_values.iter().map(|kw| format_ident!("{}_KW", to_upper_snake_case(kw)));
|
||||
let x = |&name| match name {
|
||||
"Self" => format_ident!("SELF_TYPE_KW"),
|
||||
name => format_ident!("{}_KW", to_upper_snake_case(name)),
|
||||
};
|
||||
let full_keywords_values = grammar.keywords;
|
||||
let full_keywords = full_keywords_values.iter().map(x);
|
||||
|
||||
let contextual_keywords_values = &grammar.contextual_keywords;
|
||||
let contextual_keywords =
|
||||
contextual_keywords_values.iter().map(|kw| format_ident!("{}_KW", to_upper_snake_case(kw)));
|
||||
let contextual_keywords = contextual_keywords_values.iter().map(x);
|
||||
|
||||
let all_keywords_values =
|
||||
grammar.keywords.iter().chain(grammar.contextual_keywords.iter()).collect::<Vec<_>>();
|
||||
let all_keywords_idents = all_keywords_values.iter().map(|kw| format_ident!("{}", kw));
|
||||
let all_keywords = all_keywords_values
|
||||
let all_keywords_values = grammar
|
||||
.keywords
|
||||
.iter()
|
||||
.map(|name| format_ident!("{}_KW", to_upper_snake_case(name)))
|
||||
.chain(grammar.contextual_keywords.iter())
|
||||
.copied()
|
||||
.collect::<Vec<_>>();
|
||||
let all_keywords_idents = all_keywords_values.iter().map(|kw| format_ident!("{}", kw));
|
||||
let all_keywords = all_keywords_values.iter().map(x).collect::<Vec<_>>();
|
||||
|
||||
let literals =
|
||||
grammar.literals.iter().map(|name| format_ident!("{}", name)).collect::<Vec<_>>();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue