Skip to content

Commit

Permalink
Merge pull request #361 from dtolnay/linecolumn
Browse files Browse the repository at this point in the history
Deduplicate implementations of LineColumn
  • Loading branch information
dtolnay authored Jan 16, 2023
2 parents 9924b79 + a4be982 commit 92a0295
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 57 deletions.
8 changes: 2 additions & 6 deletions src/fallback.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#[cfg(span_locations)]
use crate::location::LineColumn;
use crate::parse::{self, Cursor};
use crate::rcvec::{RcVec, RcVecBuilder, RcVecIntoIter, RcVecMut};
use crate::{Delimiter, Spacing, TokenTree};
Expand Down Expand Up @@ -332,12 +334,6 @@ impl Debug for SourceFile {
}
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct LineColumn {
pub line: usize,
pub column: usize,
}

#[cfg(span_locations)]
thread_local! {
static SOURCE_MAP: RefCell<SourceMap> = RefCell::new(SourceMap {
Expand Down
43 changes: 8 additions & 35 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ use crate::fallback as imp;
#[cfg(wrap_proc_macro)]
mod imp;

#[cfg(span_locations)]
mod location;

use crate::marker::Marker;
use core::cmp::Ordering;
use core::fmt::{self, Debug, Display};
Expand All @@ -150,6 +153,9 @@ use std::error::Error;
#[cfg(procmacro2_semver_exempt)]
use std::path::PathBuf;

#[cfg(span_locations)]
pub use crate::location::LineColumn;

/// An abstract stream of tokens, or more concretely a sequence of token trees.
///
/// This type provides interfaces for iterating over token trees and for
Expand Down Expand Up @@ -356,37 +362,6 @@ impl Debug for SourceFile {
}
}

/// A line-column pair representing the start or end of a `Span`.
///
/// This type is semver exempt and not exposed by default.
#[cfg(span_locations)]
#[cfg_attr(doc_cfg, doc(cfg(feature = "span-locations")))]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct LineColumn {
/// The 1-indexed line in the source file on which the span starts or ends
/// (inclusive).
pub line: usize,
/// The 0-indexed column (in UTF-8 characters) in the source file on which
/// the span starts or ends (inclusive).
pub column: usize,
}

#[cfg(span_locations)]
impl Ord for LineColumn {
fn cmp(&self, other: &Self) -> Ordering {
self.line
.cmp(&other.line)
.then(self.column.cmp(&other.column))
}
}

#[cfg(span_locations)]
impl PartialOrd for LineColumn {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}

/// A region of source code, along with macro expansion information.
#[derive(Copy, Clone)]
pub struct Span {
Expand Down Expand Up @@ -492,8 +467,7 @@ impl Span {
#[cfg(span_locations)]
#[cfg_attr(doc_cfg, doc(cfg(feature = "span-locations")))]
pub fn start(&self) -> LineColumn {
let imp::LineColumn { line, column } = self.inner.start();
LineColumn { line, column }
self.inner.start()
}

/// Get the ending line/column in the source file for this span.
Expand All @@ -508,8 +482,7 @@ impl Span {
#[cfg(span_locations)]
#[cfg_attr(doc_cfg, doc(cfg(feature = "span-locations")))]
pub fn end(&self) -> LineColumn {
let imp::LineColumn { line, column } = self.inner.end();
LineColumn { line, column }
self.inner.end()
}

/// Creates an empty span pointing to directly before this span.
Expand Down
29 changes: 29 additions & 0 deletions src/location.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
use core::cmp::Ordering;

/// A line-column pair representing the start or end of a `Span`.
///
/// This type is semver exempt and not exposed by default.
#[cfg_attr(doc_cfg, doc(cfg(feature = "span-locations")))]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct LineColumn {
/// The 1-indexed line in the source file on which the span starts or ends
/// (inclusive).
pub line: usize,
/// The 0-indexed column (in UTF-8 characters) in the source file on which
/// the span starts or ends (inclusive).
pub column: usize,
}

impl Ord for LineColumn {
fn cmp(&self, other: &Self) -> Ordering {
self.line
.cmp(&other.line)
.then(self.column.cmp(&other.column))
}
}

impl PartialOrd for LineColumn {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
22 changes: 6 additions & 16 deletions src/wrapper.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
use crate::detection::inside_proc_macro;
#[cfg(span_locations)]
use crate::location::LineColumn;
use crate::{fallback, Delimiter, Punct, Spacing, TokenTree};
use core::fmt::{self, Debug, Display};
use core::iter::FromIterator;
Expand Down Expand Up @@ -389,12 +391,6 @@ impl Debug for SourceFile {
}
}

#[cfg(any(super_unstable, feature = "span-locations"))]
pub(crate) struct LineColumn {
pub line: usize,
pub column: usize,
}

#[derive(Copy, Clone)]
pub(crate) enum Span {
Compiler(proc_macro::Span),
Expand Down Expand Up @@ -471,7 +467,7 @@ impl Span {
}
}

#[cfg(any(super_unstable, feature = "span-locations"))]
#[cfg(span_locations)]
pub fn start(&self) -> LineColumn {
match self {
#[cfg(proc_macro_span)]
Expand All @@ -481,14 +477,11 @@ impl Span {
}
#[cfg(not(proc_macro_span))]
Span::Compiler(_) => LineColumn { line: 0, column: 0 },
Span::Fallback(s) => {
let fallback::LineColumn { line, column } = s.start();
LineColumn { line, column }
}
Span::Fallback(s) => s.start(),
}
}

#[cfg(any(super_unstable, feature = "span-locations"))]
#[cfg(span_locations)]
pub fn end(&self) -> LineColumn {
match self {
#[cfg(proc_macro_span)]
Expand All @@ -498,10 +491,7 @@ impl Span {
}
#[cfg(not(proc_macro_span))]
Span::Compiler(_) => LineColumn { line: 0, column: 0 },
Span::Fallback(s) => {
let fallback::LineColumn { line, column } = s.end();
LineColumn { line, column }
}
Span::Fallback(s) => s.end(),
}
}

Expand Down

0 comments on commit 92a0295

Please sign in to comment.