ezno_parser/types/
type_alias.rs

1use source_map::Span;
2
3use crate::{
4	derive_ASTNode, to_string_bracketed, ASTNode, ExpressionOrStatementPosition, StatementPosition,
5	TSXToken, TypeAnnotation, TypeParameter,
6};
7
8/// e.g. `type NumberArray = Array<number>`
9#[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}