Accept unquoted path in type_id macro
diff --git a/macro/src/lib.rs b/macro/src/lib.rs
index c2ad38b..fae874a 100644
--- a/macro/src/lib.rs
+++ b/macro/src/lib.rs
@@ -15,8 +15,10 @@
use crate::syntax::file::Module;
use crate::syntax::namespace::Namespace;
+use crate::syntax::qualified::QualifiedName;
use proc_macro::TokenStream;
-use syn::{parse_macro_input, LitStr};
+use syn::parse::{Parse, ParseStream, Result};
+use syn::parse_macro_input;
/// `#[cxx::bridge] mod ffi { ... }`
///
@@ -50,6 +52,14 @@
#[proc_macro]
pub fn type_id(input: TokenStream) -> TokenStream {
- let arg = parse_macro_input!(input as LitStr);
- type_id::expand(arg).into()
+ struct TypeId(QualifiedName);
+
+ impl Parse for TypeId {
+ fn parse(input: ParseStream) -> Result<Self> {
+ QualifiedName::parse_quoted_or_unquoted(input).map(TypeId)
+ }
+ }
+
+ let arg = parse_macro_input!(input as TypeId);
+ type_id::expand(arg.0).into()
}
diff --git a/macro/src/type_id.rs b/macro/src/type_id.rs
index 445da2b..5c5d9cc 100644
--- a/macro/src/type_id.rs
+++ b/macro/src/type_id.rs
@@ -1,16 +1,16 @@
+use crate::syntax::qualified::QualifiedName;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
-use syn::LitStr;
// "folly::File" => `(f, o, l, l, y, (), F, i, l, e)`
-pub fn expand(arg: LitStr) -> TokenStream {
+pub fn expand(arg: QualifiedName) -> TokenStream {
let mut ids = Vec::new();
- for word in arg.value().split("::") {
+ for word in arg.segments {
if !ids.is_empty() {
ids.push(quote!(()));
}
- for ch in word.chars() {
+ for ch in word.to_string().chars() {
ids.push(match ch {
'A'..='Z' | 'a'..='z' => {
let t = format_ident!("{}", ch);
diff --git a/syntax/mod.rs b/syntax/mod.rs
index d6db7cb..03422d1 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -13,7 +13,7 @@
pub mod mangle;
pub mod namespace;
mod parse;
-mod qualified;
+pub mod qualified;
pub mod report;
pub mod set;
pub mod symbol;