oxc_syntax_operations/
prop_name.rs

1use oxc_ast::ast::{
2    ClassElement, MethodDefinition, ObjectProperty, ObjectPropertyKind, PropertyDefinition,
3    PropertyKey, PropertyKind,
4};
5use oxc_span::Span;
6
7/// [`PropName`](https://tc39.es/ecma262/#sec-static-semantics-propname)
8pub trait PropName {
9    fn prop_name(&self) -> Option<(&str, Span)>;
10}
11
12impl<'a> PropName for ObjectPropertyKind<'a> {
13    fn prop_name(&self) -> Option<(&str, Span)> {
14        match self {
15            ObjectPropertyKind::ObjectProperty(prop) => prop.prop_name(),
16            ObjectPropertyKind::SpreadProperty(_) => None,
17        }
18    }
19}
20
21impl<'a> PropName for ObjectProperty<'a> {
22    fn prop_name(&self) -> Option<(&str, Span)> {
23        if self.kind != PropertyKind::Init || self.method || self.shorthand || self.computed {
24            return None;
25        }
26        self.key.prop_name()
27    }
28}
29
30impl<'a> PropName for PropertyKey<'a> {
31    fn prop_name(&self) -> Option<(&str, Span)> {
32        match self {
33            PropertyKey::StaticIdentifier(ident) => Some((&ident.name, ident.span)),
34            PropertyKey::Identifier(ident) => Some((&ident.name, ident.span)),
35            PropertyKey::StringLiteral(lit) => Some((&lit.value, lit.span)),
36            _ => None,
37        }
38    }
39}
40
41impl<'a> PropName for ClassElement<'a> {
42    fn prop_name(&self) -> Option<(&str, Span)> {
43        match self {
44            ClassElement::MethodDefinition(def) => def.prop_name(),
45            ClassElement::PropertyDefinition(def) => def.prop_name(),
46            _ => None,
47        }
48    }
49}
50
51impl<'a> PropName for MethodDefinition<'a> {
52    fn prop_name(&self) -> Option<(&str, Span)> {
53        if self.computed {
54            return None;
55        }
56        self.key.prop_name()
57    }
58}
59
60impl<'a> PropName for PropertyDefinition<'a> {
61    fn prop_name(&self) -> Option<(&str, Span)> {
62        if self.computed {
63            return None;
64        }
65        self.key.prop_name()
66    }
67}