wycats / language-reporting

13 stars 3 forks source link

thread 'main' panicked at 'SimpleSpan 1027 must be bigger than 1031' #10

Open Boscop opened 4 years ago

Boscop commented 4 years ago

I adapted the example to pretty-print glium shader compilation errors, and I want to use the full line length as span length, but it always panics, even if I only use half of the line len as span len. It always panics in this loop, NOT during my own instantiations of SimpleSpan that happen before this loop:

for diagnostic in diagnostics {
    emit(&mut writer.lock(), &files, &diagnostic, &language_reporting::DefaultConfig)
        .unwrap();
    println!();
}

https://github.com/wycats/language-reporting/blob/9886d61539144360e7d6d14b55d8847c05f751cf/src/simple.rs#L106-L111

thread 'main' panicked at 'SimpleSpan 1027 must be bigger than 1031', C:\Users\me\.cargo\git\checkouts\language-reporting-bae87254abc3bc92\9886d61\src\simple.rs:106:9
stack backtrace:
   0: std::backtrace_rs::backtrace::dbghelp::trace
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\..\backtrace\src\backtrace\dbghelp.rs:98
   1: std::backtrace_rs::backtrace::trace_unsynchronized
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\..\backtrace\src\backtrace\mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:77
   3: std::sys_common::backtrace::_print::{{impl}}::fmt
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:58
   4: core::fmt::write
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libcore\fmt\mod.rs:1117

   5: std::io::Write::write_fmt<std::sys::windows::stdio::Stderr>
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\io\mod.rs:1505
   6: std::sys_common::backtrace::_print
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:61
   7: std::sys_common::backtrace::print
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:48
   8: std::panicking::default_hook::{{closure}}
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:198

   9: std::panicking::default_hook
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:217

  10: std::panicking::rust_panic_with_hook
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:526

  11: std::panicking::begin_panic_handler
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:437

  12: std::panicking::begin_panic_fmt
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:391

  13: <language_reporting::simple::SimpleSpan as language_reporting::span::ReportingSpan>::with_start
  14: language_reporting::models::SourceLine<Files>::after_marked
  15: language_reporting::components::SourceCodeLine::{{closure}}
  16: core::ops::function::FnOnce::call_once
  17: <render_tree::helpers::Section as render_tree::component::BlockComponent>::append
  18: <render_tree::component::CurriedBlockComponent<B,Block> as render_tree::render::Render>::render
  19: language_reporting::components::Diagnostic::{{closure}}
  20: <render_tree::component::CurriedInlineComponent<T> as render_tree::render::Render>::render
  21: language_reporting::components::SourceCodeLocation::{{closure}}
  22: <render_tree::component::CurriedInlineComponent<T> as render_tree::render::Render>::render
  23: language_reporting::components::Diagnostic::{{closure}}
  24: <render_tree::helpers::Section as render_tree::component::BlockComponent>::append
  25: <render_tree::component::CurriedBlockComponent<B,Block> as render_tree::render::Render>::render
  26: language_reporting::components::Diagnostic
  27: <render_tree::component::CurriedInlineComponent<T> as render_tree::render::Render>::render
  28: render_tree::render::Render::into_fragment
  29: glium::gl::Gl::GetError
  30: language_reporting::emitter::emit

This is the bigger picture:

let re = Regex::new(r"0\((\d+)\) : error (\w+): (.*)\n").unwrap();

let mut files = SimpleReportingFiles::default();
let file = files.add(&pass.name, fs_source);
let diagnostics = re
    .captures_iter(&error)
    .map(|cap| {
        let line_nr = cap[1].parse::<usize>().unwrap();
        let error_code = &cap[2];
        let error_msg = &cap[3];

        let str_start = files.byte_index(file, line_nr - 1, 0).unwrap();
        Diagnostic::new(Severity::Error, error_msg)
            .with_label(
                Label::new_primary(SimpleSpan::new(
                    file,
                    str_start,
                    // str_start, // end == start. works
                    str_start + cap[0].len(), // this is what i want, but it panics
                    // str_start + cap[0].len() / 2, // also panics
                )),
            )
            .with_code(error_code)
    })
    .collect_vec();

let writer = StandardStream::stderr(ColorArg(ColorChoice::Auto).into());
for diagnostic in diagnostics {
    emit(&mut writer.lock(), &files, &diagnostic, &language_reporting::DefaultConfig)
        .unwrap();
    println!();
}
Boscop commented 4 years ago

I realized I was using the wrong len (the len of the error msg, as opposed to the line len).

But even with a span of len 0 (start == end), i.e. this one:

[
    Diagnostic {
        severity: Error,
        code: Some(
            "C0000",
        ),
        message: "syntax error, unexpected \';\', expecting \"::\" at token \";\"",
        labels: [
            Label {
                span: SimpleSpan {
                    file_id: 0,
                    start: 0,
                    end: 0,
                },
                message: None,
                style: Primary,
            },
        ],
    },
]

I get this panic (again in the print loop!):

thread 'main' panicked at 'SimpleSpan 0 must be bigger than 1', C:\Users\me\.cargo\git\checkouts\language-reporting-bae87254abc3bc92\9886d61\src\simple.rs:106:9
stack backtrace:
   0: std::backtrace_rs::backtrace::dbghelp::trace
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\..\backtrace\src\backtrace\dbghelp.rs:98
   1: std::backtrace_rs::backtrace::trace_unsynchronized
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\..\backtrace\src\backtrace\mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:77
   3: std::sys_common::backtrace::_print::{{impl}}::fmt
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:58
   4: core::fmt::write
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libcore\fmt\mod.rs:1117

   5: std::io::Write::write_fmt<std::sys::windows::stdio::Stderr>
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\io\mod.rs:1505
   6: std::sys_common::backtrace::_print
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:61
   7: std::sys_common::backtrace::print
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\sys_common\backtrace.rs:48
   8: std::panicking::default_hook::{{closure}}
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:198

   9: std::panicking::default_hook
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:217

  10: std::panicking::rust_panic_with_hook
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:526

  11: std::panicking::begin_panic_handler
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:437

  12: std::panicking::begin_panic_fmt
             at /rustc/d7f94516345a36ddfcd68cbdf1df835d356795c3\/src\libstd\panicking.rs:391

  13: <language_reporting::simple::SimpleSpan as language_reporting::span::ReportingSpan>::with_end
  14: language_reporting::models::SourceLine<Files>::before_marked
  15: language_reporting::components::SourceCodeLine::{{closure}}
  16: core::ops::function::FnOnce::call_once
  17: <render_tree::helpers::Section as render_tree::component::BlockComponent>::append
  18: <render_tree::component::CurriedBlockComponent<B,Block> as render_tree::render::Render>::render
  19: language_reporting::components::Diagnostic::{{closure}}
  20: <render_tree::component::CurriedInlineComponent<T> as render_tree::render::Render>::render
  21: language_reporting::components::SourceCodeLocation::{{closure}}
  22: <render_tree::component::CurriedInlineComponent<T> as render_tree::render::Render>::render
  23: language_reporting::components::Diagnostic::{{closure}}
  24: <render_tree::helpers::Section as render_tree::component::BlockComponent>::append
  25: <render_tree::component::CurriedBlockComponent<B,Block> as render_tree::render::Render>::render
  26: language_reporting::components::Diagnostic
  27: <render_tree::component::CurriedInlineComponent<T> as render_tree::render::Render>::render
  28: render_tree::render::Render::into_fragment
  29: language_reporting::emitter::emit