Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit 9866046

Browse files
committed
Move rls-vfs crate
Based on rust-dev-tools/rls-vfs@023599a
1 parent 5cdf425 commit 9866046

File tree

6 files changed

+1462
-1
lines changed

6 files changed

+1462
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ rls-blacklist = "0.1.3"
2626
rls-data = { version = "0.18.2", features = ["serialize-serde", "serialize-rustc"] }
2727
rls-rustc = "0.5.0"
2828
rls-span = { version = "0.4", features = ["serialize-serde"] }
29+
rls-vfs = "0.7"
2930

3031
cargo = { git = "https://github.com/rust-lang/cargo", rev = "4e74e2fc0908524d17735c768067117d3e84ee9c" }
3132
cargo_metadata = "0.7"
@@ -42,7 +43,6 @@ num_cpus = "1"
4243
racer = { version = "=2.1.18", default-features = false }
4344
rand = "0.6"
4445
rayon = "1"
45-
rls-vfs = "0.7"
4646
rustc_tools_util = "0.1.1"
4747
rustfmt-nightly = "1.0.1"
4848
rustc-serialize = "0.3"

rls-vfs/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
target/
2+
Cargo.lock

rls-vfs/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "rls-vfs"
3+
version = "0.7.1"
4+
authors = ["Nick Cameron <ncameron@mozilla.com>"]
5+
description = "Virtual File System for the RLS"
6+
license = "Apache-2.0/MIT"
7+
repository = "https://github.com/rust-dev-tools/rls-vfs"
8+
categories = ["development-tools"]
9+
10+
[dependencies]
11+
rls-span = "0.4"
12+
log = "0.4.5"

rls-vfs/benches/bench.rs

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
//! benchmark which uses libstd/path.rs
2+
//! make sure rust-src installed before running this bench
3+
4+
#![feature(test)]
5+
extern crate rls_span;
6+
extern crate rls_vfs;
7+
extern crate test;
8+
9+
use rls_span::{Column, Position, Row, Span};
10+
use rls_vfs::{Change, VfsSpan};
11+
use std::fs;
12+
use std::io::prelude::*;
13+
use std::path::{Path, PathBuf};
14+
use std::process::Command;
15+
16+
struct EmptyUserData;
17+
type Vfs = rls_vfs::Vfs<EmptyUserData>;
18+
19+
fn std_path() -> PathBuf {
20+
let mut cmd = Command::new("rustc");
21+
cmd.args(&["--print", "sysroot"]);
22+
let op = cmd.output().unwrap();
23+
let sysroot = Path::new(::std::str::from_utf8(&op.stdout).unwrap().trim());
24+
sysroot.join("lib/rustlib/src/rust/src").to_owned()
25+
}
26+
27+
fn add_file(vfs: &Vfs, path: &Path) {
28+
let mut buf = String::new();
29+
let mut file = fs::File::open(path).unwrap();
30+
file.read_to_string(&mut buf).unwrap();
31+
let change = Change::AddFile {
32+
file: path.to_owned(),
33+
text: buf,
34+
};
35+
vfs.on_changes(&[change]).unwrap();
36+
}
37+
38+
fn make_change_(path: &Path, start_line: usize, interval: usize) -> Change {
39+
const LEN: usize = 10;
40+
let txt = unsafe { std::str::from_utf8_unchecked(&[b' '; 100]) };
41+
let start = Position::new(
42+
Row::new_zero_indexed(start_line as u32),
43+
Column::new_zero_indexed(0),
44+
);
45+
let end = Position::new(
46+
Row::new_zero_indexed((start_line + interval) as u32),
47+
Column::new_zero_indexed(0),
48+
);
49+
let buf = (0..LEN).map(|_| txt.to_owned() + "\n").collect::<String>();
50+
Change::ReplaceText {
51+
span: VfsSpan::from_usv(Span::from_positions(start, end, path), None),
52+
text: buf,
53+
}
54+
}
55+
56+
fn make_replace(path: &Path, start_line: usize) -> Change {
57+
make_change_(path, start_line, 10)
58+
}
59+
60+
fn make_insertion(path: &Path, start_line: usize) -> Change {
61+
make_change_(path, start_line, 1)
62+
}
63+
64+
fn prepare() -> (Vfs, PathBuf) {
65+
let vfs = Vfs::new();
66+
// path.rs is very long(about 4100 lines) so let's use it
67+
let lib = std_path().join("libstd/path.rs");
68+
println!("{:?}", lib);
69+
add_file(&vfs, &lib);
70+
(vfs, lib)
71+
}
72+
73+
#[bench]
74+
fn replace_front(b: &mut test::Bencher) {
75+
let (vfs, lib) = prepare();
76+
b.iter(|| {
77+
for _ in 0..10 {
78+
let change = make_replace(&lib, 0);
79+
vfs.on_changes(&[change]).unwrap();
80+
}
81+
})
82+
}
83+
84+
#[bench]
85+
fn replace_mid(b: &mut test::Bencher) {
86+
let (vfs, lib) = prepare();
87+
b.iter(|| {
88+
for _ in 0..10 {
89+
let change = make_replace(&lib, 2000);
90+
vfs.on_changes(&[change]).unwrap();
91+
}
92+
})
93+
}
94+
95+
#[bench]
96+
fn replace_tale(b: &mut test::Bencher) {
97+
let (vfs, lib) = prepare();
98+
b.iter(|| {
99+
for _ in 0..10 {
100+
let change = make_replace(&lib, 4000);
101+
vfs.on_changes(&[change]).unwrap();
102+
}
103+
})
104+
}
105+
106+
#[bench]
107+
fn insert_front(b: &mut test::Bencher) {
108+
let (vfs, lib) = prepare();
109+
b.iter(|| {
110+
for _ in 0..10 {
111+
let change = make_insertion(&lib, 0);
112+
vfs.on_changes(&[change]).unwrap();
113+
}
114+
})
115+
}
116+
117+
#[bench]
118+
fn insert_mid(b: &mut test::Bencher) {
119+
let (vfs, lib) = prepare();
120+
b.iter(|| {
121+
for _ in 0..10 {
122+
let change = make_insertion(&lib, 2000);
123+
vfs.on_changes(&[change]).unwrap();
124+
}
125+
})
126+
}
127+
128+
#[bench]
129+
fn insert_tale(b: &mut test::Bencher) {
130+
let (vfs, lib) = prepare();
131+
b.iter(|| {
132+
for _ in 0..10 {
133+
let change = make_insertion(&lib, 4000);
134+
vfs.on_changes(&[change]).unwrap();
135+
}
136+
})
137+
}

0 commit comments

Comments
 (0)