aboutsummaryrefslogtreecommitdiff
path: root/crates/syntax/src/ast/node_ext.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/syntax/src/ast/node_ext.rs')
-rw-r--r--crates/syntax/src/ast/node_ext.rs37
1 files changed, 16 insertions, 21 deletions
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 }