@@ -73,22 +73,24 @@ struct CrateInfo {
73
73
}
74
74
75
75
pub fn validate_crate_name ( sess : Option < & Session > , s : & str , sp : Option < Span > ) {
76
- let err = |s : & str | {
76
+ let say = |s : & str , warn : bool | {
77
77
match ( sp, sess) {
78
78
( _, None ) => panic ! ( "{}" , s) ,
79
+ ( Some ( sp) , Some ( sess) ) if warn => sess. span_warn ( sp, s) ,
79
80
( Some ( sp) , Some ( sess) ) => sess. span_err ( sp, s) ,
81
+ ( None , Some ( sess) ) if warn => sess. warn ( s) ,
80
82
( None , Some ( sess) ) => sess. err ( s) ,
81
83
}
82
84
} ;
83
85
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 ) ;
87
89
}
88
90
for c in s. chars ( ) {
89
91
if c. is_alphanumeric ( ) { continue }
90
92
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 ) ;
92
94
}
93
95
match sess {
94
96
Some ( sess) => sess. abort_if_errors ( ) ,
@@ -153,8 +155,9 @@ impl<'a> CrateReader<'a> {
153
155
}
154
156
}
155
157
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.
158
161
pub fn read_crates ( & mut self , krate : & ast:: Crate ) {
159
162
self . process_crate ( krate) ;
160
163
visit:: walk_crate ( self , krate) ;
@@ -184,11 +187,10 @@ impl<'a> CrateReader<'a> {
184
187
debug ! ( "resolving extern crate stmt. ident: {} path_opt: {:?}" ,
185
188
ident, path_opt) ;
186
189
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 ( ) ,
190
192
Some ( i. span ) ) ;
191
- name
193
+ name. as_str ( ) . to_string ( )
192
194
}
193
195
None => ident. to_string ( ) ,
194
196
} ;
@@ -304,7 +306,13 @@ impl<'a> CrateReader<'a> {
304
306
-> Option < ast:: CrateNum > {
305
307
let mut ret = None ;
306
308
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
+ }
308
316
309
317
match hash {
310
318
Some ( hash) if * hash == data. hash ( ) => { ret = Some ( cnum) ; return }
0 commit comments