aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/traits.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-05-07 16:35:45 +0100
committerFlorian Diebold <[email protected]>2019-05-11 15:21:20 +0100
commit7744cd41e2ad79c1b36d3d9fccd3bc0dbfd9e2d9 (patch)
tree0943a0bfd0ce6d61d28730a37130907507fdc9d1 /crates/ra_hir/src/ty/traits.rs
parentd8cd0e36f5288dd4c14fb5a07b73533d88f29788 (diff)
Reduce Chalk max_size parameter, add test for slow case
Diffstat (limited to 'crates/ra_hir/src/ty/traits.rs')
-rw-r--r--crates/ra_hir/src/ty/traits.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/crates/ra_hir/src/ty/traits.rs b/crates/ra_hir/src/ty/traits.rs
index 4bbc99f0e..4260f7ef7 100644
--- a/crates/ra_hir/src/ty/traits.rs
+++ b/crates/ra_hir/src/ty/traits.rs
@@ -14,6 +14,11 @@ mod chalk;
14 14
15pub(crate) type Solver = chalk_solve::Solver; 15pub(crate) type Solver = chalk_solve::Solver;
16 16
17/// This controls the maximum size of types Chalk considers. If we set this too
18/// high, we can run into slow edge cases; if we set it too low, Chalk won't
19/// find some solutions.
20const CHALK_SOLVER_MAX_SIZE: usize = 2;
21
17#[derive(Debug, Copy, Clone)] 22#[derive(Debug, Copy, Clone)]
18struct ChalkContext<'a, DB> { 23struct ChalkContext<'a, DB> {
19 db: &'a DB, 24 db: &'a DB,
@@ -22,7 +27,8 @@ struct ChalkContext<'a, DB> {
22 27
23pub(crate) fn solver(_db: &impl HirDatabase, _krate: Crate) -> Arc<Mutex<Solver>> { 28pub(crate) fn solver(_db: &impl HirDatabase, _krate: Crate) -> Arc<Mutex<Solver>> {
24 // krate parameter is just so we cache a unique solver per crate 29 // krate parameter is just so we cache a unique solver per crate
25 let solver_choice = chalk_solve::SolverChoice::SLG { max_size: 10 }; 30 let solver_choice = chalk_solve::SolverChoice::SLG { max_size: CHALK_SOLVER_MAX_SIZE };
31 debug!("Creating new solver for crate {:?}", _krate);
26 Arc::new(Mutex::new(solver_choice.into_solver())) 32 Arc::new(Mutex::new(solver_choice.into_solver()))
27} 33}
28 34
@@ -53,6 +59,7 @@ fn solve(
53) -> Option<chalk_solve::Solution> { 59) -> Option<chalk_solve::Solution> {
54 let context = ChalkContext { db, krate }; 60 let context = ChalkContext { db, krate };
55 let solver = db.solver(krate); 61 let solver = db.solver(krate);
62 debug!("solve goal: {:?}", goal);
56 let solution = solver.lock().unwrap().solve(&context, goal); 63 let solution = solver.lock().unwrap().solve(&context, goal);
57 debug!("solve({:?}) => {:?}", goal, solution); 64 debug!("solve({:?}) => {:?}", goal, solution);
58 solution 65 solution