@@ -54,6 +54,7 @@ mod unit;
54
54
pub mod unit_dependencies;
55
55
pub mod unit_graph;
56
56
57
+ use std:: borrow:: Cow ;
57
58
use std:: collections:: { HashMap , HashSet } ;
58
59
use std:: env;
59
60
use std:: ffi:: { OsStr , OsString } ;
@@ -1756,10 +1757,15 @@ fn on_stderr_line_inner(
1756
1757
..
1757
1758
} => {
1758
1759
#[ derive( serde:: Deserialize ) ]
1759
- struct CompilerMessage {
1760
+ struct CompilerMessage < ' a > {
1761
+ // `rendered` contains escape sequences, which can't be
1762
+ // zero-copy deserialized by serde_json.
1763
+ // See https://github.com/serde-rs/json/issues/742
1760
1764
rendered : String ,
1761
- message : String ,
1762
- level : String ,
1765
+ #[ serde( borrow) ]
1766
+ message : Cow < ' a , str > ,
1767
+ #[ serde( borrow) ]
1768
+ level : Cow < ' a , str > ,
1763
1769
children : Vec < PartialDiagnostic > ,
1764
1770
}
1765
1771
@@ -1782,7 +1788,8 @@ fn on_stderr_line_inner(
1782
1788
suggestion_applicability : Option < Applicability > ,
1783
1789
}
1784
1790
1785
- if let Ok ( mut msg) = serde_json:: from_str :: < CompilerMessage > ( compiler_message. get ( ) ) {
1791
+ if let Ok ( mut msg) = serde_json:: from_str :: < CompilerMessage < ' _ > > ( compiler_message. get ( ) )
1792
+ {
1786
1793
if msg. message . starts_with ( "aborting due to" )
1787
1794
|| msg. message . ends_with ( "warning emitted" )
1788
1795
|| msg. message . ends_with ( "warnings emitted" )
@@ -1808,7 +1815,7 @@ fn on_stderr_line_inner(
1808
1815
} )
1809
1816
. any ( |b| b) ;
1810
1817
count_diagnostic ( & msg. level , options) ;
1811
- state. emit_diag ( msg. level , rendered, machine_applicable) ?;
1818
+ state. emit_diag ( & msg. level , rendered, machine_applicable) ?;
1812
1819
}
1813
1820
return Ok ( true ) ;
1814
1821
}
@@ -1819,12 +1826,14 @@ fn on_stderr_line_inner(
1819
1826
// cached replay to enable/disable colors without re-invoking rustc.
1820
1827
MessageFormat :: Json { ansi : false , .. } => {
1821
1828
#[ derive( serde:: Deserialize , serde:: Serialize ) ]
1822
- struct CompilerMessage {
1829
+ struct CompilerMessage < ' a > {
1823
1830
rendered : String ,
1824
- #[ serde( flatten) ]
1825
- other : std:: collections:: BTreeMap < String , serde_json:: Value > ,
1831
+ #[ serde( flatten, borrow ) ]
1832
+ other : std:: collections:: BTreeMap < Cow < ' a , str > , serde_json:: Value > ,
1826
1833
}
1827
- if let Ok ( mut error) = serde_json:: from_str :: < CompilerMessage > ( compiler_message. get ( ) ) {
1834
+ if let Ok ( mut error) =
1835
+ serde_json:: from_str :: < CompilerMessage < ' _ > > ( compiler_message. get ( ) )
1836
+ {
1828
1837
error. rendered = anstream:: adapter:: strip_str ( & error. rendered ) . to_string ( ) ;
1829
1838
let new_line = serde_json:: to_string ( & error) ?;
1830
1839
let new_msg: Box < serde_json:: value:: RawValue > = serde_json:: from_str ( & new_line) ?;
@@ -1866,12 +1875,14 @@ fn on_stderr_line_inner(
1866
1875
}
1867
1876
1868
1877
#[ derive( serde:: Deserialize ) ]
1869
- struct CompilerMessage {
1870
- message : String ,
1871
- level : String ,
1878
+ struct CompilerMessage < ' a > {
1879
+ #[ serde( borrow) ]
1880
+ message : Cow < ' a , str > ,
1881
+ #[ serde( borrow) ]
1882
+ level : Cow < ' a , str > ,
1872
1883
}
1873
1884
1874
- if let Ok ( msg) = serde_json:: from_str :: < CompilerMessage > ( compiler_message. get ( ) ) {
1885
+ if let Ok ( msg) = serde_json:: from_str :: < CompilerMessage < ' _ > > ( compiler_message. get ( ) ) {
1875
1886
if msg. message . starts_with ( "aborting due to" )
1876
1887
|| msg. message . ends_with ( "warning emitted" )
1877
1888
|| msg. message . ends_with ( "warnings emitted" )
0 commit comments