Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/abis/abi_sysroot/ra_server.rs')
-rw-r--r--crates/proc-macro-srv/src/abis/abi_sysroot/ra_server.rs63
1 files changed, 41 insertions, 22 deletions
diff --git a/crates/proc-macro-srv/src/abis/abi_sysroot/ra_server.rs b/crates/proc-macro-srv/src/abis/abi_sysroot/ra_server.rs
index 2676687830..55649ab810 100644
--- a/crates/proc-macro-srv/src/abis/abi_sysroot/ra_server.rs
+++ b/crates/proc-macro-srv/src/abis/abi_sysroot/ra_server.rs
@@ -115,20 +115,29 @@ impl server::TokenStream for RustAnalyzer {
Self::TokenStream::from_iter(vec![tree])
}
- bridge::TokenTree::Ident(_symbol) => {
- todo!("convert Ident bridge=>TokenStream");
- // let IdentData(ident) = self.ident_interner.get(index).clone();
- // let ident: tt::Ident = ident;
- // let leaf = tt::Leaf::from(ident);
- // let tree = TokenTree::from(leaf);
- // Self::TokenStream::from_iter(vec![tree])
+ bridge::TokenTree::Ident(ident) => {
+ // FIXME: handle raw idents
+ let text = SYMBOL_INTERNER.lock().unwrap().get(&ident.sym).clone();
+ let ident: tt::Ident = tt::Ident { text, id: ident.span };
+ let leaf = tt::Leaf::from(ident);
+ let tree = TokenTree::from(leaf);
+ Self::TokenStream::from_iter(vec![tree])
}
- bridge::TokenTree::Literal(_literal) => {
- todo!("convert Literal bridge=>TokenStream");
- // let leaf = tt::Leaf::from(literal);
- // let tree = TokenTree::from(leaf);
- // Self::TokenStream::from_iter(vec![tree])
+ bridge::TokenTree::Literal(literal) => {
+ let symbol = SYMBOL_INTERNER.lock().unwrap().get(&literal.symbol).clone();
+
+ let text: tt::SmolStr = if let Some(suffix) = literal.suffix {
+ let suffix = SYMBOL_INTERNER.lock().unwrap().get(&suffix).clone();
+ format!("{symbol}{suffix}").into()
+ } else {
+ symbol
+ };
+
+ let literal = tt::Literal { text, id: literal.span };
+ let leaf = tt::Leaf::from(literal);
+ let tree = TokenTree::from(leaf);
+ Self::TokenStream::from_iter(vec![tree])
}
bridge::TokenTree::Punct(p) => {
@@ -185,13 +194,23 @@ impl server::TokenStream for RustAnalyzer {
stream
.into_iter()
.map(|tree| match tree {
- tt::TokenTree::Leaf(tt::Leaf::Ident(_ident)) => {
- todo!("convert Ident tt=>bridge");
- // bridge::TokenTree::Ident(Symbol(self.ident_interner.intern(&IdentData(ident))))
+ tt::TokenTree::Leaf(tt::Leaf::Ident(ident)) => {
+ bridge::TokenTree::Ident(bridge::Ident {
+ sym: SYMBOL_INTERNER.lock().unwrap().intern(&ident.text),
+ // FIXME: handle raw idents
+ is_raw: false,
+ span: ident.id,
+ })
}
- tt::TokenTree::Leaf(tt::Leaf::Literal(_lit)) => {
- todo!("convert Literal tt=>bridge");
- // bridge::TokenTree::Literal(lit)
+ tt::TokenTree::Leaf(tt::Leaf::Literal(lit)) => {
+ bridge::TokenTree::Literal(bridge::Literal {
+ // FIXME: handle literal kinds
+ kind: bridge::LitKind::Err,
+ symbol: SYMBOL_INTERNER.lock().unwrap().intern(&lit.text),
+ // FIXME: handle suffixes
+ suffix: None,
+ span: lit.id,
+ })
}
tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) => {
bridge::TokenTree::Punct(bridge::Punct {
@@ -379,12 +398,12 @@ impl server::Server for RustAnalyzer {
}
}
- fn intern_symbol(_ident: &str) -> Self::Symbol {
- todo!("intern_symbol")
+ fn intern_symbol(ident: &str) -> Self::Symbol {
+ SYMBOL_INTERNER.lock().unwrap().intern(&tt::SmolStr::from(ident))
}
- fn with_symbol_string(_symbol: &Self::Symbol, _f: impl FnOnce(&str)) {
- todo!("with_symbol_string")
+ fn with_symbol_string(symbol: &Self::Symbol, f: impl FnOnce(&str)) {
+ f(SYMBOL_INTERNER.lock().unwrap().get(symbol).as_str())
}
}