From 3b4c02c19e4af645fd37e8bff774b05d546dc0b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20Ochagav=C3=ADa?= Date: Thu, 8 Nov 2018 15:42:00 +0100 Subject: Validate string literals --- crates/ra_syntax/src/ast/generated.rs | 37 +++++++++++++++++++++++++++++++++++ crates/ra_syntax/src/ast/mod.rs | 9 ++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) (limited to 'crates/ra_syntax/src/ast') diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 5b5f71ee7..2e9ae263a 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs @@ -3236,6 +3236,43 @@ impl<'a> AstNode<'a> for Stmt<'a> { impl<'a> Stmt<'a> {} +// String +#[derive(Debug, Clone, Copy,)] +pub struct StringNode = OwnedRoot> { + pub(crate) syntax: SyntaxNode, +} +pub type String<'a> = StringNode>; + +impl, R2: TreeRoot> PartialEq> for StringNode { + fn eq(&self, other: &StringNode) -> bool { self.syntax == other.syntax } +} +impl> Eq for StringNode {} +impl> Hash for StringNode { + fn hash(&self, state: &mut H) { self.syntax.hash(state) } +} + +impl<'a> AstNode<'a> for String<'a> { + fn cast(syntax: SyntaxNodeRef<'a>) -> Option { + match syntax.kind() { + STRING => Some(String { syntax }), + _ => None, + } + } + fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } +} + +impl> StringNode { + pub fn borrowed(&self) -> String { + StringNode { syntax: self.syntax.borrowed() } + } + pub fn owned(&self) -> StringNode { + StringNode { syntax: self.syntax.owned() } + } +} + + +impl<'a> String<'a> {} + // StructDef #[derive(Debug, Clone, Copy,)] pub struct StructDefNode = OwnedRoot> { diff --git a/crates/ra_syntax/src/ast/mod.rs b/crates/ra_syntax/src/ast/mod.rs index 6b0d62610..f20714ede 100644 --- a/crates/ra_syntax/src/ast/mod.rs +++ b/crates/ra_syntax/src/ast/mod.rs @@ -1,6 +1,7 @@ mod generated; use std::marker::PhantomData; +use std::string::String as RustString; use itertools::Itertools; @@ -76,7 +77,7 @@ pub trait DocCommentsOwner<'a>: AstNode<'a> { /// Returns the textual content of a doc comment block as a single string. /// That is, strips leading `///` and joins lines - fn doc_comment_text(self) -> String { + fn doc_comment_text(self) -> RustString { self.doc_comments() .map(|comment| { let prefix = comment.prefix(); @@ -133,6 +134,12 @@ impl<'a> Char<'a> { } } +impl<'a> String<'a> { + pub fn text(&self) -> &SmolStr { + &self.syntax().leaf_text().unwrap() + } +} + impl<'a> Comment<'a> { pub fn text(&self) -> &SmolStr { self.syntax().leaf_text().unwrap() -- cgit v1.2.3