rslint_parser/ast/
ts_ext.rs1use crate::{
4 ast::*,
5 syntax_node::SyntaxNode,
6 SyntaxKind::{self, *},
7};
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10pub enum TsTypeQueryExpr {
11 TsEntityName(TsEntityName),
12 TsImport(TsImport),
13}
14
15impl AstNode for TsTypeQueryExpr {
16 fn can_cast(kind: SyntaxKind) -> bool {
17 TsEntityName::can_cast(kind) || TsImport::can_cast(kind)
18 }
19
20 fn cast(syntax: SyntaxNode) -> Option<Self> {
21 match syntax.kind() {
22 n if TsEntityName::can_cast(n) => Some(TsTypeQueryExpr::TsEntityName(
23 TsEntityName::cast(syntax).unwrap(),
24 )),
25 _ => Some(TsTypeQueryExpr::TsImport(TsImport::cast(syntax)?)),
26 }
27 }
28
29 fn syntax(&self) -> &SyntaxNode {
30 match self {
31 TsTypeQueryExpr::TsEntityName(it) => it.syntax(),
32 TsTypeQueryExpr::TsImport(it) => it.syntax(),
33 }
34 }
35}
36
37impl TsImport {
38 pub fn arg(&self) -> Option<SyntaxToken> {
39 self.syntax()
40 .tokens()
41 .into_iter()
42 .find(|t| t.kind() == STRING)
43 }
44}
45
46impl TsMappedTypeParam {
47 pub fn as_token(&self) -> Option<SyntaxToken> {
49 self.syntax()
50 .children_with_tokens()
51 .filter_map(|x| x.into_token())
52 .find(|x| x.kind() == IDENT && x.text() == "as")
53 }
54
55 pub fn alias(&self) -> Option<TsType> {
56 self.syntax()
57 .children()
58 .filter_map(|x| x.try_to::<TsType>())
59 .nth(1)
60 }
61}
62
63impl TsExternalModuleRef {
64 pub fn string_token(&self) -> Option<SyntaxToken> {
65 support::token(self.syntax(), STRING)
66 }
67}
68
69#[derive(Debug, Clone, PartialEq)]
70pub enum TsModuleRef {
71 TsExternalModuleRef(TsExternalModuleRef),
72 TsEntityName(TsEntityName),
73}
74
75impl AstNode for TsModuleRef {
76 fn can_cast(kind: SyntaxKind) -> bool {
77 kind == TS_EXTERNAL_MODULE_REF || TsEntityName::can_cast(kind)
78 }
79
80 fn cast(syntax: SyntaxNode) -> Option<Self> {
81 if Self::can_cast(syntax.kind()) {
82 None
83 } else {
84 Some(match syntax.kind() {
85 TS_EXTERNAL_MODULE_REF => TsModuleRef::TsExternalModuleRef(syntax.to()),
86 _ => TsModuleRef::TsEntityName(syntax.to()),
87 })
88 }
89 }
90
91 fn syntax(&self) -> &SyntaxNode {
92 match self {
93 TsModuleRef::TsExternalModuleRef(it) => it.syntax(),
94 TsModuleRef::TsEntityName(it) => it.syntax(),
95 }
96 }
97}