mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 04:19:13 +00:00
internal: Remove span trait
This commit is contained in:
parent
2ad14b8069
commit
cd8eb0fe6d
11 changed files with 52 additions and 55 deletions
|
@ -1,5 +1,7 @@
|
|||
//! Conversions between [`SyntaxNode`] and [`tt::TokenTree`].
|
||||
|
||||
use std::fmt;
|
||||
|
||||
use rustc_hash::{FxHashMap, FxHashSet};
|
||||
use span::{SpanAnchor, SpanData, SpanMap};
|
||||
use stdx::{never, non_empty_vec::NonEmptyVec};
|
||||
|
@ -9,30 +11,27 @@ use syntax::{
|
|||
SyntaxKind::*,
|
||||
SyntaxNode, SyntaxToken, SyntaxTreeBuilder, TextRange, TextSize, WalkEvent, T,
|
||||
};
|
||||
use tt::{
|
||||
buffer::{Cursor, TokenBuffer},
|
||||
Span,
|
||||
};
|
||||
use tt::buffer::{Cursor, TokenBuffer};
|
||||
|
||||
use crate::{to_parser_input::to_parser_input, tt_iter::TtIter};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
pub trait SpanMapper<S: Span> {
|
||||
pub trait SpanMapper<S> {
|
||||
fn span_for(&self, range: TextRange) -> S;
|
||||
}
|
||||
|
||||
impl<S> SpanMapper<SpanData<S>> for SpanMap<S>
|
||||
where
|
||||
SpanData<S>: Span,
|
||||
SpanData<S>: Copy,
|
||||
{
|
||||
fn span_for(&self, range: TextRange) -> SpanData<S> {
|
||||
self.span_at(range.start())
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: Span, SM: SpanMapper<S>> SpanMapper<S> for &SM {
|
||||
impl<S: Copy, SM: SpanMapper<S>> SpanMapper<S> for &SM {
|
||||
fn span_for(&self, range: TextRange) -> S {
|
||||
SM::span_for(self, range)
|
||||
}
|
||||
|
@ -78,8 +77,7 @@ pub fn syntax_node_to_token_tree<Ctx, SpanMap>(
|
|||
span: SpanData<Ctx>,
|
||||
) -> tt::Subtree<SpanData<Ctx>>
|
||||
where
|
||||
SpanData<Ctx>: Span,
|
||||
Ctx: Copy,
|
||||
SpanData<Ctx>: Copy + fmt::Debug,
|
||||
SpanMap: SpanMapper<SpanData<Ctx>>,
|
||||
{
|
||||
let mut c = Converter::new(node, map, Default::default(), Default::default(), span);
|
||||
|
@ -98,8 +96,7 @@ pub fn syntax_node_to_token_tree_modified<Ctx, SpanMap>(
|
|||
) -> tt::Subtree<SpanData<Ctx>>
|
||||
where
|
||||
SpanMap: SpanMapper<SpanData<Ctx>>,
|
||||
SpanData<Ctx>: Span,
|
||||
Ctx: Copy,
|
||||
SpanData<Ctx>: Copy + fmt::Debug,
|
||||
{
|
||||
let mut c = Converter::new(node, map, append, remove, call_site);
|
||||
convert_tokens(&mut c)
|
||||
|
@ -124,8 +121,7 @@ pub fn token_tree_to_syntax_node<Ctx>(
|
|||
entry_point: parser::TopEntryPoint,
|
||||
) -> (Parse<SyntaxNode>, SpanMap<Ctx>)
|
||||
where
|
||||
SpanData<Ctx>: Span,
|
||||
Ctx: Copy,
|
||||
SpanData<Ctx>: Copy + fmt::Debug,
|
||||
{
|
||||
let buffer = match tt {
|
||||
tt::Subtree {
|
||||
|
@ -161,7 +157,7 @@ pub fn parse_to_token_tree<Ctx>(
|
|||
text: &str,
|
||||
) -> Option<tt::Subtree<SpanData<Ctx>>>
|
||||
where
|
||||
SpanData<Ctx>: Span,
|
||||
SpanData<Ctx>: Copy + fmt::Debug,
|
||||
Ctx: Copy,
|
||||
{
|
||||
let lexed = parser::LexedStr::new(text);
|
||||
|
@ -175,7 +171,7 @@ where
|
|||
/// Convert a string to a `TokenTree`. The passed span will be used for all spans of the produced subtree.
|
||||
pub fn parse_to_token_tree_static_span<S>(span: S, text: &str) -> Option<tt::Subtree<S>>
|
||||
where
|
||||
S: Span,
|
||||
S: Copy + fmt::Debug,
|
||||
{
|
||||
let lexed = parser::LexedStr::new(text);
|
||||
if lexed.errors().next().is_some() {
|
||||
|
@ -186,11 +182,10 @@ where
|
|||
}
|
||||
|
||||
/// Split token tree with separate expr: $($e:expr)SEP*
|
||||
pub fn parse_exprs_with_sep<S: Span>(
|
||||
tt: &tt::Subtree<S>,
|
||||
sep: char,
|
||||
span: S,
|
||||
) -> Vec<tt::Subtree<S>> {
|
||||
pub fn parse_exprs_with_sep<S>(tt: &tt::Subtree<S>, sep: char, span: S) -> Vec<tt::Subtree<S>>
|
||||
where
|
||||
S: Copy + fmt::Debug,
|
||||
{
|
||||
if tt.token_trees.is_empty() {
|
||||
return Vec::new();
|
||||
}
|
||||
|
@ -226,7 +221,8 @@ pub fn parse_exprs_with_sep<S: Span>(
|
|||
fn convert_tokens<S, C>(conv: &mut C) -> tt::Subtree<S>
|
||||
where
|
||||
C: TokenConverter<S>,
|
||||
S: Span,
|
||||
S: Copy + fmt::Debug,
|
||||
C::Token: fmt::Debug,
|
||||
{
|
||||
let entry = tt::SubtreeBuilder {
|
||||
delimiter: tt::Delimiter::invisible_spanned(conv.call_site()),
|
||||
|
@ -485,7 +481,7 @@ struct StaticRawConverter<'a, S> {
|
|||
span: S,
|
||||
}
|
||||
|
||||
trait SrcToken<Ctx, S>: std::fmt::Debug {
|
||||
trait SrcToken<Ctx, S> {
|
||||
fn kind(&self, ctx: &Ctx) -> SyntaxKind;
|
||||
|
||||
fn to_char(&self, ctx: &Ctx) -> Option<char>;
|
||||
|
@ -525,7 +521,7 @@ impl<S, Ctx> SrcToken<RawConverter<'_, Ctx>, S> for usize {
|
|||
}
|
||||
}
|
||||
|
||||
impl<S: Span> SrcToken<StaticRawConverter<'_, S>, S> for usize {
|
||||
impl<S: Copy> SrcToken<StaticRawConverter<'_, S>, S> for usize {
|
||||
fn kind(&self, ctx: &StaticRawConverter<'_, S>) -> SyntaxKind {
|
||||
ctx.lexed.kind(*self)
|
||||
}
|
||||
|
@ -541,7 +537,7 @@ impl<S: Span> SrcToken<StaticRawConverter<'_, S>, S> for usize {
|
|||
|
||||
impl<Ctx: Copy> TokenConverter<SpanData<Ctx>> for RawConverter<'_, Ctx>
|
||||
where
|
||||
SpanData<Ctx>: Span,
|
||||
SpanData<Ctx>: Copy,
|
||||
{
|
||||
type Token = usize;
|
||||
|
||||
|
@ -584,7 +580,7 @@ where
|
|||
|
||||
impl<S> TokenConverter<S> for StaticRawConverter<'_, S>
|
||||
where
|
||||
S: Span,
|
||||
S: Copy,
|
||||
{
|
||||
type Token = usize;
|
||||
|
||||
|
@ -709,7 +705,7 @@ impl<S> SynToken<S> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<SpanMap, S: std::fmt::Debug> SrcToken<Converter<SpanMap, S>, S> for SynToken<S> {
|
||||
impl<SpanMap, S> SrcToken<Converter<SpanMap, S>, S> for SynToken<S> {
|
||||
fn kind(&self, _ctx: &Converter<SpanMap, S>) -> SyntaxKind {
|
||||
match self {
|
||||
SynToken::Ordinary(token) => token.kind(),
|
||||
|
@ -748,7 +744,7 @@ impl<SpanMap, S: std::fmt::Debug> SrcToken<Converter<SpanMap, S>, S> for SynToke
|
|||
|
||||
impl<S, SpanMap> TokenConverter<S> for Converter<SpanMap, S>
|
||||
where
|
||||
S: Span,
|
||||
S: Copy,
|
||||
SpanMap: SpanMapper<S>,
|
||||
{
|
||||
type Token = SynToken<S>;
|
||||
|
@ -828,7 +824,7 @@ where
|
|||
|
||||
struct TtTreeSink<'a, Ctx>
|
||||
where
|
||||
SpanData<Ctx>: Span,
|
||||
SpanData<Ctx>: Copy,
|
||||
{
|
||||
buf: String,
|
||||
cursor: Cursor<'a, SpanData<Ctx>>,
|
||||
|
@ -839,7 +835,7 @@ where
|
|||
|
||||
impl<'a, Ctx> TtTreeSink<'a, Ctx>
|
||||
where
|
||||
SpanData<Ctx>: Span,
|
||||
SpanData<Ctx>: Copy,
|
||||
{
|
||||
fn new(cursor: Cursor<'a, SpanData<Ctx>>) -> Self {
|
||||
TtTreeSink {
|
||||
|
@ -871,7 +867,7 @@ fn delim_to_str(d: tt::DelimiterKind, closing: bool) -> Option<&'static str> {
|
|||
|
||||
impl<Ctx> TtTreeSink<'_, Ctx>
|
||||
where
|
||||
SpanData<Ctx>: Span,
|
||||
SpanData<Ctx>: Copy,
|
||||
{
|
||||
/// Parses a float literal as if it was a one to two name ref nodes with a dot inbetween.
|
||||
/// This occurs when a float literal is used as a field access.
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
//! Convert macro-by-example tokens which are specific to macro expansion into a
|
||||
//! format that works for our parser.
|
||||
|
||||
use std::fmt;
|
||||
|
||||
use syntax::{SyntaxKind, SyntaxKind::*, T};
|
||||
|
||||
use tt::{buffer::TokenBuffer, Span};
|
||||
use tt::buffer::TokenBuffer;
|
||||
|
||||
pub(crate) fn to_parser_input<S: Span>(buffer: &TokenBuffer<'_, S>) -> parser::Input {
|
||||
pub(crate) fn to_parser_input<S: Copy + fmt::Debug>(buffer: &TokenBuffer<'_, S>) -> parser::Input {
|
||||
let mut res = parser::Input::default();
|
||||
|
||||
let mut current = buffer.begin();
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
//! A "Parser" structure for token trees. We use this when parsing a declarative
|
||||
//! macro definition into a list of patterns and templates.
|
||||
|
||||
use core::fmt;
|
||||
|
||||
use smallvec::{smallvec, SmallVec};
|
||||
use syntax::SyntaxKind;
|
||||
use tt::Span;
|
||||
|
||||
use crate::{to_parser_input::to_parser_input, ExpandError, ExpandResult};
|
||||
|
||||
|
@ -12,7 +13,7 @@ pub(crate) struct TtIter<'a, S> {
|
|||
pub(crate) inner: std::slice::Iter<'a, tt::TokenTree<S>>,
|
||||
}
|
||||
|
||||
impl<'a, S: Span> TtIter<'a, S> {
|
||||
impl<'a, S: Copy> TtIter<'a, S> {
|
||||
pub(crate) fn new(subtree: &'a tt::Subtree<S>) -> TtIter<'a, S> {
|
||||
TtIter { inner: subtree.token_trees.iter() }
|
||||
}
|
||||
|
@ -130,7 +131,12 @@ impl<'a, S: Span> TtIter<'a, S> {
|
|||
_ => Ok(smallvec![first]),
|
||||
}
|
||||
}
|
||||
pub(crate) fn peek_n(&self, n: usize) -> Option<&'a tt::TokenTree<S>> {
|
||||
self.inner.as_slice().get(n)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, S: Copy + fmt::Debug> TtIter<'a, S> {
|
||||
pub(crate) fn expect_fragment(
|
||||
&mut self,
|
||||
entry_point: parser::PrefixEntryPoint,
|
||||
|
@ -185,10 +191,6 @@ impl<'a, S: Span> TtIter<'a, S> {
|
|||
};
|
||||
ExpandResult { value: res, err }
|
||||
}
|
||||
|
||||
pub(crate) fn peek_n(&self, n: usize) -> Option<&'a tt::TokenTree<S>> {
|
||||
self.inner.as_slice().get(n)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, S> Iterator for TtIter<'a, S> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue