ezno_parser/types/
type_alias.rs1use source_map::Span;
2
3use crate::{
4 derive_ASTNode, to_string_bracketed, ASTNode, ExpressionOrStatementPosition, StatementPosition,
5 TSXToken, TypeAnnotation, TypeParameter,
6};
7
8#[apply(derive_ASTNode)]
10#[derive(Debug, Clone, PartialEq, get_field_by_type::GetFieldByType)]
11#[get_field_by_type_target(Span)]
12pub struct TypeAlias {
13 pub name: StatementPosition,
14 pub parameters: Option<Vec<TypeParameter>>,
15 pub references: TypeAnnotation,
16 pub position: Span,
17}
18
19impl ASTNode for TypeAlias {
20 fn from_reader(
21 reader: &mut impl tokenizer_lib::TokenReader<TSXToken, crate::TokenStart>,
22 state: &mut crate::ParsingState,
23 options: &crate::ParseOptions,
24 ) -> crate::ParseResult<Self> {
25 let start = state.expect_keyword(reader, crate::TSXKeyword::Type)?;
26 let name = StatementPosition::from_reader(reader, state, options)?;
27 let parameters = reader
28 .conditional_next(|token| *token == TSXToken::OpenChevron)
29 .is_some()
30 .then(|| {
31 crate::parse_bracketed(reader, state, options, None, TSXToken::CloseChevron)
32 .map(|(params, _, _)| params)
33 })
34 .transpose()?;
35
36 reader.expect_next(TSXToken::Assign)?;
37 let references = TypeAnnotation::from_reader(reader, state, options)?;
38 let position = start.union(references.get_position());
39
40 Ok(Self { name, parameters, references, position })
41 }
42
43 fn to_string_from_buffer<T: source_map::ToString>(
44 &self,
45 buf: &mut T,
46 options: &crate::ToStringOptions,
47 local: crate::LocalToStringInformation,
48 ) {
49 if options.include_type_annotations {
50 if self.name.is_declare() {
51 buf.push_str("declare ");
52 }
53 buf.push_str("type ");
54 self.name.identifier.to_string_from_buffer(buf, options, local);
55 if let Some(type_parameters) = &self.parameters {
56 to_string_bracketed(type_parameters, ('<', '>'), buf, options, local);
57 }
58 buf.push_str(" = ");
59 self.references.to_string_from_buffer(buf, options, local);
60 }
61 }
62
63 fn get_position(&self) -> Span {
64 self.position
65 }
66}