aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock28
-rw-r--r--crates/ra_ide/src/syntax_highlighting.rs27
-rw-r--r--crates/ra_ide/src/syntax_highlighting/tests.rs10
-rw-r--r--crates/ra_ide/test_data/highlighting.html10
-rw-r--r--crates/ra_prof/Cargo.toml2
-rw-r--r--crates/ra_prof/src/lib.rs4
-rw-r--r--crates/rust-analyzer/Cargo.toml1
-rw-r--r--xtask/src/install.rs16
-rw-r--r--xtask/src/main.rs15
9 files changed, 104 insertions, 9 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 11eb9a823..6cc44e0da 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -215,6 +215,15 @@ dependencies = [
215] 215]
216 216
217[[package]] 217[[package]]
218name = "cmake"
219version = "0.1.44"
220source = "registry+https://github.com/rust-lang/crates.io-index"
221checksum = "0e56268c17a6248366d66d4a47a3381369d068cce8409bb1716ed77ea32163bb"
222dependencies = [
223 "cc",
224]
225
226[[package]]
218name = "console" 227name = "console"
219version = "0.11.3" 228version = "0.11.3"
220source = "registry+https://github.com/rust-lang/crates.io-index" 229source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -675,6 +684,15 @@ dependencies = [
675] 684]
676 685
677[[package]] 686[[package]]
687name = "libmimalloc-sys"
688version = "0.1.15"
689source = "registry+https://github.com/rust-lang/crates.io-index"
690checksum = "a27252ec1d0c4e0dd6142cbc572da50b363ab56fc334f7aa8fadf295b2e24e74"
691dependencies = [
692 "cmake",
693]
694
695[[package]]
678name = "linked-hash-map" 696name = "linked-hash-map"
679version = "0.5.3" 697version = "0.5.3"
680source = "registry+https://github.com/rust-lang/crates.io-index" 698source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -771,6 +789,15 @@ dependencies = [
771] 789]
772 790
773[[package]] 791[[package]]
792name = "mimalloc"
793version = "0.1.19"
794source = "registry+https://github.com/rust-lang/crates.io-index"
795checksum = "6c52de2069999f01bd26436564dbe7de3a87898feeb7a0d0ff9eb20a05bb7ca0"
796dependencies = [
797 "libmimalloc-sys",
798]
799
800[[package]]
774name = "miniz_oxide" 801name = "miniz_oxide"
775version = "0.4.0" 802version = "0.4.0"
776source = "registry+https://github.com/rust-lang/crates.io-index" 803source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1248,6 +1275,7 @@ dependencies = [
1248 "backtrace", 1275 "backtrace",
1249 "jemalloc-ctl", 1276 "jemalloc-ctl",
1250 "jemallocator", 1277 "jemallocator",
1278 "mimalloc",
1251 "once_cell", 1279 "once_cell",
1252 "ra_arena", 1280 "ra_arena",
1253] 1281]
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs
index 5bb6f9642..b3236e821 100644
--- a/crates/ra_ide/src/syntax_highlighting.rs
+++ b/crates/ra_ide/src/syntax_highlighting.rs
@@ -566,10 +566,31 @@ fn highlight_element(
566 | T![return] 566 | T![return]
567 | T![while] 567 | T![while]
568 | T![in] => h | HighlightModifier::ControlFlow, 568 | T![in] => h | HighlightModifier::ControlFlow,
569 T![for] if !is_child_of_impl(element) => h | HighlightModifier::ControlFlow, 569 T![for] if !is_child_of_impl(&element) => h | HighlightModifier::ControlFlow,
570 T![unsafe] => h | HighlightModifier::Unsafe, 570 T![unsafe] => h | HighlightModifier::Unsafe,
571 T![true] | T![false] => HighlightTag::BoolLiteral.into(), 571 T![true] | T![false] => HighlightTag::BoolLiteral.into(),
572 T![self] => HighlightTag::SelfKeyword.into(), 572 T![self] => {
573 let self_param_is_mut = element
574 .parent()
575 .and_then(ast::SelfParam::cast)
576 .and_then(|p| p.mut_token())
577 .is_some();
578 // closure to enforce lazyness
579 let self_path = || {
580 sema.resolve_path(&element.parent()?.parent().and_then(ast::Path::cast)?)
581 };
582 if self_param_is_mut
583 || matches!(self_path(),
584 Some(hir::PathResolution::Local(local))
585 if local.is_self(db)
586 && (local.is_mut(db) || local.ty(db).is_mutable_reference())
587 )
588 {
589 HighlightTag::SelfKeyword | HighlightModifier::Mutable
590 } else {
591 HighlightTag::SelfKeyword.into()
592 }
593 }
573 _ => h, 594 _ => h,
574 } 595 }
575 } 596 }
@@ -592,7 +613,7 @@ fn highlight_element(
592 } 613 }
593} 614}
594 615
595fn is_child_of_impl(element: SyntaxElement) -> bool { 616fn is_child_of_impl(element: &SyntaxElement) -> bool {
596 match element.parent() { 617 match element.parent() {
597 Some(e) => e.kind() == IMPL_DEF, 618 Some(e) => e.kind() == IMPL_DEF,
598 _ => false, 619 _ => false,
diff --git a/crates/ra_ide/src/syntax_highlighting/tests.rs b/crates/ra_ide/src/syntax_highlighting/tests.rs
index aa7c887d6..87a6e2523 100644
--- a/crates/ra_ide/src/syntax_highlighting/tests.rs
+++ b/crates/ra_ide/src/syntax_highlighting/tests.rs
@@ -25,6 +25,16 @@ impl Bar for Foo {
25 } 25 }
26} 26}
27 27
28impl Foo {
29 fn baz(mut self) -> i32 {
30 self.x
31 }
32
33 fn qux(&mut self) {
34 self.x = 0;
35 }
36}
37
28static mut STATIC_MUT: i32 = 0; 38static mut STATIC_MUT: i32 = 0;
29 39
30fn foo<'a, T>() -> T { 40fn foo<'a, T>() -> T {
diff --git a/crates/ra_ide/test_data/highlighting.html b/crates/ra_ide/test_data/highlighting.html
index 134743c72..553811a2f 100644
--- a/crates/ra_ide/test_data/highlighting.html
+++ b/crates/ra_ide/test_data/highlighting.html
@@ -51,6 +51,16 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
51 } 51 }
52} 52}
53 53
54<span class="keyword">impl</span> <span class="struct">Foo</span> {
55 <span class="keyword">fn</span> <span class="function declaration">baz</span>(<span class="keyword">mut</span> <span class="self_keyword mutable">self</span>) -&gt; <span class="builtin_type">i32</span> {
56 <span class="self_keyword">self</span>.<span class="field">x</span>
57 }
58
59 <span class="keyword">fn</span> <span class="function declaration">qux</span>(&<span class="keyword">mut</span> <span class="self_keyword mutable">self</span>) {
60 <span class="self_keyword mutable">self</span>.<span class="field">x</span> = <span class="numeric_literal">0</span>;
61 }
62}
63
54<span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable">STATIC_MUT</span>: <span class="builtin_type">i32</span> = <span class="numeric_literal">0</span>; 64<span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable">STATIC_MUT</span>: <span class="builtin_type">i32</span> = <span class="numeric_literal">0</span>;
55 65
56<span class="keyword">fn</span> <span class="function declaration">foo</span>&lt;<span class="lifetime declaration">'a</span>, <span class="type_param declaration">T</span>&gt;() -&gt; <span class="type_param">T</span> { 66<span class="keyword">fn</span> <span class="function declaration">foo</span>&lt;<span class="lifetime declaration">'a</span>, <span class="type_param declaration">T</span>&gt;() -&gt; <span class="type_param">T</span> {
diff --git a/crates/ra_prof/Cargo.toml b/crates/ra_prof/Cargo.toml
index 69ac51c9e..b3d52985a 100644
--- a/crates/ra_prof/Cargo.toml
+++ b/crates/ra_prof/Cargo.toml
@@ -13,6 +13,7 @@ doctest = false
13ra_arena = { path = "../ra_arena" } 13ra_arena = { path = "../ra_arena" }
14once_cell = "1.3.1" 14once_cell = "1.3.1"
15backtrace = { version = "0.3.44", optional = true } 15backtrace = { version = "0.3.44", optional = true }
16mimalloc = { version = "0.1.19", default-features = false, optional = true }
16 17
17[target.'cfg(not(target_env = "msvc"))'.dependencies] 18[target.'cfg(not(target_env = "msvc"))'.dependencies]
18jemallocator = { version = "0.3.2", optional = true } 19jemallocator = { version = "0.3.2", optional = true }
@@ -25,4 +26,5 @@ cpu_profiler = []
25# Uncomment to enable for the whole crate graph 26# Uncomment to enable for the whole crate graph
26# default = [ "backtrace" ] 27# default = [ "backtrace" ]
27# default = [ "jemalloc" ] 28# default = [ "jemalloc" ]
29# default = [ "mimalloc" ]
28# default = [ "cpu_profiler" ] 30# default = [ "cpu_profiler" ]
diff --git a/crates/ra_prof/src/lib.rs b/crates/ra_prof/src/lib.rs
index 7163a8424..b54531b4e 100644
--- a/crates/ra_prof/src/lib.rs
+++ b/crates/ra_prof/src/lib.rs
@@ -19,6 +19,10 @@ pub use crate::{
19#[global_allocator] 19#[global_allocator]
20static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; 20static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
21 21
22#[cfg(all(feature = "mimalloc"))]
23#[global_allocator]
24static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc;
25
22/// Prints backtrace to stderr, useful for debugging. 26/// Prints backtrace to stderr, useful for debugging.
23#[cfg(feature = "backtrace")] 27#[cfg(feature = "backtrace")]
24pub fn print_backtrace() { 28pub fn print_backtrace() {
diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml
index 370b13090..57724bcbc 100644
--- a/crates/rust-analyzer/Cargo.toml
+++ b/crates/rust-analyzer/Cargo.toml
@@ -66,3 +66,4 @@ tt = { path = "../ra_tt", package = "ra_tt" }
66 66
67[features] 67[features]
68jemalloc = [ "ra_prof/jemalloc" ] 68jemalloc = [ "ra_prof/jemalloc" ]
69mimalloc = [ "ra_prof/mimalloc" ]
diff --git a/xtask/src/install.rs b/xtask/src/install.rs
index 9ba77a3aa..a0dc0c9c2 100644
--- a/xtask/src/install.rs
+++ b/xtask/src/install.rs
@@ -19,7 +19,13 @@ pub enum ClientOpt {
19} 19}
20 20
21pub struct ServerOpt { 21pub struct ServerOpt {
22 pub jemalloc: bool, 22 pub malloc: Malloc,
23}
24
25pub enum Malloc {
26 System,
27 Jemalloc,
28 Mimalloc,
23} 29}
24 30
25impl InstallCmd { 31impl InstallCmd {
@@ -130,8 +136,12 @@ fn install_server(opts: ServerOpt) -> Result<()> {
130 ) 136 )
131 } 137 }
132 138
133 let jemalloc = if opts.jemalloc { "--features jemalloc" } else { "" }; 139 let malloc_feature = match opts.malloc {
134 let res = run!("cargo install --path crates/rust-analyzer --locked --force {}", jemalloc); 140 Malloc::System => "",
141 Malloc::Jemalloc => "--features jemalloc",
142 Malloc::Mimalloc => "--features mimalloc",
143 };
144 let res = run!("cargo install --path crates/rust-analyzer --locked --force {}", malloc_feature);
135 145
136 if res.is_err() && old_rust { 146 if res.is_err() && old_rust {
137 eprintln!( 147 eprintln!(
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index f447613d4..399ff7204 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -14,7 +14,7 @@ use pico_args::Arguments;
14use xtask::{ 14use xtask::{
15 codegen::{self, Mode}, 15 codegen::{self, Mode},
16 dist::run_dist, 16 dist::run_dist,
17 install::{ClientOpt, InstallCmd, ServerOpt}, 17 install::{ClientOpt, InstallCmd, Malloc, ServerOpt},
18 not_bash::pushd, 18 not_bash::pushd,
19 pre_commit, project_root, 19 pre_commit, project_root,
20 release::{PromoteCmd, ReleaseCmd}, 20 release::{PromoteCmd, ReleaseCmd},
@@ -46,6 +46,7 @@ FLAGS:
46 --client-code Install only VS Code plugin 46 --client-code Install only VS Code plugin
47 --server Install only the language server 47 --server Install only the language server
48 --jemalloc Use jemalloc for server 48 --jemalloc Use jemalloc for server
49 --mimalloc Use mimalloc for server
49 -h, --help Prints help information 50 -h, --help Prints help information
50 " 51 "
51 ); 52 );
@@ -61,13 +62,21 @@ FLAGS:
61 return Ok(()); 62 return Ok(());
62 } 63 }
63 64
64 let jemalloc = args.contains("--jemalloc"); 65 let malloc = match (args.contains("--jemalloc"), args.contains("--mimalloc")) {
66 (false, false) => Malloc::System,
67 (true, false) => Malloc::Jemalloc,
68 (false, true) => Malloc::Mimalloc,
69 (true, true) => {
70 eprintln!("error: Cannot use both `--jemalloc` and `--mimalloc`");
71 return Ok(());
72 }
73 };
65 74
66 args.finish()?; 75 args.finish()?;
67 76
68 InstallCmd { 77 InstallCmd {
69 client: if server { None } else { Some(ClientOpt::VsCode) }, 78 client: if server { None } else { Some(ClientOpt::VsCode) },
70 server: if client_code { None } else { Some(ServerOpt { jemalloc }) }, 79 server: if client_code { None } else { Some(ServerOpt { malloc }) },
71 } 80 }
72 .run() 81 .run()
73 } 82 }