rslint_parser/ast/
ts_ext.rs

1//! Extensions to TypeScript AST elements
2
3use 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    /// present for alias
48    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}