rls-span 0.4.1

Types for identifying code spans/ranges
Documentation
// Copyright 2016 The RLS Project Developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

/// These are the structures emitted by the compiler as part of JSON errors.
/// The original source can be found at
/// https://github.com/rust-lang/rust/blob/master/src/libsyntax/json.rs

use std::path::PathBuf;

use {Span, Row, Column, OneIndexed};

#[cfg_attr(feature = "serialize-serde", derive(Deserialize))]
#[derive(Debug, Clone)]
pub struct DiagnosticSpan {
    pub file_name: String,
    pub byte_start: u32,
    pub byte_end: u32,
    /// 1-based.
    pub line_start: usize,
    pub line_end: usize,
    /// 1-based, character offset.
    pub column_start: usize,
    pub column_end: usize,
    /// Is this a "primary" span -- meaning the point, or one of the points,
    /// where the error occurred?
    pub is_primary: bool,
    /// Source text from the start of line_start to the end of line_end.
    pub text: Vec<DiagnosticSpanLine>,
    /// Label that should be placed at this location (if any)
    pub label: Option<String>,
    /// If we are suggesting a replacement, this will contain text
    /// that should be sliced in atop this span. You may prefer to
    /// load the fully rendered version from the parent `Diagnostic`,
    /// however.
    pub suggested_replacement: Option<String>,
    /// Macro invocations that created the code at this span, if any.
    pub expansion: Option<Box<DiagnosticSpanMacroExpansion>>,
}

impl DiagnosticSpan {
    pub fn rls_span(&self) -> Span<OneIndexed> {
        Span::new(
            Row::new(self.line_start as u32),
            Row::new(self.line_end as u32),
            Column::new(self.column_start as u32),
            Column::new(self.column_end as u32),
            PathBuf::from(&self.file_name),
        )
    }
}

#[cfg_attr(feature = "serialize-serde", derive(Deserialize))]
#[derive(Debug, Clone)]
pub struct DiagnosticSpanLine {
    pub text: String,

    /// 1-based, character offset in self.text.
    pub highlight_start: usize,

    pub highlight_end: usize,
}

#[cfg_attr(feature = "serialize-serde", derive(Deserialize))]
#[derive(Debug, Clone)]
pub struct DiagnosticSpanMacroExpansion {
    /// span where macro was applied to generate this code; note that
    /// this may itself derive from a macro (if
    /// `span.expansion.is_some()`)
    pub span: DiagnosticSpan,

    /// name of macro that was applied (e.g., "foo!" or "#[derive(Eq)]")
    pub macro_decl_name: String,

    /// span where macro was defined (if known)
    pub def_site_span: Option<DiagnosticSpan>,
}