about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVictor Song <vsong1618@gmail.com>2024-01-30 01:13:17 -0600
committerVictor Song <vsong1618@gmail.com>2024-02-13 00:00:02 -0600
commit6cd458f3d08030cddcd488ef28c2a8b581bd7928 (patch)
treeddc19b28bd4cfae328a2646cbc118b7d4b41b4b3
parente8c9ca2a2fdd20f9ea314671dd2cb329c82b910e (diff)
downloadrust-6cd458f3d08030cddcd488ef28c2a8b581bd7928.tar.gz
rust-6cd458f3d08030cddcd488ef28c2a8b581bd7928.zip
Move `raw_delimiter_count` to `syntax` crate
-rw-r--r--crates/proc-macro-srv/src/server.rs13
-rw-r--r--crates/syntax/src/ast/token_ext.rs10
2 files changed, 13 insertions, 10 deletions
diff --git a/crates/proc-macro-srv/src/server.rs b/crates/proc-macro-srv/src/server.rs
index 9339d226a2c..9961c5910a3 100644
--- a/crates/proc-macro-srv/src/server.rs
+++ b/crates/proc-macro-srv/src/server.rs
@@ -59,21 +59,21 @@ fn literal_to_external(literal: ast::LiteralKind) -> Option<proc_macro::bridge::
     Some(match lit.kind() {
         ast::LiteralKind::String(data) => {
             if data.is_raw() {
-                bridge::LitKind::StrRaw(raw_delimiter_count(data)?)
+                bridge::LitKind::StrRaw(data.raw_delimiter_count()?)
             } else {
                 bridge::LitKind::Str
             }
         }
         ast::LiteralKind::ByteString(data) => {
             if data.is_raw() {
-                bridge::LitKind::ByteStrRaw(raw_delimiter_count(data)?)
+                bridge::LitKind::ByteStrRaw(data.raw_delimiter_count()?)
             } else {
                 bridge::LitKind::ByteStr
             }
         }
         ast::LiteralKind::CString(data) => {
             if data.is_raw() {
-                bridge::LitKind::CStrRaw(raw_delimiter_count(data)?)
+                bridge::LitKind::CStrRaw(data.raw_delimiter_count()?)
             } else {
                 bridge::LitKind::CStr
             }
@@ -86,13 +86,6 @@ fn literal_to_external(literal: ast::LiteralKind) -> Option<proc_macro::bridge::
     })
 }
 
-fn raw_delimiter_count<S: IsString>(s: S) -> Option<u8> {
-    let text = s.text();
-    let quote_range = s.text_range_between_quotes()?;
-    let range_start = s.syntax().text_range().start();
-    text[TextRange::up_to((quote_range - range_start).start())].matches('#').count().try_into().ok()
-}
-
 fn str_to_lit_node(input: &str) -> Option<ast::Literal> {
     let input = input.trim();
     let source_code = format!("fn f() {{ let _ = {input}; }}");
diff --git a/crates/syntax/src/ast/token_ext.rs b/crates/syntax/src/ast/token_ext.rs
index 7cd1f1550b9..c93391a9792 100644
--- a/crates/syntax/src/ast/token_ext.rs
+++ b/crates/syntax/src/ast/token_ext.rs
@@ -204,6 +204,16 @@ pub trait IsString: AstToken {
         assert!(TextRange::up_to(contents_range.len()).contains_range(range));
         Some(range + contents_range.start())
     }
+    fn raw_delimiter_count(&self) -> Option<u8> {
+        let text = self.text();
+        let quote_range = self.text_range_between_quotes()?;
+        let range_start = self.syntax().text_range().start();
+        text[TextRange::up_to((quote_range - range_start).start())]
+            .matches('#')
+            .count()
+            .try_into()
+            .ok()
+    }
 }
 
 impl IsString for ast::String {