tokio-rs / tracing

Application level tracing for Rust.
https://tracing.rs
MIT License
5.14k stars 671 forks source link

Unqualified `line!` macro usage inside `info!` causes issues with `ratatui_macros` #3023

Open kdheepak opened 6 days ago

kdheepak commented 6 days ago

Just importing ratatui_macros::line causes tracing::info to compile error:

use ratatui_macros::line;
use tracing::info;

fn main() {
    info!("Hello, world!");
}

Here's the error:

error: expected a literal
 --> src/main.rs:5:5
  |
5 |     info!("Hello, world!");
  |     ^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: only literals (like `"foo"`, `-42` and `3.14`) can be passed to `concat!()`
  = note: this error originates in the macro `line` which comes from the expansion of the macro `info` (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0308]: mismatched types
   --> src/main.rs:5:5
    |
5   |     info!("Hello, world!");
    |     ^^^^^^^^^^^^^^^^^^^^^^
    |     |
    |     expected `u32`, found `Line<'_>`
    |     arguments to this enum variant are incorrect
    |

with this Cargo.toml

[package]
name = "test-ratatui-macros"
version = "0.1.0"
edition = "2021"

[dependencies]
log = "0.4.22"
ratatui = "0.27.0"
ratatui-macros = "0.4.2"
tracing = "0.1.40"

I get similar errors with other macros from tracing, but I don't get any errors with log::info! or other macros from log.

Here's the diff of cargo expand without and with use ratatui_macros::line;

--- without_ratatui_macros.txt  2024-06-30 00:19:44
+++ with_ratatui_macros.txt     2024-06-30 00:19:54
@@ -3,6 +3,7 @@
 use std::prelude::rust_2021::*;
 #[macro_use]
 extern crate std;
+use ratatui_macros::line;
 use tracing::info;
 fn main() {
     {
@@ -10,11 +11,11 @@
         static __CALLSITE: ::tracing::callsite::DefaultCallsite = {
             static META: ::tracing::Metadata<'static> = {
                 ::tracing_core::metadata::Metadata::new(
-                    "event src/main.rs:5",
+                    (/*ERROR*/),
                     "test_ratatui_macros",
                     ::tracing::Level::INFO,
                     ::core::option::Option::Some("src/main.rs"),
-                    ::core::option::Option::Some(5u32),
+                    ::core::option::Option::Some(::ratatui::text::Line::default()),
                     ::core::option::Option::Some("test_ratatui_macros"),
                     ::tracing_core::field::FieldSet::new(
                         &["message"],

tracing seems to be adding a line like this ::core::option::Option::Some(::ratatui::text::Line::default()), when use ratatui_macros::line is in the file.

The issue stems from unqualified usages of line! like these:

https://github.com/tokio-rs/tracing/blob/ba387ddc03f17eb91e70efe58ae007326ecb9cd4/tracing/src/macros.rs#L700

https://github.com/tokio-rs/tracing/blob/ba387ddc03f17eb91e70efe58ae007326ecb9cd4/tracing/src/macros.rs#L861

https://github.com/tokio-rs/tracing/blob/ba387ddc03f17eb91e70efe58ae007326ecb9cd4/tracing/src/macros.rs#L1191

Making them std::line!() should resolve this issue.

Thanks to @joshka for helping figure out the issue.

joshka commented 5 days ago

It's also a problem in the metadata! macro in tracing-core.