aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_assists/src/add_missing_impl_members.rs96
-rw-r--r--crates/ra_assists/src/ast_editor.rs41
-rw-r--r--editors/code/package-lock.json81
-rw-r--r--editors/code/package.json2
4 files changed, 129 insertions, 91 deletions
diff --git a/crates/ra_assists/src/add_missing_impl_members.rs b/crates/ra_assists/src/add_missing_impl_members.rs
index 0e49b0401..0c903a563 100644
--- a/crates/ra_assists/src/add_missing_impl_members.rs
+++ b/crates/ra_assists/src/add_missing_impl_members.rs
@@ -2,9 +2,10 @@ use crate::{Assist, AssistId, AssistCtx, ast_editor::{AstEditor, AstBuilder}};
2 2
3use hir::{HasSource, db::HirDatabase}; 3use hir::{HasSource, db::HirDatabase};
4use ra_syntax::{SmolStr, TreeArc}; 4use ra_syntax::{SmolStr, TreeArc};
5use ra_syntax::ast::{self, AstNode, FnDef, ImplItem, ImplItemKind, NameOwner}; 5use ra_syntax::ast::{self, AstNode, ImplItem, ImplItemKind, NameOwner};
6use ra_db::FilePosition; 6use ra_db::FilePosition;
7 7
8#[derive(PartialEq)]
8enum AddMissingImplMembersMode { 9enum AddMissingImplMembersMode {
9 DefaultMethodsOnly, 10 DefaultMethodsOnly,
10 NoDefaultMethods, 11 NoDefaultMethods,
@@ -45,39 +46,50 @@ fn add_missing_impl_members_inner(
45 resolve_target_trait_def(ctx.db, &analyzer, impl_node)? 46 resolve_target_trait_def(ctx.db, &analyzer, impl_node)?
46 }; 47 };
47 48
48 let missing_fns: Vec<_> = { 49 let def_name = |kind| -> Option<&SmolStr> {
49 let fn_def_opt = |kind| if let ImplItemKind::FnDef(def) = kind { Some(def) } else { None }; 50 match kind {
50 let def_name = |def| -> Option<&SmolStr> { FnDef::name(def).map(ast::Name::text) }; 51 ImplItemKind::FnDef(def) => def.name(),
51 52 ImplItemKind::TypeAliasDef(def) => def.name(),
52 let trait_items = 53 ImplItemKind::ConstDef(def) => def.name(),
53 trait_def.syntax().descendants().find_map(ast::ItemList::cast)?.impl_items(); 54 }
54 let impl_items = impl_item_list.impl_items(); 55 .map(ast::Name::text)
55
56 let trait_fns = trait_items.map(ImplItem::kind).filter_map(fn_def_opt);
57 let impl_fns = impl_items.map(ImplItem::kind).filter_map(fn_def_opt).collect::<Vec<_>>();
58
59 trait_fns
60 .filter(|t| def_name(t).is_some())
61 .filter(|t| match mode {
62 AddMissingImplMembersMode::DefaultMethodsOnly => t.body().is_some(),
63 AddMissingImplMembersMode::NoDefaultMethods => t.body().is_none(),
64 })
65 .filter(|t| impl_fns.iter().all(|i| def_name(i) != def_name(t)))
66 .collect()
67 }; 56 };
68 if missing_fns.is_empty() { 57
58 let trait_items = trait_def.item_list()?.impl_items();
59 let impl_items = impl_item_list.impl_items().collect::<Vec<_>>();
60
61 let missing_items: Vec<_> = trait_items
62 .filter(|t| def_name(t.kind()).is_some())
63 .filter(|t| match t.kind() {
64 ImplItemKind::FnDef(def) => match mode {
65 AddMissingImplMembersMode::DefaultMethodsOnly => def.body().is_some(),
66 AddMissingImplMembersMode::NoDefaultMethods => def.body().is_none(),
67 },
68 _ => mode == AddMissingImplMembersMode::NoDefaultMethods,
69 })
70 .filter(|t| impl_items.iter().all(|i| def_name(i.kind()) != def_name(t.kind())))
71 .collect();
72 if missing_items.is_empty() {
69 return None; 73 return None;
70 } 74 }
71 75
72 ctx.add_action(AssistId(assist_id), label, |edit| { 76 ctx.add_action(AssistId(assist_id), label, |edit| {
73 let n_existing_items = impl_item_list.impl_items().count(); 77 let n_existing_items = impl_item_list.impl_items().count();
74 let fns = missing_fns.into_iter().map(add_body_and_strip_docstring).collect::<Vec<_>>();
75
76 let mut ast_editor = AstEditor::new(impl_item_list); 78 let mut ast_editor = AstEditor::new(impl_item_list);
77 if n_existing_items == 0 { 79 if n_existing_items == 0 {
78 ast_editor.make_multiline(); 80 ast_editor.make_multiline();
79 } 81 }
80 ast_editor.append_functions(fns.iter().map(|it| &**it)); 82
83 for item in missing_items {
84 let it = match item.kind() {
85 ImplItemKind::FnDef(def) => {
86 strip_docstring(ImplItem::cast(add_body(def).syntax()).unwrap())
87 }
88 _ => strip_docstring(item),
89 };
90 ast_editor.append_item(&it)
91 }
92
81 let first_new_item = ast_editor.ast().impl_items().nth(n_existing_items).unwrap(); 93 let first_new_item = ast_editor.ast().impl_items().nth(n_existing_items).unwrap();
82 let cursor_poisition = first_new_item.syntax().range().start(); 94 let cursor_poisition = first_new_item.syntax().range().start();
83 ast_editor.into_text_edit(edit.text_edit_builder()); 95 ast_editor.into_text_edit(edit.text_edit_builder());
@@ -88,14 +100,19 @@ fn add_missing_impl_members_inner(
88 ctx.build() 100 ctx.build()
89} 101}
90 102
91fn add_body_and_strip_docstring(fn_def: &ast::FnDef) -> TreeArc<ast::FnDef> { 103fn strip_docstring(item: &ast::ImplItem) -> TreeArc<ast::ImplItem> {
104 let mut ast_editor = AstEditor::new(item);
105 ast_editor.strip_attrs_and_docs();
106 ast_editor.ast().to_owned()
107}
108
109fn add_body(fn_def: &ast::FnDef) -> TreeArc<ast::FnDef> {
92 let mut ast_editor = AstEditor::new(fn_def); 110 let mut ast_editor = AstEditor::new(fn_def);
93 if fn_def.body().is_none() { 111 if fn_def.body().is_none() {
94 ast_editor.set_body(&AstBuilder::<ast::Block>::single_expr( 112 ast_editor.set_body(&AstBuilder::<ast::Block>::single_expr(
95 &AstBuilder::<ast::Expr>::unimplemented(), 113 &AstBuilder::<ast::Expr>::unimplemented(),
96 )); 114 ));
97 } 115 }
98 ast_editor.strip_attrs_and_docs();
99 ast_editor.ast().to_owned() 116 ast_editor.ast().to_owned()
100} 117}
101 118
@@ -126,6 +143,10 @@ mod tests {
126 add_missing_impl_members, 143 add_missing_impl_members,
127 " 144 "
128trait Foo { 145trait Foo {
146 type Output;
147
148 const CONST: usize = 42;
149
129 fn foo(&self); 150 fn foo(&self);
130 fn bar(&self); 151 fn bar(&self);
131 fn baz(&self); 152 fn baz(&self);
@@ -139,6 +160,10 @@ impl Foo for S {
139}", 160}",
140 " 161 "
141trait Foo { 162trait Foo {
163 type Output;
164
165 const CONST: usize = 42;
166
142 fn foo(&self); 167 fn foo(&self);
143 fn bar(&self); 168 fn bar(&self);
144 fn baz(&self); 169 fn baz(&self);
@@ -148,7 +173,9 @@ struct S;
148 173
149impl Foo for S { 174impl Foo for S {
150 fn bar(&self) {} 175 fn bar(&self) {}
151 <|>fn foo(&self) { unimplemented!() } 176 <|>type Output;
177 const CONST: usize = 42;
178 fn foo(&self) { unimplemented!() }
152 fn baz(&self) { unimplemented!() } 179 fn baz(&self) { unimplemented!() }
153 180
154}", 181}",
@@ -256,6 +283,8 @@ impl Foo for S { <|> }",
256#[doc(alias = "test alias")] 283#[doc(alias = "test alias")]
257trait Foo { 284trait Foo {
258 /// doc string 285 /// doc string
286 type Output;
287
259 #[must_use] 288 #[must_use]
260 fn foo(&self); 289 fn foo(&self);
261} 290}
@@ -265,12 +294,15 @@ impl Foo for S {}<|>"#,
265#[doc(alias = "test alias")] 294#[doc(alias = "test alias")]
266trait Foo { 295trait Foo {
267 /// doc string 296 /// doc string
297 type Output;
298
268 #[must_use] 299 #[must_use]
269 fn foo(&self); 300 fn foo(&self);
270} 301}
271struct S; 302struct S;
272impl Foo for S { 303impl Foo for S {
273 <|>fn foo(&self) { unimplemented!() } 304 <|>type Output;
305 fn foo(&self) { unimplemented!() }
274}"#, 306}"#,
275 ) 307 )
276 } 308 }
@@ -281,6 +313,10 @@ impl Foo for S {
281 add_missing_default_members, 313 add_missing_default_members,
282 " 314 "
283trait Foo { 315trait Foo {
316 type Output;
317
318 const CONST: usize = 42;
319
284 fn valid(some: u32) -> bool { false } 320 fn valid(some: u32) -> bool { false }
285 fn foo(some: u32) -> bool; 321 fn foo(some: u32) -> bool;
286} 322}
@@ -288,6 +324,10 @@ struct S;
288impl Foo for S { <|> }", 324impl Foo for S { <|> }",
289 " 325 "
290trait Foo { 326trait Foo {
327 type Output;
328
329 const CONST: usize = 42;
330
291 fn valid(some: u32) -> bool { false } 331 fn valid(some: u32) -> bool { false }
292 fn foo(some: u32) -> bool; 332 fn foo(some: u32) -> bool;
293} 333}
diff --git a/crates/ra_assists/src/ast_editor.rs b/crates/ra_assists/src/ast_editor.rs
index de0529b32..5f8ba3df6 100644
--- a/crates/ra_assists/src/ast_editor.rs
+++ b/crates/ra_assists/src/ast_editor.rs
@@ -163,11 +163,7 @@ impl AstEditor<ast::ItemList> {
163 self.do_make_multiline() 163 self.do_make_multiline()
164 } 164 }
165 165
166 pub fn append_functions<'a>(&mut self, fns: impl Iterator<Item = &'a ast::FnDef>) { 166 pub fn append_item(&mut self, item: &ast::ImplItem) {
167 fns.for_each(|it| self.append_function(it))
168 }
169
170 pub fn append_function(&mut self, fn_def: &ast::FnDef) {
171 let (indent, position) = match self.ast().impl_items().last() { 167 let (indent, position) = match self.ast().impl_items().last() {
172 Some(it) => ( 168 Some(it) => (
173 leading_indent(it.syntax()).unwrap_or("").to_string(), 169 leading_indent(it.syntax()).unwrap_or("").to_string(),
@@ -182,8 +178,7 @@ impl AstEditor<ast::ItemList> {
182 }, 178 },
183 }; 179 };
184 let ws = tokens::WsBuilder::new(&format!("\n{}", indent)); 180 let ws = tokens::WsBuilder::new(&format!("\n{}", indent));
185 let to_insert: ArrayVec<[SyntaxElement; 2]> = 181 let to_insert: ArrayVec<[SyntaxElement; 2]> = [ws.ws().into(), item.syntax().into()].into();
186 [ws.ws().into(), fn_def.syntax().into()].into();
187 self.ast = self.insert_children(position, to_insert.into_iter()); 182 self.ast = self.insert_children(position, to_insert.into_iter());
188 } 183 }
189 184
@@ -192,6 +187,23 @@ impl AstEditor<ast::ItemList> {
192 } 187 }
193} 188}
194 189
190impl AstEditor<ast::ImplItem> {
191 pub fn strip_attrs_and_docs(&mut self) {
192 while let Some(start) = self
193 .ast()
194 .syntax()
195 .children_with_tokens()
196 .find(|it| it.kind() == ATTR || it.kind() == COMMENT)
197 {
198 let end = match start.next_sibling_or_token() {
199 Some(el) if el.kind() == WHITESPACE => el,
200 Some(_) | None => start,
201 };
202 self.ast = self.replace_children(RangeInclusive::new(start, end), iter::empty());
203 }
204 }
205}
206
195impl AstEditor<ast::FnDef> { 207impl AstEditor<ast::FnDef> {
196 pub fn set_body(&mut self, body: &ast::Block) { 208 pub fn set_body(&mut self, body: &ast::Block) {
197 let mut to_insert: ArrayVec<[SyntaxElement; 2]> = ArrayVec::new(); 209 let mut to_insert: ArrayVec<[SyntaxElement; 2]> = ArrayVec::new();
@@ -210,21 +222,6 @@ impl AstEditor<ast::FnDef> {
210 let replace_range = RangeInclusive::new(old_body_or_semi, old_body_or_semi); 222 let replace_range = RangeInclusive::new(old_body_or_semi, old_body_or_semi);
211 self.ast = self.replace_children(replace_range, to_insert.into_iter()) 223 self.ast = self.replace_children(replace_range, to_insert.into_iter())
212 } 224 }
213
214 pub fn strip_attrs_and_docs(&mut self) {
215 while let Some(start) = self
216 .ast()
217 .syntax()
218 .children_with_tokens()
219 .find(|it| it.kind() == ATTR || it.kind() == COMMENT)
220 {
221 let end = match start.next_sibling_or_token() {
222 Some(el) if el.kind() == WHITESPACE => el,
223 Some(_) | None => start,
224 };
225 self.ast = self.replace_children(RangeInclusive::new(start, end), iter::empty());
226 }
227 }
228} 225}
229 226
230pub struct AstBuilder<N: AstNode> { 227pub struct AstBuilder<N: AstNode> {
diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json
index 6b3a12f91..b3666f30b 100644
--- a/editors/code/package-lock.json
+++ b/editors/code/package-lock.json
@@ -39,7 +39,8 @@
39 "@types/seedrandom": { 39 "@types/seedrandom": {
40 "version": "2.4.28", 40 "version": "2.4.28",
41 "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.28.tgz", 41 "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.28.tgz",
42 "integrity": "sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA==" 42 "integrity": "sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA==",
43 "dev": true
43 }, 44 },
44 "agent-base": { 45 "agent-base": {
45 "version": "4.2.1", 46 "version": "4.2.1",
@@ -113,6 +114,18 @@
113 "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 114 "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
114 "dev": true 115 "dev": true
115 }, 116 },
117 "azure-devops-node-api": {
118 "version": "7.2.0",
119 "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz",
120 "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==",
121 "dev": true,
122 "requires": {
123 "os": "0.1.1",
124 "tunnel": "0.0.4",
125 "typed-rest-client": "1.2.0",
126 "underscore": "1.8.3"
127 }
128 },
116 "balanced-match": { 129 "balanced-match": {
117 "version": "1.0.0", 130 "version": "1.0.0",
118 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 131 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -289,6 +302,12 @@
289 "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", 302 "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
290 "dev": true 303 "dev": true
291 }, 304 },
305 "didyoumean": {
306 "version": "1.2.1",
307 "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz",
308 "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=",
309 "dev": true
310 },
292 "diff": { 311 "diff": {
293 "version": "3.5.0", 312 "version": "3.5.0",
294 "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 313 "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
@@ -805,6 +824,12 @@
805 "wrappy": "1" 824 "wrappy": "1"
806 } 825 }
807 }, 826 },
827 "os": {
828 "version": "0.1.1",
829 "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz",
830 "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=",
831 "dev": true
832 },
808 "os-homedir": { 833 "os-homedir": {
809 "version": "1.0.2", 834 "version": "1.0.2",
810 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 835 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -887,12 +912,6 @@
887 "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 912 "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
888 "dev": true 913 "dev": true
889 }, 914 },
890 "q": {
891 "version": "1.5.1",
892 "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
893 "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
894 "dev": true
895 },
896 "qs": { 915 "qs": {
897 "version": "6.5.2", 916 "version": "6.5.2",
898 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 917 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
@@ -915,9 +934,9 @@
915 } 934 }
916 }, 935 },
917 "readable-stream": { 936 "readable-stream": {
918 "version": "3.3.0", 937 "version": "3.4.0",
919 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", 938 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
920 "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", 939 "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
921 "dev": true, 940 "dev": true,
922 "requires": { 941 "requires": {
923 "inherits": "^2.0.3", 942 "inherits": "^2.0.3",
@@ -1177,21 +1196,13 @@
1177 "dev": true 1196 "dev": true
1178 }, 1197 },
1179 "typed-rest-client": { 1198 "typed-rest-client": {
1180 "version": "0.9.0", 1199 "version": "1.2.0",
1181 "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz", 1200 "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz",
1182 "integrity": "sha1-92jMDcP06VDwbgSCXDaz54NKofI=", 1201 "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==",
1183 "dev": true, 1202 "dev": true,
1184 "requires": { 1203 "requires": {
1185 "tunnel": "0.0.4", 1204 "tunnel": "0.0.4",
1186 "underscore": "1.8.3" 1205 "underscore": "1.8.3"
1187 },
1188 "dependencies": {
1189 "underscore": {
1190 "version": "1.8.3",
1191 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
1192 "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
1193 "dev": true
1194 }
1195 } 1206 }
1196 }, 1207 },
1197 "typescript": { 1208 "typescript": {
@@ -1207,9 +1218,9 @@
1207 "dev": true 1218 "dev": true
1208 }, 1219 },
1209 "underscore": { 1220 "underscore": {
1210 "version": "1.9.1", 1221 "version": "1.8.3",
1211 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", 1222 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
1212 "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", 1223 "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
1213 "dev": true 1224 "dev": true
1214 }, 1225 },
1215 "uri-js": { 1226 "uri-js": {
@@ -1261,15 +1272,17 @@
1261 } 1272 }
1262 }, 1273 },
1263 "vsce": { 1274 "vsce": {
1264 "version": "1.59.0", 1275 "version": "1.64.0",
1265 "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.59.0.tgz", 1276 "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.64.0.tgz",
1266 "integrity": "sha512-tkB97885k5ce25Brbe9AZTCAXAkBh7oa5EOzY0BCJQ51W/mfRaQuCluCd9gZpWdgiU4AbPvwxtoVKKsenlSt8w==", 1277 "integrity": "sha512-t3R7QTe2nAXQZs2kD+nA8GjdlX8pAQlnzxaNTG2976i5cyQ8r+ZsMNa/f9PDt7bhjcQM+u/fL+LkNuw+hwoy2A==",
1267 "dev": true, 1278 "dev": true,
1268 "requires": { 1279 "requires": {
1280 "azure-devops-node-api": "^7.2.0",
1269 "chalk": "^2.4.2", 1281 "chalk": "^2.4.2",
1270 "cheerio": "^1.0.0-rc.1", 1282 "cheerio": "^1.0.0-rc.1",
1271 "commander": "^2.8.1", 1283 "commander": "^2.8.1",
1272 "denodeify": "^1.2.1", 1284 "denodeify": "^1.2.1",
1285 "didyoumean": "^1.2.1",
1273 "glob": "^7.0.6", 1286 "glob": "^7.0.6",
1274 "lodash": "^4.17.10", 1287 "lodash": "^4.17.10",
1275 "markdown-it": "^8.3.1", 1288 "markdown-it": "^8.3.1",
@@ -1280,8 +1293,8 @@
1280 "read": "^1.0.7", 1293 "read": "^1.0.7",
1281 "semver": "^5.1.0", 1294 "semver": "^5.1.0",
1282 "tmp": "0.0.29", 1295 "tmp": "0.0.29",
1296 "typed-rest-client": "1.2.0",
1283 "url-join": "^1.1.0", 1297 "url-join": "^1.1.0",
1284 "vso-node-api": "6.1.2-preview",
1285 "yauzl": "^2.3.1", 1298 "yauzl": "^2.3.1",
1286 "yazl": "^2.2.2" 1299 "yazl": "^2.2.2"
1287 } 1300 }
@@ -1339,18 +1352,6 @@
1339 "https-proxy-agent": "^2.2.1" 1352 "https-proxy-agent": "^2.2.1"
1340 } 1353 }
1341 }, 1354 },
1342 "vso-node-api": {
1343 "version": "6.1.2-preview",
1344 "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.1.2-preview.tgz",
1345 "integrity": "sha1-qrNUbfJFHs2JTgcbuZtd8Zxfp48=",
1346 "dev": true,
1347 "requires": {
1348 "q": "^1.0.1",
1349 "tunnel": "0.0.4",
1350 "typed-rest-client": "^0.9.0",
1351 "underscore": "^1.8.3"
1352 }
1353 },
1354 "wrappy": { 1355 "wrappy": {
1355 "version": "1.0.2", 1356 "version": "1.0.2",
1356 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1357 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/editors/code/package.json b/editors/code/package.json
index 52972031d..052f0b3b3 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -44,7 +44,7 @@
44 "tslint": "^5.16.0", 44 "tslint": "^5.16.0",
45 "tslint-config-prettier": "^1.18.0", 45 "tslint-config-prettier": "^1.18.0",
46 "typescript": "^3.4.4", 46 "typescript": "^3.4.4",
47 "vsce": "^1.59.0", 47 "vsce": "^1.64.0",
48 "vscode": "^1.1.33" 48 "vscode": "^1.1.33"
49 }, 49 },
50 "activationEvents": [ 50 "activationEvents": [