Question:
This is somewhat the opposite of and the acknowledgement that computing additional text edits for all items upfront is too demanding. This issue is only about and the goal is a pragmatic solution, similar to the one that we have for . Idea accept an unresolved completion proceed with insertion as usual set up a content change listener resolve the items once resolved check if additional edits overlap with "concurrent" changes. when they overlap, do nothing otherwise proceed
The first version for this is now merged to master, it's a pragmatic approach that's better then not resolving but worst than (costly) upfront resolving. Items to followup on [ ] telemetry and follow up issues [ ] - TS issue for having incomplete items [ ] [ ] java for returning very few (resolved) completions, e.g doing the right thing
/cc - My understanding is that Java resolves all items upfront, e.g compute additional text edits during "provide", and that it is quite expensive and therefore Java only returns a small amount of items. Is that correct? Could Java return results faster when additional text edits are computed during resolve (and therefore only for selected items)?
Yes. I think so! is the dev who was working on Java completion. I believe he can provide more insights toward this topic. // cc
this is exactly the behavior that used to have, ie compute all the completion items first (fast), then the text edits were computed during resolveCompletion. We were asked to not do that as and changed to return a small subset of completion items (with incomplete=true), with full text edits computed upfront. The user experience is definitely not as good as with our initial implementation.
To be clear, computing any Java textedit upfront is costly when returning 100+ items (and we can return several thousands items). We'd prefer if the async insertion of textedits covered all textedits, not just the additional ones.
The requirements discussed in are still true and there are no plans to change that. There is (which might be derived from ) and . The former () is inserted at the cursor and must be inserted synchronous to accepting a completion (we cannot block typing while waiting for that). The latter () is meant for things like import-statements and we now want to relax that, e.g it can come late and we try to apply those edits despite the user having typed more.
When exactly does run, is it only when an item gets highlighted in the menu? Can't tell from the docs. I only need to generate for the completion item the user ends up applying -- doing it for other items is unnecessary work that's bogging down the extension host, and I will have to implement yielding. I assume no one would need to generate before a completion item is applied? Is there any kind of completion applied event we can hook into to work around this for the time being?
That's exactly what is about . Today, there is no guarantee that is ever called because its original design is to provide data for the suggest details widget. However, we see that (amongst other things) are computed during resolve and leads to subtle bugs (because don't always call resolve or always await it) Well, is the problem if you do not generate them upfront. select suggestion synchronously inserts the string starts for additional text edits continues to type quickly and all over the place -call eventually returns but it is unclear if the edits are still valid because the state changed many types in-between Solutions: Won't work because in JS you cannot wait for another "thread" or "process", the world always keeps turning Implement a full -solution because this is two entities "typing" concurrently in the same document. However, it will feel awkward because the user doesn't expect to be such a scenario. approach that tries to apply additional edits if possible but inserts the "main edit" (insertText) always synchronously. () "if possible" is currently defined as "no edit has occurred before the first additional edit". That works well if you use additional edits for things like imports or prefixes (which is the indented use-case) but won't work if additional text edits change the main edit, like appending a call-operators with arguments etc
I mean JS can't block but ignoring typing while awaiting is possible -- I was imagining that VSCode would keep the completions menu open and ignore any typing until is resolved and all text edits applied for the accepted item. Obviously this would be bad if resolving takes a long time, but the API has cancelation tokens already, so the UI would just need to show a spinner/cancel icon, and also cancel if the user presses ESC or navigates to a different editor, for a decent UX. I think this would be less confusing for users too; it's the only way it would be clear when VSCode is completely done applying the completion. I think many users would be confused if imports usually get but not when they resume typing too soon. FWIW I can syncronously generate the additional text edits I need, so I'd be happy if there were an API to synchronously generate them when the completion item is accepted. I know not everyone would be able to generate them sync though.
Also I know my questions may have seemed redundant, but I hadn't seen anyone on this thread point out that it would be ideal to avoid ever computing additional text edits (or even the primary insert text) for unselected completions. Since can get called before any item is accepted (I assume, since it seems to be for showing additional details in the menu), I'd think any solution via could still result in unnecessarily generating additional edits that are ultimately discarded.
The golden rule is that "you can always type inside the editor". Ignoring typing is not a good solution and will bug users. Just think of quick suggest and auto accept characters - you don't want the editor to stop typing just because an extension is taking a little longer (+50ms). To be precise you should have written "typing at or before the offset at which additional edits are going to happen" I honestly think the majority can generate them synchronously but this happens in the extension host process or the language server process, and all of that might happen on a different machine and there is no way to synchronously transport that into the UI.
re with the current changes you should be able to have a "simple insert text", say , and compute an additional text edit, like , that goes in front of it so that you eventually have . Right? Or am I missing something?
that might actually be a good idea ;-) In practice though, we might need to revisit the way the principal TextEdit is computed (i.e rewrite a bunch of stuff from upstream JDT)
I get the desire to be able to always be able to type inside the editor and agree that's an important principle. The only reason I think this case is an exception is that: The user would probably want to wait for all edits to get applied anyway. Seems unlikely that people would want to get the main edit without the additional edits By making the operation cancelable, you can still go back to typing immediately if you so desire. I certainly wouldn't want to block the user from typing without recourse (as you know, I feel frustrated that happens currently when using Vim extensions) On the other hand, I guess it's unlikely that the additional text edits would overlap whatever the user continues typing...
I hadn't thought about auto accept characters though, that's a good point. That's something I don't have experience with. Also considering that VSCode could pop up a warning if it has to bail on inserting additional edits, it's not a big deal if it ever happens
I remember that we have some new data points regarding the time consumption in different stages of code completion in Can you share that data and see how we can tune it with this change?
For Java language server, below is a sample of call tree when triggering completion. (time value is larger than expected because of extra overhead from JProfiler) ! Total time of completion stage mainly consists of three parts: competion candidates in JDT to CompletionItems (calc textEdits, additionalTextEdits, etc.) --- calc an incomplete list of only 50 items by default (the full list can contain thousands) --- here calculating import statements costs a lot of time server-side code snippets (not much related to this topic) I did a simple experiment on java language server, with vscode-insider built on 2020-5-15. I was using spring-petclinic, which is not a big one, but with some dependencies. Type a initial letter, e.g. "O", and observe perf of completion and resolve. Do multiple times for statistics. Calculating additionalTextEdits async in resolve stage does decrease the time cost a lot. textEdits and additionalTextEdits are calculated during completion stage. completion: ~150 ms resolve(avg of top 10 items): ~10 ms Now I simply move a bunch of textedit calculation from "completion" stage into "resolve" stage. completion: ~100 ms resolve(avg of top 10 items): ~17 ms !
I just realized that can return a thenable, but I assume that would delay the appearance of the entire menu?
Closing as we haven't seen issues with the new pragmatic approach and the plan is to stick with it.
so how do servers know that clients support lazy-loading of additional textedits? Surely this should be a client capability advertised by vscode (that needs to be specced in the LSP)
is the right person for that and you should probably create a follow up issue in the LSP land
corresponding LSP feature request created here please add more details if I miss anything.
Thanks
To verify: use TypeScript have a suggestion that will import a symbol make sure that suggestion isn't first or focused in the UI use the mouse(!) to select the suggestion make sure the import is there make sure undo, redo works as expected

