proc_macro/bridge: send diagnostics over the bridge as a struct
This removes some RPC when creating and emitting diagnostics, and simplifies the bridge slightly. After this change, there are no remaining methods which take advantage of the support for `&mut` references to objects in the store as arguments, meaning that support for them could technically be removed if we wanted. The only remaining uses of immutable references into the store are `TokenStream` and `SourceFile`.
This commit is contained in:
parent
5c54be35c6
commit
1c7c792dda
6 changed files with 41 additions and 125 deletions
|
|
@ -176,8 +176,6 @@ define_handles! {
|
|||
FreeFunctions,
|
||||
TokenStream,
|
||||
SourceFile,
|
||||
MultiSpan,
|
||||
Diagnostic,
|
||||
|
||||
'interned:
|
||||
Span,
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ macro_rules! with_api {
|
|||
fn track_env_var(var: &str, value: Option<&str>);
|
||||
fn track_path(path: &str);
|
||||
fn literal_from_str(s: &str) -> Result<Literal<$S::Span, $S::Symbol>, ()>;
|
||||
fn emit_diagnostic(diagnostic: Diagnostic<$S::Span>);
|
||||
},
|
||||
TokenStream {
|
||||
fn drop($self: $S::TokenStream);
|
||||
|
|
@ -87,22 +88,6 @@ macro_rules! with_api {
|
|||
fn path($self: &$S::SourceFile) -> String;
|
||||
fn is_real($self: &$S::SourceFile) -> bool;
|
||||
},
|
||||
MultiSpan {
|
||||
fn drop($self: $S::MultiSpan);
|
||||
fn new() -> $S::MultiSpan;
|
||||
fn push($self: &mut $S::MultiSpan, span: $S::Span);
|
||||
},
|
||||
Diagnostic {
|
||||
fn drop($self: $S::Diagnostic);
|
||||
fn new(level: Level, msg: &str, span: $S::MultiSpan) -> $S::Diagnostic;
|
||||
fn sub(
|
||||
$self: &mut $S::Diagnostic,
|
||||
level: Level,
|
||||
msg: &str,
|
||||
span: $S::MultiSpan,
|
||||
);
|
||||
fn emit($self: $S::Diagnostic);
|
||||
},
|
||||
Span {
|
||||
fn debug($self: $S::Span) -> String;
|
||||
fn source_file($self: $S::Span) -> $S::SourceFile;
|
||||
|
|
@ -510,6 +495,18 @@ compound_traits!(
|
|||
}
|
||||
);
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Diagnostic<Span> {
|
||||
pub level: Level,
|
||||
pub message: String,
|
||||
pub spans: Vec<Span>,
|
||||
pub children: Vec<Diagnostic<Span>>,
|
||||
}
|
||||
|
||||
compound_traits!(
|
||||
struct Diagnostic<Span> { level, message, spans, children }
|
||||
);
|
||||
|
||||
/// Globals provided alongside the initial inputs for a macro expansion.
|
||||
/// Provides values such as spans which are used frequently to avoid RPC.
|
||||
#[derive(Clone)]
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@ pub trait Types {
|
|||
type FreeFunctions: 'static;
|
||||
type TokenStream: 'static + Clone;
|
||||
type SourceFile: 'static + Clone;
|
||||
type MultiSpan: 'static;
|
||||
type Diagnostic: 'static;
|
||||
type Span: 'static + Copy + Eq + Hash;
|
||||
type Symbol: 'static;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -161,22 +161,15 @@ impl Diagnostic {
|
|||
/// Emit the diagnostic.
|
||||
#[unstable(feature = "proc_macro_diagnostic", issue = "54140")]
|
||||
pub fn emit(self) {
|
||||
fn to_internal(spans: Vec<Span>) -> crate::bridge::client::MultiSpan {
|
||||
let mut multi_span = crate::bridge::client::MultiSpan::new();
|
||||
for span in spans {
|
||||
multi_span.push(span.0);
|
||||
fn to_internal(diag: Diagnostic) -> crate::bridge::Diagnostic<crate::bridge::client::Span> {
|
||||
crate::bridge::Diagnostic {
|
||||
level: diag.level,
|
||||
message: diag.message,
|
||||
spans: diag.spans.into_iter().map(|s| s.0).collect(),
|
||||
children: diag.children.into_iter().map(to_internal).collect(),
|
||||
}
|
||||
multi_span
|
||||
}
|
||||
|
||||
let mut diag = crate::bridge::client::Diagnostic::new(
|
||||
self.level,
|
||||
&self.message[..],
|
||||
to_internal(self.spans),
|
||||
);
|
||||
for c in self.children {
|
||||
diag.sub(c.level, &c.message[..], to_internal(c.spans));
|
||||
}
|
||||
diag.emit();
|
||||
crate::bridge::client::FreeFunctions::emit_diagnostic(to_internal(self));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue