@@ -73,22 +73,24 @@ struct CrateInfo {
7373}
7474
7575pub fn validate_crate_name ( sess : Option < & Session > , s : & str , sp : Option < Span > ) {
76- let err = |s : & str | {
76+ let say = |s : & str , warn : bool | {
7777 match ( sp, sess) {
7878 ( _, None ) => panic ! ( "{}" , s) ,
79+ ( Some ( sp) , Some ( sess) ) if warn => sess. span_warn ( sp, s) ,
7980 ( Some ( sp) , Some ( sess) ) => sess. span_err ( sp, s) ,
81+ ( None , Some ( sess) ) if warn => sess. warn ( s) ,
8082 ( None , Some ( sess) ) => sess. err ( s) ,
8183 }
8284 } ;
8385 if s. len ( ) == 0 {
84- err ( "crate name must not be empty" ) ;
85- } else if s. char_at ( 0 ) == '-' {
86- err ( & format ! ( "crate name cannot start with a hyphen : {}" , s) ) ;
86+ say ( "crate name must not be empty" , false ) ;
87+ } else if s. contains ( "-" ) {
88+ say ( & format ! ( "crate names soon cannot contain hyphens : {}" , s) , true ) ;
8789 }
8890 for c in s. chars ( ) {
8991 if c. is_alphanumeric ( ) { continue }
9092 if c == '_' || c == '-' { continue }
91- err ( & format ! ( "invalid character `{}` in crate name: `{}`" , c, s) ) ;
93+ say ( & format ! ( "invalid character `{}` in crate name: `{}`" , c, s) , false ) ;
9294 }
9395 match sess {
9496 Some ( sess) => sess. abort_if_errors ( ) ,
@@ -153,8 +155,9 @@ impl<'a> CrateReader<'a> {
153155 }
154156 }
155157
156- // Traverses an AST, reading all the information about use'd crates and extern
157- // libraries necessary for later resolving, typechecking, linking, etc.
158+ // Traverses an AST, reading all the information about use'd crates and
159+ // extern libraries necessary for later resolving, typechecking, linking,
160+ // etc.
158161 pub fn read_crates ( & mut self , krate : & ast:: Crate ) {
159162 self . process_crate ( krate) ;
160163 visit:: walk_crate ( self , krate) ;
@@ -184,11 +187,10 @@ impl<'a> CrateReader<'a> {
184187 debug ! ( "resolving extern crate stmt. ident: {} path_opt: {:?}" ,
185188 ident, path_opt) ;
186189 let name = match * path_opt {
187- Some ( ( ref path_str, _) ) => {
188- let name = path_str. to_string ( ) ;
189- validate_crate_name ( Some ( self . sess ) , & name[ ..] ,
190+ Some ( name) => {
191+ validate_crate_name ( Some ( self . sess ) , name. as_str ( ) ,
190192 Some ( i. span ) ) ;
191- name
193+ name. as_str ( ) . to_string ( )
192194 }
193195 None => ident. to_string ( ) ,
194196 } ;
@@ -304,7 +306,13 @@ impl<'a> CrateReader<'a> {
304306 -> Option < ast:: CrateNum > {
305307 let mut ret = None ;
306308 self . sess . cstore . iter_crate_data ( |cnum, data| {
307- if data. name != name { return }
309+ // For now we do a "fuzzy match" on crate names by considering
310+ // hyphens equal to underscores. This is purely meant to be a
311+ // transitionary feature while we deprecate the quote syntax of
312+ // `extern crate` statements.
313+ if data. name != name. replace ( "-" , "_" ) {
314+ return
315+ }
308316
309317 match hash {
310318 Some ( hash) if * hash == data. hash ( ) => { ret = Some ( cnum) ; return }
0 commit comments