Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/ast/expr_ext.rs')
| -rw-r--r-- | crates/syntax/src/ast/expr_ext.rs | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/crates/syntax/src/ast/expr_ext.rs b/crates/syntax/src/ast/expr_ext.rs index 23b1145a77..f4bff80c4c 100644 --- a/crates/syntax/src/ast/expr_ext.rs +++ b/crates/syntax/src/ast/expr_ext.rs @@ -282,7 +282,7 @@ pub enum LiteralKind { String(ast::String), ByteString(ast::ByteString), IntNumber(ast::IntNumber), - FloatNumber(ast::FloatNumber), + FloatNumber(ast::FloatLiteral), Char(ast::Char), Byte(ast::Byte), Bool(bool), @@ -297,16 +297,17 @@ impl ast::Literal { } pub fn kind(&self) -> LiteralKind { let token = match self.value() { - rowan::NodeOrToken::Node(_node) => unreachable!(), + rowan::NodeOrToken::Node(node) => { + return LiteralKind::FloatNumber( + ast::FloatLiteral::cast(node).expect("unreachable"), + ); + } rowan::NodeOrToken::Token(token) => token, }; if let Some(t) = ast::IntNumber::cast(token.clone()) { return LiteralKind::IntNumber(t); } - if let Some(t) = ast::FloatNumber::cast(token.clone()) { - return LiteralKind::FloatNumber(t); - } if let Some(t) = ast::String::cast(token.clone()) { return LiteralKind::String(t); } @@ -326,6 +327,26 @@ impl ast::Literal { _ => unreachable!(), } } + + pub fn as_string(&self) -> Option<ast::String> { + match self.kind() { + LiteralKind::String(it) => Some(it), + _ => None, + } + } + + pub fn as_byte_string(&self) -> Option<ast::ByteString> { + match self.kind() { + LiteralKind::ByteString(it) => Some(it), + _ => None, + } + } +} + +impl ast::FloatLiteral { + pub fn suffix(&self) -> Option<String> { + ast::FloatNumber::cast(self.syntax().last_token()?)?.suffix().map(|s| s.to_string()) + } } pub enum BlockModifier { |