From d9f97a4e817399febfc82d03cf3c9051103d6663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E8=85=BE=E9=9D=96?= Date: Wed, 8 Jun 2022 20:15:32 +0800 Subject: fix jsx text foreground in tomorrow-night theme (#151478) --- .../themes/tomorrow-night-blue-color-theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'extensions') diff --git a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-color-theme.json b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-color-theme.json index 70b57d594fe..b37fd6b0083 100644 --- a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-color-theme.json +++ b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-color-theme.json @@ -65,7 +65,7 @@ } }, { - "scope": ["meta.embedded", "source.groovy.embedded"], + "scope": ["meta.embedded", "source.groovy.embedded", "meta.jsx.children"], "settings": { //"background": "#002451", "foreground": "#FFFFFF" -- cgit v1.2.3 From 6f5fc176226b2d2a53223698cc3fac7d19c669ec Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:45:27 +0200 Subject: Git - use editor as commit message input (#151491) --- extensions/git/extension.webpack.config.js | 3 +- extensions/git/package.json | 61 ++++++++++++++++++++-------- extensions/git/package.nls.json | 2 + extensions/git/src/api/git.d.ts | 3 ++ extensions/git/src/askpass.ts | 14 +------ extensions/git/src/commands.ts | 39 +++++++++++++++--- extensions/git/src/git-editor-empty.sh | 1 + extensions/git/src/git-editor-main.ts | 21 ++++++++++ extensions/git/src/git-editor.sh | 4 ++ extensions/git/src/git.ts | 34 ++++++++++++---- extensions/git/src/gitEditor.ts | 65 ++++++++++++++++++++++++++++++ extensions/git/src/main.ts | 17 +++++++- extensions/git/src/repository.ts | 7 ++++ extensions/git/tsconfig.json | 1 + 14 files changed, 228 insertions(+), 44 deletions(-) create mode 100755 extensions/git/src/git-editor-empty.sh create mode 100644 extensions/git/src/git-editor-main.ts create mode 100755 extensions/git/src/git-editor.sh create mode 100644 extensions/git/src/gitEditor.ts (limited to 'extensions') diff --git a/extensions/git/extension.webpack.config.js b/extensions/git/extension.webpack.config.js index 5efa2052e88..3324b6c1d98 100644 --- a/extensions/git/extension.webpack.config.js +++ b/extensions/git/extension.webpack.config.js @@ -13,6 +13,7 @@ module.exports = withDefaults({ context: __dirname, entry: { main: './src/main.ts', - ['askpass-main']: './src/askpass-main.ts' + ['askpass-main']: './src/askpass-main.ts', + ['git-editor-main']: './src/git-editor-main.ts' } }); diff --git a/extensions/git/package.json b/extensions/git/package.json index e2428b5e02f..111717f86c9 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -14,6 +14,7 @@ "contribMergeEditorToolbar", "contribViewsWelcome", "scmActionButton", + "scmInput", "scmSelectedProvider", "scmValidation", "timeline" @@ -213,83 +214,99 @@ "command": "git.commit", "title": "%command.commit%", "category": "Git", - "icon": "$(check)" + "icon": "$(check)", + "enablement": "!commitInProgress" }, { "command": "git.commitStaged", "title": "%command.commitStaged%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitEmpty", "title": "%command.commitEmpty%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitStagedSigned", "title": "%command.commitStagedSigned%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitStagedAmend", "title": "%command.commitStagedAmend%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitAll", "title": "%command.commitAll%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitAllSigned", "title": "%command.commitAllSigned%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitAllAmend", "title": "%command.commitAllAmend%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitNoVerify", "title": "%command.commitNoVerify%", "category": "Git", - "icon": "$(check)" + "icon": "$(check)", + "enablement": "!commitInProgress" }, { "command": "git.commitStagedNoVerify", "title": "%command.commitStagedNoVerify%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitEmptyNoVerify", "title": "%command.commitEmptyNoVerify%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitStagedSignedNoVerify", "title": "%command.commitStagedSignedNoVerify%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitStagedAmendNoVerify", "title": "%command.commitStagedAmendNoVerify%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitAllNoVerify", "title": "%command.commitAllNoVerify%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitAllSignedNoVerify", "title": "%command.commitAllSignedNoVerify%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.commitAllAmendNoVerify", "title": "%command.commitAllAmendNoVerify%", - "category": "Git" + "category": "Git", + "enablement": "!commitInProgress" }, { "command": "git.restoreCommitTemplate", @@ -2013,6 +2030,18 @@ "scope": "machine", "description": "%config.defaultCloneDirectory%" }, + "git.useEditorAsCommitInput": { + "type": "boolean", + "scope": "resource", + "description": "%config.useEditorAsCommitInput%", + "default": false + }, + "git.verboseCommit": { + "type": "boolean", + "scope": "resource", + "markdownDescription": "%config.verboseCommit%", + "default": false + }, "git.enableSmartCommit": { "type": "boolean", "scope": "resource", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index b729f821b61..5210e64de80 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -140,6 +140,8 @@ "config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository.", "config.ignoreRebaseWarning": "Ignores the warning when it looks like the branch might have been rebased when pulling.", "config.defaultCloneDirectory": "The default location to clone a git repository.", + "config.useEditorAsCommitInput": "Use an editor to author the commit message.", + "config.verboseCommit": "Enable verbose output when `#git.useEditorAsCommitInput#` is enabled.", "config.enableSmartCommit": "Commit all changes when there are no staged changes.", "config.smartCommitChanges": "Control which changes are automatically staged by Smart Commit.", "config.smartCommitChanges.all": "Automatically stage all changes.", diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts index 4b180dac920..14c7447e3e8 100644 --- a/extensions/git/src/api/git.d.ts +++ b/extensions/git/src/api/git.d.ts @@ -137,6 +137,8 @@ export interface CommitOptions { empty?: boolean; noVerify?: boolean; requireUserConfig?: boolean; + useEditor?: boolean; + verbose?: boolean; } export interface FetchOptions { @@ -336,4 +338,5 @@ export const enum GitErrorCodes { PatchDoesNotApply = 'PatchDoesNotApply', NoPathFound = 'NoPathFound', UnknownPath = 'UnknownPath', + EmptyCommitMessage = 'EmptyCommitMessage' } diff --git a/extensions/git/src/askpass.ts b/extensions/git/src/askpass.ts index 81895a0e0d6..ffbd7e48a0e 100644 --- a/extensions/git/src/askpass.ts +++ b/extensions/git/src/askpass.ts @@ -6,9 +6,8 @@ import { window, InputBoxOptions, Uri, Disposable, workspace } from 'vscode'; import { IDisposable, EmptyDisposable, toDisposable } from './util'; import * as path from 'path'; -import { IIPCHandler, IIPCServer, createIPCServer } from './ipc/ipcServer'; +import { IIPCHandler, IIPCServer } from './ipc/ipcServer'; import { CredentialsProvider, Credentials } from './api/git'; -import { OutputChannelLogger } from './log'; export class Askpass implements IIPCHandler { @@ -16,16 +15,7 @@ export class Askpass implements IIPCHandler { private cache = new Map(); private credentialsProviders = new Set(); - static async create(outputChannelLogger: OutputChannelLogger, context?: string): Promise { - try { - return new Askpass(await createIPCServer(context)); - } catch (err) { - outputChannelLogger.logError(`Failed to create git askpass IPC: ${err}`); - return new Askpass(); - } - } - - private constructor(private ipc?: IIPCServer) { + constructor(private ipc?: IIPCServer) { if (ipc) { this.disposable = ipc.registerHandler('askpass', this); } diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 32812e42159..dd557053e8b 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1516,6 +1516,14 @@ export class CommandCenter { opts.signoff = true; } + if (config.get('useEditorAsCommitInput')) { + opts.useEditor = true; + + if (config.get('verboseCommit')) { + opts.verbose = true; + } + } + const smartCommitChanges = config.get<'all' | 'tracked'>('smartCommitChanges'); if ( @@ -1563,7 +1571,7 @@ export class CommandCenter { let message = await getCommitMessage(); - if (!message && !opts.amend) { + if (!message && !opts.amend && !opts.useEditor) { return false; } @@ -1623,10 +1631,13 @@ export class CommandCenter { private async commitWithAnyInput(repository: Repository, opts?: CommitOptions): Promise { const message = repository.inputBox.value; + const root = Uri.file(repository.root); + const config = workspace.getConfiguration('git', root); + const getCommitMessage = async () => { let _message: string | undefined = message; - if (!_message) { + if (!_message && !config.get('useEditorAsCommitInput')) { let value: string | undefined = undefined; if (opts && opts.amend && repository.HEAD && repository.HEAD.commit) { @@ -3010,7 +3021,7 @@ export class CommandCenter { }; let message: string; - let type: 'error' | 'warning' = 'error'; + let type: 'error' | 'warning' | 'information' = 'error'; const choices = new Map void>(); const openOutputChannelChoice = localize('open git log', "Open Git Log"); @@ -3073,6 +3084,12 @@ export class CommandCenter { message = localize('missing user info', "Make sure you configure your 'user.name' and 'user.email' in git."); choices.set(localize('learn more', "Learn More"), () => commands.executeCommand('vscode.open', Uri.parse('https://aka.ms/vscode-setup-git'))); break; + case GitErrorCodes.EmptyCommitMessage: + message = localize('empty commit', "Commit operation was cancelled due to empty commit message."); + choices.clear(); + type = 'information'; + options.modal = false; + break; default: { const hint = (err.stderr || err.message || String(err)) .replace(/^error: /mi, '') @@ -3094,10 +3111,20 @@ export class CommandCenter { return; } + let result: string | undefined; const allChoices = Array.from(choices.keys()); - const result = type === 'error' - ? await window.showErrorMessage(message, options, ...allChoices) - : await window.showWarningMessage(message, options, ...allChoices); + + switch (type) { + case 'error': + result = await window.showErrorMessage(message, options, ...allChoices); + break; + case 'warning': + result = await window.showWarningMessage(message, options, ...allChoices); + break; + case 'information': + result = await window.showInformationMessage(message, options, ...allChoices); + break; + } if (result) { const resultFn = choices.get(result); diff --git a/extensions/git/src/git-editor-empty.sh b/extensions/git/src/git-editor-empty.sh new file mode 100755 index 00000000000..1a2485251c3 --- /dev/null +++ b/extensions/git/src/git-editor-empty.sh @@ -0,0 +1 @@ +#!/bin/sh diff --git a/extensions/git/src/git-editor-main.ts b/extensions/git/src/git-editor-main.ts new file mode 100644 index 00000000000..eb4da4a40b5 --- /dev/null +++ b/extensions/git/src/git-editor-main.ts @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { IPCClient } from './ipc/ipcClient'; + +function fatal(err: any): void { + console.error(err); + process.exit(1); +} + +function main(argv: string[]): void { + const ipcClient = new IPCClient('git-editor'); + const commitMessagePath = argv[argv.length - 1]; + + ipcClient.call({ commitMessagePath }).then(() => { + setTimeout(() => process.exit(0), 0); + }).catch(err => fatal(err)); +} + +main(process.argv); diff --git a/extensions/git/src/git-editor.sh b/extensions/git/src/git-editor.sh new file mode 100755 index 00000000000..1c45c2deac1 --- /dev/null +++ b/extensions/git/src/git-editor.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +ELECTRON_RUN_AS_NODE="1" \ +"$VSCODE_GIT_EDITOR_NODE" "$VSCODE_GIT_EDITOR_MAIN" $VSCODE_GIT_EDITOR_EXTRA_ARGS $@ diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index a511db761a6..f87cefbd653 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1400,20 +1400,37 @@ export class Repository { } async commit(message: string | undefined, opts: CommitOptions = Object.create(null)): Promise { - const args = ['commit', '--quiet', '--allow-empty-message']; + const args = ['commit', '--quiet']; + const options: SpawnOptions = {}; + + if (message) { + options.input = message; + args.push('--file', '-'); + } + + if (opts.verbose) { + args.push('--verbose'); + } if (opts.all) { args.push('--all'); } - if (opts.amend && message) { + if (opts.amend) { args.push('--amend'); } - if (opts.amend && !message) { - args.push('--amend', '--no-edit'); - } else { - args.push('--file', '-'); + if (!opts.useEditor) { + if (!message) { + if (opts.amend) { + args.push('--no-edit'); + } else { + options.input = ''; + args.push('--file', '-'); + } + } + + args.push('--allow-empty-message'); } if (opts.signoff) { @@ -1438,7 +1455,7 @@ export class Repository { } try { - await this.exec(args, !opts.amend || message ? { input: message || '' } : {}); + await this.exec(args, options); } catch (commitErr) { await this.handleCommitError(commitErr); } @@ -1462,6 +1479,9 @@ export class Repository { if (/not possible because you have unmerged files/.test(commitErr.stderr || '')) { commitErr.gitErrorCode = GitErrorCodes.UnmergedChanges; throw commitErr; + } else if (/Aborting commit due to empty commit message/.test(commitErr.stderr || '')) { + commitErr.gitErrorCode = GitErrorCodes.EmptyCommitMessage; + throw commitErr; } try { diff --git a/extensions/git/src/gitEditor.ts b/extensions/git/src/gitEditor.ts new file mode 100644 index 00000000000..5f65a7dbcf2 --- /dev/null +++ b/extensions/git/src/gitEditor.ts @@ -0,0 +1,65 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as path from 'path'; +import { TabInputText, Uri, window, workspace } from 'vscode'; +import { IIPCHandler, IIPCServer } from './ipc/ipcServer'; +import { EmptyDisposable, IDisposable } from './util'; + +interface GitEditorRequest { + commitMessagePath?: string; +} + +export class GitEditor implements IIPCHandler { + + private disposable: IDisposable = EmptyDisposable; + + constructor(private ipc?: IIPCServer) { + if (ipc) { + this.disposable = ipc.registerHandler('git-editor', this); + } + } + + async handle({ commitMessagePath }: GitEditorRequest): Promise { + if (commitMessagePath) { + const uri = Uri.file(commitMessagePath); + const doc = await workspace.openTextDocument(uri); + await window.showTextDocument(doc, { preview: false }); + + return new Promise((c) => { + const onDidClose = window.tabGroups.onDidChangeTabs(async (tabs) => { + if (tabs.closed.some(t => t.input instanceof TabInputText && t.input.uri.toString() === uri.toString())) { + onDidClose.dispose(); + return c(true); + } + }); + }); + } + } + + getEnv(): { [key: string]: string } { + if (!this.ipc) { + return { + GIT_EDITOR: `"${path.join(__dirname, 'git-editor-empty.sh')}"` + }; + } + + let env: { [key: string]: string } = { + VSCODE_GIT_EDITOR_NODE: process.execPath, + VSCODE_GIT_EDITOR_EXTRA_ARGS: (process.versions['electron'] && process.versions['microsoft-build']) ? '--ms-enable-electron-run-as-node' : '', + VSCODE_GIT_EDITOR_MAIN: path.join(__dirname, 'git-editor-main.js') + }; + + const config = workspace.getConfiguration('git'); + if (config.get('useEditorAsCommitInput')) { + env.GIT_EDITOR = `"${path.join(__dirname, 'git-editor.sh')}"`; + } + + return env; + } + + dispose(): void { + this.disposable.dispose(); + } +} diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index a5e7c060f00..46f612539fb 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -25,6 +25,8 @@ import { GitTimelineProvider } from './timelineProvider'; import { registerAPICommands } from './api/api1'; import { TerminalEnvironmentManager } from './terminal'; import { OutputChannelLogger } from './log'; +import { createIPCServer, IIPCServer } from './ipc/ipcServer'; +import { GitEditor } from './gitEditor'; const deactivateTasks: { (): Promise }[] = []; @@ -60,10 +62,21 @@ async function createModel(context: ExtensionContext, outputChannelLogger: Outpu return !skip; }); - const askpass = await Askpass.create(outputChannelLogger, context.storagePath); + let ipc: IIPCServer | undefined = undefined; + + try { + ipc = await createIPCServer(context.storagePath); + } catch (err) { + outputChannelLogger.logError(`Failed to create git IPC: ${err}`); + } + + const askpass = new Askpass(ipc); disposables.push(askpass); - const environment = askpass.getEnv(); + const gitEditor = new GitEditor(ipc); + disposables.push(gitEditor); + + const environment = { ...askpass.getEnv(), ...gitEditor.getEnv() }; const terminalEnvironmentManager = new TerminalEnvironmentManager(context, environment); disposables.push(terminalEnvironmentManager); diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 69c184209fa..c6fa51b5497 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -454,6 +454,13 @@ class ProgressManager { const onDidChange = filterEvent(workspace.onDidChangeConfiguration, e => e.affectsConfiguration('git', Uri.file(this.repository.root))); onDidChange(_ => this.updateEnablement()); this.updateEnablement(); + + this.repository.onDidChangeOperations(() => { + const commitInProgress = this.repository.operations.isRunning(Operation.Commit); + + this.repository.sourceControl.inputBox.enabled = !commitInProgress; + commands.executeCommand('setContext', 'commitInProgress', commitInProgress); + }); } private updateEnablement(): void { diff --git a/extensions/git/tsconfig.json b/extensions/git/tsconfig.json index 13997275056..1f1c02d3356 100644 --- a/extensions/git/tsconfig.json +++ b/extensions/git/tsconfig.json @@ -12,6 +12,7 @@ "../../src/vscode-dts/vscode.d.ts", "../../src/vscode-dts/vscode.proposed.diffCommand.d.ts", "../../src/vscode-dts/vscode.proposed.scmActionButton.d.ts", + "../../src/vscode-dts/vscode.proposed.scmInput.d.ts", "../../src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts", "../../src/vscode-dts/vscode.proposed.scmValidation.d.ts", "../../src/vscode-dts/vscode.proposed.tabs.d.ts", -- cgit v1.2.3 From c38afc571d96c366e30d0a3146de408c9ab14e94 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 8 Jun 2022 09:35:00 -0700 Subject: Switch deprecated editor.document -> editor.notebook (#151530) --- .../src/singlefolder-tests/ipynb.test.ts | 8 +- .../src/singlefolder-tests/notebook.editor.test.ts | 8 +- .../src/singlefolder-tests/notebook.test.ts | 108 ++++++++++----------- 3 files changed, 62 insertions(+), 62 deletions(-) (limited to 'extensions') diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts index 44359de5e84..b73025ab2e7 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts @@ -18,9 +18,9 @@ import * as vscode from 'vscode'; const notebookEditor = vscode.window.activeNotebookEditor; assert.ok(notebookEditor); - assert.strictEqual(notebookEditor.document.cellCount, 2); - assert.strictEqual(notebookEditor.document.cellAt(0).kind, vscode.NotebookCellKind.Markup); - assert.strictEqual(notebookEditor.document.cellAt(1).kind, vscode.NotebookCellKind.Code); - assert.strictEqual(notebookEditor.document.cellAt(1).outputs.length, 1); + assert.strictEqual(notebookEditor.notebook.cellCount, 2); + assert.strictEqual(notebookEditor.notebook.cellAt(0).kind, vscode.NotebookCellKind.Markup); + assert.strictEqual(notebookEditor.notebook.cellAt(1).kind, vscode.NotebookCellKind.Code); + assert.strictEqual(notebookEditor.notebook.cellAt(1).outputs.length, 1); }); }); diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts index eeffb282f91..516db93b845 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts @@ -75,11 +75,11 @@ import * as utils from '../utils'; const uri = await utils.createRandomFile(undefined, undefined, '.nbdtest'); const editor = await vscode.window.showNotebookDocument(uri); - assert.strictEqual(uri.toString(), editor.document.uri.toString()); + assert.strictEqual(uri.toString(), editor.notebook.uri.toString()); - assert.strictEqual(notebookDocumentsFromOnDidOpen.has(editor.document), true); + assert.strictEqual(notebookDocumentsFromOnDidOpen.has(editor.notebook), true); - const includes = vscode.workspace.notebookDocuments.includes(editor.document); + const includes = vscode.workspace.notebookDocuments.includes(editor.notebook); assert.strictEqual(true, includes); sub.dispose(); @@ -104,7 +104,7 @@ import * as utils from '../utils'; const resource = await utils.createRandomFile(undefined, undefined, '.nbdtest'); const editor = await vscode.window.showNotebookDocument(resource); assert.ok(await openedEditor); - assert.strictEqual(editor.document.uri.toString(), resource.toString()); + assert.strictEqual(editor.notebook.uri.toString(), resource.toString()); }); test('Active/Visible Editor', async function () { diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts index f863bf014b6..c4d4733578a 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts @@ -77,7 +77,7 @@ export class Kernel { function getFocusedCell(editor?: vscode.NotebookEditor) { - return editor ? editor.document.cellAt(editor.selections[0].start) : undefined; + return editor ? editor.notebook.cellAt(editor.selections[0].start) : undefined; } async function assertKernel(kernel: Kernel, notebook: vscode.NotebookDocument): Promise { @@ -204,12 +204,12 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { const cellsChangeEvent = asPromise(vscode.workspace.onDidChangeNotebookDocument); await vscode.commands.executeCommand('notebook.cell.insertCodeCellBelow'); const cellChangeEventRet = await cellsChangeEvent; - assert.strictEqual(cellChangeEventRet.notebook, editor.document); + assert.strictEqual(cellChangeEventRet.notebook, editor.notebook); assert.strictEqual(cellChangeEventRet.contentChanges.length, 1); assert.deepStrictEqual(cellChangeEventRet.contentChanges[0], { range: new vscode.NotebookRange(1, 1), removedCells: [], - addedCells: [editor.document.cellAt(1)] + addedCells: [editor.notebook.cellAt(1)] }); const moveCellEvent = asPromise(vscode.workspace.onDidChangeNotebookDocument); @@ -220,11 +220,11 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('notebook.cell.execute'); const cellOutputsAddedRet = await cellOutputChange; - assert.strictEqual(cellOutputsAddedRet.notebook.uri.toString(), editor.document.uri.toString()); + assert.strictEqual(cellOutputsAddedRet.notebook.uri.toString(), editor.notebook.uri.toString()); assert.strictEqual(cellOutputsAddedRet.metadata, undefined); assert.strictEqual(cellOutputsAddedRet.contentChanges.length, 0); assert.strictEqual(cellOutputsAddedRet.cellChanges.length, 1); - assert.deepStrictEqual(cellOutputsAddedRet.cellChanges[0].cell, editor.document.cellAt(0)); + assert.deepStrictEqual(cellOutputsAddedRet.cellChanges[0].cell, editor.notebook.cellAt(0)); assert.deepStrictEqual(cellOutputsAddedRet.cellChanges[0].executionSummary, { executionOrder: undefined, success: undefined, timing: undefined }); // TODO@jrieken should this be undefined instead all empty? assert.strictEqual(cellOutputsAddedRet.cellChanges[0].document, undefined); assert.strictEqual(cellOutputsAddedRet.cellChanges[0].metadata, undefined); @@ -235,15 +235,15 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('notebook.cell.clearOutputs'); const cellOutputsCleardRet = await cellOutputClear; assert.deepStrictEqual(cellOutputsCleardRet, { - notebook: editor.document, + notebook: editor.notebook, metadata: undefined, contentChanges: [], cellChanges: [{ - cell: editor.document.cellAt(0), + cell: editor.notebook.cellAt(0), document: undefined, executionSummary: undefined, metadata: undefined, - outputs: editor.document.cellAt(0).outputs + outputs: editor.notebook.cellAt(0).outputs }], }); assert.strictEqual(cellOutputsCleardRet.cellChanges[0].cell.outputs.length, 0); @@ -289,21 +289,21 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { const editor = await vscode.window.showNotebookDocument(notebook); const notebookChangeEvent = asPromise(vscode.workspace.onDidChangeNotebookDocument); - const version = editor.document.version; + const version = editor.notebook.version; await editor.edit(editBuilder => { editBuilder.replaceCells(1, 0, [{ kind: vscode.NotebookCellKind.Code, languageId: 'javascript', value: 'test 2', outputs: [], metadata: undefined }]); editBuilder.replaceCellMetadata(0, { inputCollapsed: false }); }); await notebookChangeEvent; - assert.strictEqual(editor.document.cellCount, 3); - assert.strictEqual(editor.document.cellAt(0)?.metadata.inputCollapsed, false); - assert.strictEqual(version + 1, editor.document.version); + assert.strictEqual(editor.notebook.cellCount, 3); + assert.strictEqual(editor.notebook.cellAt(0)?.metadata.inputCollapsed, false); + assert.strictEqual(version + 1, editor.notebook.version); await vscode.commands.executeCommand('undo'); - assert.strictEqual(version + 2, editor.document.version); - assert.strictEqual(editor.document.cellAt(0)?.metadata.inputCollapsed, undefined); - assert.strictEqual(editor.document.cellCount, 2); + assert.strictEqual(version + 2, editor.notebook.version); + assert.strictEqual(editor.notebook.cellAt(0)?.metadata.inputCollapsed, undefined); + assert.strictEqual(editor.notebook.cellCount, 2); }); // #126371 @@ -326,7 +326,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { assert.strictEqual(getFocusedCell(editor)?.document.getText(), 'test'); assert.strictEqual(getFocusedCell(editor)?.document.languageId, 'typescript'); - const secondCell = editor.document.cellAt(1); + const secondCell = editor.notebook.cellAt(1); assert.strictEqual(secondCell.outputs.length, 1); assert.deepStrictEqual(secondCell.outputs[0].metadata, { testOutputMetadata: true, ['text/plain']: { testOutputItemMetadata: true } }); assert.strictEqual(secondCell.outputs[0].items.length, 1); @@ -353,22 +353,22 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { let activeCell = getFocusedCell(editor); assert.notStrictEqual(getFocusedCell(editor), undefined); assert.strictEqual(activeCell!.document.getText(), ''); - assert.strictEqual(editor.document.cellCount, 4); - assert.strictEqual(editor.document.getCells().indexOf(activeCell!), 1); + assert.strictEqual(editor.notebook.cellCount, 4); + assert.strictEqual(editor.notebook.getCells().indexOf(activeCell!), 1); // ---- focus bottom ---- // await vscode.commands.executeCommand('notebook.focusBottom'); activeCell = getFocusedCell(editor); - assert.strictEqual(editor.document.getCells().indexOf(activeCell!), 3); + assert.strictEqual(editor.notebook.getCells().indexOf(activeCell!), 3); // ---- focus top and then copy down ---- // await vscode.commands.executeCommand('notebook.focusTop'); activeCell = getFocusedCell(editor); - assert.strictEqual(editor.document.getCells().indexOf(activeCell!), 0); + assert.strictEqual(editor.notebook.getCells().indexOf(activeCell!), 0); await vscode.commands.executeCommand('notebook.cell.copyDown'); activeCell = getFocusedCell(editor); - assert.strictEqual(editor.document.getCells().indexOf(activeCell!), 1); + assert.strictEqual(editor.notebook.getCells().indexOf(activeCell!), 1); assert.strictEqual(activeCell?.document.getText(), 'test'); { @@ -381,25 +381,25 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { } activeCell = getFocusedCell(editor); - assert.strictEqual(editor.document.getCells().indexOf(activeCell!), 1); + assert.strictEqual(editor.notebook.getCells().indexOf(activeCell!), 1); assert.strictEqual(activeCell?.document.getText(), ''); // ---- focus top and then copy up ---- // await vscode.commands.executeCommand('notebook.focusTop'); await vscode.commands.executeCommand('notebook.cell.copyUp'); - assert.strictEqual(editor.document.cellCount, 5); - assert.strictEqual(editor.document.cellAt(0).document.getText(), 'test'); - assert.strictEqual(editor.document.cellAt(1).document.getText(), 'test'); - assert.strictEqual(editor.document.cellAt(2).document.getText(), ''); - assert.strictEqual(editor.document.cellAt(3).document.getText(), ''); + assert.strictEqual(editor.notebook.cellCount, 5); + assert.strictEqual(editor.notebook.cellAt(0).document.getText(), 'test'); + assert.strictEqual(editor.notebook.cellAt(1).document.getText(), 'test'); + assert.strictEqual(editor.notebook.cellAt(2).document.getText(), ''); + assert.strictEqual(editor.notebook.cellAt(3).document.getText(), ''); activeCell = getFocusedCell(editor); - assert.strictEqual(editor.document.getCells().indexOf(activeCell!), 0); + assert.strictEqual(editor.notebook.getCells().indexOf(activeCell!), 0); // ---- move up and down ---- // await vscode.commands.executeCommand('notebook.cell.moveDown'); - assert.strictEqual(editor.document.getCells().indexOf(getFocusedCell(editor)!), 1, + assert.strictEqual(editor.notebook.getCells().indexOf(getFocusedCell(editor)!), 1, `first move down, active cell ${getFocusedCell(editor)!.document.uri.toString()}, ${getFocusedCell(editor)!.document.getText()}`); await vscode.commands.executeCommand('workbench.action.files.save'); @@ -427,7 +427,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { // assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true, 'notebook first'); // const editor = vscode.window.activeNotebookEditor!; - // const cell = editor.document.cellAt(0); + // const cell = editor.notebook.cellAt(0); // assert.strictEqual(cell.outputs.length, 0); // currentKernelProvider.setHasKernels(false); @@ -452,7 +452,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true, 'notebook first'); const editor = vscode.window.activeNotebookEditor!; - const cell = editor.document.cellAt(0); + const cell = editor.notebook.cellAt(0); await vscode.commands.executeCommand('notebook.execute'); assert.strictEqual(cell.outputs.length, 0, 'should not execute'); // not runnable, didn't work @@ -463,7 +463,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true, 'notebook first'); const editor = vscode.window.activeNotebookEditor!; - const cell = editor.document.cellAt(0); + const cell = editor.notebook.cellAt(0); await withEvent(vscode.workspace.onDidChangeNotebookDocument, async (event) => { await vscode.commands.executeCommand('notebook.execute'); @@ -484,7 +484,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('notebook.cell.execute', { start: 0, end: 1 }, resource); await event; assert.strictEqual(cell.outputs.length, 1, 'should execute'); // runnable, it worked - assert.strictEqual(vscode.window.activeNotebookEditor?.document.uri.fsPath, secondResource.fsPath); + assert.strictEqual(vscode.window.activeNotebookEditor?.notebook.uri.fsPath, secondResource.fsPath); }); }); @@ -524,7 +524,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true, 'notebook first'); const editor = vscode.window.activeNotebookEditor!; - const cell = editor.document.cellAt(0); + const cell = editor.notebook.cellAt(0); await withEvent(vscode.workspace.onDidChangeNotebookDocument, async (event) => { await vscode.commands.executeCommand('notebook.execute'); @@ -544,7 +544,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('notebook.execute', resource); await event; assert.strictEqual(cell.outputs.length, 1, 'should execute'); // runnable, it worked - assert.strictEqual(vscode.window.activeNotebookEditor?.document.uri.fsPath, secondResource.fsPath); + assert.strictEqual(vscode.window.activeNotebookEditor?.notebook.uri.fsPath, secondResource.fsPath); }); }); @@ -553,7 +553,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { const editor = await vscode.window.showNotebookDocument(notebook); assert.strictEqual(vscode.window.activeNotebookEditor === editor, true, 'notebook first'); - const cell = editor.document.cellAt(0); + const cell = editor.notebook.cellAt(0); const alternativeKernel = new class extends Kernel { constructor() { @@ -597,7 +597,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { const resource = await createRandomNotebookFile(); await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); const editor = vscode.window.activeNotebookEditor!; - const cell = editor.document.cellAt(0); + const cell = editor.notebook.cellAt(0); vscode.commands.executeCommand('notebook.cell.execute'); let eventCount = 0; @@ -636,8 +636,8 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { const activeCell = getFocusedCell(editor); assert.notStrictEqual(getFocusedCell(editor), undefined); assert.strictEqual(activeCell!.document.getText(), ''); - assert.strictEqual(editor.document.cellCount, 4); - assert.strictEqual(editor.document.getCells().indexOf(activeCell!), 1); + assert.strictEqual(editor.notebook.cellCount, 4); + assert.strictEqual(editor.notebook.getCells().indexOf(activeCell!), 1); await withEvent(vscode.workspace.onDidChangeTextDocument, async event => { const edit = new vscode.WorkspaceEdit(); @@ -645,7 +645,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.workspace.applyEdit(edit); await event; assert.strictEqual(vscode.window.activeNotebookEditor === editor, true); - assert.deepStrictEqual(editor.document.cellAt(1), getFocusedCell(editor)); + assert.deepStrictEqual(editor.notebook.cellAt(1), getFocusedCell(editor)); assert.strictEqual(getFocusedCell(editor)?.document.getText(), 'var abc = 0;'); }); }); @@ -667,8 +667,8 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { // make sure that the previous dirty editor is still restored in the extension host and no data loss assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cellAt(1), getFocusedCell(vscode.window.activeNotebookEditor)); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cellCount, 4); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.notebook.cellAt(1), getFocusedCell(vscode.window.activeNotebookEditor)); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.notebook.cellCount, 4); assert.strictEqual(getFocusedCell(vscode.window.activeNotebookEditor)?.document.getText(), 'var abc = 0;'); }); @@ -692,15 +692,15 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { // switch to the first editor await vscode.window.showNotebookDocument(notebook); assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cellAt(1), getFocusedCell(vscode.window.activeNotebookEditor)); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cellCount, 4); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.notebook.cellAt(1), getFocusedCell(vscode.window.activeNotebookEditor)); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.notebook.cellCount, 4); assert.strictEqual(getFocusedCell(vscode.window.activeNotebookEditor)?.document.getText(), 'var abc = 0;'); // switch to the second editor await vscode.window.showNotebookDocument(secondNotebook); assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cellAt(1), getFocusedCell(vscode.window.activeNotebookEditor)); - assert.deepStrictEqual(vscode.window.activeNotebookEditor?.document.cellCount, 3); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.notebook.cellAt(1), getFocusedCell(vscode.window.activeNotebookEditor)); + assert.deepStrictEqual(vscode.window.activeNotebookEditor?.notebook.cellCount, 3); assert.strictEqual(getFocusedCell(vscode.window.activeNotebookEditor)?.document.getText(), ''); }); @@ -721,7 +721,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { assert.strictEqual(getFocusedCell(vscode.window.activeNotebookEditor!)?.document.languageId, 'typescript'); assert.notStrictEqual(firstNotebookEditor, secondNotebookEditor); - assert.strictEqual(firstNotebookEditor?.document, secondNotebookEditor?.document, 'split notebook editors share the same document'); + assert.strictEqual(firstNotebookEditor?.notebook, secondNotebookEditor?.notebook, 'split notebook editors share the same document'); }); @@ -737,7 +737,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { // await vscode.commands.executeCommand('vscode.open', cell.document.uri, vscode.ViewColumn.Active); assert.strictEqual(!!vscode.window.activeNotebookEditor, true); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.uri.toString(), document.uri.toString()); + assert.strictEqual(vscode.window.activeNotebookEditor!.notebook.uri.toString(), document.uri.toString()); }); test('Cannot open notebook from cell-uri with vscode.open-command', async function () { @@ -752,7 +752,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { // removes the fragment if it matches something numeric. For notebooks that's not wanted... await vscode.commands.executeCommand('vscode.open', cell.document.uri); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.uri.toString(), document.uri.toString()); + assert.strictEqual(vscode.window.activeNotebookEditor!.notebook.uri.toString(), document.uri.toString()); }); test('#97830, #97764. Support switch to other editor types', async function () { @@ -805,15 +805,15 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { await vscode.commands.executeCommand('notebook.cell.copyDown'); await vscode.commands.executeCommand('notebook.cell.edit'); activeCell = getFocusedCell(vscode.window.activeNotebookEditor); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.getCells().indexOf(activeCell!), 1); + assert.strictEqual(vscode.window.activeNotebookEditor!.notebook.getCells().indexOf(activeCell!), 1); assert.strictEqual(activeCell?.document.getText(), 'test'); const edit = new vscode.WorkspaceEdit(); edit.insert(getFocusedCell(vscode.window.activeNotebookEditor)!.document.uri, new vscode.Position(0, 0), 'var abc = 0;'); await vscode.workspace.applyEdit(edit); - assert.strictEqual(vscode.window.activeNotebookEditor!.document.getCells().length, 3); - assert.notStrictEqual(vscode.window.activeNotebookEditor!.document.cellAt(0).document.getText(), vscode.window.activeNotebookEditor!.document.cellAt(1).document.getText()); + assert.strictEqual(vscode.window.activeNotebookEditor!.notebook.getCells().length, 3); + assert.notStrictEqual(vscode.window.activeNotebookEditor!.notebook.cellAt(0).document.getText(), vscode.window.activeNotebookEditor!.notebook.cellAt(1).document.getText()); await closeAllEditors(); }); @@ -876,7 +876,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { const resource = await createRandomNotebookFile(); await vscode.commands.executeCommand('vscode.openWith', resource, 'notebookCoreTest'); const editor = vscode.window.activeNotebookEditor!; - const cell = editor.document.cellAt(0); + const cell = editor.notebook.cellAt(0); assert.strictEqual(cell.executionSummary?.success, undefined); assert.strictEqual(cell.executionSummary?.executionOrder, undefined); @@ -999,7 +999,7 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { const notebook = await openRandomNotebookDocument(); const editor = await vscode.window.showNotebookDocument(notebook); - assert.strictEqual(editor.document.metadata.custom?.testMetadata, false); + assert.strictEqual(editor.notebook.metadata.custom?.testMetadata, false); assert.strictEqual(getFocusedCell(editor)?.metadata.custom?.testCellMetadata, 123); assert.strictEqual(getFocusedCell(editor)?.document.languageId, 'typescript'); }); -- cgit v1.2.3 From 6d91b80dd8d385483383b7bafeb4f7c3fc3c420f Mon Sep 17 00:00:00 2001 From: jram Date: Wed, 8 Jun 2022 10:46:54 -0700 Subject: [npm extension] exclude top level npm_modules when detecting npm scripts in workspaces (#150205) * Check if current folder is a path that should be excluded * update regex to be an exact match --- extensions/npm/src/tasks.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'extensions') diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 47237442d98..accbe0f6bc9 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -12,10 +12,12 @@ import * as path from 'path'; import * as fs from 'fs'; import * as minimatch from 'minimatch'; import * as nls from 'vscode-nls'; +import { Utils } from 'vscode-uri'; import { findPreferredPM } from './preferred-pm'; import { readScripts } from './readScripts'; const localize = nls.loadMessageBundle(); +const excludeRegex = new RegExp('^(node_modules|.vscode-test)$', 'i'); export interface INpmTaskDefinition extends TaskDefinition { script: string; @@ -156,7 +158,7 @@ export async function hasNpmScripts(): Promise { } try { for (const folder of folders) { - if (isAutoDetectionEnabled(folder)) { + if (isAutoDetectionEnabled(folder) && !excludeRegex.test(Utils.basename(folder.uri))) { let relativePattern = new RelativePattern(folder, '**/package.json'); let paths = await workspace.findFiles(relativePattern, '**/node_modules/**'); if (paths.length > 0) { @@ -182,7 +184,7 @@ async function detectNpmScripts(context: ExtensionContext, showWarning: boolean) } try { for (const folder of folders) { - if (isAutoDetectionEnabled(folder)) { + if (isAutoDetectionEnabled(folder) && !excludeRegex.test(Utils.basename(folder.uri))) { let relativePattern = new RelativePattern(folder, '**/package.json'); let paths = await workspace.findFiles(relativePattern, '**/{node_modules,.vscode-test}/**'); for (const path of paths) { @@ -206,6 +208,9 @@ export async function detectNpmScriptsForFolder(context: ExtensionContext, folde let folderTasks: IFolderTaskItem[] = []; try { + if (excludeRegex.test(Utils.basename(folder))) { + return folderTasks; + } let relativePattern = new RelativePattern(folder.fsPath, '**/package.json'); let paths = await workspace.findFiles(relativePattern, '**/node_modules/**'); -- cgit v1.2.3 From 5a32c3ff17eb5cd91e42309c8058812fdd90c83d Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 8 Jun 2022 11:53:06 -0700 Subject: [typescript-language-features] Pass through all `typescript.unstable.*` settings (#151472) Pass through all `typescript.unstable.*` settings --- .../src/languageFeatures/fileConfigurationManager.ts | 1 + 1 file changed, 1 insertion(+) (limited to 'extensions') diff --git a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts index c35aa35aee0..bc0ac10388b 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts @@ -174,6 +174,7 @@ export default class FileConfigurationManager extends Disposable { document); const preferences: Proto.UserPreferences = { + ...config.get('unstable'), quotePreference: this.getQuoteStylePreference(preferencesConfig), importModuleSpecifierPreference: getImportModuleSpecifierPreference(preferencesConfig), importModuleSpecifierEnding: getImportModuleSpecifierEndingPreference(preferencesConfig), -- cgit v1.2.3 From 370dfd5fee7049a9c909ffbd4120bf26dc315002 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 8 Jun 2022 12:06:55 -0700 Subject: Iterate on paste edit provider api (#151477) * Iterate on paste edit provider api For #30066 - Pass all selections to paste providers. For #151326 - Introduce `DocumentPasteEdit` as return type. This new type uses an `insertText` that is applied to every paste location (for multicursor), plus an optional additional edit - Add `DocumentPasteProviderMetadata`. This lets extensions tell us which types of mimetypes they are interested in, letting us avoid round trips if no extensions care about the pasted data * Correctly batch insertText --- .../src/languageFeatures/copyPaste.ts | 14 ++++++++++---- .../src/languageFeatures/dropIntoEditor.ts | 12 ++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'extensions') diff --git a/extensions/markdown-language-features/src/languageFeatures/copyPaste.ts b/extensions/markdown-language-features/src/languageFeatures/copyPaste.ts index d9e939b463c..c36403d06ee 100644 --- a/extensions/markdown-language-features/src/languageFeatures/copyPaste.ts +++ b/extensions/markdown-language-features/src/languageFeatures/copyPaste.ts @@ -4,23 +4,29 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { tryInsertUriList } from './dropIntoEditor'; +import { tryGetUriListSnippet } from './dropIntoEditor'; export function registerPasteProvider(selector: vscode.DocumentSelector) { return vscode.languages.registerDocumentPasteEditProvider(selector, new class implements vscode.DocumentPasteEditProvider { async provideDocumentPasteEdits( document: vscode.TextDocument, - range: vscode.Range, + _ranges: readonly vscode.Range[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken, - ): Promise { + ): Promise { const enabled = vscode.workspace.getConfiguration('markdown', document).get('experimental.editor.pasteLinks.enabled', false); if (!enabled) { return; } - return tryInsertUriList(document, range, dataTransfer, token); + const snippet = await tryGetUriListSnippet(document, dataTransfer, token); + if (snippet) { + return { insertText: snippet }; + } + return undefined; } + }, { + pasteMimeTypes: ['text/uri-list'] }); } diff --git a/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts b/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts index 2ad71ec0516..b451ea40a4e 100644 --- a/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts +++ b/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts @@ -28,16 +28,20 @@ export function registerDropIntoEditor(selector: vscode.DocumentSelector) { async provideDocumentOnDropEdits(document: vscode.TextDocument, position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { const enabled = vscode.workspace.getConfiguration('markdown', document).get('editor.drop.enabled', true); if (!enabled) { - return; + return undefined; } const replacementRange = new vscode.Range(position, position); - return tryInsertUriList(document, replacementRange, dataTransfer, token); + const snippet = await tryGetUriListSnippet(document, dataTransfer, token); + if (snippet) { + return new vscode.SnippetTextEdit(replacementRange, snippet); + } + return undefined; } }); } -export async function tryInsertUriList(document: vscode.TextDocument, replacementRange: vscode.Range, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { +export async function tryGetUriListSnippet(document: vscode.TextDocument, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { const urlList = await dataTransfer.get('text/uri-list')?.asString(); if (!urlList || token.isCancellationRequested) { return undefined; @@ -72,5 +76,5 @@ export async function tryInsertUriList(document: vscode.TextDocument, replacemen } }); - return new vscode.SnippetTextEdit(replacementRange, snippet); + return snippet; } -- cgit v1.2.3 From 48cfaa21875348e6c70610c746a3918f785235b6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 8 Jun 2022 12:20:17 -0700 Subject: Fix rename of paths in markdown reference link definitions (#151545) Fixes #151117 --- .../src/languageFeatures/rename.ts | 2 +- .../src/test/rename.test.ts | 75 ++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) (limited to 'extensions') diff --git a/extensions/markdown-language-features/src/languageFeatures/rename.ts b/extensions/markdown-language-features/src/languageFeatures/rename.ts index db06b7eeb9c..955581b9d97 100644 --- a/extensions/markdown-language-features/src/languageFeatures/rename.ts +++ b/extensions/markdown-language-features/src/languageFeatures/rename.ts @@ -142,7 +142,7 @@ export class MdRenameProvider extends Disposable implements vscode.RenameProvide return this.renameExternalLink(allRefsInfo, newName); } else if (triggerRef.kind === 'header' || (triggerRef.kind === 'link' && triggerRef.link.source.fragmentRange?.contains(position) && (triggerRef.link.kind === 'definition' || triggerRef.link.kind === 'link' && triggerRef.link.href.kind === 'internal'))) { return this.renameFragment(allRefsInfo, newName); - } else if (triggerRef.kind === 'link' && !triggerRef.link.source.fragmentRange?.contains(position) && triggerRef.link.kind === 'link' && triggerRef.link.href.kind === 'internal') { + } else if (triggerRef.kind === 'link' && !triggerRef.link.source.fragmentRange?.contains(position) && (triggerRef.link.kind === 'link' || triggerRef.link.kind === 'definition') && triggerRef.link.href.kind === 'internal') { return this.renameFilePath(triggerRef.link.source.resource, triggerRef.link.href, allRefsInfo, newName); } diff --git a/extensions/markdown-language-features/src/test/rename.test.ts b/extensions/markdown-language-features/src/test/rename.test.ts index 53839071ea4..6560055823d 100644 --- a/extensions/markdown-language-features/src/test/rename.test.ts +++ b/extensions/markdown-language-features/src/test/rename.test.ts @@ -614,4 +614,79 @@ suite('markdown: rename', () => { ] }); }); + + test('Rename on definition path should update all references to path', async () => { + const uri = workspacePath('doc.md'); + const doc = new InMemoryDocument(uri, joinLines( + `[ref text][ref]`, + `[direct](/file)`, + `[ref]: /file`, // rename here + )); + + const workspace = new InMemoryWorkspaceMarkdownDocuments([doc]); + + const preparedInfo = await prepareRename(doc, new vscode.Position(2, 10), workspace); + assert.strictEqual(preparedInfo!.placeholder, '/file'); + assertRangeEqual(preparedInfo!.range, new vscode.Range(2, 7, 2, 12)); + + const edit = await getRenameEdits(doc, new vscode.Position(2, 10), "/newFile", workspace); + assertEditsEqual(edit!, { + uri, edits: [ + new vscode.TextEdit(new vscode.Range(1, 9, 1, 14), '/newFile'), + new vscode.TextEdit(new vscode.Range(2, 7, 2, 12), '/newFile'), + ] + }); + }); + + test('Rename on definition path where file exists should also update file', async () => { + const uri1 = workspacePath('doc.md'); + const doc1 = new InMemoryDocument(uri1, joinLines( + `[ref text][ref]`, + `[direct](/doc2)`, + `[ref]: /doc2`, // rename here + )); + + const uri2 = workspacePath('doc2.md'); + const doc2 = new InMemoryDocument(uri2, joinLines()); + + const workspace = new InMemoryWorkspaceMarkdownDocuments([doc1, doc2]); + + const preparedInfo = await prepareRename(doc1, new vscode.Position(2, 10), workspace); + assert.strictEqual(preparedInfo!.placeholder, '/doc2'); + assertRangeEqual(preparedInfo!.range, new vscode.Range(2, 7, 2, 12)); + + const edit = await getRenameEdits(doc1, new vscode.Position(2, 10), "/new-doc", workspace); + assertEditsEqual(edit!, { + uri: uri1, edits: [ + new vscode.TextEdit(new vscode.Range(1, 9, 1, 14), '/new-doc'), + new vscode.TextEdit(new vscode.Range(2, 7, 2, 12), '/new-doc'), + ] + }, { + originalUri: uri2, + newUri: workspacePath('new-doc.md') + }); + }); + + test('Rename on definition path header should update all references to header', async () => { + const uri = workspacePath('doc.md'); + const doc = new InMemoryDocument(uri, joinLines( + `[ref text][ref]`, + `[direct](/file#header)`, + `[ref]: /file#header`, // rename here + )); + + const workspace = new InMemoryWorkspaceMarkdownDocuments([doc]); + + const preparedInfo = await prepareRename(doc, new vscode.Position(2, 16), workspace); + assert.strictEqual(preparedInfo!.placeholder, 'header'); + assertRangeEqual(preparedInfo!.range, new vscode.Range(2, 13, 2, 19)); + + const edit = await getRenameEdits(doc, new vscode.Position(2, 16), "New Header", workspace); + assertEditsEqual(edit!, { + uri, edits: [ + new vscode.TextEdit(new vscode.Range(1, 15, 1, 21), 'new-header'), + new vscode.TextEdit(new vscode.Range(2, 13, 2, 19), 'new-header'), + ] + }); + }); }); -- cgit v1.2.3 From d7c90c2b2b82df0325cd8e947f7395510b632882 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 8 Jun 2022 14:44:28 -0700 Subject: Update text editor drop proposal (#151552) This updates the text editor drop proposal (#142990). This change introduces `DocumentDropEdit` which removes the need for `SnippetTextEdit`. This interface may also be extended in the future with additional metadata --- .../src/languageFeatures/dropIntoEditor.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'extensions') diff --git a/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts b/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts index b451ea40a4e..01daa70085f 100644 --- a/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts +++ b/extensions/markdown-language-features/src/languageFeatures/dropIntoEditor.ts @@ -25,16 +25,15 @@ const imageFileExtensions = new Set([ export function registerDropIntoEditor(selector: vscode.DocumentSelector) { return vscode.languages.registerDocumentOnDropEditProvider(selector, new class implements vscode.DocumentOnDropEditProvider { - async provideDocumentOnDropEdits(document: vscode.TextDocument, position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { + async provideDocumentOnDropEdits(document: vscode.TextDocument, _position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise { const enabled = vscode.workspace.getConfiguration('markdown', document).get('editor.drop.enabled', true); if (!enabled) { return undefined; } - const replacementRange = new vscode.Range(position, position); const snippet = await tryGetUriListSnippet(document, dataTransfer, token); if (snippet) { - return new vscode.SnippetTextEdit(replacementRange, snippet); + return { insertText: snippet }; } return undefined; } -- cgit v1.2.3