@@ -160,6 +160,21 @@ impl<'a, 'v> Visitor<'v> for PluginLoader<'a> {
160
160
}
161
161
}
162
162
163
+ self . load_plugin ( CrateOrString :: Krate ( vi) , plugin_attr, macro_selection, reexport)
164
+ }
165
+
166
+ fn visit_mac ( & mut self , _: & ast:: Mac ) {
167
+ // bummer... can't see plugins inside macros.
168
+ // do nothing.
169
+ }
170
+ }
171
+
172
+ impl < ' a > PluginLoader < ' a > {
173
+ pub fn load_plugin < ' b > ( & mut self ,
174
+ c : CrateOrString < ' b > ,
175
+ plugin_attr : Option < P < ast:: MetaItem > > ,
176
+ macro_selection : Option < HashSet < token:: InternedString > > ,
177
+ reexport : HashSet < token:: InternedString > ) {
163
178
let mut macros = vec ! [ ] ;
164
179
let mut registrar = None ;
165
180
@@ -169,13 +184,15 @@ impl<'a, 'v> Visitor<'v> for PluginLoader<'a> {
169
184
} ;
170
185
let load_registrar = plugin_attr. is_some ( ) ;
171
186
172
- if load_macros && !self . span_whitelist . contains ( & vi. span ) {
173
- self . sess . span_err ( vi. span , "an `extern crate` loading macros must be at \
174
- the crate root") ;
175
- }
187
+ if let CrateOrString :: Krate ( vi) = c {
188
+ if load_macros && !self . span_whitelist . contains ( & vi. span ) {
189
+ self . sess . span_err ( vi. span , "an `extern crate` loading macros must be at \
190
+ the crate root") ;
191
+ }
192
+ }
176
193
177
194
if load_macros || load_registrar {
178
- let pmd = self . reader . read_plugin_metadata ( CrateOrString :: Krate ( vi ) ) ;
195
+ let pmd = self . reader . read_plugin_metadata ( c ) ;
179
196
if load_macros {
180
197
macros = pmd. exported_macros ( ) ;
181
198
}
@@ -195,24 +212,17 @@ impl<'a, 'v> Visitor<'v> for PluginLoader<'a> {
195
212
}
196
213
197
214
if let Some ( ( lib, symbol) ) = registrar {
198
- let fun = self . dylink_registrar ( vi , lib, symbol) ;
215
+ let fun = self . dylink_registrar ( c , lib, symbol) ;
199
216
self . plugins . registrars . push ( PluginRegistrar {
200
217
fun : fun,
201
218
args : plugin_attr. unwrap ( ) ,
202
219
} ) ;
203
220
}
204
221
}
205
222
206
- fn visit_mac ( & mut self , _: & ast:: Mac ) {
207
- // bummer... can't see plugins inside macros.
208
- // do nothing.
209
- }
210
- }
211
-
212
- impl < ' a > PluginLoader < ' a > {
213
223
// Dynamically link a registrar function into the compiler process.
214
- fn dylink_registrar ( & mut self ,
215
- vi : & ast :: ViewItem ,
224
+ fn dylink_registrar < ' b > ( & mut self ,
225
+ c : CrateOrString < ' b > ,
216
226
path : Path ,
217
227
symbol : String ) -> PluginRegistrarFun {
218
228
// Make sure the path contains a / or the linker will search for it.
@@ -223,7 +233,13 @@ impl<'a> PluginLoader<'a> {
223
233
// this is fatal: there are almost certainly macros we need
224
234
// inside this crate, so continue would spew "macro undefined"
225
235
// errors
226
- Err ( err) => self . sess . span_fatal ( vi. span , & err[ ] )
236
+ Err ( err) => {
237
+ if let CrateOrString :: Krate ( cr) = c {
238
+ self . sess . span_fatal ( cr. span , & err[ ] )
239
+ } else {
240
+ self . sess . fatal ( & err[ ] )
241
+ }
242
+ }
227
243
} ;
228
244
229
245
unsafe {
@@ -233,7 +249,13 @@ impl<'a> PluginLoader<'a> {
233
249
mem:: transmute :: < * mut u8 , PluginRegistrarFun > ( registrar)
234
250
}
235
251
// again fatal if we can't register macros
236
- Err ( err) => self . sess . span_fatal ( vi. span , & err[ ] )
252
+ Err ( err) => {
253
+ if let CrateOrString :: Krate ( cr) = c {
254
+ self . sess . span_fatal ( cr. span , & err[ ] )
255
+ } else {
256
+ self . sess . fatal ( & err[ ] )
257
+ }
258
+ }
237
259
} ;
238
260
239
261
// Intentionally leak the dynamic library. We can't ever unload it
0 commit comments