@@ -242,22 +242,23 @@ named!(import_from<StrSpan, Import>,
242242 keyword!( "from" ) >>
243243 spaces2 >>
244244 import_from: alt!(
245- preceded! ( char ! ( '.' ) , do_parse!(
246- leading_dots: ws2!( map!( many0!( char !( '.' ) ) , |dots| dots. len( ) + 1 ) ) >>
245+ do_parse!(
246+ leading_dots: ws2!( map!( many0!( char !( '.' ) ) , |dots| dots. len( ) ) ) >>
247247 from_name: opt!( call!( ImportParser :: <NewlinesAreNotSpaces >:: dotted_name) ) >> (
248248 ( leading_dots, from_name. unwrap_or( Vec :: new( ) ) )
249249 )
250- ) )
250+ )
251251 | call!( ImportParser :: <NewlinesAreNotSpaces >:: dotted_name) => { |n| ( 0 , n) }
252252 ) >>
253- space_sep2 >>
254- keyword!( "import" ) >>
253+ spaces2 >>
254+ dbg_dmp! ( keyword!( "import" ) ) >>
255255 spaces2 >>
256256 names: alt!(
257257 char !( '*' ) => { |_| Vec :: new( ) }
258258 | ws2!( delimited!( char !( '(' ) , call!( ImportParser :: <NewlinesAreSpaces >:: import_as_names) , char !( ')' ) ) )
259259 | call!( ImportParser :: <NewlinesAreNotSpaces >:: import_as_names)
260- ) >> ( {
260+ ) >>
261+ ( {
261262 let ( leading_dots, path) = import_from;
262263 if names. len( ) > 0 {
263264 Import :: ImportFrom { leading_dots, path, names }
@@ -1108,6 +1109,57 @@ mod tests {
11081109 ) ) ) ;
11091110 }
11101111
1112+ #[ test]
1113+ fn test_import_from ( ) {
1114+ assert_parse_eq ( statement ( make_strspan ( "from . import foo" ) , 0 ) , Ok ( ( make_strspan ( "" ) ,
1115+ vec ! [ Statement :: Import ( Import :: ImportFrom {
1116+ leading_dots: 1 ,
1117+ path: vec![ ] ,
1118+ names: vec![ ( "foo" . to_string( ) , None ) ] ,
1119+ } ) ]
1120+ ) ) ) ;
1121+
1122+ assert_parse_eq ( statement ( make_strspan ( "from . import foo as bar" ) , 0 ) , Ok ( ( make_strspan ( "" ) ,
1123+ vec ! [ Statement :: Import ( Import :: ImportFrom {
1124+ leading_dots: 1 ,
1125+ path: vec![ ] ,
1126+ names: vec![ ( "foo" . to_string( ) , Some ( "bar" . to_string( ) ) ) ] ,
1127+ } ) ]
1128+ ) ) ) ;
1129+
1130+ assert_parse_eq ( statement ( make_strspan ( "from qux import foo" ) , 0 ) , Ok ( ( make_strspan ( "" ) ,
1131+ vec ! [ Statement :: Import ( Import :: ImportFrom {
1132+ leading_dots: 0 ,
1133+ path: vec![ "qux" . to_string( ) ] ,
1134+ names: vec![ ( "foo" . to_string( ) , None ) ] ,
1135+ } ) ]
1136+ ) ) ) ;
1137+
1138+ assert_parse_eq ( statement ( make_strspan ( "from qux import foo as bar" ) , 0 ) , Ok ( ( make_strspan ( "" ) ,
1139+ vec ! [ Statement :: Import ( Import :: ImportFrom {
1140+ leading_dots: 0 ,
1141+ path: vec![ "qux" . to_string( ) ] ,
1142+ names: vec![ ( "foo" . to_string( ) , Some ( "bar" . to_string( ) ) ) ] ,
1143+ } ) ]
1144+ ) ) ) ;
1145+
1146+ assert_parse_eq ( statement ( make_strspan ( "from .qux import foo" ) , 0 ) , Ok ( ( make_strspan ( "" ) ,
1147+ vec ! [ Statement :: Import ( Import :: ImportFrom {
1148+ leading_dots: 1 ,
1149+ path: vec![ "qux" . to_string( ) ] ,
1150+ names: vec![ ( "foo" . to_string( ) , None ) ] ,
1151+ } ) ]
1152+ ) ) ) ;
1153+
1154+ assert_parse_eq ( statement ( make_strspan ( "from .qux import foo as bar" ) , 0 ) , Ok ( ( make_strspan ( "" ) ,
1155+ vec ! [ Statement :: Import ( Import :: ImportFrom {
1156+ leading_dots: 1 ,
1157+ path: vec![ "qux" . to_string( ) ] ,
1158+ names: vec![ ( "foo" . to_string( ) , Some ( "bar" . to_string( ) ) ) ] ,
1159+ } ) ]
1160+ ) ) ) ;
1161+ }
1162+
11111163 #[ test]
11121164 fn test_unpack ( ) {
11131165 assert_parse_eq ( testlist_star_expr ( make_strspan ( "foo," ) ) , Ok ( ( make_strspan ( "" ) ,
0 commit comments