assert.equal(editor.getValue(), '    let name = foo'); }); <ins> test('use additionalTextEdits sync when possible', async function () { disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ kind: CompletionItemKind.Snippet, label: 'let', insertText: 'hello', range: Range.fromPositions(pos), additionalTextEdits: [{ text: 'I came sync', range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } }] }] }; }, async resolveCompletionItem(item) { return item; } })); editor.setValue('hellonhallo'); editor.setSelection(new Selection(2, 6, 2, 6)); // trigger let p1 = Event.toPromise(controller.model.onDidSuggest); controller.triggerSuggest(); await p1; // let p2 = Event.toPromise(controller.model.onDidCancel); controller.acceptSelectedSuggestion(false, false); await p2; // insertText happens sync! assert.equal(editor.getValue(), 'I came synchellonhallohello'); }); test('resolve additionalTextEdits async when needed', async function () { let resolveCallCount = 0; disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ kind: CompletionItemKind.Snippet, label: 'let', insertText: 'hello', range: Range.fromPositions(pos) }] }; }, async resolveCompletionItem(item) { resolveCallCount += 1; await timeout(10); item.additionalTextEdits = [{ text: 'I came late', range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } }]; return item; } })); editor.setValue('hellonhallo'); editor.setSelection(new Selection(2, 6, 2, 6)); // trigger let p1 = Event.toPromise(controller.model.onDidSuggest); controller.triggerSuggest(); await p1; // let p2 = Event.toPromise(controller.model.onDidCancel); controller.acceptSelectedSuggestion(false, false); await p2; // insertText happens sync! assert.equal(editor.getValue(), 'hellonhallohello'); assert.equal(resolveCallCount, 1); // additional edits happened after a litte wait await timeout(20); assert.equal(editor.getValue(), 'I came latehellonhallohello'); // single undo stop editor.getModel()?.undo(); assert.equal(editor.getValue(), 'hellonhallo'); }); test('resolve additionalTextEdits async when needed (typing)', async function () { let resolveCallCount = 0; let resolve: Function = () => { }; disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ kind: CompletionItemKind.Snippet, label: 'let', insertText: 'hello', range: Range.fromPositions(pos) }] }; }, async resolveCompletionItem(item) { resolveCallCount += 1; await new Promise(_resolve => resolve = _resolve); item.additionalTextEdits = [{ text: 'I came late', range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } }]; return item; } })); editor.setValue('hellonhallo'); editor.setSelection(new Selection(2, 6, 2, 6)); // trigger let p1 = Event.toPromise(controller.model.onDidSuggest); controller.triggerSuggest(); await p1; // let p2 = Event.toPromise(controller.model.onDidCancel); controller.acceptSelectedSuggestion(false, false); await p2; // insertText happens sync! assert.equal(editor.getValue(), 'hellonhallohello'); assert.equal(resolveCallCount, 1); // additional edits happened after a litte wait assert.ok(editor.getSelection()?.equalsSelection(new Selection(2, 11, 2, 11))); editor.trigger('test', 'type', { text: 'TYPING' }); assert.equal(editor.getValue(), 'hellonhallohelloTYPING'); resolve(); await timeout(10); assert.equal(editor.getValue(), 'I came latehellonhallohelloTYPING'); assert.ok(editor.getSelection()?.equalsSelection(new Selection(2, 17, 2, 17))); }); // additional edit come late and are AFTER the selection -> cancel test('resolve additionalTextEdits async when needed (simple conflict)', async function () { let resolveCallCount = 0; let resolve: Function = () => { }; disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ kind: CompletionItemKind.Snippet, label: 'let', insertText: 'hello', range: Range.fromPositions(pos) }] }; }, async resolveCompletionItem(item) { resolveCallCount += 1; await new Promise(_resolve => resolve = _resolve); item.additionalTextEdits = [{ text: 'I came late', range: { startLineNumber: 1, startColumn: 6, endLineNumber: 1, endColumn: 6 } }]; return item; } })); editor.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); // trigger let p1 = Event.toPromise(controller.model.onDidSuggest); controller.triggerSuggest(); await p1; // let p2 = Event.toPromise(controller.model.onDidCancel); controller.acceptSelectedSuggestion(false, false); await p2; // insertText happens sync! assert.equal(editor.getValue(), 'hello'); assert.equal(resolveCallCount, 1); resolve(); await timeout(10); assert.equal(editor.getValue(), 'hello'); }); // additional edit come late and are AFTER the position at which the user typed -> cancelled test('resolve additionalTextEdits async when needed (conflict)', async function () { let resolveCallCount = 0; let resolve: Function = () => { }; disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ kind: CompletionItemKind.Snippet, label: 'let', insertText: 'hello', range: Range.fromPositions(pos) }] }; }, async resolveCompletionItem(item) { resolveCallCount += 1; await new Promise(_resolve => resolve = _resolve); item.additionalTextEdits = [{ text: 'I came late', range: { startLineNumber: 1, startColumn: 2, endLineNumber: 1, endColumn: 2 } }]; return item; } })); editor.setValue('hellonhallo'); editor.setSelection(new Selection(2, 6, 2, 6)); // trigger let p1 = Event.toPromise(controller.model.onDidSuggest); controller.triggerSuggest(); await p1; // let p2 = Event.toPromise(controller.model.onDidCancel); controller.acceptSelectedSuggestion(false, false); await p2; // insertText happens sync! assert.equal(editor.getValue(), 'hellonhallohello'); assert.equal(resolveCallCount, 1); // additional edits happened after a litte wait editor.setSelection(new Selection(1, 1, 1, 1)); editor.trigger('test', 'type', { text: 'TYPING' }); assert.equal(editor.getValue(), 'TYPINGhellonhallohello'); resolve(); await timeout(10); assert.equal(editor.getValue(), 'TYPINGhellonhallohello'); assert.ok(editor.getSelection()?.equalsSelection(new Selection(1, 7, 1, 7))); }); test('resolve additionalTextEdits async when needed (cancel)', async function () { let resolve: Function[] = []; disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ kind: CompletionItemKind.Snippet, label: 'let', insertText: 'hello', range: Range.fromPositions(pos) }, { kind: CompletionItemKind.Snippet, label: 'let', insertText: 'hallo', range: Range.fromPositions(pos) }] }; }, async resolveCompletionItem(item) { await new Promise(_resolve => resolve.push(_resolve)); item.additionalTextEdits = [{ text: 'additionalTextEdits', range: { startLineNumber: 1, startColumn: 2, endLineNumber: 1, endColumn: 2 } }]; return item; } })); editor.setValue('abc'); editor.setSelection(new Selection(1, 1, 1, 1)); // trigger let p1 = Event.toPromise(controller.model.onDidSuggest); controller.triggerSuggest(); await p1; // let p2 = Event.toPromise(controller.model.onDidCancel); controller.acceptSelectedSuggestion(true, false); await p2; // insertText happens sync! assert.equal(editor.getValue(), 'helloabc'); // next controller.acceptNextSuggestion(); // resolve additional edits (MUST be cancelled) resolve.forEach(fn => fn); resolve.length = 0; await timeout(10); // next suggestion used assert.equal(editor.getValue(), 'halloabc'); }); </ins> });


Question: ERR LinkedMap got modified during iteration.: Error: LinkedMap got modified during iteration. at LinkedMap.forEach (file:///Applications/Visual Studio Code - ) at g.cleanUp (file:///Applications/Visual Studio Code - ) at g.saveState (file:///Applications/Visual Studio Code - ) at file:///Applications/Visual Studio Code - Code is here:

private cleanUp(): void { const cache = this.doLoad(); <del> // Remove groups from states that no longer exist cache.forEach((mapGroupToMemento, resource) => { </del> <ins> // Remove groups from states that no longer exist. Since we modify the // cache and its is a LRU cache make a copy to ensure iteration succeeds const entries = [...cache.entries()]; for (const [resource, mapGroupToMemento] of entries) { </ins> Object.keys(mapGroupToMemento).forEach(group => { const groupId: GroupIdentifier = Number(group); if (!this.editorGroupService.getGroup(groupId)) { delete mapGroupToMemento[groupId]; if (isEmptyObject(mapGroupToMemento)) { cache.delete(resource); } } }); <del> }); </del> <ins> } </ins> } }


Question:
see gif open GH notebook with a few cell that reference a variable run peek references and select entries notice how notebook cells are being highlighted, like "Milestone Work" get selected !
I can repro in Insiders but not master, I'll check again tomorrow
This happens because of this listener: Tho, not yet sure why the selection keeps changing... Maybe some inner list event (from the references list) bubbles up to the outer list
That listener is fine, it's the nested lists
Hey do you have any thoughts on handling this? We have a list inside another list. The inner list handles the touch event properly. The outer list then handles the event and picks up the wrong index because it finds the data attribute inside the inner list in We can Make sure the event is fired on the outer list with the correct element, by fixing to check whether it's in the right list Not fire the event on the outer list at all, when we see that it originates in a different list Add some property to the list event that says it originated in a different list so the consumer can decide In this particular case, I think any of these are fine
Thinking more, I don't think that the event should ever be handled by two lists at all. Meaning we either mark the browserEvent as handled, like with preventDefault/isDefaultPrevented, or we make the list check every event to be sure that it originated in this list.
This sounds good to me. This also sounds good to me.
related when I do peek references, I see markdown cells being selected? ! Notice I'm looking for under-discussion but "Configure" is being highlighted as one of the references
From Good catch, I didn't notice that
Thanks for the quick handling!

return; } <ins> if (e.browserEvent.defaultPrevented) { return; } </ins> const focus = e.index; if (typeof focus === 'undefined') {


Question:
see gif open GH notebook with a few cell that reference a variable run peek references and select entries notice how notebook cells are being highlighted, like "Milestone Work" get selected !
I can repro in Insiders but not master, I'll check again tomorrow
This happens because of this listener: Tho, not yet sure why the selection keeps changing... Maybe some inner list event (from the references list) bubbles up to the outer list
That listener is fine, it's the nested lists
Hey do you have any thoughts on handling this? We have a list inside another list. The inner list handles the touch event properly. The outer list then handles the event and picks up the wrong index because it finds the data attribute inside the inner list in We can Make sure the event is fired on the outer list with the correct element, by fixing to check whether it's in the right list Not fire the event on the outer list at all, when we see that it originates in a different list Add some property to the list event that says it originated in a different list so the consumer can decide In this particular case, I think any of these are fine
Thinking more, I don't think that the event should ever be handled by two lists at all. Meaning we either mark the browserEvent as handled, like with preventDefault/isDefaultPrevented, or we make the list check every event to be sure that it originated in this list.
This sounds good to me. This also sounds good to me.
related when I do peek references, I see markdown cells being selected? ! Notice I'm looking for under-discussion but "Configure" is being highlighted as one of the references
From Good catch, I didn't notice that
Thanks for the quick handling!

this.list.setSelection([focus], e.browserEvent); } <ins> e.browserEvent.preventDefault(); </ins> this._onPointer.fire(e); }


Question:
see gif open GH notebook with a few cell that reference a variable run peek references and select entries notice how notebook cells are being highlighted, like "Milestone Work" get selected !
I can repro in Insiders but not master, I'll check again tomorrow
This happens because of this listener: Tho, not yet sure why the selection keeps changing... Maybe some inner list event (from the references list) bubbles up to the outer list
That listener is fine, it's the nested lists
Hey do you have any thoughts on handling this? We have a list inside another list. The inner list handles the touch event properly. The outer list then handles the event and picks up the wrong index because it finds the data attribute inside the inner list in We can Make sure the event is fired on the outer list with the correct element, by fixing to check whether it's in the right list Not fire the event on the outer list at all, when we see that it originates in a different list Add some property to the list event that says it originated in a different list so the consumer can decide In this particular case, I think any of these are fine
Thinking more, I don't think that the event should ever be handled by two lists at all. Meaning we either mark the browserEvent as handled, like with preventDefault/isDefaultPrevented, or we make the list check every event to be sure that it originated in this list.
This sounds good to me. This also sounds good to me.
related when I do peek references, I see markdown cells being selected? ! Notice I'm looking for under-discussion but "Configure" is being highlighted as one of the references
From Good catch, I didn't notice that
Thanks for the quick handling!

