@@ -35,7 +35,6 @@ use std::{
35
35
fs,
36
36
path:: { Path , PathBuf } ,
37
37
thread,
38
- time:: SystemTime ,
39
38
} ;
40
39
41
40
use paths:: { Utf8Path , Utf8PathBuf } ;
@@ -53,7 +52,7 @@ use crate::server_impl::TokenStream;
53
52
pub const RUSTC_VERSION_STRING : & str = env ! ( "RUSTC_VERSION" ) ;
54
53
55
54
pub struct ProcMacroSrv < ' env > {
56
- expanders : HashMap < ( Utf8PathBuf , SystemTime ) , dylib:: Expander > ,
55
+ expanders : HashMap < Utf8PathBuf , dylib:: Expander > ,
57
56
span_mode : SpanMode ,
58
57
env : & ' env EnvSnapshot ,
59
58
}
@@ -81,10 +80,9 @@ impl<'env> ProcMacroSrv<'env> {
81
80
) -> Result < ( msg:: FlatTree , Vec < u32 > ) , msg:: PanicMessage > {
82
81
let span_mode = self . span_mode ;
83
82
let snapped_env = self . env ;
84
- let expander = self . expander ( lib. as_ref ( ) ) . map_err ( |err| {
85
- debug_assert ! ( false , "should list macros before asking to expand" ) ;
86
- msg:: PanicMessage ( format ! ( "failed to load macro: {err}" ) )
87
- } ) ?;
83
+ let expander = self
84
+ . expander ( lib. as_ref ( ) )
85
+ . map_err ( |err| msg:: PanicMessage ( format ! ( "failed to load macro: {err}" ) ) ) ?;
88
86
89
87
let prev_env = EnvChange :: apply ( snapped_env, env, current_dir. as_ref ( ) . map ( <_ >:: as_ref) ) ;
90
88
@@ -107,16 +105,20 @@ impl<'env> ProcMacroSrv<'env> {
107
105
}
108
106
109
107
fn expander ( & mut self , path : & Utf8Path ) -> Result < & dylib:: Expander , String > {
110
- let time = fs:: metadata ( path)
111
- . and_then ( |it| it. modified ( ) )
112
- . map_err ( |err| format ! ( "Failed to get file metadata for {path}: {err}" , ) ) ?;
113
-
114
- Ok ( match self . expanders . entry ( ( path. to_path_buf ( ) , time) ) {
115
- Entry :: Vacant ( v) => v. insert (
116
- dylib:: Expander :: new ( path)
117
- . map_err ( |err| format ! ( "Cannot create expander for {path}: {err}" , ) ) ?,
118
- ) ,
119
- Entry :: Occupied ( e) => e. into_mut ( ) ,
108
+ let expander = || {
109
+ dylib:: Expander :: new ( path)
110
+ . map_err ( |err| format ! ( "Cannot create expander for {path}: {err}" , ) )
111
+ } ;
112
+
113
+ Ok ( match self . expanders . entry ( path. to_path_buf ( ) ) {
114
+ Entry :: Vacant ( v) => v. insert ( expander ( ) ?) ,
115
+ Entry :: Occupied ( mut e) => {
116
+ let time = fs:: metadata ( path) . and_then ( |it| it. modified ( ) ) . ok ( ) ;
117
+ if Some ( e. get ( ) . modified_time ( ) ) != time {
118
+ e. insert ( expander ( ) ?) ;
119
+ }
120
+ e. into_mut ( )
121
+ }
120
122
} )
121
123
}
122
124
}
0 commit comments