From 98718e0544f42e55642d2838b00d6a7bef1e2414 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 15 Jan 2021 21:07:38 +0100 Subject: [PATCH] Wrap remaining self/super/crate in Name{Ref} --- Cargo.lock | 4 +- .../src/handlers/introduce_named_lifetime.rs | 2 +- crates/hir_ty/src/tests.rs | 4 +- crates/ide/src/display/navigation_target.rs | 14 ++-- crates/ide/src/goto_definition.rs | 5 -- crates/ide/src/hover.rs | 5 +- crates/ide/src/references/rename.rs | 78 ++++++++----------- .../ide/src/syntax_highlighting/highlight.rs | 22 +++--- crates/ide_db/src/defs.rs | 11 +-- crates/parser/src/grammar.rs | 12 ++- crates/parser/src/grammar/items.rs | 2 + crates/parser/src/grammar/params.rs | 31 ++++---- crates/syntax/src/ast/generated/nodes.rs | 7 +- crates/syntax/src/ast/node_ext.rs | 33 +++++--- .../parser/err/0037_visibility_in_traits.rast | 10 ++- .../parser/inline/ok/0006_self_param.rast | 15 ++-- .../parser/inline/ok/0018_arb_self_types.rast | 6 +- .../parser/inline/ok/0021_impl_item_list.rast | 3 +- .../inline/ok/0022_crate_visibility.rast | 50 ++++++------ .../parser/inline/ok/0022_crate_visibility.rs | 3 +- .../inline/ok/0138_self_param_outer_attr.rast | 3 +- .../inline/ok/0160_crate_visibility_in.rast | 42 ++++++++++ .../inline/ok/0160_crate_visibility_in.rs | 2 + .../parser/ok/0007_extern_crate.rast | 3 +- .../test_data/parser/ok/0012_visibility.rast | 10 ++- .../parser/ok/0045_block_inner_attrs.rast | 3 +- .../parser/ok/0051_parameter_attrs.rast | 24 ++++-- xtask/Cargo.toml | 2 +- 28 files changed, 237 insertions(+), 169 deletions(-) create mode 100644 crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rast create mode 100644 crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rs diff --git a/Cargo.lock b/Cargo.lock index db8b491222..89d52a290b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1837,9 +1837,9 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "ungrammar" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33a2183403af89252547c4219a06a6cc8aef6302fee67e10e8431866af3ee72" +checksum = "b137a875a3b942539dd04bd37d193649f5d67e11407186f5b9d63ae0332b1a93" [[package]] name = "unicase" diff --git a/crates/assists/src/handlers/introduce_named_lifetime.rs b/crates/assists/src/handlers/introduce_named_lifetime.rs index 3f5f44d691..02782eb6de 100644 --- a/crates/assists/src/handlers/introduce_named_lifetime.rs +++ b/crates/assists/src/handlers/introduce_named_lifetime.rs @@ -61,7 +61,7 @@ fn generate_fn_def_assist( // compute the location which implicitly has the same lifetime as the anonymous lifetime let loc_needing_lifetime = if let Some(self_param) = self_param { // if we have a self reference, use that - Some(self_param.self_token()?.text_range().start()) + Some(self_param.name()?.syntax().text_range().start()) } else { // otherwise, if there's a single reference parameter without a named liftime, use that let fn_params_without_lifetime: Vec<_> = param_list diff --git a/crates/hir_ty/src/tests.rs b/crates/hir_ty/src/tests.rs index 3b1675f0b7..5ff7553214 100644 --- a/crates/hir_ty/src/tests.rs +++ b/crates/hir_ty/src/tests.rs @@ -26,7 +26,7 @@ use once_cell::race::OnceBool; use stdx::format_to; use syntax::{ algo, - ast::{self, AstNode}, + ast::{self, AstNode, NameOwner}, SyntaxNode, }; use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; @@ -153,7 +153,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { }); for (node, ty) in &types { let (range, text) = if let Some(self_param) = ast::SelfParam::cast(node.value.clone()) { - (self_param.self_token().unwrap().text_range(), "self".to_string()) + (self_param.name().unwrap().syntax().text_range(), "self".to_string()) } else { (node.value.text_range(), node.value.text().to_string().replace("\n", " ")) }; diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs index 685052e7f5..00e6012442 100644 --- a/crates/ide/src/display/navigation_target.rs +++ b/crates/ide/src/display/navigation_target.rs @@ -400,15 +400,13 @@ impl TryToNav for hir::GenericParam { impl ToNav for hir::Local { fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { let src = self.source(db); - let (node, focus_range) = match &src.value { - Either::Left(bind_pat) => ( - bind_pat.syntax().clone(), - bind_pat - .name() - .map(|it| src.with_value(&it.syntax().clone()).original_file_range(db).range), - ), - Either::Right(it) => (it.syntax().clone(), it.self_token().map(|it| it.text_range())), + let (node, name) = match &src.value { + Either::Left(bind_pat) => (bind_pat.syntax().clone(), bind_pat.name()), + Either::Right(it) => (it.syntax().clone(), it.name()), }; + let focus_range = + name.map(|it| src.with_value(&it.syntax().clone()).original_file_range(db).range); + let full_range = src.with_value(&node).original_file_range(db); let name = match self.name(db) { Some(it) => it.to_string().into(), diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index 988a5668f8..a1d2bce1d1 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -55,11 +55,6 @@ pub(crate) fn goto_definition( } else { reference_definition(&sema, Either::Left(<)).to_vec() }, - ast::SelfParam(self_param) => { - let def = NameClass::classify_self_param(&sema, &self_param)?.referenced_or_defined(sema.db); - let nav = def.try_to_nav(sema.db)?; - vec![nav] - }, _ => return None, } }; diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 6022bd2752..2024acd94e 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -98,7 +98,6 @@ pub(crate) fn hover( ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)), ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime) .map_or_else(|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced(sema.db)), |d| d.defined(sema.db)), - ast::SelfParam(self_param) => NameClass::classify_self_param(&sema, &self_param).and_then(|d| d.defined(sema.db)), _ => None, } }; @@ -3223,7 +3222,7 @@ impl Foo { } "#, expect![[r#" - *&self* + *self* ```rust &Foo @@ -3243,7 +3242,7 @@ impl Foo { } "#, expect![[r#" - *self: Arc* + *self* ```rust Arc diff --git a/crates/ide/src/references/rename.rs b/crates/ide/src/references/rename.rs index 9ac4af026b..4df189c981 100644 --- a/crates/ide/src/references/rename.rs +++ b/crates/ide/src/references/rename.rs @@ -1,12 +1,9 @@ //! FIXME: write short doc here -use std::{ - convert::TryInto, - fmt::{self, Display}, -}; +use std::fmt::{self, Display}; use hir::{Module, ModuleDef, ModuleSource, Semantics}; use ide_db::{ - base_db::{AnchoredPathBuf, FileId, FileRange, SourceDatabaseExt}, + base_db::{AnchoredPathBuf, FileId, FileRange}, defs::{Definition, NameClass, NameRefClass}, search::FileReference, RootDatabase, @@ -14,14 +11,14 @@ use ide_db::{ use syntax::{ algo::find_node_at_offset, ast::{self, NameOwner}, - lex_single_syntax_kind, match_ast, AstNode, SyntaxKind, SyntaxNode, SyntaxToken, T, + lex_single_syntax_kind, match_ast, AstNode, SyntaxKind, SyntaxNode, T, }; use test_utils::mark; use text_edit::TextEdit; use crate::{ FilePosition, FileSystemEdit, RangeInfo, ReferenceKind, ReferenceSearchResult, SourceChange, - TextRange, TextSize, + TextRange, }; type RenameResult = Result; @@ -52,10 +49,6 @@ pub(crate) fn prepare_rename( let syntax = source_file.syntax(); if let Some(module) = find_module_at_offset(&sema, position, syntax) { rename_mod(&sema, position, module, "dummy") - } else if let Some(self_token) = - syntax.token_at_offset(position.offset).find(|t| t.kind() == T![self]) - { - rename_self_to_param(&sema, position, self_token, "dummy") } else { let RangeInfo { range, .. } = find_all_refs(&sema, position)?; Ok(RangeInfo::new(range, SourceChange::default())) @@ -82,10 +75,6 @@ pub(crate) fn rename_with_semantics( if let Some(module) = find_module_at_offset(&sema, position, syntax) { rename_mod(&sema, position, module, new_name) - } else if let Some(self_token) = - syntax.token_at_offset(position.offset).find(|t| t.kind() == T![self]) - { - rename_self_to_param(&sema, position, self_token, new_name) } else { rename_reference(&sema, position, new_name) } @@ -108,7 +97,7 @@ pub(crate) fn will_rename_file( Some(change) } -#[derive(Debug, PartialEq)] +#[derive(Copy, Clone, Debug, PartialEq)] enum IdentifierKind { Ident, Lifetime, @@ -375,53 +364,50 @@ fn text_edit_from_self_param( fn rename_self_to_param( sema: &Semantics, position: FilePosition, - self_token: SyntaxToken, new_name: &str, + ident_kind: IdentifierKind, + range: TextRange, + refs: ReferenceSearchResult, ) -> Result, RenameError> { - let ident_kind = check_identifier(new_name)?; match ident_kind { IdentifierKind::Lifetime => bail!("Invalid name `{}`: not an identifier", new_name), IdentifierKind::ToSelf => { // no-op mark::hit!(rename_self_to_self); - return Ok(RangeInfo::new(self_token.text_range(), SourceChange::default())); + return Ok(RangeInfo::new(range, SourceChange::default())); } _ => (), } let source_file = sema.parse(position.file_id); let syn = source_file.syntax(); - let text = sema.db.file_text(position.file_id); let fn_def = find_node_at_offset::(syn, position.offset) .ok_or_else(|| format_err!("No surrounding method declaration found"))?; - let search_range = fn_def.syntax().text_range(); let mut source_change = SourceChange::default(); - - for (idx, _) in text.match_indices("self") { - let offset: TextSize = idx.try_into().unwrap(); - if !search_range.contains_inclusive(offset) { - continue; - } - if let Some(ref usage) = syn.token_at_offset(offset).find(|t| t.kind() == T![self]) { - let edit = if let Some(ref self_param) = ast::SelfParam::cast(usage.parent()) { - text_edit_from_self_param(syn, self_param, new_name) - .ok_or_else(|| format_err!("No target type found"))? - } else { - TextEdit::replace(usage.text_range(), String::from(new_name)) - }; + if let Some(self_param) = fn_def.param_list().and_then(|it| it.self_param()) { + if self_param + .syntax() + .text_range() + .contains_range(refs.declaration().nav.focus_or_full_range()) + { + let edit = text_edit_from_self_param(syn, &self_param, new_name) + .ok_or_else(|| format_err!("No target type found"))?; source_change.insert_source_edit(position.file_id, edit); + + source_change.extend(refs.references().iter().map(|(&file_id, references)| { + source_edit_from_references(sema, file_id, &references, new_name) + })); + + if source_change.source_file_edits.len() > 1 && ident_kind == IdentifierKind::Underscore + { + bail!("Cannot rename reference to `_` as it is being referenced multiple times"); + } + + return Ok(RangeInfo::new(range, source_change)); } } - - if source_change.source_file_edits.len() > 1 && ident_kind == IdentifierKind::Underscore { - bail!("Cannot rename reference to `_` as it is being referenced multiple times"); - } - - let range = ast::SelfParam::cast(self_token.parent()) - .map_or(self_token.text_range(), |p| p.syntax().text_range()); - - Ok(RangeInfo::new(range, source_change)) + Err(format_err!("Method has no self param")) } fn rename_reference( @@ -444,8 +430,9 @@ fn rename_reference( mark::hit!(rename_not_an_ident_ref); bail!("Invalid name `{}`: not an identifier", new_name) } - (IdentifierKind::ToSelf, ReferenceKind::SelfParam) => { - unreachable!("rename_self_to_param should've been called instead") + (_, ReferenceKind::SelfParam) => { + mark::hit!(rename_self_to_param); + return rename_self_to_param(sema, position, new_name, ident_kind, range, refs); } (IdentifierKind::ToSelf, _) => { mark::hit!(rename_to_self); @@ -1350,6 +1337,7 @@ impl Foo { #[test] fn test_owned_self_to_parameter() { + mark::check!(rename_self_to_param); check( "foo", r#" diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs index 87578e70ac..8625ef5dfc 100644 --- a/crates/ide/src/syntax_highlighting/highlight.rs +++ b/crates/ide/src/syntax_highlighting/highlight.rs @@ -68,7 +68,8 @@ pub(super) fn element( NAME_REF => { let name_ref = element.into_node().and_then(ast::NameRef::cast).unwrap(); highlight_func_by_name_ref(sema, &name_ref).unwrap_or_else(|| { - match NameRefClass::classify(sema, &name_ref) { + let is_self = name_ref.self_token().is_some(); + let h = match NameRefClass::classify(sema, &name_ref) { Some(name_kind) => match name_kind { NameRefClass::ExternCrate(_) => HlTag::Symbol(SymbolKind::Module).into(), NameRefClass::Definition(def) => { @@ -108,6 +109,11 @@ pub(super) fn element( highlight_name_ref_by_syntax(name_ref, sema) } None => HlTag::UnresolvedReference.into(), + }; + if h.tag == HlTag::Symbol(SymbolKind::Module) && is_self { + HlTag::Symbol(SymbolKind::SelfParam).into() + } else { + h } }) } @@ -225,18 +231,8 @@ pub(super) fn element( T![for] if !is_child_of_impl(&element) => h | HlMod::ControlFlow, T![unsafe] => h | HlMod::Unsafe, T![true] | T![false] => HlTag::BoolLiteral.into(), - T![self] => { - let self_param = element.parent().and_then(ast::SelfParam::cast); - if let Some(NameClass::Definition(def)) = self_param - .and_then(|self_param| NameClass::classify_self_param(sema, &self_param)) - { - highlight_def(db, def) | HlMod::Definition - } else if element.ancestors().any(|it| it.kind() == USE_TREE) { - HlTag::Symbol(SymbolKind::SelfParam).into() - } else { - return None; - } - } + // self is handled as either a Name or NameRef already + T![self] => return None, T![ref] => element .parent() .and_then(ast::IdentPat::cast) diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index 231e886a91..d9875ffef6 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -117,13 +117,6 @@ impl NameClass { } } - pub fn classify_self_param( - sema: &Semantics, - self_param: &ast::SelfParam, - ) -> Option { - sema.to_def(self_param).map(Definition::Local).map(NameClass::Definition) - } - pub fn classify(sema: &Semantics, name: &ast::Name) -> Option { let _p = profile::span("classify_name"); @@ -186,6 +179,10 @@ impl NameClass { Some(NameClass::Definition(Definition::Local(local))) }, + ast::SelfParam(it) => { + let def = sema.to_def(&it)?; + Some(NameClass::Definition(Definition::Local(def.into()))) + }, ast::RecordField(it) => { let field: hir::Field = sema.to_def(&it)?; Some(NameClass::Definition(Definition::Field(field))) diff --git a/crates/parser/src/grammar.rs b/crates/parser/src/grammar.rs index bb9ffea8be..6913e9ec2f 100644 --- a/crates/parser/src/grammar.rs +++ b/crates/parser/src/grammar.rs @@ -190,17 +190,25 @@ fn opt_visibility(p: &mut Parser) -> bool { // test crate_visibility // pub(crate) struct S; // pub(self) struct S; - // pub(self) struct S; - // pub(self) struct S; + // pub(super) struct S; // test pub_parens_typepath // struct B(pub (super::A)); // struct B(pub (crate::A,)); T![crate] | T![self] | T![super] if p.nth(2) != T![:] => { p.bump_any(); + let path_m = p.start(); + let path_segment_m = p.start(); + let name_ref_m = p.start(); p.bump_any(); + name_ref_m.complete(p, NAME_REF); + path_segment_m.complete(p, PATH_SEGMENT); + path_m.complete(p, PATH); p.expect(T![')']); } + // test crate_visibility_in + // pub(in super::A) struct S; + // pub(in crate) struct S; T![in] => { p.bump_any(); p.bump_any(); diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index 2070ce1632..1d894e907b 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs @@ -270,7 +270,9 @@ fn extern_crate(p: &mut Parser, m: Marker) { p.bump(T![crate]); if p.at(T![self]) { + let m = p.start(); p.bump(T![self]); + m.complete(p, NAME_REF); } else { name_ref(p); } diff --git a/crates/parser/src/grammar/params.rs b/crates/parser/src/grammar/params.rs index 2d006a1d59..6a98d73686 100644 --- a/crates/parser/src/grammar/params.rs +++ b/crates/parser/src/grammar/params.rs @@ -156,7 +156,7 @@ fn variadic_param(p: &mut Parser) -> bool { fn opt_self_param(p: &mut Parser, m: Marker) { if p.at(T![self]) || p.at(T![mut]) && p.nth(1) == T![self] { p.eat(T![mut]); - p.eat(T![self]); + self_as_name(p); // test arb_self_types // impl S { // fn a(self: &Self) {} @@ -169,24 +169,29 @@ fn opt_self_param(p: &mut Parser, m: Marker) { let la1 = p.nth(1); let la2 = p.nth(2); let la3 = p.nth(3); - let mut n_toks = match (p.current(), la1, la2, la3) { - (T![&], T![self], _, _) => 2, - (T![&], T![mut], T![self], _) => 3, - (T![&], LIFETIME_IDENT, T![self], _) => 3, - (T![&], LIFETIME_IDENT, T![mut], T![self]) => 4, - _ => return m.abandon(p), - }; - p.bump_any(); + if !matches!((p.current(), la1, la2, la3), + (T![&], T![self], _, _) + | (T![&], T![mut], T![self], _) + | (T![&], LIFETIME_IDENT, T![self], _) + | (T![&], LIFETIME_IDENT, T![mut], T![self]) + ) { + return m.abandon(p); + } + p.bump(T![&]); if p.at(LIFETIME_IDENT) { lifetime(p); - n_toks -= 1; - } - for _ in 1..n_toks { - p.bump_any(); } + p.eat(T![mut]); + self_as_name(p); } m.complete(p, SELF_PARAM); if !p.at(T![')']) { p.expect(T![,]); } } + +fn self_as_name(p: &mut Parser) { + let m = p.start(); + p.bump(T![self]); + m.complete(p, NAME); +} diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index 1d722db3cf..6407d7c851 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -11,6 +11,7 @@ pub struct Name { } impl Name { pub fn ident_token(&self) -> Option { support::token(&self.syntax, T![ident]) } + pub fn self_token(&self) -> Option { support::token(&self.syntax, T![self]) } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct NameRef { @@ -238,7 +239,6 @@ impl ExternCrate { pub fn extern_token(&self) -> Option { support::token(&self.syntax, T![extern]) } pub fn crate_token(&self) -> Option { support::token(&self.syntax, T![crate]) } pub fn name_ref(&self) -> Option { support::child(&self.syntax) } - pub fn self_token(&self) -> Option { support::token(&self.syntax, T![self]) } pub fn rename(&self) -> Option { support::child(&self.syntax) } pub fn semicolon_token(&self) -> Option { support::token(&self.syntax, T![;]) } } @@ -406,9 +406,6 @@ pub struct Visibility { impl Visibility { pub fn pub_token(&self) -> Option { support::token(&self.syntax, T![pub]) } pub fn l_paren_token(&self) -> Option { support::token(&self.syntax, T!['(']) } - pub fn super_token(&self) -> Option { support::token(&self.syntax, T![super]) } - pub fn self_token(&self) -> Option { support::token(&self.syntax, T![self]) } - pub fn crate_token(&self) -> Option { support::token(&self.syntax, T![crate]) } pub fn in_token(&self) -> Option { support::token(&self.syntax, T![in]) } pub fn path(&self) -> Option { support::child(&self.syntax) } pub fn r_paren_token(&self) -> Option { support::token(&self.syntax, T![')']) } @@ -492,11 +489,11 @@ pub struct SelfParam { pub(crate) syntax: SyntaxNode, } impl ast::AttrsOwner for SelfParam {} +impl ast::NameOwner for SelfParam {} impl SelfParam { pub fn amp_token(&self) -> Option { support::token(&self.syntax, T![&]) } pub fn lifetime(&self) -> Option { support::child(&self.syntax) } pub fn mut_token(&self) -> Option { support::token(&self.syntax, T![mut]) } - pub fn self_token(&self) -> Option { support::token(&self.syntax, T![self]) } pub fn colon_token(&self) -> Option { support::token(&self.syntax, T![:]) } pub fn ty(&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 b8ce71d270..738c92a5b5 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -198,6 +198,13 @@ impl ast::Path { pub fn parent_path(&self) -> Option { self.syntax().parent().and_then(ast::Path::cast) } + + pub fn as_single_segment(&self) -> Option { + match self.qualifier() { + Some(_) => None, + None => self.segment(), + } + } } impl ast::UseTreeList { @@ -448,16 +455,22 @@ pub enum VisibilityKind { impl ast::Visibility { pub fn kind(&self) -> VisibilityKind { - if let Some(path) = support::children(self.syntax()).next() { - VisibilityKind::In(path) - } else if self.crate_token().is_some() { - VisibilityKind::PubCrate - } else if self.super_token().is_some() { - VisibilityKind::PubSuper - } else if self.self_token().is_some() { - VisibilityKind::PubSelf - } else { - VisibilityKind::Pub + match self.path() { + Some(path) => { + if let Some(segment) = + path.as_single_segment().filter(|it| it.coloncolon_token().is_none()) + { + if segment.crate_token().is_some() { + return VisibilityKind::PubCrate; + } else if segment.super_token().is_some() { + return VisibilityKind::PubSuper; + } else if segment.self_token().is_some() { + return VisibilityKind::PubSelf; + } + } + VisibilityKind::In(path) + } + None => VisibilityKind::Pub, } } } diff --git a/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast b/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast index faf87d6e5c..ae4dd2f3b2 100644 --- a/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast +++ b/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast @@ -50,7 +50,10 @@ SOURCE_FILE@0..118 VISIBILITY@56..66 PUB_KW@56..59 "pub" L_PAREN@59..60 "(" - CRATE_KW@60..65 "crate" + PATH@60..65 + PATH_SEGMENT@60..65 + NAME_REF@60..65 + CRATE_KW@60..65 "crate" R_PAREN@65..66 ")" WHITESPACE@66..67 " " TYPE_KW@67..71 "type" @@ -69,7 +72,10 @@ SOURCE_FILE@0..118 VISIBILITY@86..96 PUB_KW@86..89 "pub" L_PAREN@89..90 "(" - CRATE_KW@90..95 "crate" + PATH@90..95 + PATH_SEGMENT@90..95 + NAME_REF@90..95 + CRATE_KW@90..95 "crate" R_PAREN@95..96 ")" WHITESPACE@96..97 " " CONST_KW@97..102 "const" diff --git a/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast b/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast index 8048f5fadd..f0d152d335 100644 --- a/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast +++ b/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast @@ -19,7 +19,8 @@ SOURCE_FILE@0..128 PARAM_LIST@17..23 L_PAREN@17..18 "(" SELF_PARAM@18..22 - SELF_KW@18..22 "self" + NAME@18..22 + SELF_KW@18..22 "self" R_PAREN@22..23 ")" WHITESPACE@23..24 " " BLOCK_EXPR@24..26 @@ -35,7 +36,8 @@ SOURCE_FILE@0..128 L_PAREN@35..36 "(" SELF_PARAM@36..41 AMP@36..37 "&" - SELF_KW@37..41 "self" + NAME@37..41 + SELF_KW@37..41 "self" COMMA@41..42 "," R_PAREN@42..43 ")" WHITESPACE@43..44 " " @@ -55,7 +57,8 @@ SOURCE_FILE@0..128 LIFETIME@57..59 LIFETIME_IDENT@57..59 "\'a" WHITESPACE@59..60 " " - SELF_KW@60..64 "self" + NAME@60..64 + SELF_KW@60..64 "self" COMMA@64..65 "," R_PAREN@65..66 ")" WHITESPACE@66..67 " " @@ -77,7 +80,8 @@ SOURCE_FILE@0..128 WHITESPACE@82..83 " " MUT_KW@83..86 "mut" WHITESPACE@86..87 " " - SELF_KW@87..91 "self" + NAME@87..91 + SELF_KW@87..91 "self" COMMA@91..92 "," WHITESPACE@92..93 " " PARAM@93..99 @@ -107,7 +111,8 @@ SOURCE_FILE@0..128 SELF_PARAM@113..121 MUT_KW@113..116 "mut" WHITESPACE@116..117 " " - SELF_KW@117..121 "self" + NAME@117..121 + SELF_KW@117..121 "self" R_PAREN@121..122 ")" WHITESPACE@122..123 " " BLOCK_EXPR@123..125 diff --git a/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast b/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast index ddbd665888..df59f37a25 100644 --- a/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast +++ b/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast @@ -19,7 +19,8 @@ SOURCE_FILE@0..69 PARAM_LIST@17..30 L_PAREN@17..18 "(" SELF_PARAM@18..29 - SELF_KW@18..22 "self" + NAME@18..22 + SELF_KW@18..22 "self" COLON@22..23 ":" WHITESPACE@23..24 " " REF_TYPE@24..29 @@ -45,7 +46,8 @@ SOURCE_FILE@0..69 SELF_PARAM@43..62 MUT_KW@43..46 "mut" WHITESPACE@46..47 " " - SELF_KW@47..51 "self" + NAME@47..51 + SELF_KW@47..51 "self" COLON@51..52 ":" WHITESPACE@52..53 " " PATH_TYPE@53..62 diff --git a/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rast b/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rast index ca0702aba5..dc7f6295b2 100644 --- a/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rast +++ b/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rast @@ -67,7 +67,8 @@ SOURCE_FILE@0..89 L_PAREN@76..77 "(" SELF_PARAM@77..82 AMP@77..78 "&" - SELF_KW@78..82 "self" + NAME@78..82 + SELF_KW@78..82 "self" R_PAREN@82..83 ")" WHITESPACE@83..84 " " BLOCK_EXPR@84..86 diff --git a/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rast b/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rast index 50742cbcf1..f2ead8a624 100644 --- a/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rast +++ b/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rast @@ -1,9 +1,12 @@ -SOURCE_FILE@0..81 +SOURCE_FILE@0..62 STRUCT@0..20 VISIBILITY@0..10 PUB_KW@0..3 "pub" L_PAREN@3..4 "(" - CRATE_KW@4..9 "crate" + PATH@4..9 + PATH_SEGMENT@4..9 + NAME_REF@4..9 + CRATE_KW@4..9 "crate" R_PAREN@9..10 ")" WHITESPACE@10..11 " " STRUCT_KW@11..17 "struct" @@ -16,7 +19,10 @@ SOURCE_FILE@0..81 VISIBILITY@21..30 PUB_KW@21..24 "pub" L_PAREN@24..25 "(" - SELF_KW@25..29 "self" + PATH@25..29 + PATH_SEGMENT@25..29 + NAME_REF@25..29 + SELF_KW@25..29 "self" R_PAREN@29..30 ")" WHITESPACE@30..31 " " STRUCT_KW@31..37 "struct" @@ -25,29 +31,19 @@ SOURCE_FILE@0..81 IDENT@38..39 "S" SEMICOLON@39..40 ";" WHITESPACE@40..41 "\n" - STRUCT@41..60 - VISIBILITY@41..50 + STRUCT@41..61 + VISIBILITY@41..51 PUB_KW@41..44 "pub" L_PAREN@44..45 "(" - SELF_KW@45..49 "self" - R_PAREN@49..50 ")" - WHITESPACE@50..51 " " - STRUCT_KW@51..57 "struct" - WHITESPACE@57..58 " " - NAME@58..59 - IDENT@58..59 "S" - SEMICOLON@59..60 ";" - WHITESPACE@60..61 "\n" - STRUCT@61..80 - VISIBILITY@61..70 - PUB_KW@61..64 "pub" - L_PAREN@64..65 "(" - SELF_KW@65..69 "self" - R_PAREN@69..70 ")" - WHITESPACE@70..71 " " - STRUCT_KW@71..77 "struct" - WHITESPACE@77..78 " " - NAME@78..79 - IDENT@78..79 "S" - SEMICOLON@79..80 ";" - WHITESPACE@80..81 "\n" + PATH@45..50 + PATH_SEGMENT@45..50 + NAME_REF@45..50 + SUPER_KW@45..50 "super" + R_PAREN@50..51 ")" + WHITESPACE@51..52 " " + STRUCT_KW@52..58 "struct" + WHITESPACE@58..59 " " + NAME@59..60 + IDENT@59..60 "S" + SEMICOLON@60..61 ";" + WHITESPACE@61..62 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rs b/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rs index faeefde94e..a790a485f9 100644 --- a/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rs +++ b/crates/syntax/test_data/parser/inline/ok/0022_crate_visibility.rs @@ -1,4 +1,3 @@ pub(crate) struct S; pub(self) struct S; -pub(self) struct S; -pub(self) struct S; +pub(super) struct S; diff --git a/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast b/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast index d3219f0b24..c54e64e3f9 100644 --- a/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast +++ b/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast @@ -16,7 +16,8 @@ SOURCE_FILE@0..26 IDENT@7..15 "must_use" R_BRACK@15..16 "]" WHITESPACE@16..17 " " - SELF_KW@17..21 "self" + NAME@17..21 + SELF_KW@17..21 "self" R_PAREN@21..22 ")" WHITESPACE@22..23 " " BLOCK_EXPR@23..25 diff --git a/crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rast b/crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rast new file mode 100644 index 0000000000..3d855fc6b1 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rast @@ -0,0 +1,42 @@ +SOURCE_FILE@0..51 + STRUCT@0..26 + VISIBILITY@0..16 + PUB_KW@0..3 "pub" + L_PAREN@3..4 "(" + IN_KW@4..6 "in" + WHITESPACE@6..7 " " + PATH@7..15 + PATH@7..12 + PATH_SEGMENT@7..12 + NAME_REF@7..12 + SUPER_KW@7..12 "super" + COLON2@12..14 "::" + PATH_SEGMENT@14..15 + NAME_REF@14..15 + IDENT@14..15 "A" + R_PAREN@15..16 ")" + WHITESPACE@16..17 " " + STRUCT_KW@17..23 "struct" + WHITESPACE@23..24 " " + NAME@24..25 + IDENT@24..25 "S" + SEMICOLON@25..26 ";" + WHITESPACE@26..27 "\n" + STRUCT@27..50 + VISIBILITY@27..40 + PUB_KW@27..30 "pub" + L_PAREN@30..31 "(" + IN_KW@31..33 "in" + WHITESPACE@33..34 " " + PATH@34..39 + PATH_SEGMENT@34..39 + NAME_REF@34..39 + CRATE_KW@34..39 "crate" + R_PAREN@39..40 ")" + WHITESPACE@40..41 " " + STRUCT_KW@41..47 "struct" + WHITESPACE@47..48 " " + NAME@48..49 + IDENT@48..49 "S" + SEMICOLON@49..50 ";" + WHITESPACE@50..51 "\n" diff --git a/crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rs b/crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rs new file mode 100644 index 0000000000..2856dbd848 --- /dev/null +++ b/crates/syntax/test_data/parser/inline/ok/0160_crate_visibility_in.rs @@ -0,0 +1,2 @@ +pub(in super::A) struct S; +pub(in crate) struct S; diff --git a/crates/syntax/test_data/parser/ok/0007_extern_crate.rast b/crates/syntax/test_data/parser/ok/0007_extern_crate.rast index 594c2f8f20..4babdba927 100644 --- a/crates/syntax/test_data/parser/ok/0007_extern_crate.rast +++ b/crates/syntax/test_data/parser/ok/0007_extern_crate.rast @@ -28,7 +28,8 @@ SOURCE_FILE@0..69 WHITESPACE@49..50 " " CRATE_KW@50..55 "crate" WHITESPACE@55..56 " " - SELF_KW@56..60 "self" + NAME_REF@56..60 + SELF_KW@56..60 "self" WHITESPACE@60..61 " " RENAME@61..67 AS_KW@61..63 "as" diff --git a/crates/syntax/test_data/parser/ok/0012_visibility.rast b/crates/syntax/test_data/parser/ok/0012_visibility.rast index 83a93b5a9e..c5dbfb702a 100644 --- a/crates/syntax/test_data/parser/ok/0012_visibility.rast +++ b/crates/syntax/test_data/parser/ok/0012_visibility.rast @@ -32,7 +32,10 @@ SOURCE_FILE@0..98 VISIBILITY@24..34 PUB_KW@24..27 "pub" L_PAREN@27..28 "(" - CRATE_KW@28..33 "crate" + PATH@28..33 + PATH_SEGMENT@28..33 + NAME_REF@28..33 + CRATE_KW@28..33 "crate" R_PAREN@33..34 ")" WHITESPACE@34..35 " " FN_KW@35..37 "fn" @@ -51,7 +54,10 @@ SOURCE_FILE@0..98 VISIBILITY@45..55 PUB_KW@45..48 "pub" L_PAREN@48..49 "(" - SUPER_KW@49..54 "super" + PATH@49..54 + PATH_SEGMENT@49..54 + NAME_REF@49..54 + SUPER_KW@49..54 "super" R_PAREN@54..55 ")" WHITESPACE@55..56 " " FN_KW@56..58 "fn" diff --git a/crates/syntax/test_data/parser/ok/0045_block_inner_attrs.rast b/crates/syntax/test_data/parser/ok/0045_block_inner_attrs.rast index 0ac56df6d0..6afed5f05e 100644 --- a/crates/syntax/test_data/parser/ok/0045_block_inner_attrs.rast +++ b/crates/syntax/test_data/parser/ok/0045_block_inner_attrs.rast @@ -110,7 +110,8 @@ SOURCE_FILE@0..686 L_PAREN@558..559 "(" SELF_PARAM@559..564 AMP@559..560 "&" - SELF_KW@560..564 "self" + NAME@560..564 + SELF_KW@560..564 "self" COMMA@564..565 "," WHITESPACE@565..566 " " PARAM@566..600 diff --git a/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast b/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast index 3fed118382..e10521d853 100644 --- a/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast +++ b/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast @@ -281,7 +281,8 @@ SOURCE_FILE@0..519 IDENT@259..267 "must_use" R_BRACK@267..268 "]" WHITESPACE@268..269 " " - SELF_KW@269..273 "self" + NAME@269..273 + SELF_KW@269..273 "self" R_PAREN@273..274 ")" WHITESPACE@274..275 " " BLOCK_EXPR@275..277 @@ -305,7 +306,8 @@ SOURCE_FILE@0..519 IDENT@291..295 "attr" R_BRACK@295..296 "]" WHITESPACE@296..297 " " - SELF_KW@297..301 "self" + NAME@297..301 + SELF_KW@297..301 "self" R_PAREN@301..302 ")" WHITESPACE@302..303 " " BLOCK_EXPR@303..305 @@ -330,7 +332,8 @@ SOURCE_FILE@0..519 R_BRACK@323..324 "]" WHITESPACE@324..325 " " AMP@325..326 "&" - SELF_KW@326..330 "self" + NAME@326..330 + SELF_KW@326..330 "self" R_PAREN@330..331 ")" WHITESPACE@331..332 " " BLOCK_EXPR@332..334 @@ -363,7 +366,8 @@ SOURCE_FILE@0..519 AMP@358..359 "&" MUT_KW@359..362 "mut" WHITESPACE@362..363 " " - SELF_KW@363..367 "self" + NAME@363..367 + SELF_KW@363..367 "self" R_PAREN@367..368 ")" WHITESPACE@368..369 " " BLOCK_EXPR@369..371 @@ -397,7 +401,8 @@ SOURCE_FILE@0..519 LIFETIME@396..398 LIFETIME_IDENT@396..398 "\'a" WHITESPACE@398..399 " " - SELF_KW@399..403 "self" + NAME@399..403 + SELF_KW@399..403 "self" R_PAREN@403..404 ")" WHITESPACE@404..405 " " BLOCK_EXPR@405..407 @@ -433,7 +438,8 @@ SOURCE_FILE@0..519 WHITESPACE@434..435 " " MUT_KW@435..438 "mut" WHITESPACE@438..439 " " - SELF_KW@439..443 "self" + NAME@439..443 + SELF_KW@439..443 "self" R_PAREN@443..444 ")" WHITESPACE@444..445 " " BLOCK_EXPR@445..447 @@ -457,7 +463,8 @@ SOURCE_FILE@0..519 IDENT@460..464 "attr" R_BRACK@464..465 "]" WHITESPACE@465..466 " " - SELF_KW@466..470 "self" + NAME@466..470 + SELF_KW@466..470 "self" COLON@470..471 ":" WHITESPACE@471..472 " " PATH_TYPE@472..476 @@ -488,7 +495,8 @@ SOURCE_FILE@0..519 IDENT@493..497 "attr" R_BRACK@497..498 "]" WHITESPACE@498..499 " " - SELF_KW@499..503 "self" + NAME@499..503 + SELF_KW@499..503 "self" COLON@503..504 ":" WHITESPACE@504..505 " " PATH_TYPE@505..513 diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml index 1bb9222d71..4abc7b0539 100644 --- a/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -15,7 +15,7 @@ flate2 = "1.0" pico-args = "0.3.1" proc-macro2 = "1.0.8" quote = "1.0.2" -ungrammar = "1.8" +ungrammar = "1.9" walkdir = "2.3.1" write-json = "0.1.0" xshell = "0.1"