return; } <ins> if (e.browserEvent.defaultPrevented) { return; } </ins> const focus = this.list.getFocus(); this.list.setSelection(focus, e.browserEvent); <ins> e.browserEvent.preventDefault(); </ins> } private changeSelection(e: IListMouseEvent<T> | IListTouchEvent<T>): void {


Question:
see gif open GH notebook with a few cell that reference a variable run peek references and select entries notice how notebook cells are being highlighted, like "Milestone Work" get selected !
I can repro in Insiders but not master, I'll check again tomorrow
This happens because of this listener: Tho, not yet sure why the selection keeps changing... Maybe some inner list event (from the references list) bubbles up to the outer list
That listener is fine, it's the nested lists
Hey do you have any thoughts on handling this? We have a list inside another list. The inner list handles the touch event properly. The outer list then handles the event and picks up the wrong index because it finds the data attribute inside the inner list in We can Make sure the event is fired on the outer list with the correct element, by fixing to check whether it's in the right list Not fire the event on the outer list at all, when we see that it originates in a different list Add some property to the list event that says it originated in a different list so the consumer can decide In this particular case, I think any of these are fine
Thinking more, I don't think that the event should ever be handled by two lists at all. Meaning we either mark the browserEvent as handled, like with preventDefault/isDefaultPrevented, or we make the list check every event to be sure that it originated in this list.
This sounds good to me. This also sounds good to me.
related when I do peek references, I see markdown cells being selected? ! Notice I'm looking for under-discussion but "Configure" is being highlighted as one of the references
From Good catch, I didn't notice that
Thanks for the quick handling!

return; } <ins> if (e.browserEvent.defaultPrevented) { return; } </ins> const node = e.element; if (!node) {


Question:
see gif open GH notebook with a few cell that reference a variable run peek references and select entries notice how notebook cells are being highlighted, like "Milestone Work" get selected !
I can repro in Insiders but not master, I'll check again tomorrow
This happens because of this listener: Tho, not yet sure why the selection keeps changing... Maybe some inner list event (from the references list) bubbles up to the outer list
That listener is fine, it's the nested lists
Hey do you have any thoughts on handling this? We have a list inside another list. The inner list handles the touch event properly. The outer list then handles the event and picks up the wrong index because it finds the data attribute inside the inner list in We can Make sure the event is fired on the outer list with the correct element, by fixing to check whether it's in the right list Not fire the event on the outer list at all, when we see that it originates in a different list Add some property to the list event that says it originated in a different list so the consumer can decide In this particular case, I think any of these are fine
Thinking more, I don't think that the event should ever be handled by two lists at all. Meaning we either mark the browserEvent as handled, like with preventDefault/isDefaultPrevented, or we make the list check every event to be sure that it originated in this list.
This sounds good to me. This also sounds good to me.
related when I do peek references, I see markdown cells being selected? ! Notice I'm looking for under-discussion but "Configure" is being highlighted as one of the references
From Good catch, I didn't notice that
Thanks for the quick handling!

return; } <ins> if (e.browserEvent.defaultPrevented) { return; } </ins> super.onDoubleClick(e); } }


Question:
see gif open GH notebook with a few cell that reference a variable run peek references and select entries notice how notebook cells are being highlighted, like "Milestone Work" get selected !
I can repro in Insiders but not master, I'll check again tomorrow
This happens because of this listener: Tho, not yet sure why the selection keeps changing... Maybe some inner list event (from the references list) bubbles up to the outer list
That listener is fine, it's the nested lists
Hey do you have any thoughts on handling this? We have a list inside another list. The inner list handles the touch event properly. The outer list then handles the event and picks up the wrong index because it finds the data attribute inside the inner list in We can Make sure the event is fired on the outer list with the correct element, by fixing to check whether it's in the right list Not fire the event on the outer list at all, when we see that it originates in a different list Add some property to the list event that says it originated in a different list so the consumer can decide In this particular case, I think any of these are fine
Thinking more, I don't think that the event should ever be handled by two lists at all. Meaning we either mark the browserEvent as handled, like with preventDefault/isDefaultPrevented, or we make the list check every event to be sure that it originated in this list.
This sounds good to me. This also sounds good to me.
related when I do peek references, I see markdown cells being selected? ! Notice I'm looking for under-discussion but "Configure" is being highlighted as one of the references
From Good catch, I didn't notice that
Thanks for the quick handling!

} if (node.collapsible) { <del> // Do not set this before calling a handler on the super class, because it will reject it as handled e.browserEvent.isHandledByList = true; </del> const location = this.tree.getNodeLocation(node); const recursive = e.browserEvent.altKey; this.tree.setFocus([location]); this.tree.toggleCollapsed(location, recursive); if (expandOnlyOnTwistieClick && onTwistie) { <ins> // Do not set this before calling a handler on the super class, because it will reject it as handled e.browserEvent.isHandledByList = true; </ins> return; } }


Question:
<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --Currently the VS Code Git commit message box automatically synchronises with the contents of .git/MERGEMSG (provided you have not entered your own commit message yet into VS Code). I would like to request support for VS Code to do the same with .git/SQUASHMSG (produced when running ). This would provide better integration between VS code git related VS Code extensions which often have the ability to perform a squash merge via the extension GUI but do not typically replicate any of the existing VS Code git interface (commit message box and changed file list).
I wouldn't mind taking this on, and I've looked through the code so I have a pretty good idea of what's required to implement this. Just one question, though — is there any situation where and are both present? If so: which one do we think should take precedence as the 'default' commit message?
my suggestion would be to follow what git-gui does since it's bundled with git. Looks like it preferences MERGEMSG over SQUASHMSG (see )
That makes sense, and that's what I was thinking too. I'll put a PR in shortly!
I got this to partially work by: a file with some content like "HELLO" a local branch file sometimes gets filled with content, like the following it seems like the content of the file is not constant for me, and changes once I do a squash Reopening this for discussion. I also might be doing something wrong. Bonus bug: when chaning the content of the SQUASHMSG the scm input does not reg resized and ends up looking broken (picture attached). So I would recommend that we revert this PR and polish it a bit more. !
It worked fine (and always displayed the intended (?) squash msg), but maybe it's because I was only squashing another branch that only had one commit? I concur that it seems like the contents of SQUASHMSG aren't always consistent though, now that I've tried with a branch with more than one commit. EDIT: It seems like it displays all of the squashed commits in one message, prefaced by As for the bonus bug, is that issue exclusive to SQUASHMSG or does it also happen if you change the contents of MERGE_MSG?
You're not supposed to manually create or edit the file. This is a file created by git during the command. When you run this command you will have a commit pending... and the input box should be prepopulated with a template commit message. Can you try this again? Thanks for the input box issue though, will try to repro.
This was the intended behaviour behind this feature request. I'm not expecting VS Code to do anything magical here with SQUASHMSG. It should just be taking the entire contents of the file as other graphical git tools do (and as a command line call to does if SQUASHMSG exists). I do not think the PR needs reverting.
Added another commit, since the can exist but just have no content. In that case we should take . Please verify once again, now the feature is clearer.
Sorry for the confusion, just was not very clear to me. I will verify this later today.
Adding verified label since the git commit gets nicely preopulated with the squash message.

return message.replace(/^s*#.*$n?/gm, '').trim(); } <ins> async getSquashMessage(): Promise<string | undefined> { const squashMsgPath = path.join(this.repositoryRoot, '.git', 'SQUASH_MSG'); try { const raw = await fs.readFile(squashMsgPath, 'utf8'); return this.stripCommitMessageComments(raw); } catch { return undefined; } } </ins> async getMergeMessage(): Promise<string | undefined> { const mergeMsgPath = path.join(this.repositoryRoot, '.git', 'MERGE_MSG');


Question:
<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --Currently the VS Code Git commit message box automatically synchronises with the contents of .git/MERGEMSG (provided you have not entered your own commit message yet into VS Code). I would like to request support for VS Code to do the same with .git/SQUASHMSG (produced when running ). This would provide better integration between VS code git related VS Code extensions which often have the ability to perform a squash merge via the extension GUI but do not typically replicate any of the existing VS Code git interface (commit message box and changed file list).
I wouldn't mind taking this on, and I've looked through the code so I have a pretty good idea of what's required to implement this. Just one question, though — is there any situation where and are both present? If so: which one do we think should take precedence as the 'default' commit message?
my suggestion would be to follow what git-gui does since it's bundled with git. Looks like it preferences MERGEMSG over SQUASHMSG (see )
That makes sense, and that's what I was thinking too. I'll put a PR in shortly!
I got this to partially work by: a file with some content like "HELLO" a local branch file sometimes gets filled with content, like the following it seems like the content of the file is not constant for me, and changes once I do a squash Reopening this for discussion. I also might be doing something wrong. Bonus bug: when chaning the content of the SQUASHMSG the scm input does not reg resized and ends up looking broken (picture attached). So I would recommend that we revert this PR and polish it a bit more. !
It worked fine (and always displayed the intended (?) squash msg), but maybe it's because I was only squashing another branch that only had one commit? I concur that it seems like the contents of SQUASHMSG aren't always consistent though, now that I've tried with a branch with more than one commit. EDIT: It seems like it displays all of the squashed commits in one message, prefaced by As for the bonus bug, is that issue exclusive to SQUASHMSG or does it also happen if you change the contents of MERGE_MSG?
You're not supposed to manually create or edit the file. This is a file created by git during the command. When you run this command you will have a commit pending... and the input box should be prepopulated with a template commit message. Can you try this again? Thanks for the input box issue though, will try to repro.
This was the intended behaviour behind this feature request. I'm not expecting VS Code to do anything magical here with SQUASHMSG. It should just be taking the entire contents of the file as other graphical git tools do (and as a command line call to does if SQUASHMSG exists). I do not think the PR needs reverting.
Added another commit, since the can exist but just have no content. In that case we should take . Please verify once again, now the feature is clearer.
Sorry for the confusion, just was not very clear to me. I will verify this later today.
Adding verified label since the git commit gets nicely preopulated with the squash message.

} async getInputTemplate(): Promise<string> { <del> const mergeMessage = await this.repository.getMergeMessage(); </del> <ins> const commitMessage = (await Promise.all([this.repository.getMergeMessage(), this.repository.getSquashMessage()])).find(msg => msg !== undefined); </ins> <del> if (mergeMessage) { return mergeMessage; </del> <ins> if (commitMessage) { return commitMessage; </ins> } return await this.repository.getCommitTemplate();


Question: VSCode Version: 1.47 insiders OS Version: Windows Steps to Reproduce: on the "Add item" button in and press enter. ! Does this issue occur when all extensions are disabled?: Yes

} } // New item was added <del> else if (template.objectWidget.isItemNew(e.originalItem)) { </del> <ins> else if (template.objectWidget.isItemNew(e.originalItem) && e.item.key.data !== '') { </ins> newValue[e.item.key.data] = e.item.value.data; newItems.push(e.item); }


Question:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.47 OS Version: MacOS Steps to Reproduce: a local project server (f.ex angular) with a long filename (some 16+ characters) <filename.<extension. a debug session (f.ex firefox), and check the debug console output. <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes !
I don't understand what the screenshot is showing. Please show the whole debug console. I do not understand what gets concatenated in the screenshot. What exactly are you expecting and what is the erroneous behavior?
attached photo of whole debug console - error occurs on last line. Behavior: supposedly filenames (some 16+ characters) will be shortened with (...) instead of showing the whole filename and line number. Expecting: the whole filename and line number where a console log is being outputted. !
Yes, I agree this is an issue. The problem is that we set a to 150 . The ideal solution would be that the elements gets shrinked first, and that it has unlimited size. Adding help wanted as I am open to review a PR which fixes this. If nobody tackles this I can also look into this in the future.
Hi I can give this a try.
great, thanks!

} .monaco-workbench .repl .repl-tree .output.expression.value-and-source .value { <del> flex: 1; </del> <ins> margin-right: 4px; </ins> } .monaco-workbench .repl .repl-tree .monaco-tl-contents .arrow {


Question:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.47 OS Version: MacOS Steps to Reproduce: a local project server (f.ex angular) with a long filename (some 16+ characters) <filename.<extension. a debug session (f.ex firefox), and check the debug console output. <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes !
I don't understand what the screenshot is showing. Please show the whole debug console. I do not understand what gets concatenated in the screenshot. What exactly are you expecting and what is the erroneous behavior?
attached photo of whole debug console - error occurs on last line. Behavior: supposedly filenames (some 16+ characters) will be shortened with (...) instead of showing the whole filename and line number. Expecting: the whole filename and line number where a console log is being outputted. !
Yes, I agree this is an issue. The problem is that we set a to 150 . The ideal solution would be that the elements gets shrinked first, and that it has unlimited size. Adding help wanted as I am open to review a PR which fixes this. If nobody tackles this I can also look into this in the future.
Hi I can give this a try.
great, thanks!

} .monaco-workbench .repl .repl-tree .output.expression.value-and-source .source { <del> margin-left: 4px; </del> <ins> margin-left: auto; </ins> margin-right: 8px; cursor: pointer; text-decoration: underline; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; <del> max-width: 150px; </del> <ins> text-align: right; </ins> } .monaco-workbench .repl .repl-tree .output.expression > .value,


