diff options
Diffstat (limited to 'crates/ide_db/src/helpers')
-rw-r--r-- | crates/ide_db/src/helpers/insert_use/tests.rs | 84 | ||||
-rw-r--r-- | crates/ide_db/src/helpers/merge_imports.rs | 54 |
2 files changed, 77 insertions, 61 deletions
diff --git a/crates/ide_db/src/helpers/insert_use/tests.rs b/crates/ide_db/src/helpers/insert_use/tests.rs index 048c213e2..248227d29 100644 --- a/crates/ide_db/src/helpers/insert_use/tests.rs +++ b/crates/ide_db/src/helpers/insert_use/tests.rs | |||
@@ -44,7 +44,7 @@ fn insert_not_group_empty() { | |||
44 | 44 | ||
45 | #[test] | 45 | #[test] |
46 | fn insert_existing() { | 46 | fn insert_existing() { |
47 | check_full("std::fs", "use std::fs;", "use std::fs;") | 47 | check_crate("std::fs", "use std::fs;", "use std::fs;") |
48 | } | 48 | } |
49 | 49 | ||
50 | #[test] | 50 | #[test] |
@@ -249,7 +249,7 @@ use self::fmt;", | |||
249 | 249 | ||
250 | #[test] | 250 | #[test] |
251 | fn insert_no_imports() { | 251 | fn insert_no_imports() { |
252 | check_full( | 252 | check_crate( |
253 | "foo::bar", | 253 | "foo::bar", |
254 | "fn main() {}", | 254 | "fn main() {}", |
255 | r"use foo::bar; | 255 | r"use foo::bar; |
@@ -263,7 +263,7 @@ fn insert_empty_file() { | |||
263 | cov_mark::check!(insert_group_empty_file); | 263 | cov_mark::check!(insert_group_empty_file); |
264 | // empty files will get two trailing newlines | 264 | // empty files will get two trailing newlines |
265 | // this is due to the test case insert_no_imports above | 265 | // this is due to the test case insert_no_imports above |
266 | check_full( | 266 | check_crate( |
267 | "foo::bar", | 267 | "foo::bar", |
268 | "", | 268 | "", |
269 | r"use foo::bar; | 269 | r"use foo::bar; |
@@ -290,7 +290,7 @@ fn insert_empty_module() { | |||
290 | #[test] | 290 | #[test] |
291 | fn insert_after_inner_attr() { | 291 | fn insert_after_inner_attr() { |
292 | cov_mark::check!(insert_group_empty_inner_attr); | 292 | cov_mark::check!(insert_group_empty_inner_attr); |
293 | check_full( | 293 | check_crate( |
294 | "foo::bar", | 294 | "foo::bar", |
295 | r"#![allow(unused_imports)]", | 295 | r"#![allow(unused_imports)]", |
296 | r"#![allow(unused_imports)] | 296 | r"#![allow(unused_imports)] |
@@ -301,7 +301,7 @@ use foo::bar;", | |||
301 | 301 | ||
302 | #[test] | 302 | #[test] |
303 | fn insert_after_inner_attr2() { | 303 | fn insert_after_inner_attr2() { |
304 | check_full( | 304 | check_crate( |
305 | "foo::bar", | 305 | "foo::bar", |
306 | r"#![allow(unused_imports)] | 306 | r"#![allow(unused_imports)] |
307 | 307 | ||
@@ -371,12 +371,12 @@ fn main() {}"#, | |||
371 | 371 | ||
372 | #[test] | 372 | #[test] |
373 | fn merge_groups() { | 373 | fn merge_groups() { |
374 | check_last("std::io", r"use std::fmt;", r"use std::{fmt, io};") | 374 | check_module("std::io", r"use std::fmt;", r"use std::{fmt, io};") |
375 | } | 375 | } |
376 | 376 | ||
377 | #[test] | 377 | #[test] |
378 | fn merge_groups_last() { | 378 | fn merge_groups_last() { |
379 | check_last( | 379 | check_module( |
380 | "std::io", | 380 | "std::io", |
381 | r"use std::fmt::{Result, Display};", | 381 | r"use std::fmt::{Result, Display};", |
382 | r"use std::fmt::{Result, Display}; | 382 | r"use std::fmt::{Result, Display}; |
@@ -386,12 +386,12 @@ use std::io;", | |||
386 | 386 | ||
387 | #[test] | 387 | #[test] |
388 | fn merge_last_into_self() { | 388 | fn merge_last_into_self() { |
389 | check_last("foo::bar::baz", r"use foo::bar;", r"use foo::bar::{self, baz};"); | 389 | check_module("foo::bar::baz", r"use foo::bar;", r"use foo::bar::{self, baz};"); |
390 | } | 390 | } |
391 | 391 | ||
392 | #[test] | 392 | #[test] |
393 | fn merge_groups_full() { | 393 | fn merge_groups_full() { |
394 | check_full( | 394 | check_crate( |
395 | "std::io", | 395 | "std::io", |
396 | r"use std::fmt::{Result, Display};", | 396 | r"use std::fmt::{Result, Display};", |
397 | r"use std::{fmt::{Result, Display}, io};", | 397 | r"use std::{fmt::{Result, Display}, io};", |
@@ -400,17 +400,21 @@ fn merge_groups_full() { | |||
400 | 400 | ||
401 | #[test] | 401 | #[test] |
402 | fn merge_groups_long_full() { | 402 | fn merge_groups_long_full() { |
403 | check_full("std::foo::bar::Baz", r"use std::foo::bar::Qux;", r"use std::foo::bar::{Baz, Qux};") | 403 | check_crate("std::foo::bar::Baz", r"use std::foo::bar::Qux;", r"use std::foo::bar::{Baz, Qux};") |
404 | } | 404 | } |
405 | 405 | ||
406 | #[test] | 406 | #[test] |
407 | fn merge_groups_long_last() { | 407 | fn merge_groups_long_last() { |
408 | check_last("std::foo::bar::Baz", r"use std::foo::bar::Qux;", r"use std::foo::bar::{Baz, Qux};") | 408 | check_module( |
409 | "std::foo::bar::Baz", | ||
410 | r"use std::foo::bar::Qux;", | ||
411 | r"use std::foo::bar::{Baz, Qux};", | ||
412 | ) | ||
409 | } | 413 | } |
410 | 414 | ||
411 | #[test] | 415 | #[test] |
412 | fn merge_groups_long_full_list() { | 416 | fn merge_groups_long_full_list() { |
413 | check_full( | 417 | check_crate( |
414 | "std::foo::bar::Baz", | 418 | "std::foo::bar::Baz", |
415 | r"use std::foo::bar::{Qux, Quux};", | 419 | r"use std::foo::bar::{Qux, Quux};", |
416 | r"use std::foo::bar::{Baz, Quux, Qux};", | 420 | r"use std::foo::bar::{Baz, Quux, Qux};", |
@@ -419,7 +423,7 @@ fn merge_groups_long_full_list() { | |||
419 | 423 | ||
420 | #[test] | 424 | #[test] |
421 | fn merge_groups_long_last_list() { | 425 | fn merge_groups_long_last_list() { |
422 | check_last( | 426 | check_module( |
423 | "std::foo::bar::Baz", | 427 | "std::foo::bar::Baz", |
424 | r"use std::foo::bar::{Qux, Quux};", | 428 | r"use std::foo::bar::{Qux, Quux};", |
425 | r"use std::foo::bar::{Baz, Quux, Qux};", | 429 | r"use std::foo::bar::{Baz, Quux, Qux};", |
@@ -428,7 +432,7 @@ fn merge_groups_long_last_list() { | |||
428 | 432 | ||
429 | #[test] | 433 | #[test] |
430 | fn merge_groups_long_full_nested() { | 434 | fn merge_groups_long_full_nested() { |
431 | check_full( | 435 | check_crate( |
432 | "std::foo::bar::Baz", | 436 | "std::foo::bar::Baz", |
433 | r"use std::foo::bar::{Qux, quux::{Fez, Fizz}};", | 437 | r"use std::foo::bar::{Qux, quux::{Fez, Fizz}};", |
434 | r"use std::foo::bar::{Baz, Qux, quux::{Fez, Fizz}};", | 438 | r"use std::foo::bar::{Baz, Qux, quux::{Fez, Fizz}};", |
@@ -437,7 +441,7 @@ fn merge_groups_long_full_nested() { | |||
437 | 441 | ||
438 | #[test] | 442 | #[test] |
439 | fn merge_groups_long_last_nested() { | 443 | fn merge_groups_long_last_nested() { |
440 | check_last( | 444 | check_module( |
441 | "std::foo::bar::Baz", | 445 | "std::foo::bar::Baz", |
442 | r"use std::foo::bar::{Qux, quux::{Fez, Fizz}};", | 446 | r"use std::foo::bar::{Qux, quux::{Fez, Fizz}};", |
443 | r"use std::foo::bar::Baz; | 447 | r"use std::foo::bar::Baz; |
@@ -447,7 +451,7 @@ use std::foo::bar::{Qux, quux::{Fez, Fizz}};", | |||
447 | 451 | ||
448 | #[test] | 452 | #[test] |
449 | fn merge_groups_full_nested_deep() { | 453 | fn merge_groups_full_nested_deep() { |
450 | check_full( | 454 | check_crate( |
451 | "std::foo::bar::quux::Baz", | 455 | "std::foo::bar::quux::Baz", |
452 | r"use std::foo::bar::{Qux, quux::{Fez, Fizz}};", | 456 | r"use std::foo::bar::{Qux, quux::{Fez, Fizz}};", |
453 | r"use std::foo::bar::{Qux, quux::{Baz, Fez, Fizz}};", | 457 | r"use std::foo::bar::{Qux, quux::{Baz, Fez, Fizz}};", |
@@ -456,7 +460,7 @@ fn merge_groups_full_nested_deep() { | |||
456 | 460 | ||
457 | #[test] | 461 | #[test] |
458 | fn merge_groups_full_nested_long() { | 462 | fn merge_groups_full_nested_long() { |
459 | check_full( | 463 | check_crate( |
460 | "std::foo::bar::Baz", | 464 | "std::foo::bar::Baz", |
461 | r"use std::{foo::bar::Qux};", | 465 | r"use std::{foo::bar::Qux};", |
462 | r"use std::{foo::bar::{Baz, Qux}};", | 466 | r"use std::{foo::bar::{Baz, Qux}};", |
@@ -465,7 +469,7 @@ fn merge_groups_full_nested_long() { | |||
465 | 469 | ||
466 | #[test] | 470 | #[test] |
467 | fn merge_groups_last_nested_long() { | 471 | fn merge_groups_last_nested_long() { |
468 | check_full( | 472 | check_crate( |
469 | "std::foo::bar::Baz", | 473 | "std::foo::bar::Baz", |
470 | r"use std::{foo::bar::Qux};", | 474 | r"use std::{foo::bar::Qux};", |
471 | r"use std::{foo::bar::{Baz, Qux}};", | 475 | r"use std::{foo::bar::{Baz, Qux}};", |
@@ -474,7 +478,7 @@ fn merge_groups_last_nested_long() { | |||
474 | 478 | ||
475 | #[test] | 479 | #[test] |
476 | fn merge_groups_skip_pub() { | 480 | fn merge_groups_skip_pub() { |
477 | check_full( | 481 | check_crate( |
478 | "std::io", | 482 | "std::io", |
479 | r"pub use std::fmt::{Result, Display};", | 483 | r"pub use std::fmt::{Result, Display};", |
480 | r"pub use std::fmt::{Result, Display}; | 484 | r"pub use std::fmt::{Result, Display}; |
@@ -484,7 +488,7 @@ use std::io;", | |||
484 | 488 | ||
485 | #[test] | 489 | #[test] |
486 | fn merge_groups_skip_pub_crate() { | 490 | fn merge_groups_skip_pub_crate() { |
487 | check_full( | 491 | check_crate( |
488 | "std::io", | 492 | "std::io", |
489 | r"pub(crate) use std::fmt::{Result, Display};", | 493 | r"pub(crate) use std::fmt::{Result, Display};", |
490 | r"pub(crate) use std::fmt::{Result, Display}; | 494 | r"pub(crate) use std::fmt::{Result, Display}; |
@@ -494,7 +498,7 @@ use std::io;", | |||
494 | 498 | ||
495 | #[test] | 499 | #[test] |
496 | fn merge_groups_skip_attributed() { | 500 | fn merge_groups_skip_attributed() { |
497 | check_full( | 501 | check_crate( |
498 | "std::io", | 502 | "std::io", |
499 | r#" | 503 | r#" |
500 | #[cfg(feature = "gated")] use std::fmt::{Result, Display}; | 504 | #[cfg(feature = "gated")] use std::fmt::{Result, Display}; |
@@ -509,7 +513,7 @@ use std::io; | |||
509 | #[test] | 513 | #[test] |
510 | #[ignore] // FIXME: Support this | 514 | #[ignore] // FIXME: Support this |
511 | fn split_out_merge() { | 515 | fn split_out_merge() { |
512 | check_last( | 516 | check_module( |
513 | "std::fmt::Result", | 517 | "std::fmt::Result", |
514 | r"use std::{fmt, io};", | 518 | r"use std::{fmt, io};", |
515 | r"use std::fmt::{self, Result}; | 519 | r"use std::fmt::{self, Result}; |
@@ -519,29 +523,33 @@ use std::io;", | |||
519 | 523 | ||
520 | #[test] | 524 | #[test] |
521 | fn merge_into_module_import() { | 525 | fn merge_into_module_import() { |
522 | check_full("std::fmt::Result", r"use std::{fmt, io};", r"use std::{fmt::{self, Result}, io};") | 526 | check_crate("std::fmt::Result", r"use std::{fmt, io};", r"use std::{fmt::{self, Result}, io};") |
523 | } | 527 | } |
524 | 528 | ||
525 | #[test] | 529 | #[test] |
526 | fn merge_groups_self() { | 530 | fn merge_groups_self() { |
527 | check_full("std::fmt::Debug", r"use std::fmt;", r"use std::fmt::{self, Debug};") | 531 | check_crate("std::fmt::Debug", r"use std::fmt;", r"use std::fmt::{self, Debug};") |
528 | } | 532 | } |
529 | 533 | ||
530 | #[test] | 534 | #[test] |
531 | fn merge_mod_into_glob() { | 535 | fn merge_mod_into_glob() { |
532 | check_full("token::TokenKind", r"use token::TokenKind::*;", r"use token::TokenKind::{*, self};") | 536 | check_crate( |
537 | "token::TokenKind", | ||
538 | r"use token::TokenKind::*;", | ||
539 | r"use token::TokenKind::{*, self};", | ||
540 | ) | ||
533 | // FIXME: have it emit `use token::TokenKind::{self, *}`? | 541 | // FIXME: have it emit `use token::TokenKind::{self, *}`? |
534 | } | 542 | } |
535 | 543 | ||
536 | #[test] | 544 | #[test] |
537 | fn merge_self_glob() { | 545 | fn merge_self_glob() { |
538 | check_full("self", r"use self::*;", r"use self::{*, self};") | 546 | check_crate("self", r"use self::*;", r"use self::{*, self};") |
539 | // FIXME: have it emit `use {self, *}`? | 547 | // FIXME: have it emit `use {self, *}`? |
540 | } | 548 | } |
541 | 549 | ||
542 | #[test] | 550 | #[test] |
543 | fn merge_glob_nested() { | 551 | fn merge_glob_nested() { |
544 | check_full( | 552 | check_crate( |
545 | "foo::bar::quux::Fez", | 553 | "foo::bar::quux::Fez", |
546 | r"use foo::bar::{Baz, quux::*};", | 554 | r"use foo::bar::{Baz, quux::*};", |
547 | r"use foo::bar::{Baz, quux::{self::*, Fez}};", | 555 | r"use foo::bar::{Baz, quux::{self::*, Fez}};", |
@@ -550,7 +558,7 @@ fn merge_glob_nested() { | |||
550 | 558 | ||
551 | #[test] | 559 | #[test] |
552 | fn merge_nested_considers_first_segments() { | 560 | fn merge_nested_considers_first_segments() { |
553 | check_full( | 561 | check_crate( |
554 | "hir_ty::display::write_bounds_like_dyn_trait", | 562 | "hir_ty::display::write_bounds_like_dyn_trait", |
555 | r"use hir_ty::{autoderef, display::{HirDisplayError, HirFormatter}, method_resolution};", | 563 | r"use hir_ty::{autoderef, display::{HirDisplayError, HirFormatter}, method_resolution};", |
556 | r"use hir_ty::{autoderef, display::{HirDisplayError, HirFormatter, write_bounds_like_dyn_trait}, method_resolution};", | 564 | r"use hir_ty::{autoderef, display::{HirDisplayError, HirFormatter, write_bounds_like_dyn_trait}, method_resolution};", |
@@ -559,7 +567,7 @@ fn merge_nested_considers_first_segments() { | |||
559 | 567 | ||
560 | #[test] | 568 | #[test] |
561 | fn skip_merge_last_too_long() { | 569 | fn skip_merge_last_too_long() { |
562 | check_last( | 570 | check_module( |
563 | "foo::bar", | 571 | "foo::bar", |
564 | r"use foo::bar::baz::Qux;", | 572 | r"use foo::bar::baz::Qux;", |
565 | r"use foo::bar; | 573 | r"use foo::bar; |
@@ -569,7 +577,7 @@ use foo::bar::baz::Qux;", | |||
569 | 577 | ||
570 | #[test] | 578 | #[test] |
571 | fn skip_merge_last_too_long2() { | 579 | fn skip_merge_last_too_long2() { |
572 | check_last( | 580 | check_module( |
573 | "foo::bar::baz::Qux", | 581 | "foo::bar::baz::Qux", |
574 | r"use foo::bar;", | 582 | r"use foo::bar;", |
575 | r"use foo::bar; | 583 | r"use foo::bar; |
@@ -592,7 +600,7 @@ fn merge_last_fail() { | |||
592 | check_merge_only_fail( | 600 | check_merge_only_fail( |
593 | r"use foo::bar::{baz::{Qux, Fez}};", | 601 | r"use foo::bar::{baz::{Qux, Fez}};", |
594 | r"use foo::bar::{baaz::{Quux, Feez}};", | 602 | r"use foo::bar::{baaz::{Quux, Feez}};", |
595 | MergeBehavior::Last, | 603 | MergeBehavior::Module, |
596 | ); | 604 | ); |
597 | } | 605 | } |
598 | 606 | ||
@@ -601,7 +609,7 @@ fn merge_last_fail1() { | |||
601 | check_merge_only_fail( | 609 | check_merge_only_fail( |
602 | r"use foo::bar::{baz::{Qux, Fez}};", | 610 | r"use foo::bar::{baz::{Qux, Fez}};", |
603 | r"use foo::bar::baaz::{Quux, Feez};", | 611 | r"use foo::bar::baaz::{Quux, Feez};", |
604 | MergeBehavior::Last, | 612 | MergeBehavior::Module, |
605 | ); | 613 | ); |
606 | } | 614 | } |
607 | 615 | ||
@@ -610,7 +618,7 @@ fn merge_last_fail2() { | |||
610 | check_merge_only_fail( | 618 | check_merge_only_fail( |
611 | r"use foo::bar::baz::{Qux, Fez};", | 619 | r"use foo::bar::baz::{Qux, Fez};", |
612 | r"use foo::bar::{baaz::{Quux, Feez}};", | 620 | r"use foo::bar::{baaz::{Quux, Feez}};", |
613 | MergeBehavior::Last, | 621 | MergeBehavior::Module, |
614 | ); | 622 | ); |
615 | } | 623 | } |
616 | 624 | ||
@@ -619,7 +627,7 @@ fn merge_last_fail3() { | |||
619 | check_merge_only_fail( | 627 | check_merge_only_fail( |
620 | r"use foo::bar::baz::{Qux, Fez};", | 628 | r"use foo::bar::baz::{Qux, Fez};", |
621 | r"use foo::bar::baaz::{Quux, Feez};", | 629 | r"use foo::bar::baaz::{Quux, Feez};", |
622 | MergeBehavior::Last, | 630 | MergeBehavior::Module, |
623 | ); | 631 | ); |
624 | } | 632 | } |
625 | 633 | ||
@@ -648,12 +656,12 @@ fn check( | |||
648 | assert_eq_text!(ra_fixture_after, &result); | 656 | assert_eq_text!(ra_fixture_after, &result); |
649 | } | 657 | } |
650 | 658 | ||
651 | fn check_full(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) { | 659 | fn check_crate(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) { |
652 | check(path, ra_fixture_before, ra_fixture_after, Some(MergeBehavior::Full), false, true) | 660 | check(path, ra_fixture_before, ra_fixture_after, Some(MergeBehavior::Crate), false, true) |
653 | } | 661 | } |
654 | 662 | ||
655 | fn check_last(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) { | 663 | fn check_module(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) { |
656 | check(path, ra_fixture_before, ra_fixture_after, Some(MergeBehavior::Last), false, true) | 664 | check(path, ra_fixture_before, ra_fixture_after, Some(MergeBehavior::Module), false, true) |
657 | } | 665 | } |
658 | 666 | ||
659 | fn check_none(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) { | 667 | fn check_none(path: &str, ra_fixture_before: &str, ra_fixture_after: &str) { |
diff --git a/crates/ide_db/src/helpers/merge_imports.rs b/crates/ide_db/src/helpers/merge_imports.rs index 3f5bbef7f..8fb40e837 100644 --- a/crates/ide_db/src/helpers/merge_imports.rs +++ b/crates/ide_db/src/helpers/merge_imports.rs | |||
@@ -2,26 +2,27 @@ | |||
2 | use std::cmp::Ordering; | 2 | use std::cmp::Ordering; |
3 | 3 | ||
4 | use itertools::{EitherOrBoth, Itertools}; | 4 | use itertools::{EitherOrBoth, Itertools}; |
5 | use syntax::ast::{ | 5 | use syntax::{ |
6 | self, edit::AstNodeEdit, make, AstNode, AttrsOwner, PathSegmentKind, VisibilityOwner, | 6 | ast::{self, make, AstNode, AttrsOwner, PathSegmentKind, VisibilityOwner}, |
7 | ted, | ||
7 | }; | 8 | }; |
8 | 9 | ||
9 | /// What type of merges are allowed. | 10 | /// What type of merges are allowed. |
10 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] | 11 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] |
11 | pub enum MergeBehavior { | 12 | pub enum MergeBehavior { |
12 | /// Merge everything together creating deeply nested imports. | 13 | /// Merge imports from the same crate into a single use statement. |
13 | Full, | 14 | Crate, |
14 | /// Only merge the last import level, doesn't allow import nesting. | 15 | /// Merge imports from the same module into a single use statement. |
15 | Last, | 16 | Module, |
16 | } | 17 | } |
17 | 18 | ||
18 | impl MergeBehavior { | 19 | impl MergeBehavior { |
19 | #[inline] | 20 | #[inline] |
20 | fn is_tree_allowed(&self, tree: &ast::UseTree) -> bool { | 21 | fn is_tree_allowed(&self, tree: &ast::UseTree) -> bool { |
21 | match self { | 22 | match self { |
22 | MergeBehavior::Full => true, | 23 | MergeBehavior::Crate => true, |
23 | // only simple single segment paths are allowed | 24 | // only simple single segment paths are allowed |
24 | MergeBehavior::Last => { | 25 | MergeBehavior::Module => { |
25 | tree.use_tree_list().is_none() && tree.path().map(path_len) <= Some(1) | 26 | tree.use_tree_list().is_none() && tree.path().map(path_len) <= Some(1) |
26 | } | 27 | } |
27 | } | 28 | } |
@@ -41,10 +42,12 @@ pub fn try_merge_imports( | |||
41 | return None; | 42 | return None; |
42 | } | 43 | } |
43 | 44 | ||
45 | let lhs = lhs.clone_subtree().clone_for_update(); | ||
44 | let lhs_tree = lhs.use_tree()?; | 46 | let lhs_tree = lhs.use_tree()?; |
45 | let rhs_tree = rhs.use_tree()?; | 47 | let rhs_tree = rhs.use_tree()?; |
46 | let merged = try_merge_trees(&lhs_tree, &rhs_tree, merge_behavior)?; | 48 | let merged = try_merge_trees(&lhs_tree, &rhs_tree, merge_behavior)?; |
47 | Some(lhs.with_use_tree(merged).clone_for_update()) | 49 | ted::replace(lhs_tree.syntax(), merged.syntax()); |
50 | Some(lhs) | ||
48 | } | 51 | } |
49 | 52 | ||
50 | pub fn try_merge_trees( | 53 | pub fn try_merge_trees( |
@@ -65,7 +68,7 @@ pub fn try_merge_trees( | |||
65 | } else { | 68 | } else { |
66 | (lhs.split_prefix(&lhs_prefix), rhs.split_prefix(&rhs_prefix)) | 69 | (lhs.split_prefix(&lhs_prefix), rhs.split_prefix(&rhs_prefix)) |
67 | }; | 70 | }; |
68 | recursive_merge(&lhs, &rhs, merge) | 71 | recursive_merge(&lhs, &rhs, merge).map(|it| it.clone_for_update()) |
69 | } | 72 | } |
70 | 73 | ||
71 | /// Recursively "zips" together lhs and rhs. | 74 | /// Recursively "zips" together lhs and rhs. |
@@ -78,7 +81,8 @@ fn recursive_merge( | |||
78 | .use_tree_list() | 81 | .use_tree_list() |
79 | .into_iter() | 82 | .into_iter() |
80 | .flat_map(|list| list.use_trees()) | 83 | .flat_map(|list| list.use_trees()) |
81 | // we use Option here to early return from this function(this is not the same as a `filter` op) | 84 | // We use Option here to early return from this function(this is not the |
85 | // same as a `filter` op). | ||
82 | .map(|tree| match merge.is_tree_allowed(&tree) { | 86 | .map(|tree| match merge.is_tree_allowed(&tree) { |
83 | true => Some(tree), | 87 | true => Some(tree), |
84 | false => None, | 88 | false => None, |
@@ -111,8 +115,10 @@ fn recursive_merge( | |||
111 | let tree_is_self = |tree: ast::UseTree| { | 115 | let tree_is_self = |tree: ast::UseTree| { |
112 | tree.path().as_ref().map(path_is_self).unwrap_or(false) | 116 | tree.path().as_ref().map(path_is_self).unwrap_or(false) |
113 | }; | 117 | }; |
114 | // check if only one of the two trees has a tree list, and whether that then contains `self` or not. | 118 | // Check if only one of the two trees has a tree list, and |
115 | // If this is the case we can skip this iteration since the path without the list is already included in the other one via `self` | 119 | // whether that then contains `self` or not. If this is the |
120 | // case we can skip this iteration since the path without | ||
121 | // the list is already included in the other one via `self`. | ||
116 | let tree_contains_self = |tree: &ast::UseTree| { | 122 | let tree_contains_self = |tree: &ast::UseTree| { |
117 | tree.use_tree_list() | 123 | tree.use_tree_list() |
118 | .map(|tree_list| tree_list.use_trees().any(tree_is_self)) | 124 | .map(|tree_list| tree_list.use_trees().any(tree_is_self)) |
@@ -127,9 +133,11 @@ fn recursive_merge( | |||
127 | _ => (), | 133 | _ => (), |
128 | } | 134 | } |
129 | 135 | ||
130 | // glob imports arent part of the use-tree lists so we need to special handle them here as well | 136 | // Glob imports aren't part of the use-tree lists so we need |
131 | // this special handling is only required for when we merge a module import into a glob import of said module | 137 | // to special handle them here as well this special handling |
132 | // see the `merge_self_glob` or `merge_mod_into_glob` tests | 138 | // is only required for when we merge a module import into a |
139 | // glob import of said module see the `merge_self_glob` or | ||
140 | // `merge_mod_into_glob` tests. | ||
133 | if lhs_t.star_token().is_some() || rhs_t.star_token().is_some() { | 141 | if lhs_t.star_token().is_some() || rhs_t.star_token().is_some() { |
134 | *lhs_t = make::use_tree( | 142 | *lhs_t = make::use_tree( |
135 | make::path_unqualified(make::path_segment_self()), | 143 | make::path_unqualified(make::path_segment_self()), |
@@ -137,7 +145,7 @@ fn recursive_merge( | |||
137 | None, | 145 | None, |
138 | false, | 146 | false, |
139 | ); | 147 | ); |
140 | use_trees.insert(idx, make::glob_use_tree()); | 148 | use_trees.insert(idx, make::use_tree_glob()); |
141 | continue; | 149 | continue; |
142 | } | 150 | } |
143 | 151 | ||
@@ -153,7 +161,7 @@ fn recursive_merge( | |||
153 | } | 161 | } |
154 | } | 162 | } |
155 | Err(_) | 163 | Err(_) |
156 | if merge == MergeBehavior::Last | 164 | if merge == MergeBehavior::Module |
157 | && use_trees.len() > 0 | 165 | && use_trees.len() > 0 |
158 | && rhs_t.use_tree_list().is_some() => | 166 | && rhs_t.use_tree_list().is_some() => |
159 | { | 167 | { |
@@ -165,11 +173,11 @@ fn recursive_merge( | |||
165 | } | 173 | } |
166 | } | 174 | } |
167 | 175 | ||
168 | Some(if let Some(old) = lhs.use_tree_list() { | 176 | let lhs = lhs.clone_subtree().clone_for_update(); |
169 | lhs.replace_descendant(old, make::use_tree_list(use_trees)).clone_for_update() | 177 | if let Some(old) = lhs.use_tree_list() { |
170 | } else { | 178 | ted::replace(old.syntax(), make::use_tree_list(use_trees).syntax().clone_for_update()); |
171 | lhs.clone() | 179 | } |
172 | }) | 180 | ast::UseTree::cast(lhs.syntax().clone_subtree()) |
173 | } | 181 | } |
174 | 182 | ||
175 | /// Traverses both paths until they differ, returning the common prefix of both. | 183 | /// Traverses both paths until they differ, returning the common prefix of both. |