mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 12:33:33 +00:00
Merge #6222
6222: Fix stackoverflow in insert_use::recursive_merge r=matklad a=Veykril Fixes #6221. #6108 shouldn't be related to this as autocompletion doesn't depend on this code. Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
69f1c8aa6e
3 changed files with 53 additions and 2 deletions
|
@ -72,6 +72,20 @@ mod tests {
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_merge_equal() {
|
||||||
|
check_assist(
|
||||||
|
merge_imports,
|
||||||
|
r"
|
||||||
|
use std::fmt<|>::{Display, Debug};
|
||||||
|
use std::fmt::{Display, Debug};
|
||||||
|
",
|
||||||
|
r"
|
||||||
|
use std::fmt::{Debug, Display};
|
||||||
|
",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_merge_first() {
|
fn test_merge_first() {
|
||||||
check_assist(
|
check_assist(
|
||||||
|
|
|
@ -123,6 +123,23 @@ mod tests {
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_replace_already_imported() {
|
||||||
|
check_assist(
|
||||||
|
replace_qualified_name_with_use,
|
||||||
|
r"use std::fs;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
std::f<|>s::Path
|
||||||
|
}",
|
||||||
|
r"use std::fs;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
fs::Path
|
||||||
|
}",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_replace_add_use_no_anchor() {
|
fn test_replace_add_use_no_anchor() {
|
||||||
check_assist(
|
check_assist(
|
||||||
|
|
|
@ -173,8 +173,15 @@ pub(crate) fn try_merge_trees(
|
||||||
let rhs_path = rhs.path()?;
|
let rhs_path = rhs.path()?;
|
||||||
|
|
||||||
let (lhs_prefix, rhs_prefix) = common_prefix(&lhs_path, &rhs_path)?;
|
let (lhs_prefix, rhs_prefix) = common_prefix(&lhs_path, &rhs_path)?;
|
||||||
let lhs = lhs.split_prefix(&lhs_prefix);
|
let (lhs, rhs) = if is_simple_path(lhs)
|
||||||
let rhs = rhs.split_prefix(&rhs_prefix);
|
&& is_simple_path(rhs)
|
||||||
|
&& lhs_path == lhs_prefix
|
||||||
|
&& rhs_path == rhs_prefix
|
||||||
|
{
|
||||||
|
(lhs.clone(), rhs.clone())
|
||||||
|
} else {
|
||||||
|
(lhs.split_prefix(&lhs_prefix), rhs.split_prefix(&rhs_prefix))
|
||||||
|
};
|
||||||
recursive_merge(&lhs, &rhs, merge)
|
recursive_merge(&lhs, &rhs, merge)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,6 +257,10 @@ fn recursive_merge(
|
||||||
use_trees.insert(idx, make::glob_use_tree());
|
use_trees.insert(idx, make::glob_use_tree());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if lhs_t.use_tree_list().is_none() && rhs_t.use_tree_list().is_none() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let lhs = lhs_t.split_prefix(&lhs_prefix);
|
let lhs = lhs_t.split_prefix(&lhs_prefix);
|
||||||
let rhs = rhs_t.split_prefix(&rhs_prefix);
|
let rhs = rhs_t.split_prefix(&rhs_prefix);
|
||||||
|
@ -295,6 +306,10 @@ fn common_prefix(lhs: &ast::Path, rhs: &ast::Path) -> Option<(ast::Path, ast::Pa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_simple_path(use_tree: &ast::UseTree) -> bool {
|
||||||
|
use_tree.use_tree_list().is_none() && use_tree.star_token().is_none()
|
||||||
|
}
|
||||||
|
|
||||||
fn path_is_self(path: &ast::Path) -> bool {
|
fn path_is_self(path: &ast::Path) -> bool {
|
||||||
path.segment().and_then(|seg| seg.self_token()).is_some() && path.qualifier().is_none()
|
path.segment().and_then(|seg| seg.self_token()).is_some() && path.qualifier().is_none()
|
||||||
}
|
}
|
||||||
|
@ -523,6 +538,11 @@ mod tests {
|
||||||
|
|
||||||
use test_utils::assert_eq_text;
|
use test_utils::assert_eq_text;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn insert_existing() {
|
||||||
|
check_full("std::fs", "use std::fs;", "use std::fs;")
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn insert_start() {
|
fn insert_start() {
|
||||||
check_none(
|
check_none(
|
||||||
|
|
Loading…
Reference in a new issue