aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock28
-rw-r--r--Cargo.toml1
-rw-r--r--crates/gen_lsp_server/Cargo.toml2
-rw-r--r--crates/ra_hir/src/db.rs9
-rw-r--r--crates/ra_hir/src/lang_item.rs102
-rw-r--r--crates/ra_hir/src/lib.rs1
-rw-r--r--crates/ra_hir/src/nameres.rs4
-rw-r--r--crates/ra_hir/src/resolve.rs8
-rw-r--r--crates/ra_hir/src/ty/infer.rs4
-rw-r--r--crates/ra_hir/src/ty/method_resolution.rs23
-rw-r--r--crates/ra_hir/src/ty/tests.rs22
-rw-r--r--crates/ra_ide_api/src/completion/complete_path.rs25
-rw-r--r--crates/ra_lsp_server/Cargo.toml2
-rw-r--r--crates/ra_lsp_server/src/caps.rs3
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs1
-rw-r--r--crates/ra_lsp_server/src/main_loop/handlers.rs47
-rw-r--r--crates/ra_lsp_server/src/req.rs22
-rw-r--r--crates/ra_syntax/src/ast/extensions.rs14
-rw-r--r--crates/ra_syntax/src/ast/generated.rs1
-rw-r--r--crates/ra_syntax/src/grammar.ron2
-rw-r--r--docs/dev/lsp-features.md2
-rw-r--r--docs/user/features.md21
-rw-r--r--editors/code/package-lock.json1607
-rw-r--r--editors/code/package.json47
-rw-r--r--editors/code/src/commands/cargo_watch.ts102
-rw-r--r--editors/code/src/commands/extend_selection.ts34
-rw-r--r--editors/code/src/commands/index.ts2
-rw-r--r--editors/code/src/commands/runnables.ts17
-rw-r--r--editors/code/src/commands/watch_status.ts18
-rw-r--r--editors/code/src/extension.ts29
-rw-r--r--editors/code/src/server.ts1
31 files changed, 615 insertions, 1586 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 81dd812f4..723c1ac5f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -270,7 +270,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
270dependencies = [ 270dependencies = [
271 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 271 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
272 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 272 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
273 "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", 273 "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)",
274] 274]
275 275
276[[package]] 276[[package]]
@@ -343,7 +343,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
343dependencies = [ 343dependencies = [
344 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 344 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
345 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 345 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
346 "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", 346 "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)",
347 "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 347 "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
348] 348]
349 349
@@ -430,7 +430,7 @@ dependencies = [
430 "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 430 "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
431 "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 431 "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
432 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 432 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
433 "lsp-types 0.56.0 (registry+https://github.com/rust-lang/crates.io-index)", 433 "lsp-types 0.57.0 (git+https://github.com/matklad/lsp-types?branch=selection-range)",
434 "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", 434 "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
435 "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", 435 "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
436] 436]
@@ -634,8 +634,8 @@ dependencies = [
634 634
635[[package]] 635[[package]]
636name = "lsp-types" 636name = "lsp-types"
637version = "0.56.0" 637version = "0.57.0"
638source = "registry+https://github.com/rust-lang/crates.io-index" 638source = "git+https://github.com/matklad/lsp-types?branch=selection-range#6e37d45bcf411c18c22ab29ec155946ff001339e"
639dependencies = [ 639dependencies = [
640 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 640 "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
641 "num-derive 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", 641 "num-derive 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -747,7 +747,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
747dependencies = [ 747dependencies = [
748 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 748 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
749 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 749 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
750 "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", 750 "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)",
751] 751]
752 752
753[[package]] 753[[package]]
@@ -844,7 +844,7 @@ dependencies = [
844 "pest_meta 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 844 "pest_meta 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
845 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 845 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
846 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 846 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
847 "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", 847 "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)",
848] 848]
849 849
850[[package]] 850[[package]]
@@ -1027,7 +1027,7 @@ dependencies = [
1027 "flexi_logger 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", 1027 "flexi_logger 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)",
1028 "gen_lsp_server 0.1.0", 1028 "gen_lsp_server 0.1.0",
1029 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1029 "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
1030 "lsp-types 0.56.0 (registry+https://github.com/rust-lang/crates.io-index)", 1030 "lsp-types 0.57.0 (git+https://github.com/matklad/lsp-types?branch=selection-range)",
1031 "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 1031 "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
1032 "ra_arena 0.1.0", 1032 "ra_arena 0.1.0",
1033 "ra_ide_api 0.1.0", 1033 "ra_ide_api 0.1.0",
@@ -1378,7 +1378,7 @@ dependencies = [
1378 "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1378 "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
1379 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1379 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
1380 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 1380 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
1381 "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", 1381 "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)",
1382] 1382]
1383 1383
1384[[package]] 1384[[package]]
@@ -1423,7 +1423,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1423dependencies = [ 1423dependencies = [
1424 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1424 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
1425 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 1425 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
1426 "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", 1426 "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)",
1427] 1427]
1428 1428
1429[[package]] 1429[[package]]
@@ -1501,7 +1501,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1501 1501
1502[[package]] 1502[[package]]
1503name = "syn" 1503name = "syn"
1504version = "0.15.31" 1504version = "0.15.32"
1505source = "registry+https://github.com/rust-lang/crates.io-index" 1505source = "registry+https://github.com/rust-lang/crates.io-index"
1506dependencies = [ 1506dependencies = [
1507 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1507 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1516,7 +1516,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1516dependencies = [ 1516dependencies = [
1517 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", 1517 "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
1518 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 1518 "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
1519 "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", 1519 "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)",
1520 "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1520 "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
1521] 1521]
1522 1522
@@ -1937,7 +1937,7 @@ dependencies = [
1937"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" 1937"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
1938"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" 1938"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c"
1939"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" 1939"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
1940"checksum lsp-types 0.56.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31954f2cf354421e6f99a48fdcfd5c3113c675a0db311960ffdac0b8d45cf09c" 1940"checksum lsp-types 0.57.0 (git+https://github.com/matklad/lsp-types?branch=selection-range)" = "<none>"
1941"checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43" 1941"checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43"
1942"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1942"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
1943"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" 1943"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39"
@@ -2010,7 +2010,7 @@ dependencies = [
2010"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" 2010"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
2011"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 2011"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
2012"checksum superslice 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab16ced94dbd8a46c82fd81e3ed9a8727dac2977ea869d217bcc4ea1f122e81f" 2012"checksum superslice 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab16ced94dbd8a46c82fd81e3ed9a8727dac2977ea869d217bcc4ea1f122e81f"
2013"checksum syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b4cfac95805274c6afdb12d8f770fa2d27c045953e7b630a81801953699a9a" 2013"checksum syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)" = "846620ec526c1599c070eff393bfeeeb88a93afa2513fc3b49f1fea84cf7b0ed"
2014"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" 2014"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
2015"checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" 2015"checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a"
2016"checksum tera 0.11.20 (registry+https://github.com/rust-lang/crates.io-index)" = "4b505279e19d8f7d24b1a9dc58327c9c36174b1a2c7ebdeac70792d017cb64f3" 2016"checksum tera 0.11.20 (registry+https://github.com/rust-lang/crates.io-index)" = "4b505279e19d8f7d24b1a9dc58327c9c36174b1a2c7ebdeac70792d017cb64f3"
diff --git a/Cargo.toml b/Cargo.toml
index c5155e899..0e474a184 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,3 +6,4 @@ incremental = true
6debug = true 6debug = true
7 7
8[patch.'crates-io'] 8[patch.'crates-io']
9lsp-types = { git = "https://github.com/matklad/lsp-types", branch = "selection-range" }
diff --git a/crates/gen_lsp_server/Cargo.toml b/crates/gen_lsp_server/Cargo.toml
index 9e0d819d0..34343e2f2 100644
--- a/crates/gen_lsp_server/Cargo.toml
+++ b/crates/gen_lsp_server/Cargo.toml
@@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0"
8description = "Generic LSP server scaffold." 8description = "Generic LSP server scaffold."
9 9
10[dependencies] 10[dependencies]
11lsp-types = "0.56.0" 11lsp-types = "0.57.0"
12log = "0.4.3" 12log = "0.4.3"
13failure = "0.1.4" 13failure = "0.1.4"
14serde_json = "1.0.34" 14serde_json = "1.0.34"
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index 18627bbc2..8af0a3176 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -1,6 +1,6 @@
1use std::sync::Arc; 1use std::sync::Arc;
2 2
3use ra_syntax::{SyntaxNode, TreeArc, SourceFile, ast}; 3use ra_syntax::{SyntaxNode, TreeArc, SourceFile, SmolStr, ast};
4use ra_db::{SourceDatabase, salsa}; 4use ra_db::{SourceDatabase, salsa};
5 5
6use crate::{ 6use crate::{
@@ -16,6 +16,7 @@ use crate::{
16 generics::{GenericParams, GenericDef}, 16 generics::{GenericParams, GenericDef},
17 type_ref::TypeRef, 17 type_ref::TypeRef,
18 traits::TraitData, Trait, ty::TraitRef, 18 traits::TraitData, Trait, ty::TraitRef,
19 lang_item::{LangItems, LangItemTarget},
19 ids 20 ids
20}; 21};
21 22
@@ -100,6 +101,12 @@ pub trait DefDatabase: SourceDatabase {
100 101
101 #[salsa::invoke(crate::ConstSignature::static_signature_query)] 102 #[salsa::invoke(crate::ConstSignature::static_signature_query)]
102 fn static_signature(&self, konst: Static) -> Arc<ConstSignature>; 103 fn static_signature(&self, konst: Static) -> Arc<ConstSignature>;
104
105 #[salsa::invoke(crate::lang_item::LangItems::lang_items_query)]
106 fn lang_items(&self, krate: Crate) -> Arc<LangItems>;
107
108 #[salsa::invoke(crate::lang_item::LangItems::lang_item_query)]
109 fn lang_item(&self, start_crate: Crate, item: SmolStr) -> Option<LangItemTarget>;
103} 110}
104 111
105#[salsa::query_group(HirDatabaseStorage)] 112#[salsa::query_group(HirDatabaseStorage)]
diff --git a/crates/ra_hir/src/lang_item.rs b/crates/ra_hir/src/lang_item.rs
new file mode 100644
index 000000000..5f3f91cba
--- /dev/null
+++ b/crates/ra_hir/src/lang_item.rs
@@ -0,0 +1,102 @@
1use std::sync::Arc;
2use rustc_hash::FxHashMap;
3
4use ra_syntax::{SmolStr, ast::AttrsOwner};
5
6use crate::{
7 Crate, DefDatabase, Enum, Function, HirDatabase, ImplBlock, Module, Static, Struct, Trait
8};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11pub enum LangItemTarget {
12 Enum(Enum),
13 Function(Function),
14 ImplBlock(ImplBlock),
15 Static(Static),
16 Struct(Struct),
17 Trait(Trait),
18}
19
20impl LangItemTarget {
21 pub(crate) fn krate(&self, db: &impl HirDatabase) -> Option<Crate> {
22 match self {
23 LangItemTarget::Enum(e) => e.module(db).krate(db),
24 LangItemTarget::Function(f) => f.module(db).krate(db),
25 LangItemTarget::ImplBlock(i) => i.module().krate(db),
26 LangItemTarget::Static(s) => s.module(db).krate(db),
27 LangItemTarget::Struct(s) => s.module(db).krate(db),
28 LangItemTarget::Trait(t) => t.module(db).krate(db),
29 }
30 }
31}
32
33#[derive(Debug, Clone, PartialEq, Eq)]
34pub struct LangItems {
35 items: FxHashMap<SmolStr, LangItemTarget>,
36}
37
38impl LangItems {
39 pub fn target<'a>(&'a self, item: &str) -> Option<&'a LangItemTarget> {
40 self.items.get(item)
41 }
42
43 /// Salsa query. This will look for lang items in a specific crate.
44 pub(crate) fn lang_items_query(db: &impl DefDatabase, krate: Crate) -> Arc<LangItems> {
45 let mut lang_items = LangItems { items: FxHashMap::default() };
46
47 if let Some(module) = krate.root_module(db) {
48 lang_items.collect_lang_items_recursive(db, &module);
49 }
50
51 Arc::new(lang_items)
52 }
53
54 /// Salsa query. Look for a lang item, starting from the specified crate and recursively
55 /// traversing its dependencies.
56 pub(crate) fn lang_item_query(
57 db: &impl DefDatabase,
58 start_crate: Crate,
59 item: SmolStr,
60 ) -> Option<LangItemTarget> {
61 let lang_items = db.lang_items(start_crate);
62 let start_crate_target = lang_items.items.get(&item);
63 if let Some(target) = start_crate_target {
64 Some(*target)
65 } else {
66 for dep in start_crate.dependencies(db) {
67 let dep_crate = dep.krate;
68 let dep_target = db.lang_item(dep_crate, item.clone());
69 if dep_target.is_some() {
70 return dep_target;
71 }
72 }
73 None
74 }
75 }
76
77 fn collect_lang_items_recursive(&mut self, db: &impl DefDatabase, module: &Module) {
78 // Look for impl targets
79 let (impl_blocks, source_map) = db.impls_in_module_with_source_map(module.clone());
80 let source = module.definition_source(db).1;
81 for (impl_id, _) in impl_blocks.impls.iter() {
82 let impl_block = source_map.get(&source, impl_id);
83 let lang_item_name = impl_block
84 .attrs()
85 .filter_map(|a| a.as_key_value())
86 .filter(|(key, _)| key == "lang")
87 .map(|(_, val)| val)
88 .nth(0);
89 if let Some(lang_item_name) = lang_item_name {
90 let imp = ImplBlock::from_id(*module, impl_id);
91 self.items.entry(lang_item_name).or_insert(LangItemTarget::ImplBlock(imp));
92 }
93 }
94
95 // FIXME we should look for the other lang item targets (traits, structs, ...)
96
97 // Look for lang items in the children
98 for child in module.children(db) {
99 self.collect_lang_items_recursive(db, &child);
100 }
101 }
102}
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index 9292de1b5..4411715de 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -36,6 +36,7 @@ mod type_ref;
36mod ty; 36mod ty;
37mod impl_block; 37mod impl_block;
38mod expr; 38mod expr;
39mod lang_item;
39mod generics; 40mod generics;
40mod docs; 41mod docs;
41mod resolve; 42mod resolve;
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index 0eddfab12..39152360c 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -202,6 +202,10 @@ impl CrateDefMap {
202 Arc::new(def_map) 202 Arc::new(def_map)
203 } 203 }
204 204
205 pub(crate) fn krate(&self) -> Crate {
206 self.krate
207 }
208
205 pub(crate) fn root(&self) -> CrateModuleId { 209 pub(crate) fn root(&self) -> CrateModuleId {
206 self.root 210 self.root
207 } 211 }
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs
index 685f4b8b1..f2c85eb66 100644
--- a/crates/ra_hir/src/resolve.rs
+++ b/crates/ra_hir/src/resolve.rs
@@ -5,13 +5,15 @@ use rustc_hash::FxHashMap;
5 5
6use crate::{ 6use crate::{
7 ModuleDef, 7 ModuleDef,
8 code_model_api::Crate,
8 db::HirDatabase, 9 db::HirDatabase,
9 name::{Name, KnownName}, 10 name::{Name, KnownName},
10 nameres::{PerNs, CrateDefMap, CrateModuleId}, 11 nameres::{PerNs, CrateDefMap, CrateModuleId},
11 generics::GenericParams, 12 generics::GenericParams,
12 expr::{scope::{ExprScopes, ScopeId}, PatId}, 13 expr::{scope::{ExprScopes, ScopeId}, PatId},
13 impl_block::ImplBlock, 14 impl_block::ImplBlock,
14 path::Path, Trait 15 path::Path,
16 Trait
15}; 17};
16 18
17#[derive(Debug, Clone, Default)] 19#[derive(Debug, Clone, Default)]
@@ -197,6 +199,10 @@ impl Resolver {
197 _ => None, 199 _ => None,
198 }) 200 })
199 } 201 }
202
203 pub(crate) fn krate(&self) -> Option<Crate> {
204 self.module().map(|t| t.0.krate())
205 }
200} 206}
201 207
202impl Resolver { 208impl Resolver {
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs
index 7ca1ff595..c7772a7f6 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -462,6 +462,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
462 let remaining_index = remaining_index.unwrap_or(path.segments.len()); 462 let remaining_index = remaining_index.unwrap_or(path.segments.len());
463 let mut actual_def_ty: Option<Ty> = None; 463 let mut actual_def_ty: Option<Ty> = None;
464 464
465 let krate = resolver.krate()?;
465 // resolve intermediate segments 466 // resolve intermediate segments
466 for (i, segment) in path.segments[remaining_index..].iter().enumerate() { 467 for (i, segment) in path.segments[remaining_index..].iter().enumerate() {
467 let ty = match resolved { 468 let ty = match resolved {
@@ -500,9 +501,10 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
500 // Attempt to find an impl_item for the type which has a name matching 501 // Attempt to find an impl_item for the type which has a name matching
501 // the current segment 502 // the current segment
502 log::debug!("looking for path segment: {:?}", segment); 503 log::debug!("looking for path segment: {:?}", segment);
504
503 actual_def_ty = Some(ty.clone()); 505 actual_def_ty = Some(ty.clone());
504 506
505 let item: crate::ModuleDef = ty.iterate_impl_items(self.db, |item| { 507 let item: crate::ModuleDef = ty.iterate_impl_items(self.db, krate, |item| {
506 let matching_def: Option<crate::ModuleDef> = match item { 508 let matching_def: Option<crate::ModuleDef> = match item {
507 crate::ImplItem::Method(func) => { 509 crate::ImplItem::Method(func) => {
508 let sig = func.signature(self.db); 510 let sig = func.signature(self.db);
diff --git a/crates/ra_hir/src/ty/method_resolution.rs b/crates/ra_hir/src/ty/method_resolution.rs
index 667b66095..ea6e0dc0f 100644
--- a/crates/ra_hir/src/ty/method_resolution.rs
+++ b/crates/ra_hir/src/ty/method_resolution.rs
@@ -14,6 +14,7 @@ use crate::{
14 resolve::Resolver, 14 resolve::Resolver,
15 traits::TraitItem, 15 traits::TraitItem,
16 generics::HasGenericParams, 16 generics::HasGenericParams,
17 ty::primitive::{UncertainIntTy, UncertainFloatTy}
17}; 18};
18use super::{TraitRef, Substs}; 19use super::{TraitRef, Substs};
19 20
@@ -110,10 +111,19 @@ impl CrateImplBlocks {
110 } 111 }
111} 112}
112 113
113fn def_crate(db: &impl HirDatabase, ty: &Ty) -> Option<Crate> { 114fn def_crate(db: &impl HirDatabase, cur_crate: Crate, ty: &Ty) -> Option<Crate> {
114 match ty { 115 match ty {
115 Ty::Apply(a_ty) => match a_ty.ctor { 116 Ty::Apply(a_ty) => match a_ty.ctor {
116 TypeCtor::Adt(def_id) => def_id.krate(db), 117 TypeCtor::Adt(def_id) => def_id.krate(db),
118 TypeCtor::Bool => db.lang_item(cur_crate, "bool".into())?.krate(db),
119 TypeCtor::Char => db.lang_item(cur_crate, "char".into())?.krate(db),
120 TypeCtor::Float(UncertainFloatTy::Known(f)) => {
121 db.lang_item(cur_crate, f.ty_to_string().into())?.krate(db)
122 }
123 TypeCtor::Int(UncertainIntTy::Known(i)) => {
124 db.lang_item(cur_crate, i.ty_to_string().into())?.krate(db)
125 }
126 TypeCtor::Str => db.lang_item(cur_crate, "str".into())?.krate(db),
117 _ => None, 127 _ => None,
118 }, 128 },
119 _ => None, 129 _ => None,
@@ -150,8 +160,11 @@ impl Ty {
150 // find in the end takes &self, we still do the autoderef step (just as 160 // find in the end takes &self, we still do the autoderef step (just as
151 // rustc does an autoderef and then autoref again). 161 // rustc does an autoderef and then autoref again).
152 162
163 let krate = resolver.krate()?;
153 for derefed_ty in self.autoderef(db) { 164 for derefed_ty in self.autoderef(db) {
154 if let Some(result) = derefed_ty.iterate_inherent_methods(db, name, &mut callback) { 165 if let Some(result) =
166 derefed_ty.iterate_inherent_methods(db, name, krate, &mut callback)
167 {
155 return Some(result); 168 return Some(result);
156 } 169 }
157 if let Some(result) = 170 if let Some(result) =
@@ -208,9 +221,10 @@ impl Ty {
208 &self, 221 &self,
209 db: &impl HirDatabase, 222 db: &impl HirDatabase,
210 name: Option<&Name>, 223 name: Option<&Name>,
224 krate: Crate,
211 mut callback: impl FnMut(&Ty, Function) -> Option<T>, 225 mut callback: impl FnMut(&Ty, Function) -> Option<T>,
212 ) -> Option<T> { 226 ) -> Option<T> {
213 let krate = match def_crate(db, self) { 227 let krate = match def_crate(db, krate, self) {
214 Some(krate) => krate, 228 Some(krate) => krate,
215 None => return None, 229 None => return None,
216 }; 230 };
@@ -239,9 +253,10 @@ impl Ty {
239 pub fn iterate_impl_items<T>( 253 pub fn iterate_impl_items<T>(
240 self, 254 self,
241 db: &impl HirDatabase, 255 db: &impl HirDatabase,
256 krate: Crate,
242 mut callback: impl FnMut(ImplItem) -> Option<T>, 257 mut callback: impl FnMut(ImplItem) -> Option<T>,
243 ) -> Option<T> { 258 ) -> Option<T> {
244 let krate = def_crate(db, &self)?; 259 let krate = def_crate(db, krate, &self)?;
245 let impls = db.impls_in_crate(krate); 260 let impls = db.impls_in_crate(krate);
246 261
247 for impl_block in impls.lookup_impl_blocks(&self) { 262 for impl_block in impls.lookup_impl_blocks(&self) {
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs
index 8d8a0eaaa..86f18b487 100644
--- a/crates/ra_hir/src/ty/tests.rs
+++ b/crates/ra_hir/src/ty/tests.rs
@@ -627,6 +627,28 @@ fn test(a: A) {
627} 627}
628 628
629#[test] 629#[test]
630fn infer_inherent_method_str() {
631 assert_snapshot_matches!(
632 infer(r#"
633#[lang = "str"]
634impl str {
635 fn foo(&self) -> i32 {}
636}
637
638fn test() {
639 "foo".foo();
640}
641"#),
642 @r###"
643[40; 44) 'self': &str
644[53; 55) '{}': ()
645[69; 89) '{ ...o(); }': ()
646[75; 80) '"foo"': &str
647[75; 86) '"foo".foo()': i32"###
648 );
649}
650
651#[test]
630fn infer_tuple() { 652fn infer_tuple() {
631 assert_snapshot_matches!( 653 assert_snapshot_matches!(
632 infer(r#" 654 infer(r#"
diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs
index bc03a7095..c41752ae7 100644
--- a/crates/ra_ide_api/src/completion/complete_path.rs
+++ b/crates/ra_ide_api/src/completion/complete_path.rs
@@ -38,19 +38,22 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) {
38 } 38 }
39 hir::ModuleDef::Struct(s) => { 39 hir::ModuleDef::Struct(s) => {
40 let ty = s.ty(ctx.db); 40 let ty = s.ty(ctx.db);
41 ty.iterate_impl_items(ctx.db, |item| { 41 let krate = ctx.module.and_then(|m| m.krate(ctx.db));
42 match item { 42 if let Some(krate) = krate {
43 hir::ImplItem::Method(func) => { 43 ty.iterate_impl_items(ctx.db, krate, |item| {
44 let sig = func.signature(ctx.db); 44 match item {
45 if !sig.has_self_param() { 45 hir::ImplItem::Method(func) => {
46 acc.add_function(ctx, func); 46 let sig = func.signature(ctx.db);
47 if !sig.has_self_param() {
48 acc.add_function(ctx, func);
49 }
47 } 50 }
51 hir::ImplItem::Const(ct) => acc.add_const(ctx, ct),
52 hir::ImplItem::TypeAlias(ty) => acc.add_type_alias(ctx, ty),
48 } 53 }
49 hir::ImplItem::Const(ct) => acc.add_const(ctx, ct), 54 None::<()>
50 hir::ImplItem::TypeAlias(ty) => acc.add_type_alias(ctx, ty), 55 });
51 } 56 }
52 None::<()>
53 });
54 } 57 }
55 _ => return, 58 _ => return,
56 }; 59 };
diff --git a/crates/ra_lsp_server/Cargo.toml b/crates/ra_lsp_server/Cargo.toml
index bc181e4eb..c855d6f68 100644
--- a/crates/ra_lsp_server/Cargo.toml
+++ b/crates/ra_lsp_server/Cargo.toml
@@ -15,7 +15,7 @@ crossbeam-channel = "0.3.5"
15flexi_logger = "0.11.0" 15flexi_logger = "0.11.0"
16log = "0.4.3" 16log = "0.4.3"
17url_serde = "0.2.0" 17url_serde = "0.2.0"
18lsp-types = "0.56.0" 18lsp-types = "0.57.0"
19rustc-hash = "1.0" 19rustc-hash = "1.0"
20parking_lot = "0.7.0" 20parking_lot = "0.7.0"
21 21
diff --git a/crates/ra_lsp_server/src/caps.rs b/crates/ra_lsp_server/src/caps.rs
index 2af2b89fe..f6d2b75e7 100644
--- a/crates/ra_lsp_server/src/caps.rs
+++ b/crates/ra_lsp_server/src/caps.rs
@@ -2,7 +2,7 @@ use lsp_types::{
2 CodeActionProviderCapability, CodeLensOptions, CompletionOptions, DocumentOnTypeFormattingOptions, 2 CodeActionProviderCapability, CodeLensOptions, CompletionOptions, DocumentOnTypeFormattingOptions,
3 ExecuteCommandOptions, FoldingRangeProviderCapability, RenameOptions, RenameProviderCapability, 3 ExecuteCommandOptions, FoldingRangeProviderCapability, RenameOptions, RenameProviderCapability,
4 ServerCapabilities, SignatureHelpOptions, TextDocumentSyncCapability, TextDocumentSyncKind, 4 ServerCapabilities, SignatureHelpOptions, TextDocumentSyncCapability, TextDocumentSyncKind,
5 TextDocumentSyncOptions, ImplementationProviderCapability, 5 TextDocumentSyncOptions, ImplementationProviderCapability, GenericCapability,
6}; 6};
7 7
8pub fn server_capabilities() -> ServerCapabilities { 8pub fn server_capabilities() -> ServerCapabilities {
@@ -37,6 +37,7 @@ pub fn server_capabilities() -> ServerCapabilities {
37 first_trigger_character: "=".to_string(), 37 first_trigger_character: "=".to_string(),
38 more_trigger_character: Some(vec![".".to_string()]), 38 more_trigger_character: Some(vec![".".to_string()]),
39 }), 39 }),
40 selection_range_provider: Some(GenericCapability::default()),
40 folding_range_provider: Some(FoldingRangeProviderCapability::Simple(true)), 41 folding_range_provider: Some(FoldingRangeProviderCapability::Simple(true)),
41 rename_provider: Some(RenameProviderCapability::Options(RenameOptions { 42 rename_provider: Some(RenameProviderCapability::Options(RenameOptions {
42 prepare_provider: Some(true), 43 prepare_provider: Some(true),
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs
index 07ac4917a..dc1f8f3f7 100644
--- a/crates/ra_lsp_server/src/main_loop.rs
+++ b/crates/ra_lsp_server/src/main_loop.rs
@@ -297,6 +297,7 @@ fn on_request(
297 .on::<req::AnalyzerStatus>(handlers::handle_analyzer_status)? 297 .on::<req::AnalyzerStatus>(handlers::handle_analyzer_status)?
298 .on::<req::SyntaxTree>(handlers::handle_syntax_tree)? 298 .on::<req::SyntaxTree>(handlers::handle_syntax_tree)?
299 .on::<req::ExtendSelection>(handlers::handle_extend_selection)? 299 .on::<req::ExtendSelection>(handlers::handle_extend_selection)?
300 .on::<req::SelectionRangeRequest>(handlers::handle_selection_range)?
300 .on::<req::FindMatchingBrace>(handlers::handle_find_matching_brace)? 301 .on::<req::FindMatchingBrace>(handlers::handle_find_matching_brace)?
301 .on::<req::JoinLines>(handlers::handle_join_lines)? 302 .on::<req::JoinLines>(handlers::handle_join_lines)?
302 .on::<req::OnEnter>(handlers::handle_on_enter)? 303 .on::<req::OnEnter>(handlers::handle_on_enter)?
diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs
index eb8a53545..530081494 100644
--- a/crates/ra_lsp_server/src/main_loop/handlers.rs
+++ b/crates/ra_lsp_server/src/main_loop/handlers.rs
@@ -11,7 +11,7 @@ use ra_ide_api::{
11 FileId, FilePosition, FileRange, FoldKind, Query, RangeInfo, RunnableKind, Severity, Cancelable, 11 FileId, FilePosition, FileRange, FoldKind, Query, RangeInfo, RunnableKind, Severity, Cancelable,
12 AssistId, 12 AssistId,
13}; 13};
14use ra_syntax::{AstNode, SyntaxKind, TextUnit}; 14use ra_syntax::{AstNode, SyntaxKind, TextUnit, TextRange};
15use ra_prof::profile; 15use ra_prof::profile;
16use rustc_hash::FxHashMap; 16use rustc_hash::FxHashMap;
17use serde::{Serialize, Deserialize}; 17use serde::{Serialize, Deserialize};
@@ -39,10 +39,15 @@ pub fn handle_syntax_tree(world: ServerWorld, params: req::SyntaxTreeParams) ->
39 Ok(res) 39 Ok(res)
40} 40}
41 41
42// FIXME: drop this API
42pub fn handle_extend_selection( 43pub fn handle_extend_selection(
43 world: ServerWorld, 44 world: ServerWorld,
44 params: req::ExtendSelectionParams, 45 params: req::ExtendSelectionParams,
45) -> Result<req::ExtendSelectionResult> { 46) -> Result<req::ExtendSelectionResult> {
47 log::error!(
48 "extend selection is deprecated and will be removed soon,
49 use the new selection range API in LSP",
50 );
46 let file_id = params.text_document.try_conv_with(&world)?; 51 let file_id = params.text_document.try_conv_with(&world)?;
47 let line_index = world.analysis().file_line_index(file_id); 52 let line_index = world.analysis().file_line_index(file_id);
48 let selections = params 53 let selections = params
@@ -55,6 +60,46 @@ pub fn handle_extend_selection(
55 Ok(req::ExtendSelectionResult { selections }) 60 Ok(req::ExtendSelectionResult { selections })
56} 61}
57 62
63pub fn handle_selection_range(
64 world: ServerWorld,
65 params: req::SelectionRangeParams,
66) -> Result<Vec<req::SelectionRange>> {
67 let file_id = params.text_document.try_conv_with(&world)?;
68 let line_index = world.analysis().file_line_index(file_id);
69 params
70 .positions
71 .into_iter()
72 .map_conv_with(&line_index)
73 .map(|position| {
74 let mut ranges = Vec::new();
75 {
76 let mut range = TextRange::from_to(position, position);
77 loop {
78 ranges.push(range);
79 let frange = FileRange { file_id, range };
80 let next = world.analysis().extend_selection(frange)?;
81 if next == range {
82 break;
83 } else {
84 range = next
85 }
86 }
87 }
88 let mut range = req::SelectionRange {
89 range: ranges.last().unwrap().conv_with(&line_index),
90 parent: None,
91 };
92 for r in ranges.iter().rev().skip(1) {
93 range = req::SelectionRange {
94 range: r.conv_with(&line_index),
95 parent: Some(Box::new(range)),
96 }
97 }
98 Ok(range)
99 })
100 .collect()
101}
102
58pub fn handle_find_matching_brace( 103pub fn handle_find_matching_brace(
59 world: ServerWorld, 104 world: ServerWorld,
60 params: req::FindMatchingBraceParams, 105 params: req::FindMatchingBraceParams,
diff --git a/crates/ra_lsp_server/src/req.rs b/crates/ra_lsp_server/src/req.rs
index 4f35ab9b5..6090eb7b9 100644
--- a/crates/ra_lsp_server/src/req.rs
+++ b/crates/ra_lsp_server/src/req.rs
@@ -64,6 +64,28 @@ pub struct ExtendSelectionResult {
64 pub selections: Vec<Range>, 64 pub selections: Vec<Range>,
65} 65}
66 66
67pub enum SelectionRangeRequest {}
68
69impl Request for SelectionRangeRequest {
70 type Params = SelectionRangeParams;
71 type Result = Vec<SelectionRange>;
72 const METHOD: &'static str = "textDocument/selectionRange";
73}
74
75#[derive(Deserialize, Debug)]
76#[serde(rename_all = "camelCase")]
77pub struct SelectionRangeParams {
78 pub text_document: TextDocumentIdentifier,
79 pub positions: Vec<Position>,
80}
81
82#[derive(Serialize, Debug)]
83#[serde(rename_all = "camelCase")]
84pub struct SelectionRange {
85 pub range: Range,
86 pub parent: Option<Box<SelectionRange>>,
87}
88
67pub enum FindMatchingBrace {} 89pub enum FindMatchingBrace {}
68 90
69impl Request for FindMatchingBrace { 91impl Request for FindMatchingBrace {
diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs
index ca33b43e7..5c4c0ffc1 100644
--- a/crates/ra_syntax/src/ast/extensions.rs
+++ b/crates/ra_syntax/src/ast/extensions.rs
@@ -65,6 +65,20 @@ impl ast::Attr {
65 None 65 None
66 } 66 }
67 } 67 }
68
69 pub fn as_key_value(&self) -> Option<(SmolStr, SmolStr)> {
70 let tt = self.value()?;
71 let tt_node = tt.syntax();
72 let attr = tt_node.children_with_tokens().nth(1)?;
73 if attr.kind() == IDENT {
74 let key = attr.as_token()?.text().clone();
75 let val_node = tt_node.children_with_tokens().find(|t| t.kind() == STRING)?;
76 let val = val_node.as_token()?.text().trim_start_matches("\"").trim_end_matches("\"");
77 Some((key, SmolStr::new(val)))
78 } else {
79 None
80 }
81 }
68} 82}
69 83
70#[derive(Debug, Clone, Copy, PartialEq, Eq)] 84#[derive(Debug, Clone, Copy, PartialEq, Eq)]
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs
index 17de4f058..fae371509 100644
--- a/crates/ra_syntax/src/ast/generated.rs
+++ b/crates/ra_syntax/src/ast/generated.rs
@@ -1325,6 +1325,7 @@ impl ToOwned for ImplBlock {
1325 1325
1326 1326
1327impl ast::TypeParamsOwner for ImplBlock {} 1327impl ast::TypeParamsOwner for ImplBlock {}
1328impl ast::AttrsOwner for ImplBlock {}
1328impl ImplBlock { 1329impl ImplBlock {
1329 pub fn item_list(&self) -> Option<&ItemList> { 1330 pub fn item_list(&self) -> Option<&ItemList> {
1330 super::child_opt(self) 1331 super::child_opt(self)
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron
index 663e3a2f9..5bdcf9c84 100644
--- a/crates/ra_syntax/src/grammar.ron
+++ b/crates/ra_syntax/src/grammar.ron
@@ -345,7 +345,7 @@ Grammar(
345 ], 345 ],
346 options: ["TypeRef"] 346 options: ["TypeRef"]
347 ), 347 ),
348 "ImplBlock": (options: ["ItemList"], traits: ["TypeParamsOwner"]), 348 "ImplBlock": (options: ["ItemList"], traits: ["TypeParamsOwner", "AttrsOwner"]),
349 349
350 "ParenType": (options: ["TypeRef"]), 350 "ParenType": (options: ["TypeRef"]),
351 "TupleType": ( collections: [["fields", "TypeRef"]] ), 351 "TupleType": ( collections: [["fields", "TypeRef"]] ),
diff --git a/docs/dev/lsp-features.md b/docs/dev/lsp-features.md
index 212d132ee..57015293c 100644
--- a/docs/dev/lsp-features.md
+++ b/docs/dev/lsp-features.md
@@ -52,8 +52,8 @@ This list documents LSP features, supported by rust-analyzer.
52- [x] [textDocument/documentHighlight](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentHighlight) 52- [x] [textDocument/documentHighlight](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentHighlight)
53- [x] [textDocument/documentSymbol](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentSymbol) 53- [x] [textDocument/documentSymbol](https://microsoft.github.io/language-server-protocol/specification#textDocument_documentSymbol)
54- [x] [textDocument/codeAction](https://microsoft.github.io/language-server-protocol/specification#textDocument_codeAction) 54- [x] [textDocument/codeAction](https://microsoft.github.io/language-server-protocol/specification#textDocument_codeAction)
55- [x] [textDocument/selectionRange](https://github.com/Microsoft/language-server-protocol/issues/613)
55 - rust-analyzer.syntaxTree 56 - rust-analyzer.syntaxTree
56 - rust-analyzer.extendSelection
57 - rust-analyzer.matchingBrace 57 - rust-analyzer.matchingBrace
58 - rust-analyzer.parentModule 58 - rust-analyzer.parentModule
59 - rust-analyzer.joinLines 59 - rust-analyzer.joinLines
diff --git a/docs/user/features.md b/docs/user/features.md
index 09a7f5a43..b44a3fce1 100644
--- a/docs/user/features.md
+++ b/docs/user/features.md
@@ -34,14 +34,15 @@ Some features trigger on typing certain characters:
34- Enter inside comments automatically inserts `///` 34- Enter inside comments automatically inserts `///`
35- typing `.` in a chain method call auto-indents 35- typing `.` in a chain method call auto-indents
36 36
37### Commands <kbd>ctrl+shift+p</kbd> 37### Extend Selection
38
39#### Extend Selection
40 38
41Extends the current selection to the encompassing syntactic construct 39Extends the current selection to the encompassing syntactic construct
42(expression, statement, item, module, etc). It works with multiple cursors. Do 40(expression, statement, item, module, etc). It works with multiple cursors. This
43bind this command to a key, it's super-useful! Expected to be upstreamed to LSP 41is a relatively new feature of LSP:
44soonish: https://github.com/Microsoft/language-server-protocol/issues/613 42https://github.com/Microsoft/language-server-protocol/issues/613, check your
43editor's LSP library to see if this feature is supported.
44
45### Commands <kbd>ctrl+shift+p</kbd>
45 46
46#### Run 47#### Run
47 48
@@ -76,6 +77,14 @@ Shows internal statistic about memory usage of rust-analyzer
76 77
77Manually triggers GC 78Manually triggers GC
78 79
80#### Start Cargo Watch
81
82Start `cargo watch` for live error highlighting. Will prompt to install if it's not already installed.
83
84#### Stop Cargo Watch
85
86Stop `cargo watch`
87
79### Code Actions (Assists) 88### Code Actions (Assists)
80 89
81These are triggered in a particular context via light bulb. We use custom code on 90These are triggered in a particular context via light bulb. We use custom code on
diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json
index 008df6f52..29cd260a4 100644
--- a/editors/code/package-lock.json
+++ b/editors/code/package-lock.json
@@ -4,22 +4,51 @@
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
7 "@babel/code-frame": {
8 "version": "7.0.0",
9 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
10 "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
11 "dev": true,
12 "requires": {
13 "@babel/highlight": "^7.0.0"
14 }
15 },
16 "@babel/highlight": {
17 "version": "7.0.0",
18 "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
19 "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
20 "dev": true,
21 "requires": {
22 "chalk": "^2.0.0",
23 "esutils": "^2.0.2",
24 "js-tokens": "^4.0.0"
25 }
26 },
7 "@types/mocha": { 27 "@types/mocha": {
8 "version": "5.2.5", 28 "version": "5.2.6",
9 "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", 29 "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz",
10 "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", 30 "integrity": "sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==",
11 "dev": true 31 "dev": true
12 }, 32 },
13 "@types/node": { 33 "@types/node": {
14 "version": "10.12.24", 34 "version": "10.14.5",
15 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.24.tgz", 35 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.5.tgz",
16 "integrity": "sha512-GWWbvt+z9G5otRBW8rssOFgRY87J9N/qbhqfjMZ+gUuL6zoL+Hm6gP/8qQBG4jjimqdaNLCehcVapZ/Fs2WjCQ==", 36 "integrity": "sha512-Ja7d4s0qyGFxjGeDq5S7Si25OFibSAHUi6i17UWnwNnpitADN7hah9q0Tl25gxuV5R1u2Bx+np6w4LHXfHyj/g==",
17 "dev": true 37 "dev": true
18 }, 38 },
39 "agent-base": {
40 "version": "4.2.1",
41 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
42 "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
43 "dev": true,
44 "requires": {
45 "es6-promisify": "^5.0.0"
46 }
47 },
19 "ajv": { 48 "ajv": {
20 "version": "6.8.1", 49 "version": "6.10.0",
21 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", 50 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
22 "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", 51 "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
23 "dev": true, 52 "dev": true,
24 "requires": { 53 "requires": {
25 "fast-deep-equal": "^2.0.1", 54 "fast-deep-equal": "^2.0.1",
@@ -28,49 +57,13 @@
28 "uri-js": "^4.2.2" 57 "uri-js": "^4.2.2"
29 } 58 }
30 }, 59 },
31 "ansi-cyan": {
32 "version": "0.1.1",
33 "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
34 "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
35 "dev": true,
36 "requires": {
37 "ansi-wrap": "0.1.0"
38 }
39 },
40 "ansi-red": {
41 "version": "0.1.1",
42 "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
43 "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
44 "dev": true,
45 "requires": {
46 "ansi-wrap": "0.1.0"
47 }
48 },
49 "ansi-regex": {
50 "version": "2.1.1",
51 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
52 "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
53 "dev": true
54 },
55 "ansi-styles": { 60 "ansi-styles": {
56 "version": "2.2.1", 61 "version": "3.2.1",
57 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 62 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
58 "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 63 "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
59 "dev": true
60 },
61 "ansi-wrap": {
62 "version": "0.1.0",
63 "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
64 "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
65 "dev": true
66 },
67 "append-buffer": {
68 "version": "1.0.2",
69 "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
70 "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
71 "dev": true, 64 "dev": true,
72 "requires": { 65 "requires": {
73 "buffer-equal": "^1.0.0" 66 "color-convert": "^1.9.0"
74 } 67 }
75 }, 68 },
76 "argparse": { 69 "argparse": {
@@ -82,61 +75,6 @@
82 "sprintf-js": "~1.0.2" 75 "sprintf-js": "~1.0.2"
83 } 76 }
84 }, 77 },
85 "arr-diff": {
86 "version": "1.1.0",
87 "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
88 "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
89 "dev": true,
90 "requires": {
91 "arr-flatten": "^1.0.1",
92 "array-slice": "^0.2.3"
93 }
94 },
95 "arr-flatten": {
96 "version": "1.1.0",
97 "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
98 "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
99 "dev": true
100 },
101 "arr-union": {
102 "version": "2.1.0",
103 "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
104 "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
105 "dev": true
106 },
107 "array-differ": {
108 "version": "1.0.0",
109 "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
110 "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
111 "dev": true
112 },
113 "array-slice": {
114 "version": "0.2.3",
115 "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
116 "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
117 "dev": true
118 },
119 "array-union": {
120 "version": "1.0.2",
121 "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
122 "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
123 "dev": true,
124 "requires": {
125 "array-uniq": "^1.0.1"
126 }
127 },
128 "array-uniq": {
129 "version": "1.0.3",
130 "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
131 "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
132 "dev": true
133 },
134 "arrify": {
135 "version": "1.0.1",
136 "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
137 "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
138 "dev": true
139 },
140 "asn1": { 78 "asn1": {
141 "version": "0.2.4", 79 "version": "0.2.4",
142 "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 80 "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -170,32 +108,6 @@
170 "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 108 "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
171 "dev": true 109 "dev": true
172 }, 110 },
173 "babel-code-frame": {
174 "version": "6.26.0",
175 "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
176 "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
177 "dev": true,
178 "requires": {
179 "chalk": "^1.1.3",
180 "esutils": "^2.0.2",
181 "js-tokens": "^3.0.2"
182 },
183 "dependencies": {
184 "chalk": {
185 "version": "1.1.3",
186 "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
187 "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
188 "dev": true,
189 "requires": {
190 "ansi-styles": "^2.2.1",
191 "escape-string-regexp": "^1.0.2",
192 "has-ansi": "^2.0.0",
193 "strip-ansi": "^3.0.0",
194 "supports-color": "^2.0.0"
195 }
196 }
197 }
198 },
199 "balanced-match": { 111 "balanced-match": {
200 "version": "1.0.0", 112 "version": "1.0.0",
201 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 113 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -211,15 +123,6 @@
211 "tweetnacl": "^0.14.3" 123 "tweetnacl": "^0.14.3"
212 } 124 }
213 }, 125 },
214 "block-stream": {
215 "version": "0.0.9",
216 "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
217 "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
218 "dev": true,
219 "requires": {
220 "inherits": "~2.0.0"
221 }
222 },
223 "boolbase": { 126 "boolbase": {
224 "version": "1.0.0", 127 "version": "1.0.0",
225 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 128 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -248,12 +151,6 @@
248 "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 151 "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
249 "dev": true 152 "dev": true
250 }, 153 },
251 "buffer-equal": {
252 "version": "1.0.0",
253 "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
254 "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
255 "dev": true
256 },
257 "buffer-from": { 154 "buffer-from": {
258 "version": "1.1.1", 155 "version": "1.1.1",
259 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 156 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -281,97 +178,22 @@
281 "ansi-styles": "^3.2.1", 178 "ansi-styles": "^3.2.1",
282 "escape-string-regexp": "^1.0.5", 179 "escape-string-regexp": "^1.0.5",
283 "supports-color": "^5.3.0" 180 "supports-color": "^5.3.0"
284 },
285 "dependencies": {
286 "ansi-styles": {
287 "version": "3.2.1",
288 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
289 "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
290 "dev": true,
291 "requires": {
292 "color-convert": "^1.9.0"
293 }
294 },
295 "supports-color": {
296 "version": "5.5.0",
297 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
298 "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
299 "dev": true,
300 "requires": {
301 "has-flag": "^3.0.0"
302 }
303 }
304 } 181 }
305 }, 182 },
306 "cheerio": { 183 "cheerio": {
307 "version": "1.0.0-rc.2", 184 "version": "1.0.0-rc.3",
308 "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", 185 "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
309 "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", 186 "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
310 "dev": true, 187 "dev": true,
311 "requires": { 188 "requires": {
312 "css-select": "~1.2.0", 189 "css-select": "~1.2.0",
313 "dom-serializer": "~0.1.0", 190 "dom-serializer": "~0.1.1",
314 "entities": "~1.1.1", 191 "entities": "~1.1.1",
315 "htmlparser2": "^3.9.1", 192 "htmlparser2": "^3.9.1",
316 "lodash": "^4.15.0", 193 "lodash": "^4.15.0",
317 "parse5": "^3.0.1" 194 "parse5": "^3.0.1"
318 } 195 }
319 }, 196 },
320 "clone": {
321 "version": "0.2.0",
322 "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
323 "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
324 "dev": true
325 },
326 "clone-buffer": {
327 "version": "1.0.0",
328 "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
329 "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
330 "dev": true
331 },
332 "clone-stats": {
333 "version": "0.0.1",
334 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
335 "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
336 "dev": true
337 },
338 "cloneable-readable": {
339 "version": "1.1.2",
340 "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
341 "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
342 "dev": true,
343 "requires": {
344 "inherits": "^2.0.1",
345 "process-nextick-args": "^2.0.0",
346 "readable-stream": "^2.3.5"
347 },
348 "dependencies": {
349 "readable-stream": {
350 "version": "2.3.6",
351 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
352 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
353 "dev": true,
354 "requires": {
355 "core-util-is": "~1.0.0",
356 "inherits": "~2.0.3",
357 "isarray": "~1.0.0",
358 "process-nextick-args": "~2.0.0",
359 "safe-buffer": "~5.1.1",
360 "string_decoder": "~1.1.1",
361 "util-deprecate": "~1.0.1"
362 }
363 },
364 "string_decoder": {
365 "version": "1.1.1",
366 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
367 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
368 "dev": true,
369 "requires": {
370 "safe-buffer": "~5.1.0"
371 }
372 }
373 }
374 },
375 "color-convert": { 197 "color-convert": {
376 "version": "1.9.3", 198 "version": "1.9.3",
377 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 199 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -397,9 +219,9 @@
397 } 219 }
398 }, 220 },
399 "commander": { 221 "commander": {
400 "version": "2.19.0", 222 "version": "2.20.0",
401 "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", 223 "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
402 "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", 224 "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
403 "dev": true 225 "dev": true
404 }, 226 },
405 "concat-map": { 227 "concat-map": {
@@ -408,15 +230,6 @@
408 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 230 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
409 "dev": true 231 "dev": true
410 }, 232 },
411 "convert-source-map": {
412 "version": "1.6.0",
413 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
414 "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
415 "dev": true,
416 "requires": {
417 "safe-buffer": "~5.1.1"
418 }
419 },
420 "core-util-is": { 233 "core-util-is": {
421 "version": "1.0.2", 234 "version": "1.0.2",
422 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 235 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -436,9 +249,9 @@
436 } 249 }
437 }, 250 },
438 "css-what": { 251 "css-what": {
439 "version": "2.1.2", 252 "version": "2.1.3",
440 "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", 253 "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
441 "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", 254 "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
442 "dev": true 255 "dev": true
443 }, 256 },
444 "dashdash": { 257 "dashdash": {
@@ -459,24 +272,6 @@
459 "ms": "2.0.0" 272 "ms": "2.0.0"
460 } 273 }
461 }, 274 },
462 "deep-assign": {
463 "version": "1.0.0",
464 "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz",
465 "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=",
466 "dev": true,
467 "requires": {
468 "is-obj": "^1.0.0"
469 }
470 },
471 "define-properties": {
472 "version": "1.1.3",
473 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
474 "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
475 "dev": true,
476 "requires": {
477 "object-keys": "^1.0.12"
478 }
479 },
480 "delayed-stream": { 275 "delayed-stream": {
481 "version": "1.0.0", 276 "version": "1.0.0",
482 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 277 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -496,21 +291,13 @@
496 "dev": true 291 "dev": true
497 }, 292 },
498 "dom-serializer": { 293 "dom-serializer": {
499 "version": "0.1.0", 294 "version": "0.1.1",
500 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 295 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
501 "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 296 "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
502 "dev": true, 297 "dev": true,
503 "requires": { 298 "requires": {
504 "domelementtype": "~1.1.1", 299 "domelementtype": "^1.3.0",
505 "entities": "~1.1.1" 300 "entities": "^1.1.1"
506 },
507 "dependencies": {
508 "domelementtype": {
509 "version": "1.1.3",
510 "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
511 "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
512 "dev": true
513 }
514 } 301 }
515 }, 302 },
516 "domelementtype": { 303 "domelementtype": {
@@ -538,50 +325,6 @@
538 "domelementtype": "1" 325 "domelementtype": "1"
539 } 326 }
540 }, 327 },
541 "duplexer": {
542 "version": "0.1.1",
543 "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
544 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
545 "dev": true
546 },
547 "duplexify": {
548 "version": "3.7.1",
549 "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
550 "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
551 "dev": true,
552 "requires": {
553 "end-of-stream": "^1.0.0",
554 "inherits": "^2.0.1",
555 "readable-stream": "^2.0.0",
556 "stream-shift": "^1.0.0"
557 },
558 "dependencies": {
559 "readable-stream": {
560 "version": "2.3.6",
561 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
562 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
563 "dev": true,
564 "requires": {
565 "core-util-is": "~1.0.0",
566 "inherits": "~2.0.3",
567 "isarray": "~1.0.0",
568 "process-nextick-args": "~2.0.0",
569 "safe-buffer": "~5.1.1",
570 "string_decoder": "~1.1.1",
571 "util-deprecate": "~1.0.1"
572 }
573 },
574 "string_decoder": {
575 "version": "1.1.1",
576 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
577 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
578 "dev": true,
579 "requires": {
580 "safe-buffer": "~5.1.0"
581 }
582 }
583 }
584 },
585 "ecc-jsbn": { 328 "ecc-jsbn": {
586 "version": "0.1.2", 329 "version": "0.1.2",
587 "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 330 "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -592,15 +335,6 @@
592 "safer-buffer": "^2.1.0" 335 "safer-buffer": "^2.1.0"
593 } 336 }
594 }, 337 },
595 "end-of-stream": {
596 "version": "1.4.1",
597 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
598 "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
599 "dev": true,
600 "requires": {
601 "once": "^1.4.0"
602 }
603 },
604 "entities": { 338 "entities": {
605 "version": "1.1.2", 339 "version": "1.1.2",
606 "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 340 "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
@@ -613,6 +347,21 @@
613 "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", 347 "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=",
614 "dev": true 348 "dev": true
615 }, 349 },
350 "es6-promise": {
351 "version": "4.2.6",
352 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
353 "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==",
354 "dev": true
355 },
356 "es6-promisify": {
357 "version": "5.0.0",
358 "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
359 "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
360 "dev": true,
361 "requires": {
362 "es6-promise": "^4.0.3"
363 }
364 },
616 "escape-string-regexp": { 365 "escape-string-regexp": {
617 "version": "1.0.5", 366 "version": "1.0.5",
618 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 367 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -631,36 +380,12 @@
631 "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 380 "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
632 "dev": true 381 "dev": true
633 }, 382 },
634 "event-stream": {
635 "version": "3.3.4",
636 "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
637 "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
638 "dev": true,
639 "requires": {
640 "duplexer": "~0.1.1",
641 "from": "~0",
642 "map-stream": "~0.1.0",
643 "pause-stream": "0.0.11",
644 "split": "0.3",
645 "stream-combiner": "~0.0.4",
646 "through": "~2.3.1"
647 }
648 },
649 "extend": { 383 "extend": {
650 "version": "3.0.2", 384 "version": "3.0.2",
651 "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 385 "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
652 "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 386 "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
653 "dev": true 387 "dev": true
654 }, 388 },
655 "extend-shallow": {
656 "version": "1.1.4",
657 "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
658 "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
659 "dev": true,
660 "requires": {
661 "kind-of": "^1.1.0"
662 }
663 },
664 "extsprintf": { 389 "extsprintf": {
665 "version": "1.3.0", 390 "version": "1.3.0",
666 "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 391 "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -688,16 +413,6 @@
688 "pend": "~1.2.0" 413 "pend": "~1.2.0"
689 } 414 }
690 }, 415 },
691 "flush-write-stream": {
692 "version": "1.1.0",
693 "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.0.tgz",
694 "integrity": "sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg==",
695 "dev": true,
696 "requires": {
697 "inherits": "^2.0.3",
698 "readable-stream": "^3.1.1"
699 }
700 },
701 "forever-agent": { 416 "forever-agent": {
702 "version": "0.6.1", 417 "version": "0.6.1",
703 "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 418 "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -715,46 +430,12 @@
715 "mime-types": "^2.1.12" 430 "mime-types": "^2.1.12"
716 } 431 }
717 }, 432 },
718 "from": {
719 "version": "0.1.7",
720 "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
721 "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
722 "dev": true
723 },
724 "fs-mkdirp-stream": {
725 "version": "1.0.0",
726 "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
727 "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
728 "dev": true,
729 "requires": {
730 "graceful-fs": "^4.1.11",
731 "through2": "^2.0.3"
732 }
733 },
734 "fs.realpath": { 433 "fs.realpath": {
735 "version": "1.0.0", 434 "version": "1.0.0",
736 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 435 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
737 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 436 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
738 "dev": true 437 "dev": true
739 }, 438 },
740 "fstream": {
741 "version": "1.0.11",
742 "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
743 "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
744 "dev": true,
745 "requires": {
746 "graceful-fs": "^4.1.2",
747 "inherits": "~2.0.0",
748 "mkdirp": ">=0.5 0",
749 "rimraf": "2"
750 }
751 },
752 "function-bind": {
753 "version": "1.1.1",
754 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
755 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
756 "dev": true
757 },
758 "getpass": { 439 "getpass": {
759 "version": "0.1.7", 440 "version": "0.1.7",
760 "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 441 "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
@@ -778,262 +459,12 @@
778 "path-is-absolute": "^1.0.0" 459 "path-is-absolute": "^1.0.0"
779 } 460 }
780 }, 461 },
781 "glob-parent": {
782 "version": "3.1.0",
783 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
784 "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
785 "dev": true,
786 "requires": {
787 "is-glob": "^3.1.0",
788 "path-dirname": "^1.0.0"
789 }
790 },
791 "glob-stream": {
792 "version": "6.1.0",
793 "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
794 "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
795 "dev": true,
796 "requires": {
797 "extend": "^3.0.0",
798 "glob": "^7.1.1",
799 "glob-parent": "^3.1.0",
800 "is-negated-glob": "^1.0.0",
801 "ordered-read-streams": "^1.0.0",
802 "pumpify": "^1.3.5",
803 "readable-stream": "^2.1.5",
804 "remove-trailing-separator": "^1.0.1",
805 "to-absolute-glob": "^2.0.0",
806 "unique-stream": "^2.0.2"
807 },
808 "dependencies": {
809 "readable-stream": {
810 "version": "2.3.6",
811 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
812 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
813 "dev": true,
814 "requires": {
815 "core-util-is": "~1.0.0",
816 "inherits": "~2.0.3",
817 "isarray": "~1.0.0",
818 "process-nextick-args": "~2.0.0",
819 "safe-buffer": "~5.1.1",
820 "string_decoder": "~1.1.1",
821 "util-deprecate": "~1.0.1"
822 }
823 },
824 "string_decoder": {
825 "version": "1.1.1",
826 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
827 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
828 "dev": true,
829 "requires": {
830 "safe-buffer": "~5.1.0"
831 }
832 }
833 }
834 },
835 "graceful-fs": {
836 "version": "4.1.15",
837 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
838 "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
839 "dev": true
840 },
841 "growl": { 462 "growl": {
842 "version": "1.10.3", 463 "version": "1.10.3",
843 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 464 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
844 "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 465 "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
845 "dev": true 466 "dev": true
846 }, 467 },
847 "gulp-chmod": {
848 "version": "2.0.0",
849 "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz",
850 "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=",
851 "dev": true,
852 "requires": {
853 "deep-assign": "^1.0.0",
854 "stat-mode": "^0.2.0",
855 "through2": "^2.0.0"
856 }
857 },
858 "gulp-filter": {
859 "version": "5.1.0",
860 "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz",
861 "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=",
862 "dev": true,
863 "requires": {
864 "multimatch": "^2.0.0",
865 "plugin-error": "^0.1.2",
866 "streamfilter": "^1.0.5"
867 }
868 },
869 "gulp-gunzip": {
870 "version": "1.0.0",
871 "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz",
872 "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=",
873 "dev": true,
874 "requires": {
875 "through2": "~0.6.5",
876 "vinyl": "~0.4.6"
877 },
878 "dependencies": {
879 "isarray": {
880 "version": "0.0.1",
881 "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
882 "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
883 "dev": true
884 },
885 "readable-stream": {
886 "version": "1.0.34",
887 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
888 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
889 "dev": true,
890 "requires": {
891 "core-util-is": "~1.0.0",
892 "inherits": "~2.0.1",
893 "isarray": "0.0.1",
894 "string_decoder": "~0.10.x"
895 }
896 },
897 "string_decoder": {
898 "version": "0.10.31",
899 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
900 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
901 "dev": true
902 },
903 "through2": {
904 "version": "0.6.5",
905 "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
906 "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
907 "dev": true,
908 "requires": {
909 "readable-stream": ">=1.0.33-1 <1.1.0-0",
910 "xtend": ">=4.0.0 <4.1.0-0"
911 }
912 }
913 }
914 },
915 "gulp-remote-src-vscode": {
916 "version": "0.5.1",
917 "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.1.tgz",
918 "integrity": "sha512-mw4OGjtC/jlCWJFhbcAlel4YPvccChlpsl3JceNiB/DLJi24/UPxXt53/N26lgI3dknEqd4ErfdHrO8sJ5bATQ==",
919 "dev": true,
920 "requires": {
921 "event-stream": "3.3.4",
922 "node.extend": "^1.1.2",
923 "request": "^2.79.0",
924 "through2": "^2.0.3",
925 "vinyl": "^2.0.1"
926 },
927 "dependencies": {
928 "clone": {
929 "version": "2.1.2",
930 "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
931 "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
932 "dev": true
933 },
934 "clone-stats": {
935 "version": "1.0.0",
936 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
937 "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
938 "dev": true
939 },
940 "vinyl": {
941 "version": "2.2.0",
942 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
943 "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
944 "dev": true,
945 "requires": {
946 "clone": "^2.1.1",
947 "clone-buffer": "^1.0.0",
948 "clone-stats": "^1.0.0",
949 "cloneable-readable": "^1.0.0",
950 "remove-trailing-separator": "^1.0.1",
951 "replace-ext": "^1.0.0"
952 }
953 }
954 }
955 },
956 "gulp-untar": {
957 "version": "0.0.7",
958 "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz",
959 "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==",
960 "dev": true,
961 "requires": {
962 "event-stream": "~3.3.4",
963 "streamifier": "~0.1.1",
964 "tar": "^2.2.1",
965 "through2": "~2.0.3",
966 "vinyl": "^1.2.0"
967 },
968 "dependencies": {
969 "clone": {
970 "version": "1.0.4",
971 "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
972 "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
973 "dev": true
974 },
975 "replace-ext": {
976 "version": "0.0.1",
977 "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
978 "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
979 "dev": true
980 },
981 "vinyl": {
982 "version": "1.2.0",
983 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
984 "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
985 "dev": true,
986 "requires": {
987 "clone": "^1.0.0",
988 "clone-stats": "^0.0.1",
989 "replace-ext": "0.0.1"
990 }
991 }
992 }
993 },
994 "gulp-vinyl-zip": {
995 "version": "2.1.2",
996 "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz",
997 "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==",
998 "dev": true,
999 "requires": {
1000 "event-stream": "3.3.4",
1001 "queue": "^4.2.1",
1002 "through2": "^2.0.3",
1003 "vinyl": "^2.0.2",
1004 "vinyl-fs": "^3.0.3",
1005 "yauzl": "^2.2.1",
1006 "yazl": "^2.2.1"
1007 },
1008 "dependencies": {
1009 "clone": {
1010 "version": "2.1.2",
1011 "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
1012 "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
1013 "dev": true
1014 },
1015 "clone-stats": {
1016 "version": "1.0.0",
1017 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
1018 "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
1019 "dev": true
1020 },
1021 "vinyl": {
1022 "version": "2.2.0",
1023 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
1024 "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
1025 "dev": true,
1026 "requires": {
1027 "clone": "^2.1.1",
1028 "clone-buffer": "^1.0.0",
1029 "clone-stats": "^1.0.0",
1030 "cloneable-readable": "^1.0.0",
1031 "remove-trailing-separator": "^1.0.1",
1032 "replace-ext": "^1.0.0"
1033 }
1034 }
1035 }
1036 },
1037 "har-schema": { 468 "har-schema": {
1038 "version": "2.0.0", 469 "version": "2.0.0",
1039 "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 470 "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -1050,36 +481,12 @@
1050 "har-schema": "^2.0.0" 481 "har-schema": "^2.0.0"
1051 } 482 }
1052 }, 483 },
1053 "has": {
1054 "version": "1.0.3",
1055 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1056 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1057 "dev": true,
1058 "requires": {
1059 "function-bind": "^1.1.1"
1060 }
1061 },
1062 "has-ansi": {
1063 "version": "2.0.0",
1064 "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1065 "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1066 "dev": true,
1067 "requires": {
1068 "ansi-regex": "^2.0.0"
1069 }
1070 },
1071 "has-flag": { 484 "has-flag": {
1072 "version": "3.0.0", 485 "version": "3.0.0",
1073 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 486 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1074 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 487 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1075 "dev": true 488 "dev": true
1076 }, 489 },
1077 "has-symbols": {
1078 "version": "1.0.0",
1079 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
1080 "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
1081 "dev": true
1082 },
1083 "he": { 490 "he": {
1084 "version": "1.1.1", 491 "version": "1.1.1",
1085 "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 492 "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
@@ -1087,17 +494,27 @@
1087 "dev": true 494 "dev": true
1088 }, 495 },
1089 "htmlparser2": { 496 "htmlparser2": {
1090 "version": "3.10.0", 497 "version": "3.10.1",
1091 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", 498 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
1092 "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", 499 "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
1093 "dev": true, 500 "dev": true,
1094 "requires": { 501 "requires": {
1095 "domelementtype": "^1.3.0", 502 "domelementtype": "^1.3.1",
1096 "domhandler": "^2.3.0", 503 "domhandler": "^2.3.0",
1097 "domutils": "^1.5.1", 504 "domutils": "^1.5.1",
1098 "entities": "^1.1.1", 505 "entities": "^1.1.1",
1099 "inherits": "^2.0.1", 506 "inherits": "^2.0.1",
1100 "readable-stream": "^3.0.6" 507 "readable-stream": "^3.1.1"
508 }
509 },
510 "http-proxy-agent": {
511 "version": "2.1.0",
512 "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
513 "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
514 "dev": true,
515 "requires": {
516 "agent-base": "4",
517 "debug": "3.1.0"
1101 } 518 }
1102 }, 519 },
1103 "http-signature": { 520 "http-signature": {
@@ -1111,6 +528,16 @@
1111 "sshpk": "^1.7.0" 528 "sshpk": "^1.7.0"
1112 } 529 }
1113 }, 530 },
531 "https-proxy-agent": {
532 "version": "2.2.1",
533 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
534 "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
535 "dev": true,
536 "requires": {
537 "agent-base": "^4.1.0",
538 "debug": "^3.1.0"
539 }
540 },
1114 "inflight": { 541 "inflight": {
1115 "version": "1.0.6", 542 "version": "1.0.6",
1116 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 543 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -1133,103 +560,12 @@
1133 "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", 560 "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
1134 "dev": true 561 "dev": true
1135 }, 562 },
1136 "is": {
1137 "version": "3.3.0",
1138 "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz",
1139 "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==",
1140 "dev": true
1141 },
1142 "is-absolute": {
1143 "version": "1.0.0",
1144 "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
1145 "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
1146 "dev": true,
1147 "requires": {
1148 "is-relative": "^1.0.0",
1149 "is-windows": "^1.0.1"
1150 }
1151 },
1152 "is-buffer": {
1153 "version": "1.1.6",
1154 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1155 "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1156 "dev": true
1157 },
1158 "is-extglob": {
1159 "version": "2.1.1",
1160 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1161 "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1162 "dev": true
1163 },
1164 "is-glob": {
1165 "version": "3.1.0",
1166 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
1167 "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
1168 "dev": true,
1169 "requires": {
1170 "is-extglob": "^2.1.0"
1171 }
1172 },
1173 "is-negated-glob": {
1174 "version": "1.0.0",
1175 "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
1176 "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
1177 "dev": true
1178 },
1179 "is-obj": {
1180 "version": "1.0.1",
1181 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1182 "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1183 "dev": true
1184 },
1185 "is-relative": {
1186 "version": "1.0.0",
1187 "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
1188 "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
1189 "dev": true,
1190 "requires": {
1191 "is-unc-path": "^1.0.0"
1192 }
1193 },
1194 "is-typedarray": { 563 "is-typedarray": {
1195 "version": "1.0.0", 564 "version": "1.0.0",
1196 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 565 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1197 "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 566 "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1198 "dev": true 567 "dev": true
1199 }, 568 },
1200 "is-unc-path": {
1201 "version": "1.0.0",
1202 "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
1203 "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
1204 "dev": true,
1205 "requires": {
1206 "unc-path-regex": "^0.1.2"
1207 }
1208 },
1209 "is-utf8": {
1210 "version": "0.2.1",
1211 "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1212 "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1213 "dev": true
1214 },
1215 "is-valid-glob": {
1216 "version": "1.0.0",
1217 "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
1218 "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
1219 "dev": true
1220 },
1221 "is-windows": {
1222 "version": "1.0.2",
1223 "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
1224 "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
1225 "dev": true
1226 },
1227 "isarray": {
1228 "version": "1.0.0",
1229 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1230 "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1231 "dev": true
1232 },
1233 "isstream": { 569 "isstream": {
1234 "version": "0.1.2", 570 "version": "0.1.2",
1235 "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 571 "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -1237,15 +573,15 @@
1237 "dev": true 573 "dev": true
1238 }, 574 },
1239 "js-tokens": { 575 "js-tokens": {
1240 "version": "3.0.2", 576 "version": "4.0.0",
1241 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 577 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1242 "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 578 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1243 "dev": true 579 "dev": true
1244 }, 580 },
1245 "js-yaml": { 581 "js-yaml": {
1246 "version": "3.12.1", 582 "version": "3.13.1",
1247 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", 583 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1248 "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", 584 "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1249 "dev": true, 585 "dev": true,
1250 "requires": { 586 "requires": {
1251 "argparse": "^1.0.7", 587 "argparse": "^1.0.7",
@@ -1270,12 +606,6 @@
1270 "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 606 "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1271 "dev": true 607 "dev": true
1272 }, 608 },
1273 "json-stable-stringify-without-jsonify": {
1274 "version": "1.0.1",
1275 "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1276 "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1277 "dev": true
1278 },
1279 "json-stringify-safe": { 609 "json-stringify-safe": {
1280 "version": "5.0.1", 610 "version": "5.0.1",
1281 "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 611 "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -1294,56 +624,6 @@
1294 "verror": "1.10.0" 624 "verror": "1.10.0"
1295 } 625 }
1296 }, 626 },
1297 "kind-of": {
1298 "version": "1.1.0",
1299 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
1300 "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
1301 "dev": true
1302 },
1303 "lazystream": {
1304 "version": "1.0.0",
1305 "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
1306 "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
1307 "dev": true,
1308 "requires": {
1309 "readable-stream": "^2.0.5"
1310 },
1311 "dependencies": {
1312 "readable-stream": {
1313 "version": "2.3.6",
1314 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1315 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1316 "dev": true,
1317 "requires": {
1318 "core-util-is": "~1.0.0",
1319 "inherits": "~2.0.3",
1320 "isarray": "~1.0.0",
1321 "process-nextick-args": "~2.0.0",
1322 "safe-buffer": "~5.1.1",
1323 "string_decoder": "~1.1.1",
1324 "util-deprecate": "~1.0.1"
1325 }
1326 },
1327 "string_decoder": {
1328 "version": "1.1.1",
1329 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1330 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1331 "dev": true,
1332 "requires": {
1333 "safe-buffer": "~5.1.0"
1334 }
1335 }
1336 }
1337 },
1338 "lead": {
1339 "version": "1.0.0",
1340 "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
1341 "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
1342 "dev": true,
1343 "requires": {
1344 "flush-write-stream": "^1.0.2"
1345 }
1346 },
1347 "linkify-it": { 627 "linkify-it": {
1348 "version": "2.1.0", 628 "version": "2.1.0",
1349 "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", 629 "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz",
@@ -1359,12 +639,6 @@
1359 "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 639 "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
1360 "dev": true 640 "dev": true
1361 }, 641 },
1362 "map-stream": {
1363 "version": "0.1.0",
1364 "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
1365 "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
1366 "dev": true
1367 },
1368 "markdown-it": { 642 "markdown-it": {
1369 "version": "8.4.2", 643 "version": "8.4.2",
1370 "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", 644 "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
@@ -1391,18 +665,18 @@
1391 "dev": true 665 "dev": true
1392 }, 666 },
1393 "mime-db": { 667 "mime-db": {
1394 "version": "1.37.0", 668 "version": "1.40.0",
1395 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 669 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
1396 "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 670 "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
1397 "dev": true 671 "dev": true
1398 }, 672 },
1399 "mime-types": { 673 "mime-types": {
1400 "version": "2.1.21", 674 "version": "2.1.24",
1401 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 675 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
1402 "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 676 "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
1403 "dev": true, 677 "dev": true,
1404 "requires": { 678 "requires": {
1405 "mime-db": "~1.37.0" 679 "mime-db": "1.40.0"
1406 } 680 }
1407 }, 681 },
1408 "minimatch": { 682 "minimatch": {
@@ -1496,52 +770,12 @@
1496 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 770 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1497 "dev": true 771 "dev": true
1498 }, 772 },
1499 "multimatch": {
1500 "version": "2.1.0",
1501 "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
1502 "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
1503 "dev": true,
1504 "requires": {
1505 "array-differ": "^1.0.0",
1506 "array-union": "^1.0.1",
1507 "arrify": "^1.0.0",
1508 "minimatch": "^3.0.0"
1509 }
1510 },
1511 "mute-stream": { 773 "mute-stream": {
1512 "version": "0.0.8", 774 "version": "0.0.8",
1513 "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 775 "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
1514 "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 776 "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
1515 "dev": true 777 "dev": true
1516 }, 778 },
1517 "node.extend": {
1518 "version": "1.1.8",
1519 "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz",
1520 "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==",
1521 "dev": true,
1522 "requires": {
1523 "has": "^1.0.3",
1524 "is": "^3.2.1"
1525 }
1526 },
1527 "normalize-path": {
1528 "version": "2.1.1",
1529 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
1530 "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
1531 "dev": true,
1532 "requires": {
1533 "remove-trailing-separator": "^1.0.1"
1534 }
1535 },
1536 "now-and-later": {
1537 "version": "2.0.0",
1538 "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz",
1539 "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=",
1540 "dev": true,
1541 "requires": {
1542 "once": "^1.3.2"
1543 }
1544 },
1545 "nth-check": { 779 "nth-check": {
1546 "version": "1.0.2", 780 "version": "1.0.2",
1547 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", 781 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
@@ -1557,24 +791,6 @@
1557 "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 791 "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1558 "dev": true 792 "dev": true
1559 }, 793 },
1560 "object-keys": {
1561 "version": "1.0.12",
1562 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
1563 "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
1564 "dev": true
1565 },
1566 "object.assign": {
1567 "version": "4.1.0",
1568 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1569 "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1570 "dev": true,
1571 "requires": {
1572 "define-properties": "^1.1.2",
1573 "function-bind": "^1.1.1",
1574 "has-symbols": "^1.0.0",
1575 "object-keys": "^1.0.11"
1576 }
1577 },
1578 "once": { 794 "once": {
1579 "version": "1.4.0", 795 "version": "1.4.0",
1580 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 796 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1584,41 +800,6 @@
1584 "wrappy": "1" 800 "wrappy": "1"
1585 } 801 }
1586 }, 802 },
1587 "ordered-read-streams": {
1588 "version": "1.0.1",
1589 "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
1590 "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
1591 "dev": true,
1592 "requires": {
1593 "readable-stream": "^2.0.1"
1594 },
1595 "dependencies": {
1596 "readable-stream": {
1597 "version": "2.3.6",
1598 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1599 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1600 "dev": true,
1601 "requires": {
1602 "core-util-is": "~1.0.0",
1603 "inherits": "~2.0.3",
1604 "isarray": "~1.0.0",
1605 "process-nextick-args": "~2.0.0",
1606 "safe-buffer": "~5.1.1",
1607 "string_decoder": "~1.1.1",
1608 "util-deprecate": "~1.0.1"
1609 }
1610 },
1611 "string_decoder": {
1612 "version": "1.1.1",
1613 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1614 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1615 "dev": true,
1616 "requires": {
1617 "safe-buffer": "~5.1.0"
1618 }
1619 }
1620 }
1621 },
1622 "os-homedir": { 803 "os-homedir": {
1623 "version": "1.0.2", 804 "version": "1.0.2",
1624 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 805 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -1659,12 +840,6 @@
1659 "@types/node": "*" 840 "@types/node": "*"
1660 } 841 }
1661 }, 842 },
1662 "path-dirname": {
1663 "version": "1.0.2",
1664 "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
1665 "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
1666 "dev": true
1667 },
1668 "path-is-absolute": { 843 "path-is-absolute": {
1669 "version": "1.0.1", 844 "version": "1.0.1",
1670 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 845 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -1677,15 +852,6 @@
1677 "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 852 "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1678 "dev": true 853 "dev": true
1679 }, 854 },
1680 "pause-stream": {
1681 "version": "0.0.11",
1682 "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
1683 "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
1684 "dev": true,
1685 "requires": {
1686 "through": "~2.3"
1687 }
1688 },
1689 "pend": { 855 "pend": {
1690 "version": "1.2.0", 856 "version": "1.2.0",
1691 "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 857 "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -1698,29 +864,10 @@
1698 "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 864 "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1699 "dev": true 865 "dev": true
1700 }, 866 },
1701 "plugin-error": {
1702 "version": "0.1.2",
1703 "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
1704 "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
1705 "dev": true,
1706 "requires": {
1707 "ansi-cyan": "^0.1.1",
1708 "ansi-red": "^0.1.1",
1709 "arr-diff": "^1.0.1",
1710 "arr-union": "^2.0.1",
1711 "extend-shallow": "^1.1.2"
1712 }
1713 },
1714 "prettier": { 867 "prettier": {
1715 "version": "1.16.4", 868 "version": "1.17.0",
1716 "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", 869 "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.0.tgz",
1717 "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", 870 "integrity": "sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw==",
1718 "dev": true
1719 },
1720 "process-nextick-args": {
1721 "version": "2.0.0",
1722 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1723 "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
1724 "dev": true 871 "dev": true
1725 }, 872 },
1726 "psl": { 873 "psl": {
@@ -1729,27 +876,6 @@
1729 "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", 876 "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
1730 "dev": true 877 "dev": true
1731 }, 878 },
1732 "pump": {
1733 "version": "2.0.1",
1734 "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
1735 "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
1736 "dev": true,
1737 "requires": {
1738 "end-of-stream": "^1.1.0",
1739 "once": "^1.3.1"
1740 }
1741 },
1742 "pumpify": {
1743 "version": "1.5.1",
1744 "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
1745 "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
1746 "dev": true,
1747 "requires": {
1748 "duplexify": "^3.6.0",
1749 "inherits": "^2.0.3",
1750 "pump": "^2.0.0"
1751 }
1752 },
1753 "punycode": { 879 "punycode": {
1754 "version": "2.1.1", 880 "version": "2.1.1",
1755 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 881 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@@ -1769,20 +895,11 @@
1769 "dev": true 895 "dev": true
1770 }, 896 },
1771 "querystringify": { 897 "querystringify": {
1772 "version": "2.1.0", 898 "version": "2.1.1",
1773 "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", 899 "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
1774 "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", 900 "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
1775 "dev": true 901 "dev": true
1776 }, 902 },
1777 "queue": {
1778 "version": "4.5.1",
1779 "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz",
1780 "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==",
1781 "dev": true,
1782 "requires": {
1783 "inherits": "~2.0.0"
1784 }
1785 },
1786 "read": { 903 "read": {
1787 "version": "1.0.7", 904 "version": "1.0.7",
1788 "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 905 "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
@@ -1793,9 +910,9 @@
1793 } 910 }
1794 }, 911 },
1795 "readable-stream": { 912 "readable-stream": {
1796 "version": "3.1.1", 913 "version": "3.3.0",
1797 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", 914 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz",
1798 "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", 915 "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==",
1799 "dev": true, 916 "dev": true,
1800 "requires": { 917 "requires": {
1801 "inherits": "^2.0.3", 918 "inherits": "^2.0.3",
@@ -1812,39 +929,6 @@
1812 "resolve": "^1.1.6" 929 "resolve": "^1.1.6"
1813 } 930 }
1814 }, 931 },
1815 "remove-bom-buffer": {
1816 "version": "3.0.0",
1817 "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
1818 "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
1819 "dev": true,
1820 "requires": {
1821 "is-buffer": "^1.1.5",
1822 "is-utf8": "^0.2.1"
1823 }
1824 },
1825 "remove-bom-stream": {
1826 "version": "1.2.0",
1827 "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
1828 "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
1829 "dev": true,
1830 "requires": {
1831 "remove-bom-buffer": "^3.0.0",
1832 "safe-buffer": "^5.1.0",
1833 "through2": "^2.0.3"
1834 }
1835 },
1836 "remove-trailing-separator": {
1837 "version": "1.1.0",
1838 "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
1839 "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
1840 "dev": true
1841 },
1842 "replace-ext": {
1843 "version": "1.0.0",
1844 "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
1845 "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
1846 "dev": true
1847 },
1848 "request": { 932 "request": {
1849 "version": "2.88.0", 933 "version": "2.88.0",
1850 "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 934 "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
@@ -1888,24 +972,6 @@
1888 "path-parse": "^1.0.6" 972 "path-parse": "^1.0.6"
1889 } 973 }
1890 }, 974 },
1891 "resolve-options": {
1892 "version": "1.1.0",
1893 "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
1894 "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
1895 "dev": true,
1896 "requires": {
1897 "value-or-function": "^3.0.0"
1898 }
1899 },
1900 "rimraf": {
1901 "version": "2.6.3",
1902 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1903 "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1904 "dev": true,
1905 "requires": {
1906 "glob": "^7.1.3"
1907 }
1908 },
1909 "safe-buffer": { 975 "safe-buffer": {
1910 "version": "5.1.2", 976 "version": "5.1.2",
1911 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 977 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -1919,9 +985,9 @@
1919 "dev": true 985 "dev": true
1920 }, 986 },
1921 "semver": { 987 "semver": {
1922 "version": "5.6.0", 988 "version": "5.7.0",
1923 "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 989 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
1924 "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 990 "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
1925 }, 991 },
1926 "shelljs": { 992 "shelljs": {
1927 "version": "0.8.3", 993 "version": "0.8.3",
@@ -1960,24 +1026,15 @@
1960 "dev": true 1026 "dev": true
1961 }, 1027 },
1962 "source-map-support": { 1028 "source-map-support": {
1963 "version": "0.5.10", 1029 "version": "0.5.12",
1964 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", 1030 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
1965 "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", 1031 "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
1966 "dev": true, 1032 "dev": true,
1967 "requires": { 1033 "requires": {
1968 "buffer-from": "^1.0.0", 1034 "buffer-from": "^1.0.0",
1969 "source-map": "^0.6.0" 1035 "source-map": "^0.6.0"
1970 } 1036 }
1971 }, 1037 },
1972 "split": {
1973 "version": "0.3.3",
1974 "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
1975 "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
1976 "dev": true,
1977 "requires": {
1978 "through": "2"
1979 }
1980 },
1981 "sprintf-js": { 1038 "sprintf-js": {
1982 "version": "1.0.3", 1039 "version": "1.0.3",
1983 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1040 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -2001,68 +1058,6 @@
2001 "tweetnacl": "~0.14.0" 1058 "tweetnacl": "~0.14.0"
2002 } 1059 }
2003 }, 1060 },
2004 "stat-mode": {
2005 "version": "0.2.2",
2006 "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
2007 "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
2008 "dev": true
2009 },
2010 "stream-combiner": {
2011 "version": "0.0.4",
2012 "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
2013 "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
2014 "dev": true,
2015 "requires": {
2016 "duplexer": "~0.1.1"
2017 }
2018 },
2019 "stream-shift": {
2020 "version": "1.0.0",
2021 "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
2022 "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
2023 "dev": true
2024 },
2025 "streamfilter": {
2026 "version": "1.0.7",
2027 "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz",
2028 "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==",
2029 "dev": true,
2030 "requires": {
2031 "readable-stream": "^2.0.2"
2032 },
2033 "dependencies": {
2034 "readable-stream": {
2035 "version": "2.3.6",
2036 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2037 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2038 "dev": true,
2039 "requires": {
2040 "core-util-is": "~1.0.0",
2041 "inherits": "~2.0.3",
2042 "isarray": "~1.0.0",
2043 "process-nextick-args": "~2.0.0",
2044 "safe-buffer": "~5.1.1",
2045 "string_decoder": "~1.1.1",
2046 "util-deprecate": "~1.0.1"
2047 }
2048 },
2049 "string_decoder": {
2050 "version": "1.1.1",
2051 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2052 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2053 "dev": true,
2054 "requires": {
2055 "safe-buffer": "~5.1.0"
2056 }
2057 }
2058 }
2059 },
2060 "streamifier": {
2061 "version": "0.1.1",
2062 "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
2063 "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=",
2064 "dev": true
2065 },
2066 "string_decoder": { 1061 "string_decoder": {
2067 "version": "1.2.0", 1062 "version": "1.2.0",
2068 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", 1063 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
@@ -2072,82 +1067,13 @@
2072 "safe-buffer": "~5.1.0" 1067 "safe-buffer": "~5.1.0"
2073 } 1068 }
2074 }, 1069 },
2075 "strip-ansi": {
2076 "version": "3.0.1",
2077 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2078 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2079 "dev": true,
2080 "requires": {
2081 "ansi-regex": "^2.0.0"
2082 }
2083 },
2084 "supports-color": { 1070 "supports-color": {
2085 "version": "2.0.0", 1071 "version": "5.5.0",
2086 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1072 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2087 "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1073 "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2088 "dev": true
2089 },
2090 "tar": {
2091 "version": "2.2.1",
2092 "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
2093 "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
2094 "dev": true,
2095 "requires": {
2096 "block-stream": "*",
2097 "fstream": "^1.0.2",
2098 "inherits": "2"
2099 }
2100 },
2101 "through": {
2102 "version": "2.3.8",
2103 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2104 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2105 "dev": true
2106 },
2107 "through2": {
2108 "version": "2.0.5",
2109 "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
2110 "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
2111 "dev": true,
2112 "requires": {
2113 "readable-stream": "~2.3.6",
2114 "xtend": "~4.0.1"
2115 },
2116 "dependencies": {
2117 "readable-stream": {
2118 "version": "2.3.6",
2119 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2120 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2121 "dev": true,
2122 "requires": {
2123 "core-util-is": "~1.0.0",
2124 "inherits": "~2.0.3",
2125 "isarray": "~1.0.0",
2126 "process-nextick-args": "~2.0.0",
2127 "safe-buffer": "~5.1.1",
2128 "string_decoder": "~1.1.1",
2129 "util-deprecate": "~1.0.1"
2130 }
2131 },
2132 "string_decoder": {
2133 "version": "1.1.1",
2134 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2135 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2136 "dev": true,
2137 "requires": {
2138 "safe-buffer": "~5.1.0"
2139 }
2140 }
2141 }
2142 },
2143 "through2-filter": {
2144 "version": "3.0.0",
2145 "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
2146 "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
2147 "dev": true, 1074 "dev": true,
2148 "requires": { 1075 "requires": {
2149 "through2": "~2.0.0", 1076 "has-flag": "^3.0.0"
2150 "xtend": "~4.0.0"
2151 } 1077 }
2152 }, 1078 },
2153 "tmp": { 1079 "tmp": {
@@ -2159,25 +1085,6 @@
2159 "os-tmpdir": "~1.0.1" 1085 "os-tmpdir": "~1.0.1"
2160 } 1086 }
2161 }, 1087 },
2162 "to-absolute-glob": {
2163 "version": "2.0.2",
2164 "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
2165 "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
2166 "dev": true,
2167 "requires": {
2168 "is-absolute": "^1.0.0",
2169 "is-negated-glob": "^1.0.0"
2170 }
2171 },
2172 "to-through": {
2173 "version": "2.0.0",
2174 "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
2175 "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
2176 "dev": true,
2177 "requires": {
2178 "through2": "^2.0.3"
2179 }
2180 },
2181 "tough-cookie": { 1088 "tough-cookie": {
2182 "version": "2.4.3", 1089 "version": "2.4.3",
2183 "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1090 "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
@@ -2203,23 +1110,24 @@
2203 "dev": true 1110 "dev": true
2204 }, 1111 },
2205 "tslint": { 1112 "tslint": {
2206 "version": "5.12.1", 1113 "version": "5.16.0",
2207 "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", 1114 "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
2208 "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", 1115 "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
2209 "dev": true, 1116 "dev": true,
2210 "requires": { 1117 "requires": {
2211 "babel-code-frame": "^6.22.0", 1118 "@babel/code-frame": "^7.0.0",
2212 "builtin-modules": "^1.1.1", 1119 "builtin-modules": "^1.1.1",
2213 "chalk": "^2.3.0", 1120 "chalk": "^2.3.0",
2214 "commander": "^2.12.1", 1121 "commander": "^2.12.1",
2215 "diff": "^3.2.0", 1122 "diff": "^3.2.0",
2216 "glob": "^7.1.1", 1123 "glob": "^7.1.1",
2217 "js-yaml": "^3.7.0", 1124 "js-yaml": "^3.13.0",
2218 "minimatch": "^3.0.4", 1125 "minimatch": "^3.0.4",
1126 "mkdirp": "^0.5.1",
2219 "resolve": "^1.3.2", 1127 "resolve": "^1.3.2",
2220 "semver": "^5.3.0", 1128 "semver": "^5.3.0",
2221 "tslib": "^1.8.0", 1129 "tslib": "^1.8.0",
2222 "tsutils": "^2.27.2" 1130 "tsutils": "^2.29.0"
2223 } 1131 }
2224 }, 1132 },
2225 "tslint-config-prettier": { 1133 "tslint-config-prettier": {
@@ -2277,9 +1185,9 @@
2277 } 1185 }
2278 }, 1186 },
2279 "typescript": { 1187 "typescript": {
2280 "version": "3.3.3", 1188 "version": "3.4.4",
2281 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", 1189 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.4.tgz",
2282 "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", 1190 "integrity": "sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA==",
2283 "dev": true 1191 "dev": true
2284 }, 1192 },
2285 "uc.micro": { 1193 "uc.micro": {
@@ -2288,28 +1196,12 @@
2288 "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", 1196 "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
2289 "dev": true 1197 "dev": true
2290 }, 1198 },
2291 "unc-path-regex": {
2292 "version": "0.1.2",
2293 "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
2294 "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
2295 "dev": true
2296 },
2297 "underscore": { 1199 "underscore": {
2298 "version": "1.9.1", 1200 "version": "1.9.1",
2299 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", 1201 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
2300 "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", 1202 "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==",
2301 "dev": true 1203 "dev": true
2302 }, 1204 },
2303 "unique-stream": {
2304 "version": "2.3.1",
2305 "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
2306 "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
2307 "dev": true,
2308 "requires": {
2309 "json-stable-stringify-without-jsonify": "^1.0.1",
2310 "through2-filter": "^3.0.0"
2311 }
2312 },
2313 "uri-js": { 1205 "uri-js": {
2314 "version": "4.2.2", 1206 "version": "4.2.2",
2315 "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1207 "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -2326,9 +1218,9 @@
2326 "dev": true 1218 "dev": true
2327 }, 1219 },
2328 "url-parse": { 1220 "url-parse": {
2329 "version": "1.4.4", 1221 "version": "1.4.6",
2330 "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", 1222 "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.6.tgz",
2331 "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", 1223 "integrity": "sha512-/B8AD9iQ01seoXmXf9z/MjLZQIdOoYl/+gvsQF6+mpnxaTfG9P7srYaiqaDMyKkR36XMXfhqSHss5MyFAO8lew==",
2332 "dev": true, 1224 "dev": true,
2333 "requires": { 1225 "requires": {
2334 "querystringify": "^2.0.0", 1226 "querystringify": "^2.0.0",
@@ -2347,12 +1239,6 @@
2347 "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1239 "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
2348 "dev": true 1240 "dev": true
2349 }, 1241 },
2350 "value-or-function": {
2351 "version": "3.0.0",
2352 "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
2353 "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
2354 "dev": true
2355 },
2356 "verror": { 1242 "verror": {
2357 "version": "1.10.0", 1243 "version": "1.10.0",
2358 "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1244 "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -2364,150 +1250,10 @@
2364 "extsprintf": "^1.2.0" 1250 "extsprintf": "^1.2.0"
2365 } 1251 }
2366 }, 1252 },
2367 "vinyl": {
2368 "version": "0.4.6",
2369 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
2370 "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
2371 "dev": true,
2372 "requires": {
2373 "clone": "^0.2.0",
2374 "clone-stats": "^0.0.1"
2375 }
2376 },
2377 "vinyl-fs": {
2378 "version": "3.0.3",
2379 "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
2380 "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
2381 "dev": true,
2382 "requires": {
2383 "fs-mkdirp-stream": "^1.0.0",
2384 "glob-stream": "^6.1.0",
2385 "graceful-fs": "^4.0.0",
2386 "is-valid-glob": "^1.0.0",
2387 "lazystream": "^1.0.0",
2388 "lead": "^1.0.0",
2389 "object.assign": "^4.0.4",
2390 "pumpify": "^1.3.5",
2391 "readable-stream": "^2.3.3",
2392 "remove-bom-buffer": "^3.0.0",
2393 "remove-bom-stream": "^1.2.0",
2394 "resolve-options": "^1.1.0",
2395 "through2": "^2.0.0",
2396 "to-through": "^2.0.0",
2397 "value-or-function": "^3.0.0",
2398 "vinyl": "^2.0.0",
2399 "vinyl-sourcemap": "^1.1.0"
2400 },
2401 "dependencies": {
2402 "clone": {
2403 "version": "2.1.2",
2404 "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
2405 "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
2406 "dev": true
2407 },
2408 "clone-stats": {
2409 "version": "1.0.0",
2410 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
2411 "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
2412 "dev": true
2413 },
2414 "readable-stream": {
2415 "version": "2.3.6",
2416 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2417 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2418 "dev": true,
2419 "requires": {
2420 "core-util-is": "~1.0.0",
2421 "inherits": "~2.0.3",
2422 "isarray": "~1.0.0",
2423 "process-nextick-args": "~2.0.0",
2424 "safe-buffer": "~5.1.1",
2425 "string_decoder": "~1.1.1",
2426 "util-deprecate": "~1.0.1"
2427 }
2428 },
2429 "string_decoder": {
2430 "version": "1.1.1",
2431 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2432 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2433 "dev": true,
2434 "requires": {
2435 "safe-buffer": "~5.1.0"
2436 }
2437 },
2438 "vinyl": {
2439 "version": "2.2.0",
2440 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
2441 "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
2442 "dev": true,
2443 "requires": {
2444 "clone": "^2.1.1",
2445 "clone-buffer": "^1.0.0",
2446 "clone-stats": "^1.0.0",
2447 "cloneable-readable": "^1.0.0",
2448 "remove-trailing-separator": "^1.0.1",
2449 "replace-ext": "^1.0.0"
2450 }
2451 }
2452 }
2453 },
2454 "vinyl-source-stream": {
2455 "version": "1.1.2",
2456 "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz",
2457 "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=",
2458 "dev": true,
2459 "requires": {
2460 "through2": "^2.0.3",
2461 "vinyl": "^0.4.3"
2462 }
2463 },
2464 "vinyl-sourcemap": {
2465 "version": "1.1.0",
2466 "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
2467 "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
2468 "dev": true,
2469 "requires": {
2470 "append-buffer": "^1.0.2",
2471 "convert-source-map": "^1.5.0",
2472 "graceful-fs": "^4.1.6",
2473 "normalize-path": "^2.1.1",
2474 "now-and-later": "^2.0.0",
2475 "remove-bom-buffer": "^3.0.0",
2476 "vinyl": "^2.0.0"
2477 },
2478 "dependencies": {
2479 "clone": {
2480 "version": "2.1.2",
2481 "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
2482 "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
2483 "dev": true
2484 },
2485 "clone-stats": {
2486 "version": "1.0.0",
2487 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
2488 "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
2489 "dev": true
2490 },
2491 "vinyl": {
2492 "version": "2.2.0",
2493 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
2494 "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
2495 "dev": true,
2496 "requires": {
2497 "clone": "^2.1.1",
2498 "clone-buffer": "^1.0.0",
2499 "clone-stats": "^1.0.0",
2500 "cloneable-readable": "^1.0.0",
2501 "remove-trailing-separator": "^1.0.1",
2502 "replace-ext": "^1.0.0"
2503 }
2504 }
2505 }
2506 },
2507 "vsce": { 1253 "vsce": {
2508 "version": "1.57.0", 1254 "version": "1.59.0",
2509 "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.57.0.tgz", 1255 "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.59.0.tgz",
2510 "integrity": "sha512-ULiWDQBt0XZAA5PI7XL0TxeKZ6cXk3e3ZH/lL9xk93WeckqWzR79D3xNsf0GRacOGYU+UmbhXWRtP8C6wnDNmg==", 1256 "integrity": "sha512-tkB97885k5ce25Brbe9AZTCAXAkBh7oa5EOzY0BCJQ51W/mfRaQuCluCd9gZpWdgiU4AbPvwxtoVKKsenlSt8w==",
2511 "dev": true, 1257 "dev": true,
2512 "requires": { 1258 "requires": {
2513 "chalk": "^2.4.2", 1259 "chalk": "^2.4.2",
@@ -2531,54 +1277,57 @@
2531 } 1277 }
2532 }, 1278 },
2533 "vscode": { 1279 "vscode": {
2534 "version": "1.1.29", 1280 "version": "1.1.33",
2535 "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.29.tgz", 1281 "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.33.tgz",
2536 "integrity": "sha512-E6hzqGtCD65BnBxdZzSIi8FPCM4seEEK/bbTeYdJntg+4D5R6GLbdYFySE9DNTtMJF4iB9UGoucKU/p8Guts1g==", 1282 "integrity": "sha512-sXedp2oF6y4ZvqrrFiZpeMzaCLSWV+PpYkIxjG/iYquNZ9KrLL2LujltGxPLvzn49xu2sZkyC+avVNFgcJD1Iw==",
2537 "dev": true, 1283 "dev": true,
2538 "requires": { 1284 "requires": {
2539 "glob": "^7.1.2", 1285 "glob": "^7.1.2",
2540 "gulp-chmod": "^2.0.0",
2541 "gulp-filter": "^5.0.1",
2542 "gulp-gunzip": "1.0.0",
2543 "gulp-remote-src-vscode": "^0.5.1",
2544 "gulp-untar": "^0.0.7",
2545 "gulp-vinyl-zip": "^2.1.2",
2546 "mocha": "^4.0.1", 1286 "mocha": "^4.0.1",
2547 "request": "^2.88.0", 1287 "request": "^2.88.0",
2548 "semver": "^5.4.1", 1288 "semver": "^5.4.1",
2549 "source-map-support": "^0.5.0", 1289 "source-map-support": "^0.5.0",
2550 "url-parse": "^1.4.3", 1290 "url-parse": "^1.4.4",
2551 "vinyl-fs": "^3.0.3", 1291 "vscode-test": "^0.1.4"
2552 "vinyl-source-stream": "^1.1.0"
2553 } 1292 }
2554 }, 1293 },
2555 "vscode-jsonrpc": { 1294 "vscode-jsonrpc": {
2556 "version": "4.0.0", 1295 "version": "4.1.0-next.1",
2557 "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", 1296 "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.1.0-next.1.tgz",
2558 "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" 1297 "integrity": "sha512-FzNkvHmg3GXpzZAlnGnpdRbQQX6LDRb0bvc+oxxjMUwIJ66kTO/DyeE2bwU0fsiOEGfsJTCzvjESVl368jZ0/g=="
2559 }, 1298 },
2560 "vscode-languageclient": { 1299 "vscode-languageclient": {
2561 "version": "5.3.0-next.1", 1300 "version": "5.3.0-next.4",
2562 "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.3.0-next.1.tgz", 1301 "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.3.0-next.4.tgz",
2563 "integrity": "sha512-q5o6vHHDi+HjFOFUNC288Dee5jyAO4mEufoOaF2wKCjVP1qoJGbnBalTNGuakJThrdn0RDa0XdHZgXKFyZomCQ==", 1302 "integrity": "sha512-RODuzXErVpJRSgHv+Xei8fwQtZ/iZOWPCqlLl07NTtkzgTAepJf9r4EioZVuTviGJ5DEJ9xs0bjrit8shKtW6Q==",
2564 "requires": { 1303 "requires": {
2565 "semver": "^5.5.0", 1304 "semver": "^5.5.0",
2566 "vscode-languageserver-protocol": "3.15.0-next.1" 1305 "vscode-languageserver-protocol": "3.15.0-next.4"
2567 } 1306 }
2568 }, 1307 },
2569 "vscode-languageserver-protocol": { 1308 "vscode-languageserver-protocol": {
2570 "version": "3.15.0-next.1", 1309 "version": "3.15.0-next.4",
2571 "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.0-next.1.tgz", 1310 "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.0-next.4.tgz",
2572 "integrity": "sha512-LXF0d9s3vxFBxVQ4aKl/XghdEMAncGt3dh4urIYa9Is43g3MfIQL9fC44YZtP+XXOrI2rpZU8lRNN01U1V6CDg==", 1311 "integrity": "sha512-4AgisQ8GWa3irdRu3/UNr3brcSSm0oobmoV1eSOnV7JM32lYyXDnSKB7RuTTXvaAjD/0xQJLEGhkyGHS5gbywA==",
2573 "requires": { 1312 "requires": {
2574 "vscode-jsonrpc": "^4.0.0", 1313 "vscode-jsonrpc": "^4.1.0-next.1",
2575 "vscode-languageserver-types": "3.14.0" 1314 "vscode-languageserver-types": "3.15.0-next.1"
2576 } 1315 }
2577 }, 1316 },
2578 "vscode-languageserver-types": { 1317 "vscode-languageserver-types": {
2579 "version": "3.14.0", 1318 "version": "3.15.0-next.1",
2580 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", 1319 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.0-next.1.tgz",
2581 "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" 1320 "integrity": "sha512-R0kzmaI8gOGEoU7b9huYQAzgZzRQ/5Q8HKjsIUdfz0MjXcBZ4tr1ik1So1p1O5kGrI1VTCd22Fw/wI7ECGoIPw=="
1321 },
1322 "vscode-test": {
1323 "version": "0.1.5",
1324 "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.1.5.tgz",
1325 "integrity": "sha512-s+lbF1Dtasc0yXVB9iQTexBe2JK6HJAUJe3fWezHKIjq+xRw5ZwCMEMBaonFIPy7s95qg2HPTRDR5W4h4kbxGw==",
1326 "dev": true,
1327 "requires": {
1328 "http-proxy-agent": "^2.1.0",
1329 "https-proxy-agent": "^2.2.1"
1330 }
2582 }, 1331 },
2583 "vso-node-api": { 1332 "vso-node-api": {
2584 "version": "6.1.2-preview", 1333 "version": "6.1.2-preview",
@@ -2598,12 +1347,6 @@
2598 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1347 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2599 "dev": true 1348 "dev": true
2600 }, 1349 },
2601 "xtend": {
2602 "version": "4.0.1",
2603 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
2604 "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
2605 "dev": true
2606 },
2607 "yauzl": { 1350 "yauzl": {
2608 "version": "2.10.0", 1351 "version": "2.10.0",
2609 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1352 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
diff --git a/editors/code/package.json b/editors/code/package.json
index a0454191a..015b912b3 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -13,7 +13,7 @@
13 "Other" 13 "Other"
14 ], 14 ],
15 "engines": { 15 "engines": {
16 "vscode": "^1.31.0" 16 "vscode": "^1.33.0"
17 }, 17 },
18 "scripts": { 18 "scripts": {
19 "vscode:prepublish": "npm run compile", 19 "vscode:prepublish": "npm run compile",
@@ -31,18 +31,18 @@
31 "singleQuote": true 31 "singleQuote": true
32 }, 32 },
33 "dependencies": { 33 "dependencies": {
34 "vscode-languageclient": "^5.3.0-next.1" 34 "vscode-languageclient": "^5.3.0-next.4"
35 }, 35 },
36 "devDependencies": { 36 "devDependencies": {
37 "@types/mocha": "^5.2.5", 37 "@types/mocha": "^5.2.6",
38 "@types/node": "^10.12.24", 38 "@types/node": "^10.14.5",
39 "prettier": "^1.16.4", 39 "prettier": "^1.17.0",
40 "tslint": "^5.12.1", 40 "shx": "^0.3.1",
41 "tslint": "^5.16.0",
41 "tslint-config-prettier": "^1.18.0", 42 "tslint-config-prettier": "^1.18.0",
42 "typescript": "^3.3.1", 43 "typescript": "^3.4.4",
43 "vsce": "^1.57.0", 44 "vsce": "^1.59.0",
44 "vscode": "^1.1.29", 45 "vscode": "^1.1.33"
45 "shx": "^0.3.1"
46 }, 46 },
47 "activationEvents": [ 47 "activationEvents": [
48 "onLanguage:rust", 48 "onLanguage:rust",
@@ -81,11 +81,6 @@
81 "category": "Rust Analyzer" 81 "category": "Rust Analyzer"
82 }, 82 },
83 { 83 {
84 "command": "rust-analyzer.extendSelection",
85 "title": "Extend selection",
86 "category": "Rust Analyzer"
87 },
88 {
89 "command": "rust-analyzer.matchingBrace", 84 "command": "rust-analyzer.matchingBrace",
90 "title": "Find matching brace", 85 "title": "Find matching brace",
91 "category": "Rust Analyzer" 86 "category": "Rust Analyzer"
@@ -119,6 +114,16 @@
119 "command": "rust-analyzer.reload", 114 "command": "rust-analyzer.reload",
120 "title": "Restart server", 115 "title": "Restart server",
121 "category": "Rust Analyzer" 116 "category": "Rust Analyzer"
117 },
118 {
119 "command": "rust-analyzer.startCargoWatch",
120 "title": "Start Cargo Watch",
121 "category": "Rust Analyzer"
122 },
123 {
124 "command": "rust-analyzer.stopCargoWatch",
125 "title": "Stop Cargo Watch",
126 "category": "Rust Analyzer"
122 } 127 }
123 ], 128 ],
124 "keybindings": [ 129 "keybindings": [
@@ -250,6 +255,18 @@
250 "${workspaceRoot}" 255 "${workspaceRoot}"
251 ], 256 ],
252 "pattern": "$rustc" 257 "pattern": "$rustc"
258 },
259 {
260 "name": "rustc-watch",
261 "fileLocation": [
262 "relative",
263 "${workspaceRoot}"
264 ],
265 "background": {
266 "beginsPattern": "^\\[Running\\b",
267 "endsPattern": "^\\[Finished running\\b"
268 },
269 "pattern": "$rustc"
253 } 270 }
254 ] 271 ]
255 } 272 }
diff --git a/editors/code/src/commands/cargo_watch.ts b/editors/code/src/commands/cargo_watch.ts
index 32bd38a1c..1d939e28c 100644
--- a/editors/code/src/commands/cargo_watch.ts
+++ b/editors/code/src/commands/cargo_watch.ts
@@ -7,44 +7,55 @@ import { terminate } from '../utils/processes';
7import { LineBuffer } from './line_buffer'; 7import { LineBuffer } from './line_buffer';
8import { StatusDisplay } from './watch_status'; 8import { StatusDisplay } from './watch_status';
9 9
10export class CargoWatchProvider { 10export function registerCargoWatchProvider(
11 private diagnosticCollection?: vscode.DiagnosticCollection; 11 subscriptions: vscode.Disposable[]
12 private cargoProcess?: child_process.ChildProcess; 12): CargoWatchProvider | undefined {
13 private outBuffer: string = ''; 13 let cargoExists = false;
14 private statusDisplay?: StatusDisplay; 14 const cargoTomlFile = path.join(vscode.workspace.rootPath!, 'Cargo.toml');
15 private outputChannel?: vscode.OutputChannel; 15 // Check if the working directory is valid cargo root path
16 16 try {
17 public activate(subscriptions: vscode.Disposable[]) { 17 if (fs.existsSync(cargoTomlFile)) {
18 let cargoExists = false; 18 cargoExists = true;
19 const cargoTomlFile = path.join( 19 }
20 vscode.workspace.rootPath!, 20 } catch (err) {
21 'Cargo.toml' 21 cargoExists = false;
22 }
23
24 if (!cargoExists) {
25 vscode.window.showErrorMessage(
26 `Couldn\'t find \'Cargo.toml\' in ${cargoTomlFile}`
22 ); 27 );
23 // Check if the working directory is valid cargo root path 28 return;
24 try { 29 }
25 if (fs.existsSync(cargoTomlFile)) {
26 cargoExists = true;
27 }
28 } catch (err) {
29 cargoExists = false;
30 }
31 30
32 if (!cargoExists) { 31 const provider = new CargoWatchProvider();
33 vscode.window.showErrorMessage( 32 subscriptions.push(provider);
34 `Couldn\'t find \'Cargo.toml\' in ${cargoTomlFile}` 33 return provider;
35 ); 34}
36 return;
37 }
38 35
39 subscriptions.push(this); 36export class CargoWatchProvider implements vscode.Disposable {
37 private readonly diagnosticCollection: vscode.DiagnosticCollection;
38 private readonly statusDisplay: StatusDisplay;
39 private readonly outputChannel: vscode.OutputChannel;
40 private cargoProcess?: child_process.ChildProcess;
41
42 constructor() {
40 this.diagnosticCollection = vscode.languages.createDiagnosticCollection( 43 this.diagnosticCollection = vscode.languages.createDiagnosticCollection(
41 'rustc' 44 'rustc'
42 ); 45 );
43 46 this.statusDisplay = new StatusDisplay();
44 this.statusDisplay = new StatusDisplay(subscriptions);
45 this.outputChannel = vscode.window.createOutputChannel( 47 this.outputChannel = vscode.window.createOutputChannel(
46 'Cargo Watch Trace' 48 'Cargo Watch Trace'
47 ); 49 );
50 }
51
52 public start() {
53 if (this.cargoProcess) {
54 vscode.window.showInformationMessage(
55 'Cargo Watch is already running'
56 );
57 return;
58 }
48 59
49 let args = 'check --message-format json'; 60 let args = 'check --message-format json';
50 if (Server.config.cargoWatchOptions.checkArguments.length > 0) { 61 if (Server.config.cargoWatchOptions.checkArguments.length > 0) {
@@ -95,25 +106,28 @@ export class CargoWatchProvider {
95 this.logInfo('cargo-watch started.'); 106 this.logInfo('cargo-watch started.');
96 } 107 }
97 108
98 public dispose(): void { 109 public stop() {
99 if (this.diagnosticCollection) {
100 this.diagnosticCollection.clear();
101 this.diagnosticCollection.dispose();
102 }
103
104 if (this.cargoProcess) { 110 if (this.cargoProcess) {
105 this.cargoProcess.kill(); 111 this.cargoProcess.kill();
106 terminate(this.cargoProcess); 112 terminate(this.cargoProcess);
113 this.cargoProcess = undefined;
114 } else {
115 vscode.window.showInformationMessage('Cargo Watch is not running');
107 } 116 }
117 }
108 118
109 if (this.outputChannel) { 119 public dispose(): void {
110 this.outputChannel.dispose(); 120 this.stop();
111 } 121
122 this.diagnosticCollection.clear();
123 this.diagnosticCollection.dispose();
124 this.outputChannel.dispose();
125 this.statusDisplay.dispose();
112 } 126 }
113 127
114 private logInfo(line: string) { 128 private logInfo(line: string) {
115 if (Server.config.cargoWatchOptions.trace === 'verbose') { 129 if (Server.config.cargoWatchOptions.trace === 'verbose') {
116 this.outputChannel!.append(line); 130 this.outputChannel.append(line);
117 } 131 }
118 } 132 }
119 133
@@ -122,18 +136,18 @@ export class CargoWatchProvider {
122 Server.config.cargoWatchOptions.trace === 'error' || 136 Server.config.cargoWatchOptions.trace === 'error' ||
123 Server.config.cargoWatchOptions.trace === 'verbose' 137 Server.config.cargoWatchOptions.trace === 'verbose'
124 ) { 138 ) {
125 this.outputChannel!.append(line); 139 this.outputChannel.append(line);
126 } 140 }
127 } 141 }
128 142
129 private parseLine(line: string) { 143 private parseLine(line: string) {
130 if (line.startsWith('[Running')) { 144 if (line.startsWith('[Running')) {
131 this.diagnosticCollection!.clear(); 145 this.diagnosticCollection.clear();
132 this.statusDisplay!.show(); 146 this.statusDisplay.show();
133 } 147 }
134 148
135 if (line.startsWith('[Finished running')) { 149 if (line.startsWith('[Finished running')) {
136 this.statusDisplay!.hide(); 150 this.statusDisplay.hide();
137 } 151 }
138 152
139 function getLevel(s: string): vscode.DiagnosticSeverity { 153 function getLevel(s: string): vscode.DiagnosticSeverity {
@@ -193,7 +207,7 @@ export class CargoWatchProvider {
193 207
194 // The format of the package_id is "{name} {version} ({source_id})", 208 // The format of the package_id is "{name} {version} ({source_id})",
195 // https://github.com/rust-lang/cargo/blob/37ad03f86e895bb80b474c1c088322634f4725f5/src/cargo/core/package_id.rs#L53 209 // https://github.com/rust-lang/cargo/blob/37ad03f86e895bb80b474c1c088322634f4725f5/src/cargo/core/package_id.rs#L53
196 this.statusDisplay!.packageName = msg.package_id.split(' ')[0]; 210 this.statusDisplay.packageName = msg.package_id.split(' ')[0];
197 } else if (data.reason === 'compiler-message') { 211 } else if (data.reason === 'compiler-message') {
198 const msg = data.message as RustDiagnostic; 212 const msg = data.message as RustDiagnostic;
199 213
diff --git a/editors/code/src/commands/extend_selection.ts b/editors/code/src/commands/extend_selection.ts
deleted file mode 100644
index 6f4187d15..000000000
--- a/editors/code/src/commands/extend_selection.ts
+++ /dev/null
@@ -1,34 +0,0 @@
1import * as vscode from 'vscode';
2
3import { Range, TextDocumentIdentifier } from 'vscode-languageclient';
4import { Server } from '../server';
5
6interface ExtendSelectionParams {
7 textDocument: TextDocumentIdentifier;
8 selections: Range[];
9}
10
11interface ExtendSelectionResult {
12 selections: Range[];
13}
14
15export async function handle() {
16 const editor = vscode.window.activeTextEditor;
17 if (editor == null || editor.document.languageId !== 'rust') {
18 return;
19 }
20 const request: ExtendSelectionParams = {
21 selections: editor.selections.map(s =>
22 Server.client.code2ProtocolConverter.asRange(s)
23 ),
24 textDocument: { uri: editor.document.uri.toString() }
25 };
26 const response = await Server.client.sendRequest<ExtendSelectionResult>(
27 'rust-analyzer/extendSelection',
28 request
29 );
30 editor.selections = response.selections.map((range: Range) => {
31 const r = Server.client.protocol2CodeConverter.asRange(range);
32 return new vscode.Selection(r.start, r.end);
33 });
34}
diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts
index f36c4b040..194658497 100644
--- a/editors/code/src/commands/index.ts
+++ b/editors/code/src/commands/index.ts
@@ -1,6 +1,5 @@
1import * as analyzerStatus from './analyzer_status'; 1import * as analyzerStatus from './analyzer_status';
2import * as applySourceChange from './apply_source_change'; 2import * as applySourceChange from './apply_source_change';
3import * as extendSelection from './extend_selection';
4import * as joinLines from './join_lines'; 3import * as joinLines from './join_lines';
5import * as matchingBrace from './matching_brace'; 4import * as matchingBrace from './matching_brace';
6import * as onEnter from './on_enter'; 5import * as onEnter from './on_enter';
@@ -11,7 +10,6 @@ import * as syntaxTree from './syntaxTree';
11export { 10export {
12 analyzerStatus, 11 analyzerStatus,
13 applySourceChange, 12 applySourceChange,
14 extendSelection,
15 joinLines, 13 joinLines,
16 matchingBrace, 14 matchingBrace,
17 parentModule, 15 parentModule,
diff --git a/editors/code/src/commands/runnables.ts b/editors/code/src/commands/runnables.ts
index c4df24c79..26372c1e8 100644
--- a/editors/code/src/commands/runnables.ts
+++ b/editors/code/src/commands/runnables.ts
@@ -5,7 +5,7 @@ import * as vscode from 'vscode';
5import * as lc from 'vscode-languageclient'; 5import * as lc from 'vscode-languageclient';
6 6
7import { Server } from '../server'; 7import { Server } from '../server';
8import { CargoWatchProvider } from './cargo_watch'; 8import { CargoWatchProvider, registerCargoWatchProvider } from './cargo_watch';
9 9
10interface RunnablesParams { 10interface RunnablesParams {
11 textDocument: lc.TextDocumentIdentifier; 11 textDocument: lc.TextDocumentIdentifier;
@@ -137,7 +137,7 @@ export async function handleSingle(runnable: Runnable) {
137 */ 137 */
138export async function interactivelyStartCargoWatch( 138export async function interactivelyStartCargoWatch(
139 context: vscode.ExtensionContext 139 context: vscode.ExtensionContext
140) { 140): Promise<CargoWatchProvider | undefined> {
141 if (Server.config.cargoWatchOptions.enableOnStartup === 'disabled') { 141 if (Server.config.cargoWatchOptions.enableOnStartup === 'disabled') {
142 return; 142 return;
143 } 143 }
@@ -153,6 +153,12 @@ export async function interactivelyStartCargoWatch(
153 } 153 }
154 } 154 }
155 155
156 return startCargoWatch(context);
157}
158
159export async function startCargoWatch(
160 context: vscode.ExtensionContext
161): Promise<CargoWatchProvider | undefined> {
156 const execPromise = util.promisify(child_process.exec); 162 const execPromise = util.promisify(child_process.exec);
157 163
158 const { stderr } = await execPromise('cargo watch --version').catch(e => e); 164 const { stderr } = await execPromise('cargo watch --version').catch(e => e);
@@ -197,6 +203,9 @@ export async function interactivelyStartCargoWatch(
197 } 203 }
198 } 204 }
199 205
200 const validater = new CargoWatchProvider(); 206 const provider = await registerCargoWatchProvider(context.subscriptions);
201 validater.activate(context.subscriptions); 207 if (provider) {
208 provider.start();
209 }
210 return provider;
202} 211}
diff --git a/editors/code/src/commands/watch_status.ts b/editors/code/src/commands/watch_status.ts
index 86ae821de..a3b0178f2 100644
--- a/editors/code/src/commands/watch_status.ts
+++ b/editors/code/src/commands/watch_status.ts
@@ -2,19 +2,18 @@ import * as vscode from 'vscode';
2 2
3const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']; 3const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
4 4
5export class StatusDisplay { 5export class StatusDisplay implements vscode.Disposable {
6 public packageName?: string; 6 public packageName?: string;
7 7
8 private i = 0; 8 private i = 0;
9 private statusBarItem: vscode.StatusBarItem; 9 private statusBarItem: vscode.StatusBarItem;
10 private timer?: NodeJS.Timeout; 10 private timer?: NodeJS.Timeout;
11 11
12 constructor(subscriptions: vscode.Disposable[]) { 12 constructor() {
13 this.statusBarItem = vscode.window.createStatusBarItem( 13 this.statusBarItem = vscode.window.createStatusBarItem(
14 vscode.StatusBarAlignment.Left, 14 vscode.StatusBarAlignment.Left,
15 10 15 10
16 ); 16 );
17 subscriptions.push(this.statusBarItem);
18 this.statusBarItem.hide(); 17 this.statusBarItem.hide();
19 } 18 }
20 19
@@ -33,7 +32,7 @@ export class StatusDisplay {
33 } 32 }
34 }, 300); 33 }, 300);
35 34
36 this.statusBarItem!.show(); 35 this.statusBarItem.show();
37 } 36 }
38 37
39 public hide() { 38 public hide() {
@@ -42,7 +41,16 @@ export class StatusDisplay {
42 this.timer = undefined; 41 this.timer = undefined;
43 } 42 }
44 43
45 this.statusBarItem!.hide(); 44 this.statusBarItem.hide();
45 }
46
47 public dispose() {
48 if (this.timer) {
49 clearInterval(this.timer);
50 this.timer = undefined;
51 }
52
53 this.statusBarItem.dispose();
46 } 54 }
47 55
48 private frame() { 56 private frame() {
diff --git a/editors/code/src/extension.ts b/editors/code/src/extension.ts
index 1073a36a0..c8c3004a7 100644
--- a/editors/code/src/extension.ts
+++ b/editors/code/src/extension.ts
@@ -2,7 +2,11 @@ import * as vscode from 'vscode';
2import * as lc from 'vscode-languageclient'; 2import * as lc from 'vscode-languageclient';
3 3
4import * as commands from './commands'; 4import * as commands from './commands';
5import { interactivelyStartCargoWatch } from './commands/runnables'; 5import { CargoWatchProvider } from './commands/cargo_watch';
6import {
7 interactivelyStartCargoWatch,
8 startCargoWatch
9} from './commands/runnables';
6import { SyntaxTreeContentProvider } from './commands/syntaxTree'; 10import { SyntaxTreeContentProvider } from './commands/syntaxTree';
7import * as events from './events'; 11import * as events from './events';
8import * as notifications from './notifications'; 12import * as notifications from './notifications';
@@ -54,10 +58,6 @@ export function activate(context: vscode.ExtensionContext) {
54 Server.client.sendRequest<null>('rust-analyzer/collectGarbage', null) 58 Server.client.sendRequest<null>('rust-analyzer/collectGarbage', null)
55 ); 59 );
56 registerCommand( 60 registerCommand(
57 'rust-analyzer.extendSelection',
58 commands.extendSelection.handle
59 );
60 registerCommand(
61 'rust-analyzer.matchingBrace', 61 'rust-analyzer.matchingBrace',
62 commands.matchingBrace.handle 62 commands.matchingBrace.handle
63 ); 63 );
@@ -126,7 +126,24 @@ export function activate(context: vscode.ExtensionContext) {
126 vscode.commands.registerCommand('rust-analyzer.reload', reloadCommand); 126 vscode.commands.registerCommand('rust-analyzer.reload', reloadCommand);
127 127
128 // Executing `cargo watch` provides us with inline diagnostics on save 128 // Executing `cargo watch` provides us with inline diagnostics on save
129 interactivelyStartCargoWatch(context); 129 let provider: CargoWatchProvider | undefined;
130 interactivelyStartCargoWatch(context).then(p => {
131 provider = p;
132 });
133 registerCommand('rust-analyzer.startCargoWatch', () => {
134 if (provider) {
135 provider.start();
136 } else {
137 startCargoWatch(context).then(p => {
138 provider = p;
139 });
140 }
141 });
142 registerCommand('rust-analyzer.stopCargoWatch', () => {
143 if (provider) {
144 provider.stop();
145 }
146 });
130 147
131 // Start the language server, finally! 148 // Start the language server, finally!
132 startServer(); 149 startServer();
diff --git a/editors/code/src/server.ts b/editors/code/src/server.ts
index 5e9a19340..81c2b3fff 100644
--- a/editors/code/src/server.ts
+++ b/editors/code/src/server.ts
@@ -74,6 +74,7 @@ export class Server {
74 } 74 }
75 } 75 }
76 }; 76 };
77 Server.client.registerProposedFeatures();
77 Server.client.onReady().then(() => { 78 Server.client.onReady().then(() => {
78 for (const [type, handler] of notificationHandlers) { 79 for (const [type, handler] of notificationHandlers) {
79 Server.client.onNotification(type, handler); 80 Server.client.onNotification(type, handler);