2121extern mod extra;
2222extern mod syntax;
2323
24- use driver:: driver:: { host_triple, optgroups, early_error} ;
25- use driver:: driver:: { str_input, file_input, build_session_options} ;
26- use driver:: driver:: { build_session, build_configuration, parse_pretty} ;
27- use driver:: driver:: { PpMode , pretty_print_input, list_metadata} ;
28- use driver:: driver:: { compile_input} ;
24+ use back:: link;
2925use driver:: session;
3026use middle:: lint;
3127
28+ use d = driver:: driver;
29+
3230use std:: cast;
3331use std:: comm;
3432use std:: io;
@@ -41,9 +39,12 @@ use std::task;
4139use std:: vec;
4240use extra:: getopts:: groups;
4341use extra:: getopts;
42+ use syntax:: ast;
43+ use syntax:: attr;
4444use syntax:: codemap;
4545use syntax:: diagnostic:: Emitter ;
4646use syntax:: diagnostic;
47+ use syntax:: parse;
4748
4849pub mod middle {
4950 pub mod trans;
@@ -137,7 +138,7 @@ pub fn version(argv0: &str) {
137138 None => "unknown version"
138139 } ;
139140 println ! ( "{} {}" , argv0, vers) ;
140- println ! ( "host: {}" , host_triple( ) ) ;
141+ println ! ( "host: {}" , d :: host_triple( ) ) ;
141142}
142143
143144pub fn usage ( argv0 : & str ) {
@@ -146,7 +147,7 @@ pub fn usage(argv0: &str) {
146147 Additional help:
147148 -W help Print 'lint' options and default settings
148149 -Z help Print internal options for debugging rustc\n " ,
149- groups:: usage( message, optgroups( ) ) ) ;
150+ groups:: usage( message, d :: optgroups( ) ) ) ;
150151}
151152
152153pub fn describe_warnings ( ) {
@@ -206,10 +207,10 @@ pub fn run_compiler(args: &[~str], demitter: @diagnostic::Emitter) {
206207 if args. is_empty ( ) { usage ( binary) ; return ; }
207208
208209 let matches =
209- & match getopts:: groups:: getopts ( args, optgroups ( ) ) {
210+ & match getopts:: groups:: getopts ( args, d :: optgroups ( ) ) {
210211 Ok ( m) => m,
211212 Err ( f) => {
212- early_error ( demitter, f. to_err_msg ( ) ) ;
213+ d :: early_error ( demitter, f. to_err_msg ( ) ) ;
213214 }
214215 } ;
215216
@@ -246,48 +247,97 @@ pub fn run_compiler(args: &[~str], demitter: @diagnostic::Emitter) {
246247 return ;
247248 }
248249 let input = match matches. free . len ( ) {
249- 0 u => early_error ( demitter, "no input filename given" ) ,
250+ 0 u => d :: early_error ( demitter, "no input filename given" ) ,
250251 1 u => {
251252 let ifile = matches. free [ 0 ] . as_slice ( ) ;
252253 if "-" == ifile {
253254 let src = str:: from_utf8_owned ( io:: stdin ( ) . read_to_end ( ) ) ;
254- str_input ( src. to_managed ( ) )
255+ d :: str_input ( src. to_managed ( ) )
255256 } else {
256- file_input ( Path :: new ( ifile) )
257+ d :: file_input ( Path :: new ( ifile) )
257258 }
258259 }
259- _ => early_error ( demitter, "multiple input filenames provided" )
260+ _ => d :: early_error ( demitter, "multiple input filenames provided" )
260261 } ;
261262
262- let sopts = build_session_options ( binary, matches, demitter) ;
263- let sess = build_session ( sopts, demitter) ;
263+ let sopts = d :: build_session_options ( binary, matches, demitter) ;
264+ let sess = d :: build_session ( sopts, demitter) ;
264265 let odir = matches. opt_str ( "out-dir" ) . map ( |o| Path :: new ( o) ) ;
265266 let ofile = matches. opt_str ( "o" ) . map ( |o| Path :: new ( o) ) ;
266- let cfg = build_configuration ( sess) ;
267+ let cfg = d :: build_configuration ( sess) ;
267268 let pretty = matches. opt_default ( "pretty" , "normal" ) . map ( |a| {
268- parse_pretty ( sess, a)
269+ d :: parse_pretty ( sess, a)
269270 } ) ;
270271 match pretty {
271- Some :: < PpMode > ( ppm) => {
272- pretty_print_input ( sess, cfg, & input, ppm) ;
272+ Some :: < d :: PpMode > ( ppm) => {
273+ d :: pretty_print_input ( sess, cfg, & input, ppm) ;
273274 return ;
274275 }
275- None :: < PpMode > => { /* continue */ }
276+ None :: < d :: PpMode > => { /* continue */ }
276277 }
277278 let ls = matches. opt_present( "ls" ) ;
278279 if ls {
279280 match input {
280- file_input( ref ifile) => {
281- list_metadata ( sess, & ( * ifile) , @mut io:: stdout ( ) as @mut io:: Writer ) ;
281+ d : : file_input ( ref ifile) => {
282+ d:: list_metadata ( sess, & ( * ifile) ,
283+ @mut io:: stdout ( ) as @mut io:: Writer ) ;
282284 }
283- str_input( _) => {
284- early_error ( demitter, "can not list metadata for stdin" ) ;
285+ d :: str_input ( _) => {
286+ d :: early_error ( demitter, "can not list metadata for stdin" ) ;
285287 }
286288 }
287289 return;
288290 }
291+ let ( crate_id, crate_name, crate_file_name) = sopts. print_metas ;
292+ // these nasty nested conditions are to avoid doing extra work
293+ if crate_id || crate_name || crate_file_name {
294+ let attrs = parse_crate_attrs ( sess, & input) ;
295+ let t_outputs = d:: build_output_filenames ( & input, & odir, & ofile,
296+ attrs, sess) ;
297+ if crate_id || crate_name {
298+ let pkgid = match attr:: find_pkgid ( attrs) {
299+ Some ( pkgid) => pkgid,
300+ None => {
301+ sess. fatal ( "No crate_id and --crate-id or \
302+ --crate-name requested")
303+ }
304+ } ;
305+ if crate_id {
306+ println ( pkgid. to_str ( ) ) ;
307+ }
308+ if crate_name {
309+ println ( pkgid. name ) ;
310+ }
311+ }
312+
313+ if crate_file_name {
314+ let lm = link:: build_link_meta ( sess, attrs, & t_outputs. obj_filename ,
315+ & mut :: util:: sha2:: Sha256 :: new ( ) ) ;
316+ let outputs = session:: collect_outputs ( sopts, attrs) ;
317+ for & style in outputs. iter ( ) {
318+ let fname = link:: filename_for_input ( & sess, style, & lm,
319+ & t_outputs. out_filename ) ;
320+ println ! ( "{}" , fname. filename_display( ) ) ;
321+ }
322+ }
323+
324+ return ;
325+ }
326+
327+ d:: compile_input ( sess, cfg, & input, & odir, & ofile) ;
328+ }
289329
290- compile_input ( sess, cfg, & input, & odir, & ofile) ;
330+ fn parse_crate_attrs ( sess : session:: Session ,
331+ input : & d:: input ) -> ~[ ast:: Attribute ] {
332+ match * input {
333+ d:: file_input( ref ifile) => {
334+ parse:: parse_crate_attrs_from_file ( ifile, ~[ ] , sess. parse_sess )
335+ }
336+ d:: str_input( src) => {
337+ parse:: parse_crate_attrs_from_source_str (
338+ d:: anon_src ( ) , src, ~[ ] , sess. parse_sess )
339+ }
340+ }
291341}
292342
293343#[ deriving( Eq ) ]
0 commit comments