forked from Orchid/orchid
First steps for the macro system
This commit is contained in:
@@ -16,7 +16,7 @@ use crate::error::OrcErrv;
|
||||
use crate::format::{FmtCtx, FmtUnit, Format, Variants};
|
||||
use crate::interner::{Interner, Tok};
|
||||
use crate::location::{Pos, SrcRange};
|
||||
use crate::name::Sym;
|
||||
use crate::name::{Sym, VName, VPath};
|
||||
use crate::parse::Snippet;
|
||||
use crate::{api, match_mapping, tl_cache};
|
||||
|
||||
@@ -149,6 +149,20 @@ impl<H: ExprRepr, X: ExtraTok> TokTree<H, X> {
|
||||
pub fn as_name(&self) -> Option<Tok<String>> {
|
||||
if let Token::Name(n) = &self.tok { Some(n.clone()) } else { None }
|
||||
}
|
||||
pub fn as_multiname(&self) -> Result<VName, &TokTree<H, X>> {
|
||||
let mut segs = VPath::new([]);
|
||||
let mut cur = self;
|
||||
loop {
|
||||
match &cur.tok {
|
||||
Token::Name(last) => return Ok(segs.name_with_suffix(last.clone())),
|
||||
Token::NS(seg, inner) => {
|
||||
segs = segs.suffix([seg.clone()]);
|
||||
cur = inner;
|
||||
},
|
||||
_ => return Err(cur),
|
||||
}
|
||||
}
|
||||
}
|
||||
pub fn as_s(&self, par: Paren) -> Option<Snippet<'_, H, X>> {
|
||||
self.tok.as_s(par).map(|slc| Snippet::new(self, slc))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user