a0be16b0b2
Beginning of MIR This pull request introduces the initial implementation of MIR lowering and interpreting in Rust Analyzer. The implementation of MIR has potential to bring several benefits: - Executing a unit test without compiling it: This is my main goal. It can be useful for quickly testing code changes and print-debugging unit tests without the need for a full compilation (ideally in almost zero time, similar to languages like python and js). There is a probability that it goes nowhere, it might become slower than rustc, or it might need some unreasonable amount of memory, or we may fail to support a common pattern/function that make it unusable for most of the codes. - Constant evaluation: MIR allows for easier and more correct constant evaluation, on par with rustc. If r-a wants to fully support the type system, it needs full const eval, which means arbitrary code execution, which needs MIR or something similar. - Supporting more diagnostics: MIR can be used to detect errors, most famously borrow checker and lifetime errors, but also mutability errors and uninitialized variables, which can be difficult/impossible to detect in HIR. - Lowering closures: With MIR we can find out closure capture modes, which is useful in detecting if a closure implements the `FnMut` or `Fn` traits, and calculating its size and data layout. But the current PR implements no diagnostics and doesn't support closures. About const eval, I removed the old const eval code and it now uses the mir interpreter. Everything that is supported in stable rustc is either implemented or is super easy to implement. About interpreting unit tests, I added an experimental config, disabled by default, that shows a `pass` or `fail` on hover of unit tests (ideally it should be a button similar to `Run test` button, but I didn't figured out how to add them). Currently, no real world test works, due to missing features including closures, heap allocation, `dyn Trait` and ... so at this point it is only useful for me selecting what to implement next. The implementation of MIR is based on the design of rustc, the data structures are almost copy paste (so it should be easy to migrate it to a possible future stable-mir), but the lowering and interpreting code is from me. |
||
---|---|---|
.. | ||
bin | ||
cli | ||
config | ||
diagnostics | ||
caps.rs | ||
cargo_target_spec.rs | ||
cli.rs | ||
config.rs | ||
diagnostics.rs | ||
diff.rs | ||
dispatch.rs | ||
from_proto.rs | ||
global_state.rs | ||
handlers.rs | ||
integrated_benchmarks.rs | ||
lib.rs | ||
line_index.rs | ||
lsp_ext.rs | ||
lsp_utils.rs | ||
main_loop.rs | ||
markdown.rs | ||
mem_docs.rs | ||
op_queue.rs | ||
reload.rs | ||
semantic_tokens.rs | ||
task_pool.rs | ||
to_proto.rs | ||
version.rs |