diff options
author | Florian Diebold <[email protected]> | 2019-05-07 16:35:45 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-05-11 15:21:20 +0100 |
commit | 7744cd41e2ad79c1b36d3d9fccd3bc0dbfd9e2d9 (patch) | |
tree | 0943a0bfd0ce6d61d28730a37130907507fdc9d1 /crates/ra_hir/src/ty/traits.rs | |
parent | d8cd0e36f5288dd4c14fb5a07b73533d88f29788 (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.rs | 9 |
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 | ||
15 | pub(crate) type Solver = chalk_solve::Solver; | 15 | pub(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. | ||
20 | const CHALK_SOLVER_MAX_SIZE: usize = 2; | ||
21 | |||
17 | #[derive(Debug, Copy, Clone)] | 22 | #[derive(Debug, Copy, Clone)] |
18 | struct ChalkContext<'a, DB> { | 23 | struct ChalkContext<'a, DB> { |
19 | db: &'a DB, | 24 | db: &'a DB, |
@@ -22,7 +27,8 @@ struct ChalkContext<'a, DB> { | |||
22 | 27 | ||
23 | pub(crate) fn solver(_db: &impl HirDatabase, _krate: Crate) -> Arc<Mutex<Solver>> { | 28 | pub(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 |