diff --git a/extensions/emmet/src/selectItemHTML.ts b/extensions/emmet/src/selectItemHTML.ts
index f818f5783a3..6400913396c 100644
--- a/extensions/emmet/src/selectItemHTML.ts
+++ b/extensions/emmet/src/selectItemHTML.ts
@@ -19,7 +19,7 @@ export function nextItemHTML(document: vscode.TextDocument, selectionStart: vsco
if (currentNode.type !== 'comment') {
// If cursor is in the tag name, select tag
if (currentNode.open &&
- selectionEndOffset < currentNode.open.start + currentNode.name.length) {
+ selectionEndOffset <= currentNode.open.start + currentNode.name.length) {
return getSelectionFromNode(document, currentNode);
}
diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts
index 3a3b8516d64..572037fd8fd 100644
--- a/extensions/emmet/src/util.ts
+++ b/extensions/emmet/src/util.ts
@@ -84,19 +84,19 @@ export function migrateEmmetExtensionsPath() {
* Mapping between languages that support Emmet and completion trigger characters
*/
export const LANGUAGE_MODES: { [id: string]: string[] } = {
- 'html': ['!', '.', '}', ':', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
- 'jade': ['!', '.', '}', ':', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
- 'slim': ['!', '.', '}', ':', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
- 'haml': ['!', '.', '}', ':', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
- 'xml': ['.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
- 'xsl': ['!', '.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'html': ['!', '.', '}', ':', '*', '$', ']', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'jade': ['!', '.', '}', ':', '*', '$', ']', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'slim': ['!', '.', '}', ':', '*', '$', ']', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'haml': ['!', '.', '}', ':', '*', '$', ']', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'xml': ['.', '}', '*', '$', ']', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'xsl': ['!', '.', '}', '*', '$', '/', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
'css': [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
'scss': [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
'sass': [':', '!', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
'less': [':', '!', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
'stylus': [':', '!', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
- 'javascriptreact': ['!', '.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
- 'typescriptreact': ['!', '.', '}', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
+ 'javascriptreact': ['!', '.', '}', '*', '$', ']', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ 'typescriptreact': ['!', '.', '}', '*', '$', ']', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
};
export function isStyleSheet(syntax: string): boolean {
@@ -376,32 +376,36 @@ export const allowedMimeTypesInScriptTag = ['text/html', 'text/plain', 'text/x-t
* If position is inside a script tag of type template, then it will be parsed to find the inner HTML node as well
*/
export function getHtmlFlatNode(documentText: string, root: FlatNode | undefined, offset: number, includeNodeBoundary: boolean): HtmlFlatNode | undefined {
- const currentNode: HtmlFlatNode | undefined = getFlatNode(root, offset, includeNodeBoundary);
+ let currentNode: HtmlFlatNode | undefined = getFlatNode(root, offset, includeNodeBoundary);
if (!currentNode) { return; }
- const isTemplateScript = currentNode.name === 'script' &&
- (currentNode.attributes &&
- currentNode.attributes.some(x => x.name.toString() === 'type'
- && allowedMimeTypesInScriptTag.includes(x.value.toString())));
- if (isTemplateScript
- && currentNode.open
- && offset > currentNode.open.end
- && (!currentNode.close || offset < currentNode.close.start)) {
- // blank out the rest of the document and search for the node within
- const beforePadding = ' '.repeat(currentNode.open.end);
- const endToUse = currentNode.close ? currentNode.close.start : currentNode.end;
- const scriptBodyText = beforePadding + documentText.substring(currentNode.open.end, endToUse);
- const innerRoot: HtmlFlatNode = parse(scriptBodyText);
- const scriptBodyNode = getHtmlFlatNode(scriptBodyText, innerRoot, offset, includeNodeBoundary);
- if (scriptBodyNode) {
- scriptBodyNode.parent = currentNode;
- currentNode.children.push(scriptBodyNode);
- return scriptBodyNode;
- }
+ // If the currentNode is a script one, first set up its subtree and then find HTML node.
+ if (currentNode.name === 'script' && currentNode.children.length === 0) {
+ setUpScriptNodeSubtree(documentText, currentNode);
+ currentNode = getFlatNode(currentNode, offset, includeNodeBoundary) ?? currentNode;
}
return currentNode;
}
+export function setUpScriptNodeSubtree(documentText: string, scriptNode: HtmlFlatNode): void {
+ const isTemplateScript = scriptNode.name === 'script' &&
+ (scriptNode.attributes &&
+ scriptNode.attributes.some(x => x.name.toString() === 'type'
+ && allowedMimeTypesInScriptTag.includes(x.value.toString())));
+ if (isTemplateScript
+ && scriptNode.open) {
+ // blank out the rest of the document and generate the subtree.
+ const beforePadding = ' '.repeat(scriptNode.open.end);
+ const endToUse = scriptNode.close ? scriptNode.close.start : scriptNode.end;
+ const scriptBodyText = beforePadding + documentText.substring(scriptNode.open.end, endToUse);
+ const innerRoot: HtmlFlatNode = parse(scriptBodyText);
+ innerRoot.children.forEach(child => {
+ scriptNode.children.push(child);
+ child.parent = scriptNode;
+ });
+ }
+}
+
export function isOffsetInsideOpenOrCloseTag(node: FlatNode, offset: number): boolean {
const htmlNode = node as HtmlFlatNode;
if ((htmlNode.open && offset > htmlNode.open.start && offset < htmlNode.open.end)
diff --git a/src/vs/loader.js b/src/vs/loader.js
index c3bdda280d1..815516d9cc5 100644
--- a/src/vs/loader.js
+++ b/src/vs/loader.js
@@ -763,6 +763,9 @@ var AMDLoader;
require.resolve = function resolve(request, options) {
return Module._resolveFilename(request, mod, false, options);
};
+ require.resolve.paths = function paths(request) {
+ return Module._resolveLookupPaths(request, mod);
+ };
require.main = process.mainModule;
require.extensions = Module._extensions;
require.cache = Module._cache;
diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts
index f24a0ebb427..506010bb61a 100644
--- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts
+++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts
@@ -100,9 +100,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
public dispose(): void {
this._toDispose.dispose();
this._linkProvider?.dispose();
-
- // TODO@Daniel: Should all the previously created terminals be disposed
- // when the extension host process goes down ?
}
private _getTerminalId(id: TerminalIdentifier): number | undefined {
@@ -157,17 +154,11 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
}
public $dispose(id: TerminalIdentifier): void {
- const terminalInstance = this._getTerminalInstance(id);
- if (terminalInstance) {
- terminalInstance.dispose();
- }
+ this._getTerminalInstance(id)?.dispose();
}
public $sendText(id: TerminalIdentifier, text: string, addNewLine: boolean): void {
- const terminalInstance = this._getTerminalInstance(id);
- if (terminalInstance) {
- terminalInstance.sendText(text, addNewLine);
- }
+ this._getTerminalInstance(id)?.sendText(text, addNewLine);
}
public $startSendingDataEvents(): void {
@@ -183,10 +174,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
}
public $stopSendingDataEvents(): void {
- if (this._dataEventTracker) {
- this._dataEventTracker.dispose();
- this._dataEventTracker = undefined;
- }
+ this._dataEventTracker?.dispose();
+ this._dataEventTracker = undefined;
}
public $startLinkProvider(): void {
@@ -288,53 +277,31 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
}
public $sendProcessData(terminalId: number, data: string): void {
- const terminalProcess = this._terminalProcessProxies.get(terminalId);
- if (terminalProcess) {
- terminalProcess.emitData(data);
- }
+ this._terminalProcessProxies.get(terminalId)?.emitData(data);
}
public $sendProcessReady(terminalId: number, pid: number, cwd: string): void {
- const terminalProcess = this._terminalProcessProxies.get(terminalId);
- if (terminalProcess) {
- terminalProcess.emitReady(pid, cwd);
- }
+ this._terminalProcessProxies.get(terminalId)?.emitReady(pid, cwd);
}
public $sendProcessExit(terminalId: number, exitCode: number | undefined): void {
- const terminalProcess = this._terminalProcessProxies.get(terminalId);
- if (terminalProcess) {
- terminalProcess.emitExit(exitCode);
- this._terminalProcessProxies.delete(terminalId);
- }
+ this._terminalProcessProxies.get(terminalId)?.emitExit(exitCode);
}
public $sendOverrideDimensions(terminalId: number, dimensions: ITerminalDimensions | undefined): void {
- const terminalProcess = this._terminalProcessProxies.get(terminalId);
- if (terminalProcess) {
- terminalProcess.emitOverrideDimensions(dimensions);
- }
+ this._terminalProcessProxies.get(terminalId)?.emitOverrideDimensions(dimensions);
}
public $sendProcessInitialCwd(terminalId: number, initialCwd: string): void {
- const terminalProcess = this._terminalProcessProxies.get(terminalId);
- if (terminalProcess) {
- terminalProcess.emitInitialCwd(initialCwd);
- }
+ this._terminalProcessProxies.get(terminalId)?.emitInitialCwd(initialCwd);
}
public $sendProcessCwd(terminalId: number, cwd: string): void {
- const terminalProcess = this._terminalProcessProxies.get(terminalId);
- if (terminalProcess) {
- terminalProcess.emitCwd(cwd);
- }
+ this._terminalProcessProxies.get(terminalId)?.emitCwd(cwd);
}
public $sendResolvedLaunchConfig(terminalId: number, shellLaunchConfig: IShellLaunchConfig): void {
- const instance = this._terminalService.getInstanceFromId(terminalId);
- if (instance) {
- this._getTerminalProcess(terminalId)?.emitResolvedShellLaunchConfig(shellLaunchConfig);
- }
+ this._getTerminalProcess(terminalId)?.emitResolvedShellLaunchConfig(shellLaunchConfig);
}
private async _onRequestLatency(terminalId: number): Promise {