Question:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.47.2 OS Version: Windows 10 (2004) Steps to Reproduce: a dotnet project & to a problems pane and check "Hide Excluded Files" and open problems Expected: problems pane not to show problems in generated code in folder. Actual: all problems are still visible under problems pane but as expected not visible in the explorer. ! <!-- Launch with to check. --Does this issue occur when all extensions are disabled?: No, the "problems" are generated by an extension. So cannot reproduce this way. Related issue:
AFAIK the feature in Problems to exclude items uses its own filter, which you must enter in the field to the left of the filter button. I don't think it pays any attention to
This comment suggests that suppose to work: While I can use the Filter on the left, it is separate from "Hide Excluded Files" option. They don't interact.
Deferring to
Clarification with regards to Problems are always visible not only when the file is open in the editor. I opened one in the screenshot just to show the error, but others that aren't open in the editor are still visible in the Problems pane too.
Oh alright, I realized I misunderstood so that is why I deleted my comment. I apologize for any confusion. Lemme see if I can figure something out today
Hi upon further investigation it appears that this feature uses a different list. I believe that it goes off of this list found in settings. But I do also acknowledge . could you maybe give me some input here? Maybe it can use both the global setting and the option together? <img width="981" alt="Screen Shot 2020-08-07 at 10 13 42 AM" src="https://user-"
this also happens with php language server. is there a of some sort, like has? I have to disable altogether because doesn't stop vscode to fill Problems pane.
I wasn't able to reproduce this issue when I tested just now on 1.52.1. Problems reported on a file whose name matched a glob in disappeared from the panel when I selected the "Hide Excluded Files" filter. They reappeared when I deselected that filter option, or when I removed or disabled the entry. If the problem still exists for you please provide simple repro steps.
Very much appreciated for validating the issue again. Please provide exact steps to repro.
Hey I did a repro on a clean machine and I know exactly what the issue is now. It has to do with how glob pattern is applied in the problems pane. If you apply it on folder like this - it does not work for problems pane, but works in explorer view. If you apply it on all files inside the folder - it works for problems pane and explorer view. I was able to reproduce this behaviour in typescript solution too, so was a red herring. !
Thanks for the repro. Will investigate in February.
Pushed a PR with a possible fix

