aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/hir_expand/src/name.rs13
-rw-r--r--crates/syntax/src/ast.rs4
-rw-r--r--crates/syntax/src/ast/node_ext.rs37
3 files changed, 28 insertions, 26 deletions
diff --git a/crates/hir_expand/src/name.rs b/crates/hir_expand/src/name.rs
index c7609e90d..74cf64aab 100644
--- a/crates/hir_expand/src/name.rs
+++ b/crates/hir_expand/src/name.rs
@@ -87,11 +87,18 @@ impl AsName for ast::Name {
87 } 87 }
88} 88}
89 89
90impl AsName for ast::NameOrNameRef { 90impl AsName for ast::Lifetime {
91 fn as_name(&self) -> Name {
92 Name::resolve(self.text())
93 }
94}
95
96impl AsName for ast::NameLike {
91 fn as_name(&self) -> Name { 97 fn as_name(&self) -> Name {
92 match self { 98 match self {
93 ast::NameOrNameRef::Name(it) => it.as_name(), 99 ast::NameLike::Name(it) => it.as_name(),
94 ast::NameOrNameRef::NameRef(it) => it.as_name(), 100 ast::NameLike::NameRef(it) => it.as_name(),
101 ast::NameLike::Lifetime(it) => it.as_name(),
95 } 102 }
96 } 103 }
97} 104}
diff --git a/crates/syntax/src/ast.rs b/crates/syntax/src/ast.rs
index b3a24d39d..72214a4f0 100644
--- a/crates/syntax/src/ast.rs
+++ b/crates/syntax/src/ast.rs
@@ -19,8 +19,8 @@ pub use self::{
19 expr_ext::{ArrayExprKind, BinOp, Effect, ElseBranch, LiteralKind, PrefixOp, RangeOp}, 19 expr_ext::{ArrayExprKind, BinOp, Effect, ElseBranch, LiteralKind, PrefixOp, RangeOp},
20 generated::{nodes::*, tokens::*}, 20 generated::{nodes::*, tokens::*},
21 node_ext::{ 21 node_ext::{
22 AttrKind, FieldKind, Macro, NameLike, NameOrNameRef, PathSegmentKind, SelfParamKind, 22 AttrKind, FieldKind, Macro, NameLike, PathSegmentKind, SelfParamKind, SlicePatComponents,
23 SlicePatComponents, StructKind, TypeBoundKind, VisibilityKind, 23 StructKind, TypeBoundKind, VisibilityKind,
24 }, 24 },
25 token_ext::*, 25 token_ext::*,
26 traits::*, 26 traits::*,
diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs
index 2fa7b8c1e..c1f8101b2 100644
--- a/crates/syntax/src/ast/node_ext.rs
+++ b/crates/syntax/src/ast/node_ext.rs
@@ -297,7 +297,7 @@ impl ast::RecordExprField {
297 } 297 }
298} 298}
299 299
300#[derive(Debug, Clone)] 300#[derive(Debug, Clone, PartialEq)]
301pub enum NameLike { 301pub enum NameLike {
302 NameRef(ast::NameRef), 302 NameRef(ast::NameRef),
303 Name(ast::Name), 303 Name(ast::Name),
@@ -335,6 +335,16 @@ impl ast::AstNode for NameLike {
335 } 335 }
336} 336}
337 337
338impl fmt::Display for NameLike {
339 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
340 match self {
341 NameLike::Name(it) => fmt::Display::fmt(it, f),
342 NameLike::NameRef(it) => fmt::Display::fmt(it, f),
343 NameLike::Lifetime(it) => fmt::Display::fmt(it, f),
344 }
345 }
346}
347
338mod __ { 348mod __ {
339 use super::{ 349 use super::{
340 ast::{Lifetime, Name, NameRef}, 350 ast::{Lifetime, Name, NameRef},
@@ -343,26 +353,11 @@ mod __ {
343 stdx::impl_from!(NameRef, Name, Lifetime for NameLike); 353 stdx::impl_from!(NameRef, Name, Lifetime for NameLike);
344} 354}
345 355
346#[derive(Debug, Clone, PartialEq)]
347pub enum NameOrNameRef {
348 Name(ast::Name),
349 NameRef(ast::NameRef),
350}
351
352impl fmt::Display for NameOrNameRef {
353 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
354 match self {
355 NameOrNameRef::Name(it) => fmt::Display::fmt(it, f),
356 NameOrNameRef::NameRef(it) => fmt::Display::fmt(it, f),
357 }
358 }
359}
360
361impl ast::RecordPatField { 356impl ast::RecordPatField {
362 pub fn for_field_name_ref(field_name: &ast::NameRef) -> Option<ast::RecordPatField> { 357 pub fn for_field_name_ref(field_name: &ast::NameRef) -> Option<ast::RecordPatField> {
363 let candidate = field_name.syntax().parent().and_then(ast::RecordPatField::cast)?; 358 let candidate = field_name.syntax().parent().and_then(ast::RecordPatField::cast)?;
364 match candidate.field_name()? { 359 match candidate.field_name()? {
365 NameOrNameRef::NameRef(name_ref) if name_ref == *field_name => Some(candidate), 360 NameLike::NameRef(name_ref) if name_ref == *field_name => Some(candidate),
366 _ => None, 361 _ => None,
367 } 362 }
368 } 363 }
@@ -371,19 +366,19 @@ impl ast::RecordPatField {
371 let candidate = 366 let candidate =
372 field_name.syntax().ancestors().nth(2).and_then(ast::RecordPatField::cast)?; 367 field_name.syntax().ancestors().nth(2).and_then(ast::RecordPatField::cast)?;
373 match candidate.field_name()? { 368 match candidate.field_name()? {
374 NameOrNameRef::Name(name) if name == *field_name => Some(candidate), 369 NameLike::Name(name) if name == *field_name => Some(candidate),
375 _ => None, 370 _ => None,
376 } 371 }
377 } 372 }
378 373
379 /// Deals with field init shorthand 374 /// Deals with field init shorthand
380 pub fn field_name(&self) -> Option<NameOrNameRef> { 375 pub fn field_name(&self) -> Option<NameLike> {
381 if let Some(name_ref) = self.name_ref() { 376 if let Some(name_ref) = self.name_ref() {
382 return Some(NameOrNameRef::NameRef(name_ref)); 377 return Some(NameLike::NameRef(name_ref));
383 } 378 }
384 if let Some(ast::Pat::IdentPat(pat)) = self.pat() { 379 if let Some(ast::Pat::IdentPat(pat)) = self.pat() {
385 let name = pat.name()?; 380 let name = pat.name()?;
386 return Some(NameOrNameRef::Name(name)); 381 return Some(NameLike::Name(name));
387 } 382 }
388 None 383 None
389 } 384 }