comparison src/ast_convert.rs @ 20:ace12d6b9855

Replace every loop in ast_convert with parse_list.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Fri, 03 Jun 2016 01:22:12 +0100
parents 0cb53a31ac12
children 7af637f444d1
comparison
equal deleted inserted replaced
19:0cb53a31ac12 20:ace12d6b9855
29 } else{ 29 } else{
30 unreachable!(); 30 unreachable!();
31 } 31 }
32 } 32 }
33 33
34 fn parse_expr_vec(py: Python, list: PyObject) -> Vec<expr> { 34 fn parse_list<T, F: Fn(Python, PyObject) -> T>(py: Python, list: PyObject, parse: F) -> Vec<T> {
35 let mut exprs = vec!(); 35 let mut exprs = vec!();
36 for item in list.iter(py).unwrap() { 36 for item in list.iter(py).unwrap() {
37 let item = item.unwrap(); 37 let item = item.unwrap();
38 let item = parse_expr(py, item); 38 let item = parse(py, item);
39 exprs.push(item); 39 exprs.push(item);
40 } 40 }
41 exprs 41 exprs
42 }
43
44 fn parse_string_vec(py: Python, ast: PyObject) -> Vec<String> {
45 let builtins_module = py.import("builtins").unwrap();
46 let isinstance = builtins_module.get(py, "isinstance").unwrap();
47
48 let is_instance = |object: &PyObject, type_: &PyObject| {
49 return isinstance.call(py, (object, type_), None).unwrap().is_true(py).unwrap();
50 };
51
52 let ast_module = py.import("ast").unwrap();
53 let ast_type = ast_module.get(py, "AST").unwrap();
54 let arguments_type = ast_module.get(py, "arguments").unwrap();
55
56 assert!(is_instance(&ast, &ast_type));
57
58 if is_instance(&ast, &arguments_type) {
59 let args = ast.getattr(py, "args").unwrap();
60 let mut arguments = vec!();
61 for arg in args.iter(py).unwrap() {
62 let arg = arg.unwrap();
63 let arg = parse_expr(py, arg);
64 arguments.push(match arg {
65 expr::Name(arg, expr_context::Load) => arg,
66 _ => panic!()
67 });
68 }
69 arguments
70 } else {
71 panic!()
72 }
73 } 42 }
74 43
75 fn parse_unaryop(py: Python, ast: PyObject) -> unaryop { 44 fn parse_unaryop(py: Python, ast: PyObject) -> unaryop {
76 let builtins_module = py.import("builtins").unwrap(); 45 let builtins_module = py.import("builtins").unwrap();
77 let isinstance = builtins_module.get(py, "isinstance").unwrap(); 46 let isinstance = builtins_module.get(py, "isinstance").unwrap();
173 unreachable!() 142 unreachable!()
174 } 143 }
175 } 144 }
176 145
177 fn parse_comprehension(py: Python, ast: PyObject) -> comprehension { 146 fn parse_comprehension(py: Python, ast: PyObject) -> comprehension {
178 let target = ast.getattr(py, "target").unwrap(); 147 let target = ast.getattr(py, "target").unwrap();
179 let iter = ast.getattr(py, "iter").unwrap(); 148 let iter = ast.getattr(py, "iter").unwrap();
180 let ifs = ast.getattr(py, "ifs").unwrap(); 149 let ifs = ast.getattr(py, "ifs").unwrap();
181 let ifs = ifs.iter(py).unwrap(); 150
182 151 let target = parse_expr(py, target);
183 let target = parse_expr(py, target); 152 let iter = parse_expr(py, iter);
184 let iter = parse_expr(py, iter); 153 let ifs = parse_list(py, ifs, parse_expr);
185 154
186 let mut new_ifs = vec!(); 155 comprehension {target: target, iter: iter, ifs: ifs}
187 for if_ in ifs {
188 let if_ = parse_expr(py, if_.unwrap());
189 new_ifs.push(if_);
190 }
191 comprehension {target: target, iter: iter, ifs: new_ifs}
192
193 } 156 }
194 157
195 fn parse_operator(py: Python, ast: PyObject) -> operator { 158 fn parse_operator(py: Python, ast: PyObject) -> operator {
196 let builtins_module = py.import("builtins").unwrap(); 159 let builtins_module = py.import("builtins").unwrap();
197 let isinstance = builtins_module.get(py, "isinstance").unwrap(); 160 let isinstance = builtins_module.get(py, "isinstance").unwrap();
306 let s = ast.getattr(py, "s").unwrap(); 269 let s = ast.getattr(py, "s").unwrap();
307 let s = get_str(py, s); 270 let s = get_str(py, s);
308 expr::Str(s) 271 expr::Str(s)
309 } else if is_instance(&ast, &list_type) { 272 } else if is_instance(&ast, &list_type) {
310 let elts = ast.getattr(py, "elts").unwrap(); 273 let elts = ast.getattr(py, "elts").unwrap();
311 274 let elements = parse_list(py, elts, parse_expr);
312 let mut elements = vec!();
313 for elt in elts.iter(py).unwrap() {
314 let elt = elt.unwrap();
315 elements.push(parse_expr(py, elt));
316 }
317
318 expr::List(elements, get_ctx(py, ast)) 275 expr::List(elements, get_ctx(py, ast))
319 } else if is_instance(&ast, &unary_op_type) { 276 } else if is_instance(&ast, &unary_op_type) {
320 let op = ast.getattr(py, "op").unwrap(); 277 let op = ast.getattr(py, "op").unwrap();
321 let operand = ast.getattr(py, "operand").unwrap(); 278 let operand = ast.getattr(py, "operand").unwrap();
322 279
327 } else if is_instance(&ast, &bool_op_type) { 284 } else if is_instance(&ast, &bool_op_type) {
328 let op = ast.getattr(py, "op").unwrap(); 285 let op = ast.getattr(py, "op").unwrap();
329 let values = ast.getattr(py, "values").unwrap(); 286 let values = ast.getattr(py, "values").unwrap();
330 287
331 let op = parse_boolop(py, op); 288 let op = parse_boolop(py, op);
332 let values = parse_expr_vec(py, values); 289 let values = parse_list(py, values, parse_expr);
333 290
334 expr::BoolOp(op, values) 291 expr::BoolOp(op, values)
335 } else if is_instance(&ast, &bin_op_type) { 292 } else if is_instance(&ast, &bin_op_type) {
336 let left = ast.getattr(py, "left").unwrap(); 293 let left = ast.getattr(py, "left").unwrap();
337 let op = ast.getattr(py, "op").unwrap(); 294 let op = ast.getattr(py, "op").unwrap();
346 let func = ast.getattr(py, "func").unwrap(); 303 let func = ast.getattr(py, "func").unwrap();
347 let args = ast.getattr(py, "args").unwrap(); 304 let args = ast.getattr(py, "args").unwrap();
348 let keywords = ast.getattr(py, "keywords").unwrap(); 305 let keywords = ast.getattr(py, "keywords").unwrap();
349 306
350 let func = parse_expr(py, func); 307 let func = parse_expr(py, func);
351 308 let args = parse_list(py, args, parse_expr);
352 let mut arguments = vec!();
353 for arg in args.iter(py).unwrap() {
354 let arg = arg.unwrap();
355 arguments.push(parse_expr(py, arg));
356 }
357 309
358 /* 310 /*
359 let mut kwargs = vec!(); 311 let mut kwargs = vec!();
360 for arg in keywords.iter(py).unwrap() { 312 for arg in keywords.iter(py).unwrap() {
361 let arg = arg.unwrap(); 313 let arg = arg.unwrap();
362 kwargs.push(parse_expr(py, arg)); 314 kwargs.push(parse_expr(py, arg));
363 } 315 }
364 */ 316 */
365 317
366 expr::Call(Box::new(func), arguments, vec!()) 318 expr::Call(Box::new(func), args, vec!())
367 } else if is_instance(&ast, &compare_type) { 319 } else if is_instance(&ast, &compare_type) {
368 let left = ast.getattr(py, "left").unwrap(); 320 let left = ast.getattr(py, "left").unwrap();
369 let ops = ast.getattr(py, "ops").unwrap(); 321 let ops = ast.getattr(py, "ops").unwrap();
370 let comparators = ast.getattr(py, "comparators").unwrap(); 322 let comparators = ast.getattr(py, "comparators").unwrap();
371 323
372 let left = parse_expr(py, left); 324 let left = parse_expr(py, left);
373 let ops = ops.iter(py).unwrap(); 325 let ops = parse_list(py, ops, parse_cmpop);
374 let comparators = comparators.iter(py).unwrap(); 326 let comparators = parse_list(py, comparators, parse_expr);
375 327
376 let mut new_ops = vec!(); 328 expr::Compare(Box::new(left), ops, comparators)
377 for op in ops {
378 let op = op.unwrap();
379 let op = parse_cmpop(py, op);
380 new_ops.push(op);
381 }
382
383 let mut new_comparators = vec!();
384 for comparator in comparators {
385 let comparator = comparator.unwrap();
386 let comparator = parse_expr(py, comparator);
387 new_comparators.push(comparator);
388 }
389
390 expr::Compare(Box::new(left), new_ops, new_comparators)
391 } else if is_instance(&ast, &listcomp_type) { 329 } else if is_instance(&ast, &listcomp_type) {
392 let elt = ast.getattr(py, "elt").unwrap(); 330 let elt = ast.getattr(py, "elt").unwrap();
393 let generators = ast.getattr(py, "generators").unwrap(); 331 let generators = ast.getattr(py, "generators").unwrap();
394 let generators = generators.iter(py).unwrap();
395 332
396 let elt = parse_expr(py, elt); 333 let elt = parse_expr(py, elt);
397 334 let generators = parse_list(py, generators, parse_comprehension);
398 let mut new_gens = vec!(); 335
399 for gen in generators { 336 expr::ListComp(Box::new(elt), generators)
400 let gen = gen.unwrap();
401 let gen = parse_comprehension(py, gen);
402 new_gens.push(gen);
403 }
404 expr::ListComp(Box::new(elt), new_gens)
405 } else if is_instance(&ast, &dictcomp_type) { 337 } else if is_instance(&ast, &dictcomp_type) {
406 let key = ast.getattr(py, "key").unwrap(); 338 let key = ast.getattr(py, "key").unwrap();
407 let value = ast.getattr(py, "value").unwrap(); 339 let value = ast.getattr(py, "value").unwrap();
408 let generators = ast.getattr(py, "generators").unwrap(); 340 let generators = ast.getattr(py, "generators").unwrap();
409 let generators = generators.iter(py).unwrap();
410 341
411 let key = parse_expr(py, key); 342 let key = parse_expr(py, key);
412 let value = parse_expr(py, value); 343 let value = parse_expr(py, value);
413 344 let generators = parse_list(py, generators, parse_comprehension);
414 let mut new_gens = vec!(); 345
415 for gen in generators { 346 expr::DictComp(Box::new(key), Box::new(value), generators)
416 let gen = gen.unwrap();
417 let gen = parse_comprehension(py, gen);
418 new_gens.push(gen);
419 }
420 expr::DictComp(Box::new(key), Box::new(value), new_gens)
421 } else if is_instance(&ast, &tuple_type) { 347 } else if is_instance(&ast, &tuple_type) {
422 let elts = ast.getattr(py, "elts").unwrap(); 348 let elts = ast.getattr(py, "elts").unwrap();
423 let elts = elts.iter(py).unwrap(); 349 let elts = parse_list(py, elts, parse_expr);
424 350 expr::Tuple(elts, get_ctx(py, ast))
425 let mut new_elts = vec!();
426 for elt in elts {
427 let elt = elt.unwrap();
428 let elt = parse_expr(py, elt);
429 new_elts.push(elt);
430 }
431 expr::Tuple(new_elts, get_ctx(py, ast))
432 } else { 351 } else {
433 println!("expr {}", ast); 352 println!("expr {}", ast);
434 unreachable!() 353 unreachable!()
435 } 354 }
436 } 355 }
530 //let keywords = ast.getattr(py, "keywords").unwrap(); 449 //let keywords = ast.getattr(py, "keywords").unwrap();
531 let body = ast.getattr(py, "body").unwrap(); 450 let body = ast.getattr(py, "body").unwrap();
532 //let decorator_list = ast.getattr(py, "decorator_list").unwrap(); 451 //let decorator_list = ast.getattr(py, "decorator_list").unwrap();
533 452
534 let name = get_str(py, name); 453 let name = get_str(py, name);
535 454 let bases = parse_list(py, bases, parse_expr);
536 let mut nodes = vec!(); 455 let body = parse_list(py, body, parse_statement);
537 for name_node in bases.iter(py).unwrap() { 456
538 let name_node = name_node.unwrap(); 457 stmt::ClassDef(name, bases, vec!(), body, vec!())
539 let name_node = parse_expr(py, name_node);
540 nodes.push(name_node);
541 }
542
543 let mut statements = vec!();
544 for statement in body.iter(py).unwrap() {
545 let statement = statement.unwrap();
546 let statement = parse_statement(py, statement);
547 statements.push(statement);
548 }
549
550 stmt::ClassDef(name, nodes, vec!(), statements, vec!())
551 } else if is_instance(&ast, &function_def_type) { 458 } else if is_instance(&ast, &function_def_type) {
552 let name = ast.getattr(py, "name").unwrap(); 459 let name = ast.getattr(py, "name").unwrap();
553 let args = ast.getattr(py, "args").unwrap(); 460 let args = ast.getattr(py, "args").unwrap();
554 let body = ast.getattr(py, "body").unwrap(); 461 let body = ast.getattr(py, "body").unwrap();
555 462
556 let name = get_str(py, name); 463 let name = get_str(py, name);
557 let args = parse_arguments(py, args); 464 let args = parse_arguments(py, args);
558 465 let body = parse_list(py, body, parse_statement);
559 let mut statements = vec!();
560 for statement in body.iter(py).unwrap() {
561 let statement = parse_statement(py, statement.unwrap());
562 statements.push(statement);
563 }
564 466
565 let decorators = vec!(); 467 let decorators = vec!();
566 let returns = None; 468 let returns = None;
567 469
568 stmt::FunctionDef(name, args, statements, decorators, returns) 470 stmt::FunctionDef(name, args, body, decorators, returns)
569 } else if is_instance(&ast, &global_type) { 471 } else if is_instance(&ast, &global_type) {
570 let names = ast.getattr(py, "names").unwrap(); 472 let names = ast.getattr(py, "names").unwrap();
571 473 let names = parse_list(py, names, get_str);
572 let mut globals = vec!(); 474 stmt::Global(names)
573 for name in names.iter(py).unwrap() {
574 let name = name.unwrap();
575 let name = get_str(py, name);
576 globals.push(name);
577 }
578
579 stmt::Global(globals)
580 } else if is_instance(&ast, &if_type) { 475 } else if is_instance(&ast, &if_type) {
581 let test = ast.getattr(py, "test").unwrap(); 476 let test = ast.getattr(py, "test").unwrap();
582 let body = ast.getattr(py, "body").unwrap(); 477 let body = ast.getattr(py, "body").unwrap();
583 let orelse = ast.getattr(py, "orelse").unwrap(); 478 let orelse = ast.getattr(py, "orelse").unwrap();
584 479
585 let test = parse_expr(py, test); 480 let test = parse_expr(py, test);
586 481 let body = parse_list(py, body, parse_statement);
587 let mut statements = vec!(); 482 let orelse = parse_list(py, orelse, parse_statement);
588 for statement in body.iter(py).unwrap() { 483
589 let statement = statement.unwrap(); 484 stmt::If(test, body, orelse)
590 let statement = parse_statement(py, statement);
591 statements.push(statement);
592 }
593
594 let mut orelse_ = vec!();
595 for statement in orelse.iter(py).unwrap() {
596 let statement = statement.unwrap();
597 let statement = parse_statement(py, statement);
598 orelse_.push(statement);
599 }
600
601 stmt::If(test, statements, orelse_)
602 } else if is_instance(&ast, &while_type) { 485 } else if is_instance(&ast, &while_type) {
603 let test = ast.getattr(py, "test").unwrap(); 486 let test = ast.getattr(py, "test").unwrap();
604 let body = ast.getattr(py, "body").unwrap(); 487 let body = ast.getattr(py, "body").unwrap();
605 let orelse = ast.getattr(py, "orelse").unwrap(); 488 let orelse = ast.getattr(py, "orelse").unwrap();
606 489
607 let test = parse_expr(py, test); 490 let test = parse_expr(py, test);
608 491 let body = parse_list(py, body, parse_statement);
609 let mut statements = vec!(); 492 let orelse = parse_list(py, orelse, parse_statement);
610 for statement in body.iter(py).unwrap() { 493
611 let statement = statement.unwrap(); 494 stmt::While(test, body, orelse)
612 let statement = parse_statement(py, statement);
613 statements.push(statement);
614 }
615
616 let mut orelse_ = vec!();
617 for statement in orelse.iter(py).unwrap() {
618 let statement = statement.unwrap();
619 let statement = parse_statement(py, statement);
620 orelse_.push(statement);
621 }
622
623 stmt::While(test, statements, orelse_)
624 } else if is_instance(&ast, &for_type) { 495 } else if is_instance(&ast, &for_type) {
625 let target = ast.getattr(py, "target").unwrap(); 496 let target = ast.getattr(py, "target").unwrap();
626 let iter = ast.getattr(py, "iter").unwrap(); 497 let iter = ast.getattr(py, "iter").unwrap();
627 let body = ast.getattr(py, "body").unwrap(); 498 let body = ast.getattr(py, "body").unwrap();
628 let orelse = ast.getattr(py, "orelse").unwrap(); 499 let orelse = ast.getattr(py, "orelse").unwrap();
629 500
630 let target = parse_expr(py, target); 501 let target = parse_expr(py, target);
631 let iter = parse_expr(py, iter); 502 let iter = parse_expr(py, iter);
632 503 let body = parse_list(py, body, parse_statement);
633 let mut statements = vec!(); 504 let orelse = parse_list(py, orelse, parse_statement);
634 for statement in body.iter(py).unwrap() { 505
635 let statement = statement.unwrap(); 506 stmt::For(target, iter, body, orelse)
636 let statement = parse_statement(py, statement);
637 statements.push(statement);
638 }
639
640 let mut orelse_ = vec!();
641 for statement in orelse.iter(py).unwrap() {
642 let statement = statement.unwrap();
643 let statement = parse_statement(py, statement);
644 orelse_.push(statement);
645 }
646
647 stmt::For(target, iter, statements, orelse_)
648 } else if is_instance(&ast, &assign_type) { 507 } else if is_instance(&ast, &assign_type) {
649 let targets = ast.getattr(py, "targets").unwrap(); 508 let targets = ast.getattr(py, "targets").unwrap();
650 let value = ast.getattr(py, "value").unwrap(); 509 let value = ast.getattr(py, "value").unwrap();
651 510
652 let mut arguments = vec!(); 511 let targets = parse_list(py, targets, parse_expr);
653 for target in targets.iter(py).unwrap() {
654 let target = target.unwrap();
655 let target = parse_expr(py, target);
656 arguments.push(target);
657 }
658
659 let value = parse_expr(py, value); 512 let value = parse_expr(py, value);
660 513
661 stmt::Assign(arguments, value) 514 stmt::Assign(targets, value)
662 } else if is_instance(&ast, &aug_assign_type) { 515 } else if is_instance(&ast, &aug_assign_type) {
663 let target = ast.getattr(py, "target").unwrap(); 516 let target = ast.getattr(py, "target").unwrap();
664 let op = ast.getattr(py, "op").unwrap(); 517 let op = ast.getattr(py, "op").unwrap();
665 let value = ast.getattr(py, "value").unwrap(); 518 let value = ast.getattr(py, "value").unwrap();
666 519
674 let names = ast.getattr(py, "names").unwrap(); 527 let names = ast.getattr(py, "names").unwrap();
675 let level = ast.getattr(py, "level").unwrap(); 528 let level = ast.getattr(py, "level").unwrap();
676 529
677 let module = get_str(py, module); 530 let module = get_str(py, module);
678 531
532 // TODO: move that into another function.
679 let mut names_ = vec!(); 533 let mut names_ = vec!();
680 for alias in names.iter(py).unwrap() { 534 for alias in names.iter(py).unwrap() {
681 let alias = alias.unwrap(); 535 let alias = alias.unwrap();
682 let alias = parse_expr(py, alias); 536 let alias = parse_expr(py, alias);
683 println!("{:?}", alias); 537 println!("{:?}", alias);
718 let module_type = ast_module.get(py, "Module").unwrap(); 572 let module_type = ast_module.get(py, "Module").unwrap();
719 573
720 assert!(isinstance.call(py, (module, module_type), None).unwrap().is_true(py).unwrap()); 574 assert!(isinstance.call(py, (module, module_type), None).unwrap().is_true(py).unwrap());
721 575
722 let body = module.getattr(py, "body").unwrap(); 576 let body = module.getattr(py, "body").unwrap();
723 let mut statements = vec!(); 577 let body = parse_list(py, body, parse_statement);
724 for statement in body.iter(py).unwrap() { 578 Module{name: name, statements: body}
725 let statement = parse_statement(py, statement.unwrap()); 579 }
726 statements.push(statement)
727 }
728 Module{name: name, statements: statements}
729 }