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.rs31
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 {