Title: rustc IDE
Estimate: 1 or 2 meeting
Type: technical
Figure out further steps to make rustc a perfect-for-ides compiler, based on experience with rust-analyzer so far.
| use std::{ | |
| cell::RefCell, | |
| hash::{BuildHasher, Hash, Hasher}, | |
| sync::Arc, | |
| }; | |
| // hashbrown = "0.7" | |
| use hashbrown::{hash_map::DefaultHashBuilder, HashMap}; | |
| // parking_lot = "0.10" | |
| use parking_lot::{Mutex, RwLock}; | 
| use std::path::Path; | |
| /// VFS provides two benefits over using `fs: | |
| /// | |
| /// * consistent snapshots: reading the same file twice is guranteed to return | |
| /// the same result, unless you explicitly advance the revision of VFS | |
| /// * automated file watching: if you read a file or a dir, you will be notified when the | |
| /// file changes. | |
| struct Vfs {} | 
| def max(*args): | |
| """Finds the largest argument.""" | |
| print(f"max{args} = ...") | |
| ret = 0 | |
| for x in args: | |
| ret = ret if x < ret else x | |
| print(f"max{args} = {ret}") | |
| return ret | |
| extern crate alias; | |
| use std::cell::Cell; | |
| fn pairwise_diffs(xs: &mut [i32]) { | |
| let xs: &[Cell<i32>] = alias::slice(xs); | |
| // Iterating & mutating *without* indices! | |
| for (x, y) in xs.iter().zip(xs[1..].iter()) { | |
| x.set(y.get() - x.get()) | |
| } | 
| trait Counter: 'static { | |
| fn create(data: &str) -> Self where Self: Sized; | |
| } | |
| struct CounterA(i32); | |
| impl Counter for CounterA { | |
| fn create(data: &str) -> Self where Self: Sized { | |
| CounterA(data.parse::<i32>().unwrap()) | |
| } | |
| } | 
| #include <vector> | |
| #include <cstdint> | |
| #include <iostream> | |
| #include <algorithm> | |
| void perm(std::vector<int32_t> const& xs, std::vector<int32_t> curr) { | |
| if (curr.size() == xs.size()) { | |
| for (int32_t x: curr) { | |
| std::cout << x << ' '; | |
| } | 
| # Put this file into `~/.config/nixpkgs/overlays/idea.nix`. | |
| # Then, install IDEA with `nix-env -iA nixos.idea-community`. | |
| self: super: | |
| { | |
| jbsdk = super.callPackage ~/config/nix/jbsdk.nix {}; # you might need to override this path. | |
| idea-community = let | |
| version = "2017.2.3"; | 
| pkgs.oraclejdk8.overrideDerivation (attrs: rec { | |
| name = "oraclejdk-${productVersion}u${patchVersion}"; | |
| src = pkgs.fetchurl { | |
| url = "https://bintray.com/jetbrains/intellij-jdk/download_file?file_path=jbsdk8u152b970.2_linux_x64.tar.gz"; | |
| sha256 = sha256_x86_64; | |
| }; | |
| preUnpack = '' | |
| mkdir src | |
| pushd src | |
| ''; | 
| module HM | |
| let rec loop x = loop x | |
| let mk_dno x = loop loop | |
| let assert_same_type a b = | |
| (fun f -> // manually desuget let to avoid let-polymorphism | |
| let _ = f a in | |
| let _ = f b in | |
| mk_dno loop |