const filesExcludeByRoot = Array.isArray(filesExclude) ? filesExclude : []; const excludesExpression: IExpression = Array.isArray(filesExclude) ? getEmptyExpression() : filesExclude; <ins> for (const { expression } of filesExcludeByRoot) { for (const pattern of Object.keys(expression)) { if (!pattern.endsWith('/**')) { // Append `/**` to pattern to match a parent folder #103631 expression[`${strings.rtrim(pattern, '/')}/**`] = expression[pattern]; } } } </ins> const negate = filter.startsWith('!'); this.textFilter = { text: (negate ? strings.ltrim(filter, '!') : filter).trim(), negate }; const includeExpression: IExpression = getEmptyExpression();


Question:
Issue Type: <bBug</bWhen : one mouse wheel scroll in extension view: moves 100px one mouse wheel scroll in settings editor: moves 100px When : one mouse wheel scroll in extension view: moves 100px, with slight animation one mouse wheel scroll in settings editor: moves 15~25px, without animation I'm using a Logitech G502 Lightspeed mouse, without any scrolling tweaking softwares. ! VS Code version: Code - Insiders 1.48.0-insider (, 2020-08-05T05:30:25.429Z) OS version: WindowsNT x64 10.0. <details<summarySystem Info</summary </detailsExtensions: none <!-- generated by issue reporter --
I don't see this, any idea
I believe this setting is ignored for macOS. Duplicate of
Actually not a duplicate. Interesting. I need to get my hands on a mouse to see if I can repro.
Created a PR that fixes this:

this.render(previousRenderRange, e.scrollTop, e.height, e.scrollLeft, e.scrollWidth); if (this.supportDynamicHeights) { <del> this._rerender(e.scrollTop, e.height); </del> <ins> // Don't update scrollTop from within an scroll event // so we don't break smooth scrolling. #104144 this._rerender(e.scrollTop, e.height, false); </ins> } } catch (err) { console.error('Got bad scroll event:', e);


Question:
Issue Type: <bBug</bWhen : one mouse wheel scroll in extension view: moves 100px one mouse wheel scroll in settings editor: moves 100px When : one mouse wheel scroll in extension view: moves 100px, with slight animation one mouse wheel scroll in settings editor: moves 15~25px, without animation I'm using a Logitech G502 Lightspeed mouse, without any scrolling tweaking softwares. ! VS Code version: Code - Insiders 1.48.0-insider (, 2020-08-05T05:30:25.429Z) OS version: WindowsNT x64 10.0. <details<summarySystem Info</summary </detailsExtensions: none <!-- generated by issue reporter --
I don't see this, any idea
I believe this setting is ignored for macOS. Duplicate of
Actually not a duplicate. Interesting. I need to get my hands on a mouse to see if I can repro.
Created a PR that fixes this:

* Given a stable rendered state, checks every rendered element whether it needs * to be probed for dynamic height. Adjusts scroll height and top if necessary. */ <del> private _rerender(renderTop: number, renderHeight: number): void { </del> <ins> private _rerender(renderTop: number, renderHeight: number, updateScrollTop: boolean = true): void { </ins> const previousRenderRange = this.getRenderRange(renderTop, renderHeight); // Let's remember the second element's position, this helps in scrolling up


Question:
Issue Type: <bBug</bWhen : one mouse wheel scroll in extension view: moves 100px one mouse wheel scroll in settings editor: moves 100px When : one mouse wheel scroll in extension view: moves 100px, with slight animation one mouse wheel scroll in settings editor: moves 15~25px, without animation I'm using a Logitech G502 Lightspeed mouse, without any scrolling tweaking softwares. ! VS Code version: Code - Insiders 1.48.0-insider (, 2020-08-05T05:30:25.429Z) OS version: WindowsNT x64 10.0. <details<summarySystem Info</summary </detailsExtensions: none <!-- generated by issue reporter --
I don't see this, any idea
I believe this setting is ignored for macOS. Duplicate of
Actually not a duplicate. Interesting. I need to get my hands on a mouse to see if I can repro.
Created a PR that fixes this:

} } <del> if (typeof anchorElementIndex === 'number') { </del> <ins> if (updateScrollTop && typeof anchorElementIndex === 'number') { </ins> this.scrollTop = this.elementTop(anchorElementIndex) - anchorElementTopDelta!; }


Question:
Issue Type: <bBug</brepo your user tsdk to use this version, for example: load the VS Code workspace (making sure you are using your user TS version) a file in and try getting the document outline Bug Big delay. This is because two full TS Servers are being spawned instead of a syntax only server + full server (see memory usage in screenshot): <img width="1079" alt="Screen Shot 2020-08-11 at 3 13 33 PM" src="https://user-"VS Code version: Code - Insiders 1.48.0-insider (, 2020-08-11T10:13:04.551Z) OS version: Darwin x64 19.6.0 <details<summarySystem Info</summary </details<!-- generated by issue reporter --
Seems like this was caused by
For verification, try the following cases: Using TS 3.9.7 Using TS 4.0.1-rc Using TS Using an old TS version like 3.5 (older versions don't support the syntax server at all) All should load the document symbols quickly even while the loading spinner is showing You can use the same global install in all cases, just make sure to reload VS Code each time
Assigning this to july milestone since it is a candidate.
following your steps I have verified that the outline get loaded quickly, however I still see two tsservers spinning up when I open the process explorer. If I understood correctly this is by design, since only one of them has a large memory usage. I have verified for TS: 3.9.7, 4.0.1-rc. ts 3.5 Thus adding verified label !

import { GetErrRoutingTsServer, ITypeScriptServer, ProcessBasedTsServer, SyntaxRoutingTsServer, TsServerDelegate, TsServerProcessFactory, TsServerProcessKind } from './server'; import { TypeScriptVersionManager } from './versionManager'; import { ITypeScriptVersionProvider, TypeScriptVersion } from './versionProvider'; <del> import * as semver from 'semver'; </del> const enum CompositeServerType { /** Run a single server that handles all commands  */


Question:
Issue Type: <bBug</brepo your user tsdk to use this version, for example: load the VS Code workspace (making sure you are using your user TS version) a file in and try getting the document outline Bug Big delay. This is because two full TS Servers are being spawned instead of a syntax only server + full server (see memory usage in screenshot): <img width="1079" alt="Screen Shot 2020-08-11 at 3 13 33 PM" src="https://user-"VS Code version: Code - Insiders 1.48.0-insider (, 2020-08-11T10:13:04.551Z) OS version: Darwin x64 19.6.0 <details<summarySystem Info</summary </details<!-- generated by issue reporter --
Seems like this was caused by
For verification, try the following cases: Using TS 3.9.7 Using TS 4.0.1-rc Using TS Using an old TS version like 3.5 (older versions don't support the syntax server at all) All should load the document symbols quickly even while the loading spinner is showing You can use the same global install in all cases, just make sure to reload VS Code each time
Assigning this to july milestone since it is a candidate.
following your steps I have verified that the outline get loaded quickly, however I still see two tsservers spinning up when I open the process explorer. If I understood correctly this is by design, since only one of them has a large memory usage. I have verified for TS: 3.9.7, 4.0.1-rc. ts 3.5 Thus adding verified label !

let tsServerLogFile: string | undefined; if (kind === TsServerProcessKind.Syntax) { <del> if (semver.gte(API.v400rc.fullVersionString, apiVersion.fullVersionString)) { args.push('--serverMode'); args.push('partialSemantic'); } else { </del> <ins> if (apiVersion.gte(API.v401)) { args.push('--serverMode', 'partialSemantic'); } else { </ins> args.push('--syntaxOnly'); } }


Question:
Issue Type: <bBug</brepo your user tsdk to use this version, for example: load the VS Code workspace (making sure you are using your user TS version) a file in and try getting the document outline Bug Big delay. This is because two full TS Servers are being spawned instead of a syntax only server + full server (see memory usage in screenshot): <img width="1079" alt="Screen Shot 2020-08-11 at 3 13 33 PM" src="https://user-"VS Code version: Code - Insiders 1.48.0-insider (, 2020-08-11T10:13:04.551Z) OS version: Darwin x64 19.6.0 <details<summarySystem Info</summary </details<!-- generated by issue reporter --
Seems like this was caused by
For verification, try the following cases: Using TS 3.9.7 Using TS 4.0.1-rc Using TS Using an old TS version like 3.5 (older versions don't support the syntax server at all) All should load the document symbols quickly even while the loading spinner is showing You can use the same global install in all cases, just make sure to reload VS Code each time
Assigning this to july milestone since it is a candidate.
following your steps I have verified that the outline get loaded quickly, however I still see two tsservers spinning up when I open the process explorer. If I understood correctly this is by design, since only one of them has a large memory usage. I have verified for TS: 3.9.7, 4.0.1-rc. ts 3.5 Thus adding verified label !

public static readonly v380 = API.fromSimpleString('3.8.0'); public static readonly v381 = API.fromSimpleString('3.8.1'); public static readonly v390 = API.fromSimpleString('3.9.0'); <del> public static readonly v400rc = API.fromSimpleString('4.0.0-rc'); </del> public static readonly v400 = API.fromSimpleString('4.0.0'); <ins> public static readonly v401 = API.fromSimpleString('4.0.1'); </ins> public static fromVersionString(versionString: string): API { let version = semver.valid(versionString);


Question:
<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --In markdown mode, Dimmed Monokai theme: does not render bold / italic. no special color for link / image title. !
The markdown used in the screenshot:

} }, { <ins> "name": "Markdown Headings", "scope": "markup.heading.markdown", "settings": { "fontStyle": "bold" } }, { "name": "Markdown Quote", "scope": "markup.quote.markdown", "settings": { "fontStyle": "italic", "foreground": "" } }, { "name": "Markdown Bold", "scope": "markup.bold.markdown", "settings": { "fontStyle": "bold" } }, { "name": "Markdown Link Title/Description", "scope": "string.other.link.title.markdown,string.other.link.description.markdown", "settings": { "foreground": "#AE81FF" } }, { "name": "Markdown Underline Link/Image", "scope": "markup.underline.link.markdown,markup.underline.link.image.markdown", "settings": { "foreground": "" } }, { "name": "Markdown Emphasis", "scope": "markup.italic.markdown", "settings": { "fontStyle": "italic" } }, { "name": "Markdown Punctuation Definition Link", "scope": "markup.list.unnumbered.markdown, markup.list.numbered.markdown", "settings": { "foreground": "" } }, { "name": "Markdown List Punctuation", "scope": [ "punctuation.definition.list.begin.markdown" ], "settings": { "foreground": "" } }, { </ins> "scope": "token.info-token", "settings": { "foreground": "#6796e6"


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { ExtensionContext } from 'vscode'; </del> <ins> import { ExtensionContext, Uri } from 'vscode'; </ins> import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor } from '../cssClient'; import { LanguageClient } from 'vscode-languageclient/browser';


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

// this method is called when vs code is activated export function activate(context: ExtensionContext) { <del> const serverMain = context.asAbsolutePath('server/dist/browser/cssServerMain.js'); </del> <ins> const serverMain = Uri.joinPath(context.extensionUri, 'server/dist/browser/cssServerMain.js'); </ins> try { <del> const worker = new Worker(serverMain); </del> <ins> const worker = new Worker(serverMain.toString()); </ins> const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { return new LanguageClient(id, name, clientOptions, worker); };


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { ExtensionContext } from 'vscode'; </del> <ins> import { ExtensionContext, Uri } from 'vscode'; </ins> import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor } from '../htmlClient'; import { LanguageClient } from 'vscode-languageclient/browser';


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

// this method is called when vs code is activated export function activate(context: ExtensionContext) { <del> const serverMain = context.asAbsolutePath('server/dist/browser/htmlServerMain.js'); </del> <ins> const serverMain = Uri.joinPath(context.extensionUri, 'server/dist/browser/htmlServerMain.js'); </ins> try { <del> const worker = new Worker(serverMain); </del> <ins> const worker = new Worker(serverMain.toString()); </ins> const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { return new LanguageClient(id, name, clientOptions, worker); };


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { ExtensionContext } from 'vscode'; </del> <ins> import { ExtensionContext, Uri } from 'vscode'; </ins> import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor } from '../jsonClient'; import { LanguageClient } from 'vscode-languageclient/browser';


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

// this method is called when vs code is activated export function activate(context: ExtensionContext) { <del> const serverMain = context.asAbsolutePath('server/dist/browser/jsonServerMain.js'); </del> <ins> const serverMain = Uri.joinPath(context.extensionUri, 'server/dist/browser/jsonServerMain.js'); </ins> try { <del> const worker = new Worker(serverMain); </del> <ins> const worker = new Worker(serverMain.toString()); </ins> const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { return new LanguageClient(id, name, clientOptions, worker); };


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

const versionProvider = new StaticVersionProvider( new TypeScriptVersion( TypeScriptVersionSource.Bundled, <del> context.asAbsolutePath('dist/browser/typescript-web/tsserver.web.js'), </del> <ins> vscode.Uri.joinPath(context.extensionUri, 'dist/browser/typescript-web/tsserver.web.js').toString(), </ins> API.v400)); const lazyClientHost = createLazyClientHost(context, false, {


Question:
The usage of as seen here only works because there is there is special code to return a url-string (instead of a path, see ). For loading extension relative resources the and should be used. That is the new, web-ready replacement API
fyi
tried to adopt this. When will be available. I can't find it in .
Opened for ESLint
It's in the API since 4 months:

return getExtensionApi(onCompletionAccepted.event, pluginManager); }


Question: Since we don't know when links are no longer cached by , we cannot drop the objects. Upstream part:

"vscode-ripgrep": "^1.8.0", "vscode-sqlite3": "4.0.10", "vscode-textmate": "5.2.0", <del> "xterm": "4.9.0-beta.8", </del> <ins> "xterm": "4.9.0-beta.24", </ins> "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", "xterm-addon-webgl": "0.8.0",


Question: Since we don't know when links are no longer cached by , we cannot drop the objects. Upstream part:

"vscode-proxy-agent": "^0.5.2", "vscode-ripgrep": "^1.8.0", "vscode-textmate": "5.2.0", <del> "xterm": "4.9.0-beta.8", </del> <ins> "xterm": "4.9.0-beta.24", </ins> "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", "xterm-addon-webgl": "0.8.0",


Question: Since we don't know when links are no longer cached by , we cannot drop the objects. Upstream part:

"semver-umd": "^5.5.7", "vscode-oniguruma": "1.3.1", "vscode-textmate": "5.2.0", <del> "xterm": "4.9.0-beta.8", </del> <ins> "xterm": "4.9.0-beta.24", </ins> "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", "xterm-addon-webgl": "0.8.0"


Question: Since we don't know when links are no longer cached by , we cannot drop the objects. Upstream part:

resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.8.0.tgz#4bc6bb4dbfea5b0d2d7978d6c5cef922d584fb4f" integrity sha512-dlpYPsv0C9S6v6+T/h/d/otSbdUTizMJdxvSoS34tUpMOHev6iW7Zqt5KRFqYxl4vCqpDk9Wmhb3fKL3kwX5fQ== <del> xterm@4.9.0-beta.8: version "4.9.0-beta.8" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.8.tgz#ca121934d63f88668d2d5b11d9b2fc3bde7bd805" integrity sha512-EEonYBLANDUBfEeEnHG632bZdgBaAUWst8LFr6oC6f2uLFfJGHQvVJuLaEkPtRvS+jOeoorEXZRPmso1/ANHXA== </del> <ins> xterm@4.9.0-beta.24: version "4.9.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.24.tgz#48f0990c6d32ad3a9bcc4fb49531d7effdaccea5" integrity sha512-CIVxxxbBiSw1WOMkIjjivaiIC9jNgih4klfWsRGx0qiDF5nbzHuLXkPTt+yAQUu9FCyTUwECm9Pkl3gUsSaGKg== </ins>


Question: Since we don't know when links are no longer cached by , we cannot drop the objects. Upstream part:

resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.8.0.tgz#4bc6bb4dbfea5b0d2d7978d6c5cef922d584fb4f" integrity sha512-dlpYPsv0C9S6v6+T/h/d/otSbdUTizMJdxvSoS34tUpMOHev6iW7Zqt5KRFqYxl4vCqpDk9Wmhb3fKL3kwX5fQ== <del> xterm@4.9.0-beta.8: version "4.9.0-beta.8" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.8.tgz#ca121934d63f88668d2d5b11d9b2fc3bde7bd805" integrity sha512-EEonYBLANDUBfEeEnHG632bZdgBaAUWst8LFr6oC6f2uLFfJGHQvVJuLaEkPtRvS+jOeoorEXZRPmso1/ANHXA== </del> <ins> xterm@4.9.0-beta.24: version "4.9.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.24.tgz#48f0990c6d32ad3a9bcc4fb49531d7effdaccea5" integrity sha512-CIVxxxbBiSw1WOMkIjjivaiIC9jNgih4klfWsRGx0qiDF5nbzHuLXkPTt+yAQUu9FCyTUwECm9Pkl3gUsSaGKg== </ins> yauzl@^2.9.2: version "2.10.0"


Question: Since we don't know when links are no longer cached by , we cannot drop the objects. Upstream part:

// Listen for modifier before handing it off to the hover to handle so it gets disposed correctly this._hoverListeners = new DisposableStore(); this._hoverListeners.add(dom.addDisposableListener(document, 'keydown', e => { <del> if (this._isModifierDown(e)) { </del> <ins> if (!e.repeat && this._isModifierDown(e)) { </ins> this._enableDecorations(); } })); this._hoverListeners.add(dom.addDisposableListener(document, 'keyup', e => { <del> if (!this._isModifierDown(e)) { </del> <ins> if (!e.repeat && !this._isModifierDown(e)) { </ins> this._disableDecorations(); } }));


Question: Since we don't know when links are no longer cached by , we cannot drop the objects. Upstream part:

resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.8.0.tgz#4bc6bb4dbfea5b0d2d7978d6c5cef922d584fb4f" integrity sha512-dlpYPsv0C9S6v6+T/h/d/otSbdUTizMJdxvSoS34tUpMOHev6iW7Zqt5KRFqYxl4vCqpDk9Wmhb3fKL3kwX5fQ== <del> xterm@4.9.0-beta.8: version "4.9.0-beta.8" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.8.tgz#ca121934d63f88668d2d5b11d9b2fc3bde7bd805" integrity sha512-EEonYBLANDUBfEeEnHG632bZdgBaAUWst8LFr6oC6f2uLFfJGHQvVJuLaEkPtRvS+jOeoorEXZRPmso1/ANHXA== </del> <ins> xterm@4.9.0-beta.24: version "4.9.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.24.tgz#48f0990c6d32ad3a9bcc4fb49531d7effdaccea5" integrity sha512-CIVxxxbBiSw1WOMkIjjivaiIC9jNgih4klfWsRGx0qiDF5nbzHuLXkPTt+yAQUu9FCyTUwECm9Pkl3gUsSaGKg== </ins> y18n@^3.2.1: version "3.2.1"


Question:
<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --The repository picker feature allows to pick github repos after selecting the GitHub provider. Asking for option to default the provider to GitHub so that user can have one less click when creating a codespace. it lists all repos where you are owner, is it possible to list repos of organizations you are in as well? A side question is how does the api authenticate, is it with the stored git credentials in git extension? Thanks, Jason
Sure, I can accept a PR here. But let's call it . Note that multiple providers can have the same name, tho that is a hypothetical issue, so no worries. The code that gets the repositories lives in the GitHub core extension: Maybe by querying for you'd get those repos? If so, we could add another option to the command . Authentication is implemented via the GitHub Authentication core

export interface PickRemoteSourceOptions { readonly providerLabel?: (provider: RemoteSourceProvider) => string; readonly urlLabel?: string; <ins> readonly providerName?: string; </ins> } export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions = {}): Promise<string | undefined> { const quickpick = window.createQuickPick<(QuickPickItem & { provider?: RemoteSourceProvider, url?: string })>(); quickpick.ignoreFocusOut = true; <del> const providers = model.getRemoteProviders() .map(provider => ({ label: (provider.icon ? `$(${provider.icon}) ` : '') + (options.providerLabel ? options.providerLabel(provider) : provider.name), alwaysShow: true, provider })); quickpick.placeholder = providers.length === 0 ? localize('provide url', "Provide repository URL") : localize('provide url or pick', "Provide repository URL or pick a repository source."); const updatePicks = (value?: string) => { if (value) { quickpick.items = [{ label: options.urlLabel ?? localize('url', "URL"), description: value, alwaysShow: true, url: value }, ...providers]; } else { quickpick.items = providers; } }; quickpick.onDidChangeValue(updatePicks); updatePicks(); const result = await getQuickPickResult(quickpick); if (result) { if (result.url) { return result.url; } else if (result.provider) { const quickpick = new RemoteSourceProviderQuickPick(result.provider); const remote = await quickpick.pick(); if (remote) { if (typeof remote.url === 'string') { return remote.url; } else if (remote.url.length > 0) { return await window.showQuickPick(remote.url, { ignoreFocusOut: true, placeHolder: localize('pick url', "Choose a URL to clone from.") }); } </del> <ins> const targetedProvider = model.getRemoteProviders().filter(provider => provider.name === options.providerName); if (targetedProvider && targetedProvider.length === 1) { return await pickProviderSource(targetedProvider[0]); } else { const providers = model.getRemoteProviders() .map(provider => ({ label: (provider.icon ? `$(${provider.icon}) ` : '') + (options.providerLabel ? options.providerLabel(provider) : provider.name), alwaysShow: true, provider })); quickpick.placeholder = providers.length === 0 ? localize('provide url', "Provide repository URL") : localize('provide url or pick', "Provide repository URL or pick a repository source."); const updatePicks = (value?: string) => { if (value) { quickpick.items = [{ label: options.urlLabel ?? localize('url', "URL"), description: value, alwaysShow: true, url: value }, ...providers]; } else { quickpick.items = providers; } }; quickpick.onDidChangeValue(updatePicks); updatePicks(); const result = await getQuickPickResult(quickpick); if (result) { if (result.url) { return result.url; } else if (result.provider) { return await pickProviderSource(result.provider); </ins> } } } return undefined; } <ins> async function pickProviderSource(provider: RemoteSourceProvider): Promise<string | undefined> { const quickpick = new RemoteSourceProviderQuickPick(provider); const remote = await quickpick.pick(); if (remote) { if (typeof remote.url === 'string') { return remote.url; } else if (remote.url.length > 0) { return await window.showQuickPick(remote.url, { ignoreFocusOut: true, placeHolder: localize('pick url', "Choose a URL to clone from.") }); } } return undefined; } </ins>


Question:
Below is a recording of a Control-R reload when no workspace is open and one non-builtin extension is contributing to to the Welcome view of Explorer. ! Observe how we start with Explorer's usual "NO FOLDER OPEN" view. Next my extension contributes its text and buttons. Finally the built-in git extension contributes text and a button. Since built-ins get higher priority the content from my extension jumps downward, perhaps while I'm reading it or trying to click one of its actions (link, button). There's no progress indicator when the content is being fetched and assembled, and it's hard to know how long to wait before concluding that no other extensions are going to contribute. VS Code version: Code 1.49.0 (, 2020-09-10T13:22:08.892Z) OS version: Windows_NT x64 10.0.
Similarly on the Source Control view, it starts with a message saying "No source control providers registered" and stays this way long enough for me to worry that something is broken or missing. Eventually the contribution from the git extension arrives. If a progress indicator isn't , maybe at least the initial message could say something like "Please wait while we look for source control providers". Then if nothing contributes (e.g. the git extension has been disabled,) it could then display "No source control providers registered".
This will be very hard to achieve. The problem here isn't actually the extension point, for which we could definitely add a progress indicator, but the activation of the git extension. That git section won't appear until the git extension is activated and all the potential repo locations have been probed... We simply can't add a progress indicator for that in the core unless we add some more API.
On this, we could potentially add a message.
That might help.
Closing this until we get actual user feedback that it's needed, sorry

{ "view": "scm", "contents": "%view.workbench.scm.empty%", <del> "when": "config.git.enabled && git.state == initialized && workbenchState == empty", </del> <ins> "when": "config.git.enabled && workbenchState == empty", "enablement": "git.state == initialized", </ins> "group": "2_open@1" }, { "view": "scm", "contents": "%view.workbench.scm.folder%", <del> "when": "config.git.enabled && git.state == initialized && workbenchState == folder", </del> <ins> "when": "config.git.enabled && workbenchState == folder", "enablement": "git.state == initialized", </ins> "group": "5_scm@1" }, { "view": "scm", "contents": "%view.workbench.scm.workspace%", "when": "config.git.enabled && git.state == initialized && workbenchState == workspace && workspaceFolderCount != 0", <ins> "enablement": "git.state == initialized", </ins> "group": "5_scm@1" }, { "view": "scm", "contents": "%view.workbench.scm.emptyWorkspace%", <del> "when": "config.git.enabled && git.state == initialized && workbenchState == workspace && workspaceFolderCount == 0", </del> <ins> "when": "config.git.enabled && workbenchState == workspace && workspaceFolderCount == 0", "enablement": "git.state == initialized", </ins> "group": "2_open@1" }, { "view": "explorer", "contents": "%view.workbench.cloneRepository%", <del> "when": "config.git.enabled && git.state == initialized", </del> <ins> "when": "config.git.enabled", "enablement": "git.state == initialized", </ins> "group": "5_scm@1" } ]


Question:
Below is a recording of a Control-R reload when no workspace is open and one non-builtin extension is contributing to to the Welcome view of Explorer. ! Observe how we start with Explorer's usual "NO FOLDER OPEN" view. Next my extension contributes its text and buttons. Finally the built-in git extension contributes text and a button. Since built-ins get higher priority the content from my extension jumps downward, perhaps while I'm reading it or trying to click one of its actions (link, button). There's no progress indicator when the content is being fetched and assembled, and it's hard to know how long to wait before concluding that no other extensions are going to contribute. VS Code version: Code 1.49.0 (, 2020-09-10T13:22:08.892Z) OS version: Windows_NT x64 10.0.
Similarly on the Source Control view, it starts with a message saying "No source control providers registered" and stays this way long enough for me to worry that something is broken or missing. Eventually the contribution from the git extension arrives. If a progress indicator isn't , maybe at least the initial message could say something like "Please wait while we look for source control providers". Then if nothing contributes (e.g. the git extension has been disabled,) it could then display "No source control providers registered".
This will be very hard to achieve. The problem here isn't actually the extension point, for which we could definitely add a progress indicator, but the activation of the git extension. That git section won't appear until the git extension is activated and all the potential repo locations have been probed... We simply can't add a progress indicator for that in the core unless we add some more API.
On this, we could potentially add a message.
That might help.
Closing this until we get actual user feedback that it's needed, sorry

"view.workbench.scm.folder": "The folder currently open doesn't have a git repository. You can initialize a repository which will enable source control features powered by git.n[Initialize Repository](command:git.init?%5Btrue%5D)nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).", "view.workbench.scm.workspace": "The workspace currently open doesn't have any folders containing git repositories. You can initialize a repository on a folder which will enable source control features powered by git.n[Initialize Repository](command:git.init)nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).", "view.workbench.scm.emptyWorkspace": "The workspace currently open doesn't have any folders containing git repositories.n[Add Folder to Workspace](command:workbench.action.addRootFolder)nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).", <del> "view.workbench.cloneRepository": "You can also clone a repository from a URL. To learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).n[Clone Repository](command:git.clone)" </del> <ins> "view.workbench.cloneRepository": "You can also clone a repository from a URL. To learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).n[Clone Repository](command:git.clone 'Clone a repository once the git extension has activated')" </ins> }


Question:
Below is a recording of a Control-R reload when no workspace is open and one non-builtin extension is contributing to to the Welcome view of Explorer. ! Observe how we start with Explorer's usual "NO FOLDER OPEN" view. Next my extension contributes its text and buttons. Finally the built-in git extension contributes text and a button. Since built-ins get higher priority the content from my extension jumps downward, perhaps while I'm reading it or trying to click one of its actions (link, button). There's no progress indicator when the content is being fetched and assembled, and it's hard to know how long to wait before concluding that no other extensions are going to contribute. VS Code version: Code 1.49.0 (, 2020-09-10T13:22:08.892Z) OS version: Windows_NT x64 10.0.
Similarly on the Source Control view, it starts with a message saying "No source control providers registered" and stays this way long enough for me to worry that something is broken or missing. Eventually the contribution from the git extension arrives. If a progress indicator isn't , maybe at least the initial message could say something like "Please wait while we look for source control providers". Then if nothing contributes (e.g. the git extension has been disabled,) it could then display "No source control providers registered".
This will be very hard to achieve. The problem here isn't actually the extension point, for which we could definitely add a progress indicator, but the activation of the git extension. That git section won't appear until the git extension is activated and all the potential repo locations have been probed... We simply can't add a progress indicator for that in the core unless we add some more API.
On this, we could potentially add a message.
That might help.
Closing this until we get actual user feedback that it's needed, sorry

this.bodyContainer.classList.add('welcome'); this.viewWelcomeContainer.innerText = ''; <del> let buttonIndex = 0; </del> for (const { content, preconditions } of contents) { <ins> let buttonIndex = 0; </ins> const lines = content.split('n'); for (let line of lines) {


Question:
Below is a recording of a Control-R reload when no workspace is open and one non-builtin extension is contributing to to the Welcome view of Explorer. ! Observe how we start with Explorer's usual "NO FOLDER OPEN" view. Next my extension contributes its text and buttons. Finally the built-in git extension contributes text and a button. Since built-ins get higher priority the content from my extension jumps downward, perhaps while I'm reading it or trying to click one of its actions (link, button). There's no progress indicator when the content is being fetched and assembled, and it's hard to know how long to wait before concluding that no other extensions are going to contribute. VS Code version: Code 1.49.0 (, 2020-09-10T13:22:08.892Z) OS version: Windows_NT x64 10.0.
Similarly on the Source Control view, it starts with a message saying "No source control providers registered" and stays this way long enough for me to worry that something is broken or missing. Eventually the contribution from the git extension arrives. If a progress indicator isn't , maybe at least the initial message could say something like "Please wait while we look for source control providers". Then if nothing contributes (e.g. the git extension has been disabled,) it could then display "No source control providers registered".
This will be very hard to achieve. The problem here isn't actually the extension point, for which we could definitely add a progress indicator, but the activation of the git extension. That git section won't appear until the git extension is activated and all the potential repo locations have been probed... We simply can't add a progress indicator for that in the core unless we add some more API.
On this, we could potentially add a message.
That might help.
Closing this until we get actual user feedback that it's needed, sorry

for (const welcome of contribution.value) { const id = ViewIdentifierMap[welcome.view] ?? welcome.view; const { group, order } = parseGroupAndOrder(welcome, contribution); <ins> const enablement = ContextKeyExpr.deserialize(welcome.enablement); </ins> const disposable = viewsRegistry.registerViewWelcomeContent(id, { content: welcome.contents, when: ContextKeyExpr.deserialize(welcome.when), <ins> // supply the enablement clause for each line in case the line defines a button preconditions: welcome.contents.split('n').map((_) => enablement), </ins> group, order });


Question:
Below is a recording of a Control-R reload when no workspace is open and one non-builtin extension is contributing to to the Welcome view of Explorer. ! Observe how we start with Explorer's usual "NO FOLDER OPEN" view. Next my extension contributes its text and buttons. Finally the built-in git extension contributes text and a button. Since built-ins get higher priority the content from my extension jumps downward, perhaps while I'm reading it or trying to click one of its actions (link, button). There's no progress indicator when the content is being fetched and assembled, and it's hard to know how long to wait before concluding that no other extensions are going to contribute. VS Code version: Code 1.49.0 (, 2020-09-10T13:22:08.892Z) OS version: Windows_NT x64 10.0.
Similarly on the Source Control view, it starts with a message saying "No source control providers registered" and stays this way long enough for me to worry that something is broken or missing. Eventually the contribution from the git extension arrives. If a progress indicator isn't , maybe at least the initial message could say something like "Please wait while we look for source control providers". Then if nothing contributes (e.g. the git extension has been disabled,) it could then display "No source control providers registered".
This will be very hard to achieve. The problem here isn't actually the extension point, for which we could definitely add a progress indicator, but the activation of the git extension. That git section won't appear until the git extension is activated and all the potential repo locations have been probed... We simply can't add a progress indicator for that in the core unless we add some more API.
On this, we could potentially add a message.
That might help.
Closing this until we get actual user feedback that it's needed, sorry

contents = 'contents', when = 'when', group = 'group', <ins> enablement = 'enablement', </ins> } export interface ViewWelcome {


Question:
Below is a recording of a Control-R reload when no workspace is open and one non-builtin extension is contributing to to the Welcome view of Explorer. ! Observe how we start with Explorer's usual "NO FOLDER OPEN" view. Next my extension contributes its text and buttons. Finally the built-in git extension contributes text and a button. Since built-ins get higher priority the content from my extension jumps downward, perhaps while I'm reading it or trying to click one of its actions (link, button). There's no progress indicator when the content is being fetched and assembled, and it's hard to know how long to wait before concluding that no other extensions are going to contribute. VS Code version: Code 1.49.0 (, 2020-09-10T13:22:08.892Z) OS version: Windows_NT x64 10.0.
Similarly on the Source Control view, it starts with a message saying "No source control providers registered" and stays this way long enough for me to worry that something is broken or missing. Eventually the contribution from the git extension arrives. If a progress indicator isn't , maybe at least the initial message could say something like "Please wait while we look for source control providers". Then if nothing contributes (e.g. the git extension has been disabled,) it could then display "No source control providers registered".
This will be very hard to achieve. The problem here isn't actually the extension point, for which we could definitely add a progress indicator, but the activation of the git extension. That git section won't appear until the git extension is activated and all the potential repo locations have been probed... We simply can't add a progress indicator for that in the core unless we add some more API.
On this, we could potentially add a message.
That might help.
Closing this until we get actual user feedback that it's needed, sorry

readonly [ViewsWelcomeExtensionPointFields.contents]: string; readonly [ViewsWelcomeExtensionPointFields.when]: string; readonly [ViewsWelcomeExtensionPointFields.group]: string; <ins> readonly [ViewsWelcomeExtensionPointFields.enablement]: string; </ins> } export type ViewsWelcomeExtensionPoint = ViewWelcome[];


Question:
Below is a recording of a Control-R reload when no workspace is open and one non-builtin extension is contributing to to the Welcome view of Explorer. ! Observe how we start with Explorer's usual "NO FOLDER OPEN" view. Next my extension contributes its text and buttons. Finally the built-in git extension contributes text and a button. Since built-ins get higher priority the content from my extension jumps downward, perhaps while I'm reading it or trying to click one of its actions (link, button). There's no progress indicator when the content is being fetched and assembled, and it's hard to know how long to wait before concluding that no other extensions are going to contribute. VS Code version: Code 1.49.0 (, 2020-09-10T13:22:08.892Z) OS version: Windows_NT x64 10.0.
Similarly on the Source Control view, it starts with a message saying "No source control providers registered" and stays this way long enough for me to worry that something is broken or missing. Eventually the contribution from the git extension arrives. If a progress indicator isn't , maybe at least the initial message could say something like "Please wait while we look for source control providers". Then if nothing contributes (e.g. the git extension has been disabled,) it could then display "No source control providers registered".
This will be very hard to achieve. The problem here isn't actually the extension point, for which we could definitely add a progress indicator, but the activation of the git extension. That git section won't appear until the git extension is activated and all the potential repo locations have been probed... We simply can't add a progress indicator for that in the core unless we add some more API.
On this, we could potentially add a message.
That might help.
Closing this until we get actual user feedback that it's needed, sorry

type: 'string', description: nls.localize('contributes.viewsWelcome.view.group', "Group to which this welcome content belongs."), }, <ins> [ViewsWelcomeExtensionPointFields.enablement]: { type: 'string', description: nls.localize('contributes.viewsWelcome.view.enablement', "Condition when the welcome content buttons should be enabled."), }, </ins> } } });


Question:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.48.2- -1.49.0- OS Version: Ubuntu 20.04.1 LTS Steps to Reproduce: -dev not installed and install code1.48.2- --VSCode works apt update; apt-upgrade VSCode to 1.49.0- --VSCode fails with: /usr/share/code/bin/../code: error while loading shared libraries: cannot open shared object file: No such file or directory install libgbm-dev --VSCode works Expected: upgrade checks for dependency and installs missing library
new Electron 9 dep needs to be declared here?
I didn't know about this dependency configuration in the codebase, yes adding should be sufficient. It is a new dependency for chromium 83 to use memory buffers in gpu code path.
This bug has been fixed in to the latest release of ! you can help us out by confirming things are working as expected in the latest Insiders release. If things look good, please leave a comment with the text to let us know. If not, please ensure you're on version of Insiders (today's or later - you can use in the command pallete to check), and leave a comment letting us know what isn't working as expected. Happy Coding!
Tested this by upgrading from 1.48.2 to 1.50.1

Package: @@NAME@@ Version: @@VERSION@@ Section: devel <del> Depends: libnss3 (>= 2:3.26), gnupg, apt, libxkbfile1, libsecret-1-0, libgtk-3-0 (>= 3.10.0), libxss1 </del> <ins> Depends: libnss3 (>= 2:3.26), gnupg, apt, libxkbfile1, libsecret-1-0, libgtk-3-0 (>= 3.10.0), libxss1, libgbm1 </ins> Priority: optional Architecture: @@ARCHITECTURE@@ Maintainer: Microsoft Corporation <vscode-linux@microsoft.com>


Question:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.48.2- -1.49.0- OS Version: Ubuntu 20.04.1 LTS Steps to Reproduce: -dev not installed and install code1.48.2- --VSCode works apt update; apt-upgrade VSCode to 1.49.0- --VSCode fails with: /usr/share/code/bin/../code: error while loading shared libraries: cannot open shared object file: No such file or directory install libgbm-dev --VSCode works Expected: upgrade checks for dependency and installs missing library
new Electron 9 dep needs to be declared here?
I didn't know about this dependency configuration in the codebase, yes adding should be sufficient. It is a new dependency for chromium 83 to use memory buffers in gpu code path.
This bug has been fixed in to the latest release of ! you can help us out by confirming things are working as expected in the latest Insiders release. If things look good, please leave a comment with the text to let us know. If not, please ensure you're on version of Insiders (today's or later - you can use in the command pallete to check), and leave a comment letting us know what isn't working as expected. Happy Coding!
Tested this by upgrading from 1.48.2 to 1.50.1

"libc.so.6(GLIBC_2.9)(64bit)", "libxcb.so.1()(64bit)", "libxkbfile.so.1()(64bit)", <del> "libsecret-1.so.0()(64bit)" </del> <ins> "libsecret-1.so.0()(64bit)", "libgbm.so.1()(64bit)" </ins> ], "aarch64": [ "libpthread.so.0()(aarch64)",


Question:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed: --<!-- Use Help Report Issue to prefill these. --- VSCode Version: 1.48.2- -1.49.0- OS Version: Ubuntu 20.04.1 LTS Steps to Reproduce: -dev not installed and install code1.48.2- --VSCode works apt update; apt-upgrade VSCode to 1.49.0- --VSCode fails with: /usr/share/code/bin/../code: error while loading shared libraries: cannot open shared object file: No such file or directory install libgbm-dev --VSCode works Expected: upgrade checks for dependency and installs missing library
new Electron 9 dep needs to be declared here?
I didn't know about this dependency configuration in the codebase, yes adding should be sufficient. It is a new dependency for chromium 83 to use memory buffers in gpu code path.
This bug has been fixed in to the latest release of ! you can help us out by confirming things are working as expected in the latest Insiders release. If things look good, please leave a comment with the text to let us know. If not, please ensure you're on version of Insiders (today's or later - you can use in the command pallete to check), and leave a comment letting us know what isn't working as expected. Happy Coding!
Tested this by upgrading from 1.48.2 to 1.50.1

- libgconf-2-4 - libglib2.0-bin - libgnome-keyring0 <ins> - libgbm1 </ins> - libgtk-3-0 - libnotify4 - libnspr4


Question:
It does fire for folder on move and delete. According to the reason lies here: The code goes directly to the file service. Since we correctly report move and delete for folders I think we should report create as well.
Some background: I want to adopt this in LSP but specing that this only works for move and delete of folders sounds a little silly. So I want to make sure that there is either a very compelling reason or there is some ack. that we will fix it in the future.
We currently have no related method such as for folders that the explorer could use here: If we support this, I guess one question in terms of API breakage is wether it is fine to let and emit events for folders too while they currently only emit for files. If we think this is fine, then I think this would be a relatively simple change to make.
I don't consider that breakage, it's a bug fix esp. given that move and delete already fire events for both
Verification: write an extension that registers to and and verify you see both events when you right click into the explorer and create a new folder.
Thanks for fixing!

const editorService = accessor.get(IEditorService); const viewsService = accessor.get(IViewsService); const notificationService = accessor.get(INotificationService); <ins> const workingCopyFileService = accessor.get(IWorkingCopyFileService); </ins> await viewsService.openView(VIEW_ID, true);


Question:
It does fire for folder on move and delete. According to the reason lies here: The code goes directly to the file service. Since we correctly report move and delete for folders I think we should report create as well.
Some background: I want to adopt this in LSP but specing that this only works for move and delete of folders sounds a little silly. So I want to make sure that there is either a very compelling reason or there is some ack. that we will fix it in the future.
We currently have no related method such as for folders that the explorer could use here: If we support this, I guess one question in terms of API breakage is wether it is fine to let and emit events for folders too while they currently only emit for files. If we think this is fine, then I think this would be a relatively simple change to make.
I don't consider that breakage, it's a bug fix esp. given that move and delete already fire events for both
Verification: write an extension that registers to and and verify you see both events when you right click into the explorer and create a new folder.
Thanks for fixing!

const onSuccess = async (value: string): Promise<void> => { try { <del> const created = isFolder ? await fileService.createFolder(resources.joinPath(folder.resource, value)) : await textFileService.create(resources.joinPath(folder.resource, value)); </del> <ins> const created = isFolder ? await workingCopyFileService.createFolder(resources.joinPath(folder.resource, value)) : await textFileService.create(resources.joinPath(folder.resource, value)); </ins> await refreshIfSeparator(value, explorerService); isFolder ?


Question:
It does fire for folder on move and delete. According to the reason lies here: The code goes directly to the file service. Since we correctly report move and delete for folders I think we should report create as well.
Some background: I want to adopt this in LSP but specing that this only works for move and delete of folders sounds a little silly. So I want to make sure that there is either a very compelling reason or there is some ack. that we will fix it in the future.
We currently have no related method such as for folders that the explorer could use here: If we support this, I guess one question in terms of API breakage is wether it is fine to let and emit events for folders too while they currently only emit for files. If we think this is fine, then I think this would be a relatively simple change to make.
I don't consider that breakage, it's a bug fix esp. given that move and delete already fire events for both
Verification: write an extension that registers to and and verify you see both events when you right click into the explorer and create a new folder.
Thanks for fixing!

create(resource: URI, contents?: VSBuffer | VSBufferReadable | VSBufferReadableStream, options?: { overwrite?: boolean }): Promise<IFileStatWithMetadata>; /** <ins> * Will create a folder and any parent folder that needs to be created. * * Working copy owners can listen to the `onWillRunWorkingCopyFileOperation` and * `onDidRunWorkingCopyFileOperation` events to participate. * * Note: events will only be emitted for the provided resource, but not any * parent folders that are being created as part of the operation. */ createFolder(resource: URI): Promise<IFileStatWithMetadata>; /** </ins> * Will move working copies matching the provided resources and corresponding children * to the target resources using the associated file service for those resources. *