From 23674b2cfe0d34f105acc7c33a699e34e9cbed4e Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Wed, 10 Oct 2018 09:37:51 -0700 Subject: [PATCH] Pretter for each ts file --- .prettierrc | 5 + basic-multi-root-sample/src/extension.ts | 108 +++-- completions-sample/src/extension.ts | 24 +- configuration-sample/src/extension.ts | 120 ++--- contentprovider-sample/src/extension.ts | 7 +- contentprovider-sample/src/provider.ts | 30 +- .../src/referencesDocument.ts | 43 +- decorator-sample/src/extension.ts | 34 +- fsprovider-sample/src/extension.ts | 172 ++++--- fsprovider-sample/src/fileSystemProvider.ts | 336 +++++++------- i18n-sample/src/command/sayBye.ts | 4 +- i18n-sample/src/extension.ts | 10 +- .../previewhtml-sample/src/extension.ts | 22 +- .../client/src/extension.ts | 40 +- .../client/src/test/diagnostics.test.ts | 65 +-- .../client/src/test/helper.ts | 5 +- .../client/src/test/index.ts | 8 +- lsp-log-streaming-sample/server/src/server.ts | 21 +- .../client/src/extension.ts | 75 ++-- lsp-multi-server-sample/server/src/server.ts | 14 +- lsp-sample/client/src/extension.ts | 18 +- .../client/src/test/diagnostics.test.ts | 65 +-- lsp-sample/client/src/test/helper.ts | 5 +- lsp-sample/client/src/test/index.ts | 8 +- lsp-sample/server/src/server.ts | 21 +- multi-diagnostics-sample/src/extension.ts | 48 +- .../src/test/extension.test.ts | 15 +- multi-diagnostics-sample/src/test/index.ts | 6 +- nodefs-provider-sample/src/extension.ts | 423 ++++++++++-------- .../src/test/extension.test.ts | 15 +- nodefs-provider-sample/src/test/index.ts | 6 +- progress-sample/src/extension.ts | 71 +-- quickinput-sample/src/extension.ts | 37 +- quickinput-sample/src/multiStepInput.ts | 97 ++-- quickinput-sample/src/quickOpen.ts | 17 +- .../src/extension.ts | 71 +-- statusbar-sample/src/extension.ts | 21 +- task-provider-sample/src/extension.ts | 10 +- terminal-sample/src/extension.ts | 300 +++++++------ tree-view-sample/src/extension.ts | 19 +- tree-view-sample/src/fileExplorer.ts | 92 ++-- ...ftpExplorer.textDocumentContentProvider.ts | 51 ++- tree-view-sample/src/jsftp.d.ts | 57 ++- tree-view-sample/src/jsonOutline.ts | 83 ++-- tree-view-sample/src/nodeDependencies.ts | 21 +- vim-sample/src/common.ts | 12 +- vim-sample/src/controller.ts | 47 +- vim-sample/src/extension.ts | 25 +- vim-sample/src/mappings.ts | 45 +- vim-sample/src/motions.ts | 34 +- vim-sample/src/operators.ts | 28 +- vim-sample/src/words.ts | 41 +- webpack-sample/src/extension.ts | 9 +- webpack-sample/src/math.ts | 4 +- webview-sample/src/extension.ts | 269 +++++------ 55 files changed, 1755 insertions(+), 1479 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..c090136a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "useTabs": true, + "printWidth": 120, + "singleQuote": true +} \ No newline at end of file diff --git a/basic-multi-root-sample/src/extension.ts b/basic-multi-root-sample/src/extension.ts index 7e383b60..44da7e43 100644 --- a/basic-multi-root-sample/src/extension.ts +++ b/basic-multi-root-sample/src/extension.ts @@ -4,71 +4,81 @@ 'use strict'; -import { ExtensionContext, StatusBarAlignment, window, StatusBarItem, Selection, workspace, TextEditor, commands } from 'vscode'; +import { + ExtensionContext, + StatusBarAlignment, + window, + StatusBarItem, + Selection, + workspace, + TextEditor, + commands +} from 'vscode'; import { basename } from 'path'; export function activate(context: ExtensionContext) { + // Create a status bar item + const status = window.createStatusBarItem(StatusBarAlignment.Left, 1000000); + context.subscriptions.push(status); - // Create a status bar item - const status = window.createStatusBarItem(StatusBarAlignment.Left, 1000000); - context.subscriptions.push(status); + // Update status bar item based on events for multi root folder changes + context.subscriptions.push(workspace.onDidChangeWorkspaceFolders(e => updateStatus(status))); - // Update status bar item based on events for multi root folder changes - context.subscriptions.push(workspace.onDidChangeWorkspaceFolders(e => updateStatus(status))); + // Update status bar item based on events for configuration + context.subscriptions.push(workspace.onDidChangeConfiguration(e => this.updateStatus(status))); - // Update status bar item based on events for configuration - context.subscriptions.push(workspace.onDidChangeConfiguration(e => this.updateStatus(status))); + // Update status bar item based on events around the active editor + context.subscriptions.push(window.onDidChangeActiveTextEditor(e => updateStatus(status))); + context.subscriptions.push(window.onDidChangeTextEditorViewColumn(e => updateStatus(status))); + context.subscriptions.push(workspace.onDidOpenTextDocument(e => updateStatus(status))); + context.subscriptions.push(workspace.onDidCloseTextDocument(e => updateStatus(status))); - // Update status bar item based on events around the active editor - context.subscriptions.push(window.onDidChangeActiveTextEditor(e => updateStatus(status))); - context.subscriptions.push(window.onDidChangeTextEditorViewColumn(e => updateStatus(status))); - context.subscriptions.push(workspace.onDidOpenTextDocument(e => updateStatus(status))); - context.subscriptions.push(workspace.onDidCloseTextDocument(e => updateStatus(status))); - - updateStatus(status); + updateStatus(status); } function updateStatus(status: StatusBarItem): void { - const info = getEditorInfo(); - status.text = info ? info.text : void 0; - status.tooltip = info ? info.tooltip : void 0; - status.color = info ? info.color : void 0; + const info = getEditorInfo(); + status.text = info ? info.text : void 0; + status.tooltip = info ? info.tooltip : void 0; + status.color = info ? info.color : void 0; - if (info) { - status.show(); - } else { - status.hide(); - } + if (info) { + status.show(); + } else { + status.hide(); + } } -function getEditorInfo(): { text: string; tooltip: string; color: string; } { - const editor = window.activeTextEditor; +function getEditorInfo(): { text: string; tooltip: string; color: string } { + const editor = window.activeTextEditor; - // If no workspace is opened or just a single folder, we return without any status label - // because our extension only works when more than one folder is opened in a workspace. - if (!editor || !workspace.workspaceFolders || workspace.workspaceFolders.length < 2) { - return null; - } + // If no workspace is opened or just a single folder, we return without any status label + // because our extension only works when more than one folder is opened in a workspace. + if (!editor || !workspace.workspaceFolders || workspace.workspaceFolders.length < 2) { + return null; + } - let text: string; - let tooltip: string; - let color: string; + let text: string; + let tooltip: string; + let color: string; - // If we have a file:// resource we resolve the WorkspaceFolder this file is from and update - // the status accordingly. - const resource = editor.document.uri; - if (resource.scheme === 'file') { - const folder = workspace.getWorkspaceFolder(resource); - if (!folder) { - text = `$(alert) → ${basename(resource.fsPath)}`; - } else { - text = `$(file-submodule) ${basename(folder.uri.fsPath)} (${folder.index + 1} of ${workspace.workspaceFolders.length}) → $(file-code) ${basename(resource.fsPath)}`; - tooltip = resource.fsPath; + // If we have a file:// resource we resolve the WorkspaceFolder this file is from and update + // the status accordingly. + const resource = editor.document.uri; + if (resource.scheme === 'file') { + const folder = workspace.getWorkspaceFolder(resource); + if (!folder) { + text = `$(alert) → ${basename(resource.fsPath)}`; + } else { + text = `$(file-submodule) ${basename(folder.uri.fsPath)} (${folder.index + 1} of ${ + workspace.workspaceFolders.length + }) → $(file-code) ${basename(resource.fsPath)}`; + tooltip = resource.fsPath; - const multiRootConfigForResource = workspace.getConfiguration('multiRootSample', resource); - color = multiRootConfigForResource.get('statusColor'); - } - } + const multiRootConfigForResource = workspace.getConfiguration('multiRootSample', resource); + color = multiRootConfigForResource.get('statusColor'); + } + } - return { text, tooltip, color }; + return { text, tooltip, color }; } diff --git a/completions-sample/src/extension.ts b/completions-sample/src/extension.ts index 316947b3..bfe12952 100644 --- a/completions-sample/src/extension.ts +++ b/completions-sample/src/extension.ts @@ -7,22 +7,22 @@ import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { - - // The most simple completion item provider which + // The most simple completion item provider which // * registers for text files (`'plaintext'`), and - // * return the 'Hello World' and + // * return the 'Hello World' and // a snippet-based completion item. vscode.languages.registerCompletionItemProvider('plaintext', { - provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) { - return [ - new vscode.CompletionItem('Hello World!'), - createSnippetItem() - ]; + provideCompletionItems( + document: vscode.TextDocument, + position: vscode.Position, + token: vscode.CancellationToken, + context: vscode.CompletionContext + ) { + return [new vscode.CompletionItem('Hello World!'), createSnippetItem()]; } }); function createSnippetItem(): vscode.CompletionItem { - // Read more here: // https://code.visualstudio.com/docs/extensionAPI/vscode-api#CompletionItem // https://code.visualstudio.com/docs/extensionAPI/vscode-api#SnippetString @@ -31,8 +31,10 @@ export function activate(context: vscode.ExtensionContext) { // https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets let item = new vscode.CompletionItem('Good part of the day', vscode.CompletionItemKind.Snippet); - item.insertText = new vscode.SnippetString("Good ${1|morning,afternoon,evening|}. It is ${1}, right?"); - item.documentation = new vscode.MarkdownString("Inserts a snippet that lets you select the _appropriate_ part of the day for your greeting."); + item.insertText = new vscode.SnippetString('Good ${1|morning,afternoon,evening|}. It is ${1}, right?'); + item.documentation = new vscode.MarkdownString( + 'Inserts a snippet that lets you select the _appropriate_ part of the day for your greeting.' + ); return item; } diff --git a/configuration-sample/src/extension.ts b/configuration-sample/src/extension.ts index bb6df742..a9fece7e 100644 --- a/configuration-sample/src/extension.ts +++ b/configuration-sample/src/extension.ts @@ -1,7 +1,6 @@ import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { - // Example 1: Reading Window scoped configuration const configuredView = vscode.workspace.getConfiguration().get('conf.view.showOnWindowOpen'); switch (configuredView) { @@ -24,22 +23,22 @@ export function activate(context: vscode.ExtensionContext) { // Example 2: Updating Window scoped configuration vscode.commands.registerCommand('config.commands.configureViewOnWindowOpen', async () => { - // 1) Getting the value - const value = await vscode.window.showQuickPick(['explorer', 'search', 'scm', 'debug', 'extensions'], { placeHolder: 'Select the view to show when opening a window.' }); + const value = await vscode.window.showQuickPick(['explorer', 'search', 'scm', 'debug', 'extensions'], { + placeHolder: 'Select the view to show when opening a window.' + }); if (vscode.workspace.workspaceFolders) { - // 2) Getting the Configuration target const target = await vscode.window.showQuickPick( [ { label: 'User', description: 'User Settings', target: vscode.ConfigurationTarget.Global }, { label: 'Workspace', description: 'Workspace Settings', target: vscode.ConfigurationTarget.Workspace } ], - { placeHolder: 'Select the view to show when opening a window.' }); + { placeHolder: 'Select the view to show when opening a window.' } + ); if (value && target) { - // 3) Update the configuration value in the target await vscode.workspace.getConfiguration().update('conf.view.showOnWindowOpen', value, target.target); @@ -49,33 +48,31 @@ export function activate(context: vscode.ExtensionContext) { */ } } else { - // 2) Update the configuration value in User Setting in case of no workspace folders - await vscode.workspace.getConfiguration().update('conf.view.showOnWindowOpen', value, vscode.ConfigurationTarget.Global); + await vscode.workspace + .getConfiguration() + .update('conf.view.showOnWindowOpen', value, vscode.ConfigurationTarget.Global); } - - }); // Example 3: Reading Resource scoped configuration for a file - context.subscriptions.push(vscode.workspace.onDidOpenTextDocument(e => { + context.subscriptions.push( + vscode.workspace.onDidOpenTextDocument(e => { + // 1) Get the configured glob pattern value for the current file + const value = vscode.workspace.getConfiguration('', e.uri).get('conf.resource.insertEmptyLastLine'); - // 1) Get the configured glob pattern value for the current file - const value = vscode.workspace.getConfiguration('', e.uri).get('conf.resource.insertEmptyLastLine'); + // 2) Check if the current resource matches the glob pattern + const matches = value[e.fileName]; - // 2) Check if the current resource matches the glob pattern - const matches = value[e.fileName]; - - // 3) If matches, insert empty last line - if (matches) { - vscode.window.showInformationMessage('An empty line will be added to the document ' + e.fileName); - } - - })); + // 3) If matches, insert empty last line + if (matches) { + vscode.window.showInformationMessage('An empty line will be added to the document ' + e.fileName); + } + }) + ); // Example 4: Updating Resource scoped Configuration for current file vscode.commands.registerCommand('config.commands.configureEmptyLastLineCurrentFile', async () => { - if (vscode.window.activeTextEditor) { const currentDocument = vscode.window.activeTextEditor.document; @@ -86,41 +83,46 @@ export function activate(context: vscode.ExtensionContext) { const currentValue = configuration.get('conf.resource.insertEmptyLastLine', {}); // 3) Choose target to Global when there are no workspace folders - const target = vscode.workspace.workspaceFolders ? vscode.ConfigurationTarget.WorkspaceFolder : vscode.ConfigurationTarget.Global; + const target = vscode.workspace.workspaceFolders + ? vscode.ConfigurationTarget.WorkspaceFolder + : vscode.ConfigurationTarget.Global; const value = { ...currentValue, ...{ [currentDocument.fileName]: true } }; // 4) Update the configuration - await configuration.update('conf.resource.insertEmptyLastLine', value, target) + await configuration.update('conf.resource.insertEmptyLastLine', value, target); } - }); // Example 5: Updating Resource scoped Configuration vscode.commands.registerCommand('config.commands.configureEmptyLastLineFiles', async () => { - // 1) Getting the value - const value = await vscode.window.showInputBox({ prompt: 'Provide glob pattern of files to have empty last line.' }); + const value = await vscode.window.showInputBox({ + prompt: 'Provide glob pattern of files to have empty last line.' + }); if (vscode.workspace.workspaceFolders) { - // 2) Getting the target const target = await vscode.window.showQuickPick( [ { label: 'Application', description: 'User Settings', target: vscode.ConfigurationTarget.Global }, { label: 'Workspace', description: 'Workspace Settings', target: vscode.ConfigurationTarget.Workspace }, - { label: 'Workspace Folder', description: 'Workspace Folder Settings', target: vscode.ConfigurationTarget.WorkspaceFolder } + { + label: 'Workspace Folder', + description: 'Workspace Folder Settings', + target: vscode.ConfigurationTarget.WorkspaceFolder + } ], - { placeHolder: 'Select the target to which this setting should be applied' }); + { placeHolder: 'Select the target to which this setting should be applied' } + ); if (value && target) { - if (target.target === vscode.ConfigurationTarget.WorkspaceFolder) { - // 3) Getting the workspace folder - let workspaceFolder = await vscode.window.showWorkspaceFolderPick({ placeHolder: 'Pick Workspace Folder to which this setting should be applied' }) + let workspaceFolder = await vscode.window.showWorkspaceFolderPick({ + placeHolder: 'Pick Workspace Folder to which this setting should be applied' + }); if (workspaceFolder) { - // 4) Get the configuration for the workspace folder const configuration = vscode.workspace.getConfiguration('', workspaceFolder.uri); @@ -133,7 +135,6 @@ export function activate(context: vscode.ExtensionContext) { await configuration.update('conf.resource.insertEmptyLastLine', newValue, target.target); } } else { - // 3) Get the configuration const configuration = vscode.workspace.getConfiguration(); @@ -143,11 +144,12 @@ export function activate(context: vscode.ExtensionContext) { const newValue = { ...currentValue, ...{ [value]: true } }; // 3) Update the value in the target - await vscode.workspace.getConfiguration().update('conf.resource.insertEmptyLastLine', newValue, target.target); + await vscode.workspace + .getConfiguration() + .update('conf.resource.insertEmptyLastLine', newValue, target.target); } } } else { - // 2) Get the configuration const configuration = vscode.workspace.getConfiguration(); @@ -157,31 +159,35 @@ export function activate(context: vscode.ExtensionContext) { const newValue = { ...currentValue, ...{ [value]: true } }; // 4) Update the value in the User Settings - await vscode.workspace.getConfiguration().update('conf.resource.insertEmptyLastLine', newValue, vscode.ConfigurationTarget.Global); + await vscode.workspace + .getConfiguration() + .update('conf.resource.insertEmptyLastLine', newValue, vscode.ConfigurationTarget.Global); } }); // Example 6: Listening to configuration changes - context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(e => { + context.subscriptions.push( + vscode.workspace.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('conf.resource.insertEmptyLastLine')) { + if (vscode.window.activeTextEditor) { + const currentDocument = vscode.window.activeTextEditor.document; - if (e.affectsConfiguration('conf.resource.insertEmptyLastLine')) { - if (vscode.window.activeTextEditor) { + // 1) Get the configured glob pattern value for the current file + const value = vscode.workspace + .getConfiguration('', currentDocument.uri) + .get('conf.resource.insertEmptyLastLine'); - const currentDocument = vscode.window.activeTextEditor.document; + // 2) Check if the current resource matches the glob pattern + const matches = value[currentDocument.fileName]; - // 1) Get the configured glob pattern value for the current file - const value = vscode.workspace.getConfiguration('', currentDocument.uri).get('conf.resource.insertEmptyLastLine'); - - // 2) Check if the current resource matches the glob pattern - const matches = value[currentDocument.fileName]; - - // 3) If matches, insert empty last line - if (matches) { - vscode.window.showInformationMessage('An empty line will be added to the document ' + currentDocument.fileName); + // 3) If matches, insert empty last line + if (matches) { + vscode.window.showInformationMessage( + 'An empty line will be added to the document ' + currentDocument.fileName + ); + } } } - } - - })); - -} \ No newline at end of file + }) + ); +} diff --git a/contentprovider-sample/src/extension.ts b/contentprovider-sample/src/extension.ts index 97b0dafd..d31b6bc6 100644 --- a/contentprovider-sample/src/extension.ts +++ b/contentprovider-sample/src/extension.ts @@ -7,7 +7,6 @@ import { workspace, languages, window, commands, ExtensionContext, Disposable } import ContentProvider, { encodeLocation } from './provider'; export function activate(context: ExtensionContext) { - const provider = new ContentProvider(); // register content provider for scheme `references` @@ -24,9 +23,5 @@ export function activate(context: ExtensionContext) { return workspace.openTextDocument(uri).then(doc => window.showTextDocument(doc, editor.viewColumn + 1)); }); - context.subscriptions.push( - provider, - commandRegistration, - providerRegistrations - ); + context.subscriptions.push(provider, commandRegistration, providerRegistrations); } diff --git a/contentprovider-sample/src/provider.ts b/contentprovider-sample/src/provider.ts index 49160d9c..19b99b40 100644 --- a/contentprovider-sample/src/provider.ts +++ b/contentprovider-sample/src/provider.ts @@ -7,7 +7,6 @@ import * as vscode from 'vscode'; import ReferencesDocument from './referencesDocument'; export default class Provider implements vscode.TextDocumentContentProvider, vscode.DocumentLinkProvider { - static scheme = 'references'; private _onDidChange = new vscode.EventEmitter(); @@ -16,7 +15,6 @@ export default class Provider implements vscode.TextDocumentContentProvider, vsc private _subscriptions: vscode.Disposable; constructor() { - // Listen to the `closeTextDocument`-event which means we must // clear the corresponding model object - `ReferencesDocument` this._subscriptions = vscode.workspace.onDidCloseTextDocument(doc => this._documents.delete(doc.uri.toString())); @@ -39,7 +37,6 @@ export default class Provider implements vscode.TextDocumentContentProvider, vsc // resolves its content by (1) running the reference search command // and (2) formatting the results provideTextDocumentContent(uri: vscode.Uri): string | Thenable { - // already loaded? let document = this._documents.get(uri.toString()); if (document) { @@ -51,18 +48,21 @@ export default class Provider implements vscode.TextDocumentContentProvider, vsc // From the result create a references document which is in charge of loading, // printing, and formatting references const [target, pos] = decodeLocation(uri); - return vscode.commands.executeCommand('vscode.executeReferenceProvider', target, pos).then(locations => { + return vscode.commands + .executeCommand('vscode.executeReferenceProvider', target, pos) + .then(locations => { + // sort by locations and shuffle to begin from target resource + let idx = 0; + locations + .sort(Provider._compareLocations) + .find((loc, i) => loc.uri.toString() === target.toString() && (idx = i) && true); + locations.push(...locations.splice(0, idx)); - // sort by locations and shuffle to begin from target resource - let idx = 0; - locations.sort(Provider._compareLocations).find((loc, i) => loc.uri.toString() === target.toString() && (idx = i) && true); - locations.push(...locations.splice(0, idx)); - - // create document and return its early state - let document = new ReferencesDocument(uri, locations, this._onDidChange); - this._documents.set(uri.toString(), document); - return document.value; - }); + // create document and return its early state + let document = new ReferencesDocument(uri, locations, this._onDidChange); + this._documents.set(uri.toString(), document); + return document.value; + }); } private static _compareLocations(a: vscode.Location, b: vscode.Location): number { @@ -71,7 +71,7 @@ export default class Provider implements vscode.TextDocumentContentProvider, vsc } else if (a.uri.toString() > b.uri.toString()) { return 1; } else { - return a.range.start.compareTo(b.range.start) + return a.range.start.compareTo(b.range.start); } } diff --git a/contentprovider-sample/src/referencesDocument.ts b/contentprovider-sample/src/referencesDocument.ts index beb4c91f..e3cc16c1 100644 --- a/contentprovider-sample/src/referencesDocument.ts +++ b/contentprovider-sample/src/referencesDocument.ts @@ -6,7 +6,6 @@ import * as vscode from 'vscode'; export default class ReferencesDocument { - private _uri: vscode.Uri; private _emitter: vscode.EventEmitter; private _locations: vscode.Location[]; @@ -42,18 +41,15 @@ export default class ReferencesDocument { } private _populate() { - if (this._locations.length === 0) { return; } // fetch one by one, update doc asap return new Promise(resolve => { - let index = 0; let next = () => { - // We have seen all groups if (index >= this._locations.length) { resolve(this); @@ -81,34 +77,36 @@ export default class ReferencesDocument { this._emitter.fire(this._uri); next(); }); - } + }; next(); }); } private _fetchAndFormatLocations(uri: vscode.Uri, ranges: vscode.Range[]): PromiseLike { - // Fetch the document denoted by the uri and format the matches // with leading and trailing content form the document. Make sure // to not duplicate lines - return vscode.workspace.openTextDocument(uri).then(doc => { + return vscode.workspace.openTextDocument(uri).then( + doc => { + this._lines.push('', uri.toString()); - this._lines.push('', uri.toString()); - - for (let i = 0; i < ranges.length; i++) { - const {start: {line}} = ranges[i]; - this._appendLeading(doc, line, ranges[i - 1]); - this._appendMatch(doc, line, ranges[i], uri); - this._appendTrailing(doc, line, ranges[i + 1]); + for (let i = 0; i < ranges.length; i++) { + const { + start: { line } + } = ranges[i]; + this._appendLeading(doc, line, ranges[i - 1]); + this._appendMatch(doc, line, ranges[i], uri); + this._appendTrailing(doc, line, ranges[i + 1]); + } + }, + err => { + this._lines.push('', `Failed to load '${uri.toString()}'\n\n${String(err)}`, ''); } - - }, err => { - this._lines.push('', `Failed to load '${uri.toString()}'\n\n${String(err)}`, ''); - }); + ); } private _appendLeading(doc: vscode.TextDocument, line: number, previous: vscode.Range): void { - let from = Math.max(0, line - 3, previous && previous.end.line || 0); + let from = Math.max(0, line - 3, (previous && previous.end.line) || 0); while (++from < line) { const text = doc.lineAt(from).text; this._lines.push(` ${from + 1}` + (text && ` ${text}`)); @@ -124,7 +122,12 @@ export default class ReferencesDocument { const len = this._lines.push(preamble + text); // Create a document link that will reveal the reference - const linkRange = new vscode.Range(len - 1, preamble.length + match.start.character, len - 1, preamble.length + match.end.character); + const linkRange = new vscode.Range( + len - 1, + preamble.length + match.start.character, + len - 1, + preamble.length + match.end.character + ); const linkTarget = target.with({ fragment: String(1 + match.start.line) }); this._links.push(new vscode.DocumentLink(linkRange, linkTarget)); } diff --git a/decorator-sample/src/extension.ts b/decorator-sample/src/extension.ts index 5f746f56..1f9d3008 100644 --- a/decorator-sample/src/extension.ts +++ b/decorator-sample/src/extension.ts @@ -2,7 +2,6 @@ import * as vscode from 'vscode'; // this method is called when vs code is activated export function activate(context: vscode.ExtensionContext) { - console.log('decorator sample is activated'); // create a decorator type that we use to decorate small numbers @@ -32,18 +31,26 @@ export function activate(context: vscode.ExtensionContext) { triggerUpdateDecorations(); } - vscode.window.onDidChangeActiveTextEditor(editor => { - activeEditor = editor; - if (editor) { - triggerUpdateDecorations(); - } - }, null, context.subscriptions); + vscode.window.onDidChangeActiveTextEditor( + editor => { + activeEditor = editor; + if (editor) { + triggerUpdateDecorations(); + } + }, + null, + context.subscriptions + ); - vscode.workspace.onDidChangeTextDocument(event => { - if (activeEditor && event.document === activeEditor.document) { - triggerUpdateDecorations(); - } - }, null, context.subscriptions); + vscode.workspace.onDidChangeTextDocument( + event => { + if (activeEditor && event.document === activeEditor.document) { + triggerUpdateDecorations(); + } + }, + null, + context.subscriptions + ); var timeout = null; function triggerUpdateDecorations() { @@ -62,7 +69,7 @@ export function activate(context: vscode.ExtensionContext) { const smallNumbers: vscode.DecorationOptions[] = []; const largeNumbers: vscode.DecorationOptions[] = []; let match; - while (match = regEx.exec(text)) { + while ((match = regEx.exec(text))) { const startPos = activeEditor.document.positionAt(match.index); const endPos = activeEditor.document.positionAt(match.index + match[0].length); const decoration = { range: new vscode.Range(startPos, endPos), hoverMessage: 'Number **' + match[0] + '**' }; @@ -76,4 +83,3 @@ export function activate(context: vscode.ExtensionContext) { activeEditor.setDecorations(largeNumberDecorationType, largeNumbers); } } - diff --git a/fsprovider-sample/src/extension.ts b/fsprovider-sample/src/extension.ts index 299e9f99..c420dde6 100644 --- a/fsprovider-sample/src/extension.ts +++ b/fsprovider-sample/src/extension.ts @@ -5,69 +5,131 @@ import * as fs from 'fs'; import { MemFS } from './fileSystemProvider'; export function activate(context: vscode.ExtensionContext) { + console.log('MemFS says "Hello"'); - console.log('MemFS says "Hello"') + const memFs = new MemFS(); + context.subscriptions.push(vscode.workspace.registerFileSystemProvider('memfs', memFs, { isCaseSensitive: true })); + let initialized = false; - const memFs = new MemFS(); - context.subscriptions.push(vscode.workspace.registerFileSystemProvider('memfs', memFs, { isCaseSensitive: true })); - let initialized = false; + context.subscriptions.push( + vscode.commands.registerCommand('memfs.reset', _ => { + for (const [name] of memFs.readDirectory(vscode.Uri.parse('memfs:/'))) { + memFs.delete(vscode.Uri.parse(`memfs:/${name}`)); + } + initialized = false; + }) + ); - context.subscriptions.push(vscode.commands.registerCommand('memfs.reset', _ => { - for (const [name] of memFs.readDirectory(vscode.Uri.parse('memfs:/'))) { - memFs.delete(vscode.Uri.parse(`memfs:/${name}`)); - } - initialized = false; - })); + context.subscriptions.push( + vscode.commands.registerCommand('memfs.init', _ => { + if (initialized) { + return; + } + initialized = true; - context.subscriptions.push(vscode.commands.registerCommand('memfs.init', _ => { - if (initialized) { - return; - } - initialized = true; + // most common files types + memFs.writeFile(vscode.Uri.parse(`memfs:/file.txt`), Buffer.from('foo'), { create: true, overwrite: true }); + memFs.writeFile( + vscode.Uri.parse(`memfs:/file.html`), + Buffer.from('

Hello

'), + { create: true, overwrite: true } + ); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.js`), Buffer.from('console.log("JavaScript")'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.json`), Buffer.from('{ "json": true }'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.ts`), Buffer.from('console.log("TypeScript")'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.css`), Buffer.from('* { color: green; }'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.md`), Buffer.from('Hello _World_'), { + create: true, + overwrite: true + }); + memFs.writeFile( + vscode.Uri.parse(`memfs:/file.xml`), + Buffer.from(''), + { create: true, overwrite: true } + ); + memFs.writeFile( + vscode.Uri.parse(`memfs:/file.py`), + Buffer.from('import base64, sys; base64.decode(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))'), + { create: true, overwrite: true } + ); + memFs.writeFile( + vscode.Uri.parse(`memfs:/file.php`), + Buffer.from("&1'); ?>"), + { create: true, overwrite: true } + ); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.yaml`), Buffer.from('- just: write something'), { + create: true, + overwrite: true + }); - // most common files types - memFs.writeFile(vscode.Uri.parse(`memfs:/file.txt`), Buffer.from('foo'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.html`), Buffer.from('

Hello

'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.js`), Buffer.from('console.log("JavaScript")'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.json`), Buffer.from('{ "json": true }'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.ts`), Buffer.from('console.log("TypeScript")'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.css`), Buffer.from('* { color: green; }'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.md`), Buffer.from('Hello _World_'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.xml`), Buffer.from(''), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.py`), Buffer.from('import base64, sys; base64.decode(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.php`), Buffer.from('&1\'); ?>'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.yaml`), Buffer.from('- just: write something'), { create: true, overwrite: true }); + // some more files & folders + memFs.createDirectory(vscode.Uri.parse(`memfs:/folder/`)); + memFs.createDirectory(vscode.Uri.parse(`memfs:/large/`)); + memFs.createDirectory(vscode.Uri.parse(`memfs:/xyz/`)); + memFs.createDirectory(vscode.Uri.parse(`memfs:/xyz/abc`)); + memFs.createDirectory(vscode.Uri.parse(`memfs:/xyz/def`)); - // some more files & folders - memFs.createDirectory(vscode.Uri.parse(`memfs:/folder/`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/large/`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/xyz/`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/xyz/abc`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/xyz/def`)); + memFs.writeFile(vscode.Uri.parse(`memfs:/folder/empty.txt`), new Uint8Array(0), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/folder/empty.foo`), new Uint8Array(0), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/folder/file.ts`), Buffer.from('let a:number = true; console.log(a);'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/large/rnd.foo`), randomData(50000), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/UPPER.txt`), Buffer.from('UPPER'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/upper.txt`), Buffer.from('upper'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.md`), Buffer.from('*MemFS*'), { + create: true, + overwrite: true + }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.bin`), Buffer.from([0, 0, 0, 1, 7, 0, 0, 1, 1]), { + create: true, + overwrite: true + }); + }) + ); - memFs.writeFile(vscode.Uri.parse(`memfs:/folder/empty.txt`), new Uint8Array(0), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/folder/empty.foo`), new Uint8Array(0), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/folder/file.ts`), Buffer.from('let a:number = true; console.log(a);'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/large/rnd.foo`), randomData(50000), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/UPPER.txt`), Buffer.from('UPPER'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/upper.txt`), Buffer.from('upper'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.md`), Buffer.from('*MemFS*'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.bin`), Buffer.from([0, 0, 0, 1, 7, 0, 0, 1, 1]), { create: true, overwrite: true }); - })); - - context.subscriptions.push(vscode.commands.registerCommand('memfs.workspaceInit', _ => { - vscode.workspace.updateWorkspaceFolders(0, 0, { uri: vscode.Uri.parse('memfs:/'), name: "MemFS - Sample" }); - })); + context.subscriptions.push( + vscode.commands.registerCommand('memfs.workspaceInit', _ => { + vscode.workspace.updateWorkspaceFolders(0, 0, { uri: vscode.Uri.parse('memfs:/'), name: 'MemFS - Sample' }); + }) + ); } function randomData(lineCnt: number, lineLen = 155): Buffer { - let lines: string[] = []; - for (let i = 0; i < lineCnt; i++) { - let line = ''; - while (line.length < lineLen) { - line += Math.random().toString(2 + (i % 34)).substr(2); - } - lines.push(line.substr(0, lineLen)); - } - return Buffer.from(lines.join('\n'), 'utf8'); + let lines: string[] = []; + for (let i = 0; i < lineCnt; i++) { + let line = ''; + while (line.length < lineLen) { + line += Math.random() + .toString(2 + (i % 34)) + .substr(2); + } + lines.push(line.substr(0, lineLen)); + } + return Buffer.from(lines.join('\n'), 'utf8'); } diff --git a/fsprovider-sample/src/fileSystemProvider.ts b/fsprovider-sample/src/fileSystemProvider.ts index 68844887..f7b601ce 100644 --- a/fsprovider-sample/src/fileSystemProvider.ts +++ b/fsprovider-sample/src/fileSystemProvider.ts @@ -11,212 +11,208 @@ import * as path from 'path'; import { workspace } from 'vscode'; export class File implements vscode.FileStat { + type: vscode.FileType; + ctime: number; + mtime: number; + size: number; - type: vscode.FileType; - ctime: number; - mtime: number; - size: number; + name: string; + data: Uint8Array; - name: string; - data: Uint8Array; - - constructor(name: string) { - this.type = vscode.FileType.File; - this.ctime = Date.now(); - this.mtime = Date.now(); - this.size = 0; - this.name = name; - } + constructor(name: string) { + this.type = vscode.FileType.File; + this.ctime = Date.now(); + this.mtime = Date.now(); + this.size = 0; + this.name = name; + } } export class Directory implements vscode.FileStat { + type: vscode.FileType; + ctime: number; + mtime: number; + size: number; - type: vscode.FileType; - ctime: number; - mtime: number; - size: number; + name: string; + entries: Map; - name: string; - entries: Map; - - constructor(name: string) { - this.type = vscode.FileType.Directory; - this.ctime = Date.now(); - this.mtime = Date.now(); - this.size = 0; - this.name = name; - this.entries = new Map(); - } + constructor(name: string) { + this.type = vscode.FileType.Directory; + this.ctime = Date.now(); + this.mtime = Date.now(); + this.size = 0; + this.name = name; + this.entries = new Map(); + } } export type Entry = File | Directory; export class MemFS implements vscode.FileSystemProvider { + root = new Directory(''); - root = new Directory(''); + // --- manage file metadata - // --- manage file metadata + stat(uri: vscode.Uri): vscode.FileStat { + return this._lookup(uri, false); + } - stat(uri: vscode.Uri): vscode.FileStat { - return this._lookup(uri, false); - } + readDirectory(uri: vscode.Uri): [string, vscode.FileType][] { + const entry = this._lookupAsDirectory(uri, false); + let result: [string, vscode.FileType][] = []; + for (const [name, child] of entry.entries) { + result.push([name, child.type]); + } + return result; + } - readDirectory(uri: vscode.Uri): [string, vscode.FileType][] { - const entry = this._lookupAsDirectory(uri, false); - let result: [string, vscode.FileType][] = []; - for (const [name, child] of entry.entries) { - result.push([name, child.type]); - } - return result; - } + // --- manage file contents - // --- manage file contents + readFile(uri: vscode.Uri): Uint8Array { + return this._lookupAsFile(uri, false).data; + } - readFile(uri: vscode.Uri): Uint8Array { - return this._lookupAsFile(uri, false).data; - } + writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean }): void { + let basename = path.posix.basename(uri.path); + let parent = this._lookupParentDirectory(uri); + let entry = parent.entries.get(basename); + if (entry instanceof Directory) { + throw vscode.FileSystemError.FileIsADirectory(uri); + } + if (!entry && !options.create) { + throw vscode.FileSystemError.FileNotFound(uri); + } + if (entry && options.create && !options.overwrite) { + throw vscode.FileSystemError.FileExists(uri); + } + if (!entry) { + entry = new File(basename); + parent.entries.set(basename, entry); + this._fireSoon({ type: vscode.FileChangeType.Created, uri }); + } + entry.mtime = Date.now(); + entry.size = content.byteLength; + entry.data = content; - writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void { - let basename = path.posix.basename(uri.path); - let parent = this._lookupParentDirectory(uri); - let entry = parent.entries.get(basename); - if (entry instanceof Directory) { - throw vscode.FileSystemError.FileIsADirectory(uri); - } - if (!entry && !options.create) { - throw vscode.FileSystemError.FileNotFound(uri); - } - if (entry && options.create && !options.overwrite) { - throw vscode.FileSystemError.FileExists(uri); - } - if (!entry) { - entry = new File(basename); - parent.entries.set(basename, entry); - this._fireSoon({ type: vscode.FileChangeType.Created, uri }); - } - entry.mtime = Date.now(); - entry.size = content.byteLength; - entry.data = content; + this._fireSoon({ type: vscode.FileChangeType.Changed, uri }); + } - this._fireSoon({ type: vscode.FileChangeType.Changed, uri }); - } + // --- manage files/folders - // --- manage files/folders + rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean }): void { + if (!options.overwrite && this._lookup(newUri, true)) { + throw vscode.FileSystemError.FileExists(newUri); + } - rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean }): void { + let entry = this._lookup(oldUri, false); + let oldParent = this._lookupParentDirectory(oldUri); - if (!options.overwrite && this._lookup(newUri, true)) { - throw vscode.FileSystemError.FileExists(newUri); - } + let newParent = this._lookupParentDirectory(newUri); + let newName = path.posix.basename(newUri.path); - let entry = this._lookup(oldUri, false); - let oldParent = this._lookupParentDirectory(oldUri); + oldParent.entries.delete(entry.name); + entry.name = newName; + newParent.entries.set(newName, entry); - let newParent = this._lookupParentDirectory(newUri); - let newName = path.posix.basename(newUri.path); + this._fireSoon( + { type: vscode.FileChangeType.Deleted, uri: oldUri }, + { type: vscode.FileChangeType.Created, uri: newUri } + ); + } - oldParent.entries.delete(entry.name); - entry.name = newName; - newParent.entries.set(newName, entry); + delete(uri: vscode.Uri): void { + let dirname = uri.with({ path: path.posix.dirname(uri.path) }); + let basename = path.posix.basename(uri.path); + let parent = this._lookupAsDirectory(dirname, false); + if (!parent.entries.has(basename)) { + throw vscode.FileSystemError.FileNotFound(uri); + } + parent.entries.delete(basename); + parent.mtime = Date.now(); + parent.size -= 1; + this._fireSoon({ type: vscode.FileChangeType.Changed, uri: dirname }, { uri, type: vscode.FileChangeType.Deleted }); + } - this._fireSoon( - { type: vscode.FileChangeType.Deleted, uri: oldUri }, - { type: vscode.FileChangeType.Created, uri: newUri } - ); - } + createDirectory(uri: vscode.Uri): void { + let basename = path.posix.basename(uri.path); + let dirname = uri.with({ path: path.posix.dirname(uri.path) }); + let parent = this._lookupAsDirectory(dirname, false); - delete(uri: vscode.Uri): void { - let dirname = uri.with({ path: path.posix.dirname(uri.path) }); - let basename = path.posix.basename(uri.path); - let parent = this._lookupAsDirectory(dirname, false); - if (!parent.entries.has(basename)) { - throw vscode.FileSystemError.FileNotFound(uri); - } - parent.entries.delete(basename); - parent.mtime = Date.now(); - parent.size -= 1; - this._fireSoon({ type: vscode.FileChangeType.Changed, uri: dirname }, { uri, type: vscode.FileChangeType.Deleted }); - } + let entry = new Directory(basename); + parent.entries.set(entry.name, entry); + parent.mtime = Date.now(); + parent.size += 1; + this._fireSoon({ type: vscode.FileChangeType.Changed, uri: dirname }, { type: vscode.FileChangeType.Created, uri }); + } - createDirectory(uri: vscode.Uri): void { - let basename = path.posix.basename(uri.path); - let dirname = uri.with({ path: path.posix.dirname(uri.path) }); - let parent = this._lookupAsDirectory(dirname, false); + // --- lookup - let entry = new Directory(basename); - parent.entries.set(entry.name, entry); - parent.mtime = Date.now(); - parent.size += 1; - this._fireSoon({ type: vscode.FileChangeType.Changed, uri: dirname }, { type: vscode.FileChangeType.Created, uri }); - } + private _lookup(uri: vscode.Uri, silent: false): Entry; + private _lookup(uri: vscode.Uri, silent: boolean): Entry | undefined; + private _lookup(uri: vscode.Uri, silent: boolean): Entry | undefined { + let parts = uri.path.split('/'); + let entry: Entry = this.root; + for (const part of parts) { + if (!part) { + continue; + } + let child: Entry | undefined; + if (entry instanceof Directory) { + child = entry.entries.get(part); + } + if (!child) { + if (!silent) { + throw vscode.FileSystemError.FileNotFound(uri); + } else { + return undefined; + } + } + entry = child; + } + return entry; + } - // --- lookup + private _lookupAsDirectory(uri: vscode.Uri, silent: boolean): Directory { + let entry = this._lookup(uri, silent); + if (entry instanceof Directory) { + return entry; + } + throw vscode.FileSystemError.FileNotADirectory(uri); + } - private _lookup(uri: vscode.Uri, silent: false): Entry; - private _lookup(uri: vscode.Uri, silent: boolean): Entry | undefined; - private _lookup(uri: vscode.Uri, silent: boolean): Entry | undefined { - let parts = uri.path.split('/'); - let entry: Entry = this.root; - for (const part of parts) { - if (!part) { - continue; - } - let child: Entry | undefined; - if (entry instanceof Directory) { - child = entry.entries.get(part); - } - if (!child) { - if (!silent) { - throw vscode.FileSystemError.FileNotFound(uri); - } else { - return undefined; - } - } - entry = child; - } - return entry; - } + private _lookupAsFile(uri: vscode.Uri, silent: boolean): File { + let entry = this._lookup(uri, silent); + if (entry instanceof File) { + return entry; + } + throw vscode.FileSystemError.FileIsADirectory(uri); + } - private _lookupAsDirectory(uri: vscode.Uri, silent: boolean): Directory { - let entry = this._lookup(uri, silent); - if (entry instanceof Directory) { - return entry; - } - throw vscode.FileSystemError.FileNotADirectory(uri); - } + private _lookupParentDirectory(uri: vscode.Uri): Directory { + const dirname = uri.with({ path: path.posix.dirname(uri.path) }); + return this._lookupAsDirectory(dirname, false); + } - private _lookupAsFile(uri: vscode.Uri, silent: boolean): File { - let entry = this._lookup(uri, silent); - if (entry instanceof File) { - return entry; - } - throw vscode.FileSystemError.FileIsADirectory(uri); - } + // --- manage file events - private _lookupParentDirectory(uri: vscode.Uri): Directory { - const dirname = uri.with({ path: path.posix.dirname(uri.path) }); - return this._lookupAsDirectory(dirname, false); - } + private _emitter = new vscode.EventEmitter(); + private _bufferedEvents: vscode.FileChangeEvent[] = []; + private _fireSoonHandle: NodeJS.Timer; - // --- manage file events + readonly onDidChangeFile: vscode.Event = this._emitter.event; - private _emitter = new vscode.EventEmitter(); - private _bufferedEvents: vscode.FileChangeEvent[] = []; - private _fireSoonHandle: NodeJS.Timer; + watch(resource: vscode.Uri, opts): vscode.Disposable { + // ignore, fires for all changes... + return new vscode.Disposable(() => {}); + } - readonly onDidChangeFile: vscode.Event = this._emitter.event; - - watch(resource: vscode.Uri, opts): vscode.Disposable { - // ignore, fires for all changes... - return new vscode.Disposable(() => { }); - } - - private _fireSoon(...events: vscode.FileChangeEvent[]): void { - this._bufferedEvents.push(...events); - clearTimeout(this._fireSoonHandle); - this._fireSoonHandle = setTimeout(() => { - this._emitter.fire(this._bufferedEvents); - this._bufferedEvents.length = 0; - }, 5); - } + private _fireSoon(...events: vscode.FileChangeEvent[]): void { + this._bufferedEvents.push(...events); + clearTimeout(this._fireSoonHandle); + this._fireSoonHandle = setTimeout(() => { + this._emitter.fire(this._bufferedEvents); + this._bufferedEvents.length = 0; + }, 5); + } } diff --git a/i18n-sample/src/command/sayBye.ts b/i18n-sample/src/command/sayBye.ts index 5c9a636f..94e71720 100644 --- a/i18n-sample/src/command/sayBye.ts +++ b/i18n-sample/src/command/sayBye.ts @@ -9,6 +9,6 @@ import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); export function sayByeCommand() { - const message = localize('sayBye.text', 'Bye') + const message = localize('sayBye.text', 'Bye'); vscode.window.showInformationMessage(message); -} \ No newline at end of file +} diff --git a/i18n-sample/src/extension.ts b/i18n-sample/src/extension.ts index c48a15b4..cf4c5e75 100644 --- a/i18n-sample/src/extension.ts +++ b/i18n-sample/src/extension.ts @@ -11,17 +11,13 @@ import { sayByeCommand } from './command/sayBye'; export function activate(context: vscode.ExtensionContext) { const helloCmd = vscode.commands.registerCommand('extension.sayHello', () => { - const message = localize('sayHello.text', 'Hello') + const message = localize('sayHello.text', 'Hello'); vscode.window.showInformationMessage(message); }); - const byeCmd = vscode.commands.registerCommand( - 'extension.sayBye', - sayByeCommand - ); + const byeCmd = vscode.commands.registerCommand('extension.sayBye', sayByeCommand); context.subscriptions.push(helloCmd, byeCmd); } -export function deactivate() { -} +export function deactivate() {} diff --git a/legacy-samples/previewhtml-sample/src/extension.ts b/legacy-samples/previewhtml-sample/src/extension.ts index edba3985..0d637e7b 100644 --- a/legacy-samples/previewhtml-sample/src/extension.ts +++ b/legacy-samples/previewhtml-sample/src/extension.ts @@ -6,7 +6,6 @@ import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { - let previewUri = vscode.Uri.parse('css-preview://authority/css-preview'); class TextDocumentContentProvider implements vscode.TextDocumentContentProvider { @@ -27,7 +26,7 @@ export function activate(context: vscode.ExtensionContext) { private createCssSnippet() { let editor = vscode.window.activeTextEditor; if (!(editor.document.languageId === 'css')) { - return this.errorSnippet("Active editor doesn't show a CSS document - no properties to preview.") + return this.errorSnippet("Active editor doesn't show a CSS document - no properties to preview."); } return this.extractSnippet(); } @@ -61,7 +60,9 @@ export function activate(context: vscode.ExtensionContext) { } -
Preview of the CSS properties
+
Preview of the CSS properties

Lorem ipsum dolor sit amet, mi et mauris nec ac luctus lorem, proin leo nulla integer metus vestibulum lobortis, eget
`; @@ -81,19 +82,22 @@ export function activate(context: vscode.ExtensionContext) { if (e.textEditor === vscode.window.activeTextEditor) { provider.update(previewUri); } - }) + }); let disposable = vscode.commands.registerCommand('extension.showCssPropertyPreview', () => { - return vscode.commands.executeCommand('vscode.previewHtml', previewUri, vscode.ViewColumn.Two, 'CSS Property Preview').then((success) => { - }, (reason) => { - vscode.window.showErrorMessage(reason); - }); + return vscode.commands + .executeCommand('vscode.previewHtml', previewUri, vscode.ViewColumn.Two, 'CSS Property Preview') + .then( + success => {}, + reason => { + vscode.window.showErrorMessage(reason); + } + ); }); let highlight = vscode.window.createTextEditorDecorationType({ backgroundColor: 'rgba(200,200,200,.35)' }); vscode.commands.registerCommand('extension.revealCssRule', (uri: vscode.Uri, propStart: number, propEnd: number) => { - for (let editor of vscode.window.visibleTextEditors) { if (editor.document.uri.toString() === uri.toString()) { let start = editor.document.positionAt(propStart); diff --git a/lsp-log-streaming-sample/client/src/extension.ts b/lsp-log-streaming-sample/client/src/extension.ts index 99f4c83a..208afc72 100644 --- a/lsp-log-streaming-sample/client/src/extension.ts +++ b/lsp-log-streaming-sample/client/src/extension.ts @@ -8,28 +8,21 @@ import * as path from 'path'; import { workspace, commands, ExtensionContext, OutputChannel } from 'vscode'; import * as WebSocket from 'ws'; -import { - LanguageClient, - LanguageClientOptions, - ServerOptions, - TransportKind -} from 'vscode-languageclient'; +import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient'; let client: LanguageClient; export function activate(context: ExtensionContext) { const socketPort = workspace.getConfiguration('languageServerExample').get('port', 7000); - let socket: WebSocket | null = null - + let socket: WebSocket | null = null; + commands.registerCommand('languageServerExample.startStreaming', () => { // Establish websocket connection - socket = new WebSocket(`ws://localhost:${socketPort}`) - }) + socket = new WebSocket(`ws://localhost:${socketPort}`); + }); // The server is implemented in node - let serverModule = context.asAbsolutePath( - path.join('server', 'out', 'server.js') - ); + let serverModule = context.asAbsolutePath(path.join('server', 'out', 'server.js')); // The debug options for the server // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging let debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] }; @@ -46,27 +39,27 @@ export function activate(context: ExtensionContext) { }; // The log to send - let log = '' + let log = ''; const websocketOutputChannel: OutputChannel = { name: 'websocket', // Only append the logs but send them later append(value: string) { - log += value - console.log(value) + log += value; + console.log(value); }, appendLine(value: string) { - log += value + log += value; // Don't send logs until WebSocket initialization if (socket && socket.readyState === WebSocket.OPEN) { - socket.send(log) + socket.send(log); } - log = '' + log = ''; }, clear() {}, show() {}, hide() {}, dispose() {} - } + }; // Options to control the language client let clientOptions: LanguageClientOptions = { @@ -81,12 +74,7 @@ export function activate(context: ExtensionContext) { }; // Create the language client and start the client. - client = new LanguageClient( - 'languageServerExample', - 'Language Server Example', - serverOptions, - clientOptions - ); + client = new LanguageClient('languageServerExample', 'Language Server Example', serverOptions, clientOptions); // Start the client. This will also launch the server client.start(); diff --git a/lsp-log-streaming-sample/client/src/test/diagnostics.test.ts b/lsp-log-streaming-sample/client/src/test/diagnostics.test.ts index 1eee4990..73bc66c1 100644 --- a/lsp-log-streaming-sample/client/src/test/diagnostics.test.ts +++ b/lsp-log-streaming-sample/client/src/test/diagnostics.test.ts @@ -4,39 +4,54 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -import * as vscode from 'vscode' -import * as assert from 'assert' -import { getDocUri, activate } from './helper' +import * as vscode from 'vscode'; +import * as assert from 'assert'; +import { getDocUri, activate } from './helper'; describe('Should get diagnostics', () => { - const docUri = getDocUri('diagnostics.txt') + const docUri = getDocUri('diagnostics.txt'); - it('Diagnoses uppercase texts', async () => { - await testDiagnostics(docUri, [ - { message: 'ANY is all uppercase.', range: toRange(0, 0, 0, 3), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, - { message: 'ANY is all uppercase.', range: toRange(0, 14, 0, 17), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, - { message: 'OS is all uppercase.', range: toRange(0, 18, 0, 20), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' } - ]) - }) -}) + it('Diagnoses uppercase texts', async () => { + await testDiagnostics(docUri, [ + { + message: 'ANY is all uppercase.', + range: toRange(0, 0, 0, 3), + severity: vscode.DiagnosticSeverity.Warning, + source: 'ex' + }, + { + message: 'ANY is all uppercase.', + range: toRange(0, 14, 0, 17), + severity: vscode.DiagnosticSeverity.Warning, + source: 'ex' + }, + { + message: 'OS is all uppercase.', + range: toRange(0, 18, 0, 20), + severity: vscode.DiagnosticSeverity.Warning, + source: 'ex' + } + ]); + }); +}); function toRange(sLine: number, sChar: number, eLine: number, eChar: number) { - const start = new vscode.Position(sLine, sChar) - const end = new vscode.Position(eLine, eChar) - return new vscode.Range(start, end) + const start = new vscode.Position(sLine, sChar); + const end = new vscode.Position(eLine, eChar); + return new vscode.Range(start, end); } async function testDiagnostics(docUri: vscode.Uri, expectedDiagnostics: vscode.Diagnostic[]) { - await activate(docUri) + await activate(docUri); - const actualDiagnostics = vscode.languages.getDiagnostics(docUri); + const actualDiagnostics = vscode.languages.getDiagnostics(docUri); - assert.equal(actualDiagnostics.length, expectedDiagnostics.length); + assert.equal(actualDiagnostics.length, expectedDiagnostics.length); - expectedDiagnostics.forEach((expectedDiagnostic, i) => { - const actualDiagnostic = actualDiagnostics[i] - assert.equal(actualDiagnostic.message, expectedDiagnostic.message) - assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range) - assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity) - }) -} \ No newline at end of file + expectedDiagnostics.forEach((expectedDiagnostic, i) => { + const actualDiagnostic = actualDiagnostics[i]; + assert.equal(actualDiagnostic.message, expectedDiagnostic.message); + assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range); + assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity); + }); +} diff --git a/lsp-log-streaming-sample/client/src/test/helper.ts b/lsp-log-streaming-sample/client/src/test/helper.ts index 22121c1c..b595b3f1 100644 --- a/lsp-log-streaming-sample/client/src/test/helper.ts +++ b/lsp-log-streaming-sample/client/src/test/helper.ts @@ -40,9 +40,6 @@ export const getDocUri = (p: string) => { }; export async function setTestContent(content: string): Promise { - const all = new vscode.Range( - doc.positionAt(0), - doc.positionAt(doc.getText().length) - ); + const all = new vscode.Range(doc.positionAt(0), doc.positionAt(doc.getText().length)); return editor.edit(eb => eb.replace(all, content)); } diff --git a/lsp-log-streaming-sample/client/src/test/index.ts b/lsp-log-streaming-sample/client/src/test/index.ts index 7fedf55f..bcb2a5b3 100644 --- a/lsp-log-streaming-sample/client/src/test/index.ts +++ b/lsp-log-streaming-sample/client/src/test/index.ts @@ -7,9 +7,9 @@ import * as testRunner from 'vscode/lib/testrunner'; testRunner.configure({ - ui: 'bdd', - useColors: true, - timeout: 100000 + ui: 'bdd', + useColors: true, + timeout: 100000 }); -module.exports = testRunner; \ No newline at end of file +module.exports = testRunner; diff --git a/lsp-log-streaming-sample/server/src/server.ts b/lsp-log-streaming-sample/server/src/server.ts index 4b5a0930..9693b8fa 100644 --- a/lsp-log-streaming-sample/server/src/server.ts +++ b/lsp-log-streaming-sample/server/src/server.ts @@ -35,10 +35,8 @@ connection.onInitialize((params: InitializeParams) => { // Does the client support the `workspace/configuration` request? // If not, we will fall back using global settings - hasConfigurationCapability = - capabilities.workspace && !!capabilities.workspace.configuration; - hasWorkspaceFolderCapability = - capabilities.workspace && !!capabilities.workspace.workspaceFolders; + hasConfigurationCapability = capabilities.workspace && !!capabilities.workspace.configuration; + hasWorkspaceFolderCapability = capabilities.workspace && !!capabilities.workspace.workspaceFolders; hasDiagnosticRelatedInformationCapability = capabilities.textDocument && capabilities.textDocument.publishDiagnostics && @@ -58,10 +56,7 @@ connection.onInitialize((params: InitializeParams) => { connection.onInitialized(() => { if (hasConfigurationCapability) { // Register for all configuration changes. - connection.client.register( - DidChangeConfigurationNotification.type, - undefined - ); + connection.client.register(DidChangeConfigurationNotification.type, undefined); } if (hasWorkspaceFolderCapability) { connection.workspace.onDidChangeWorkspaceFolders(_event => { @@ -89,9 +84,7 @@ connection.onDidChangeConfiguration(change => { // Reset all cached document settings documentSettings.clear(); } else { - globalSettings = ( - (change.settings.languageServerExample || defaultSettings) - ); + globalSettings = (change.settings.languageServerExample || defaultSettings); } // Revalidate all open text documents @@ -202,11 +195,9 @@ connection.onCompletion( connection.onCompletionResolve( (item: CompletionItem): CompletionItem => { if (item.data === 1) { - (item.detail = 'TypeScript details'), - (item.documentation = 'TypeScript documentation'); + (item.detail = 'TypeScript details'), (item.documentation = 'TypeScript documentation'); } else if (item.data === 2) { - (item.detail = 'JavaScript details'), - (item.documentation = 'JavaScript documentation'); + (item.detail = 'JavaScript details'), (item.documentation = 'JavaScript documentation'); } return item; } diff --git a/lsp-multi-server-sample/client/src/extension.ts b/lsp-multi-server-sample/client/src/extension.ts index 4841b77c..18d0e3d4 100644 --- a/lsp-multi-server-sample/client/src/extension.ts +++ b/lsp-multi-server-sample/client/src/extension.ts @@ -1,11 +1,15 @@ import * as path from 'path'; import { - workspace as Workspace, window as Window, ExtensionContext, TextDocument, OutputChannel, WorkspaceFolder, Uri + workspace as Workspace, + window as Window, + ExtensionContext, + TextDocument, + OutputChannel, + WorkspaceFolder, + Uri } from 'vscode'; -import { - LanguageClient, LanguageClientOptions, TransportKind -} from 'vscode-languageclient'; +import { LanguageClient, LanguageClientOptions, TransportKind } from 'vscode-languageclient'; let defaultClient: LanguageClient; let clients: Map = new Map(); @@ -13,21 +17,21 @@ let clients: Map = new Map(); let _sortedWorkspaceFolders: string[]; function sortedWorkspaceFolders(): string[] { if (_sortedWorkspaceFolders === void 0) { - _sortedWorkspaceFolders = Workspace.workspaceFolders.map(folder => { - let result = folder.uri.toString(); - if (result.charAt(result.length - 1) !== '/') { - result = result + '/'; - } - return result; - }).sort( - (a, b) => { + _sortedWorkspaceFolders = Workspace.workspaceFolders + .map(folder => { + let result = folder.uri.toString(); + if (result.charAt(result.length - 1) !== '/') { + result = result + '/'; + } + return result; + }) + .sort((a, b) => { return a.length - b.length; - } - ); + }); } return _sortedWorkspaceFolders; } -Workspace.onDidChangeWorkspaceFolders(() => _sortedWorkspaceFolders = undefined); +Workspace.onDidChangeWorkspaceFolders(() => (_sortedWorkspaceFolders = undefined)); function getOuterMostWorkspaceFolder(folder: WorkspaceFolder): WorkspaceFolder { let sorted = sortedWorkspaceFolders(); @@ -44,7 +48,6 @@ function getOuterMostWorkspaceFolder(folder: WorkspaceFolder): WorkspaceFolder { } export function activate(context: ExtensionContext) { - let module = context.asAbsolutePath(path.join('server', 'out', 'server.js')); let outputChannel: OutputChannel = Window.createOutputChannel('lsp-multi-server-example'); @@ -57,19 +60,22 @@ export function activate(context: ExtensionContext) { let uri = document.uri; // Untitled files go to a default client. if (uri.scheme === 'untitled' && !defaultClient) { - let debugOptions = { execArgv: ["--nolazy", "--inspect=6010"] }; + let debugOptions = { execArgv: ['--nolazy', '--inspect=6010'] }; let serverOptions = { run: { module, transport: TransportKind.ipc }, - debug: { module, transport: TransportKind.ipc, options: debugOptions} + debug: { module, transport: TransportKind.ipc, options: debugOptions } }; let clientOptions: LanguageClientOptions = { - documentSelector: [ - { scheme: 'untitled', language: 'plaintext' } - ], + documentSelector: [{ scheme: 'untitled', language: 'plaintext' }], diagnosticCollectionName: 'lsp-multi-server-example', outputChannel: outputChannel - } - defaultClient = new LanguageClient('lsp-multi-server-example', 'LSP Multi Server Example', serverOptions, clientOptions); + }; + defaultClient = new LanguageClient( + 'lsp-multi-server-example', + 'LSP Multi Server Example', + serverOptions, + clientOptions + ); defaultClient.start(); return; } @@ -83,20 +89,23 @@ export function activate(context: ExtensionContext) { folder = getOuterMostWorkspaceFolder(folder); if (!clients.has(folder.uri.toString())) { - let debugOptions = { execArgv: ["--nolazy", `--inspect=${6011 + clients.size}`] }; + let debugOptions = { execArgv: ['--nolazy', `--inspect=${6011 + clients.size}`] }; let serverOptions = { run: { module, transport: TransportKind.ipc }, - debug: { module, transport: TransportKind.ipc, options: debugOptions} + debug: { module, transport: TransportKind.ipc, options: debugOptions } }; let clientOptions: LanguageClientOptions = { - documentSelector: [ - { scheme: 'file', language: 'plaintext', pattern: `${folder.uri.fsPath}/**/*` } - ], + documentSelector: [{ scheme: 'file', language: 'plaintext', pattern: `${folder.uri.fsPath}/**/*` }], diagnosticCollectionName: 'lsp-multi-server-example', workspaceFolder: folder, outputChannel: outputChannel - } - let client = new LanguageClient('lsp-multi-server-example', 'LSP Multi Server Example', serverOptions, clientOptions); + }; + let client = new LanguageClient( + 'lsp-multi-server-example', + 'LSP Multi Server Example', + serverOptions, + clientOptions + ); client.start(); clients.set(folder.uri.toString(), client); } @@ -104,8 +113,8 @@ export function activate(context: ExtensionContext) { Workspace.onDidOpenTextDocument(didOpenTextDocument); Workspace.textDocuments.forEach(didOpenTextDocument); - Workspace.onDidChangeWorkspaceFolders((event) => { - for (let folder of event.removed) { + Workspace.onDidChangeWorkspaceFolders(event => { + for (let folder of event.removed) { let client = clients.get(folder.uri.toString()); if (client) { clients.delete(folder.uri.toString()); @@ -124,4 +133,4 @@ export function deactivate(): Thenable { promises.push(client.stop()); } return Promise.all(promises).then(() => undefined); -} \ No newline at end of file +} diff --git a/lsp-multi-server-sample/server/src/server.ts b/lsp-multi-server-sample/server/src/server.ts index a4bde856..bd6aa30f 100644 --- a/lsp-multi-server-sample/server/src/server.ts +++ b/lsp-multi-server-sample/server/src/server.ts @@ -3,9 +3,7 @@ *--------------------------------------------------------*/ 'use strict'; -import { - createConnection, TextDocuments, ProposedFeatures, TextDocumentSyncKind -} from 'vscode-languageserver'; +import { createConnection, TextDocuments, ProposedFeatures, TextDocumentSyncKind } from 'vscode-languageserver'; // Creates the LSP connection let connection = createConnection(ProposedFeatures.all); @@ -16,12 +14,12 @@ let documents = new TextDocuments(); // The workspace folder this server is operating on let workspaceFolder: string; -documents.onDidOpen((event) => { +documents.onDidOpen(event => { connection.console.log(`[Server(${process.pid}) ${workspaceFolder}] Document opened: ${event.document.uri}`); -}) +}); documents.listen(connection); -connection.onInitialize((params) => { +connection.onInitialize(params => { workspaceFolder = params.rootUri; connection.console.log(`[Server(${process.pid}) ${workspaceFolder}] Started and initialize received`); return { @@ -31,6 +29,6 @@ connection.onInitialize((params) => { change: TextDocumentSyncKind.None } } - } + }; }); -connection.listen(); \ No newline at end of file +connection.listen(); diff --git a/lsp-sample/client/src/extension.ts b/lsp-sample/client/src/extension.ts index d4f97f11..3b101d40 100644 --- a/lsp-sample/client/src/extension.ts +++ b/lsp-sample/client/src/extension.ts @@ -7,20 +7,13 @@ import * as path from 'path'; import { workspace, ExtensionContext } from 'vscode'; -import { - LanguageClient, - LanguageClientOptions, - ServerOptions, - TransportKind -} from 'vscode-languageclient'; +import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient'; let client: LanguageClient; export function activate(context: ExtensionContext) { // The server is implemented in node - let serverModule = context.asAbsolutePath( - path.join('server', 'out', 'server.js') - ); + let serverModule = context.asAbsolutePath(path.join('server', 'out', 'server.js')); // The debug options for the server // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging let debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] }; @@ -47,12 +40,7 @@ export function activate(context: ExtensionContext) { }; // Create the language client and start the client. - client = new LanguageClient( - 'languageServerExample', - 'Language Server Example', - serverOptions, - clientOptions - ); + client = new LanguageClient('languageServerExample', 'Language Server Example', serverOptions, clientOptions); // Start the client. This will also launch the server client.start(); diff --git a/lsp-sample/client/src/test/diagnostics.test.ts b/lsp-sample/client/src/test/diagnostics.test.ts index 1eee4990..73bc66c1 100644 --- a/lsp-sample/client/src/test/diagnostics.test.ts +++ b/lsp-sample/client/src/test/diagnostics.test.ts @@ -4,39 +4,54 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -import * as vscode from 'vscode' -import * as assert from 'assert' -import { getDocUri, activate } from './helper' +import * as vscode from 'vscode'; +import * as assert from 'assert'; +import { getDocUri, activate } from './helper'; describe('Should get diagnostics', () => { - const docUri = getDocUri('diagnostics.txt') + const docUri = getDocUri('diagnostics.txt'); - it('Diagnoses uppercase texts', async () => { - await testDiagnostics(docUri, [ - { message: 'ANY is all uppercase.', range: toRange(0, 0, 0, 3), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, - { message: 'ANY is all uppercase.', range: toRange(0, 14, 0, 17), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, - { message: 'OS is all uppercase.', range: toRange(0, 18, 0, 20), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' } - ]) - }) -}) + it('Diagnoses uppercase texts', async () => { + await testDiagnostics(docUri, [ + { + message: 'ANY is all uppercase.', + range: toRange(0, 0, 0, 3), + severity: vscode.DiagnosticSeverity.Warning, + source: 'ex' + }, + { + message: 'ANY is all uppercase.', + range: toRange(0, 14, 0, 17), + severity: vscode.DiagnosticSeverity.Warning, + source: 'ex' + }, + { + message: 'OS is all uppercase.', + range: toRange(0, 18, 0, 20), + severity: vscode.DiagnosticSeverity.Warning, + source: 'ex' + } + ]); + }); +}); function toRange(sLine: number, sChar: number, eLine: number, eChar: number) { - const start = new vscode.Position(sLine, sChar) - const end = new vscode.Position(eLine, eChar) - return new vscode.Range(start, end) + const start = new vscode.Position(sLine, sChar); + const end = new vscode.Position(eLine, eChar); + return new vscode.Range(start, end); } async function testDiagnostics(docUri: vscode.Uri, expectedDiagnostics: vscode.Diagnostic[]) { - await activate(docUri) + await activate(docUri); - const actualDiagnostics = vscode.languages.getDiagnostics(docUri); + const actualDiagnostics = vscode.languages.getDiagnostics(docUri); - assert.equal(actualDiagnostics.length, expectedDiagnostics.length); + assert.equal(actualDiagnostics.length, expectedDiagnostics.length); - expectedDiagnostics.forEach((expectedDiagnostic, i) => { - const actualDiagnostic = actualDiagnostics[i] - assert.equal(actualDiagnostic.message, expectedDiagnostic.message) - assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range) - assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity) - }) -} \ No newline at end of file + expectedDiagnostics.forEach((expectedDiagnostic, i) => { + const actualDiagnostic = actualDiagnostics[i]; + assert.equal(actualDiagnostic.message, expectedDiagnostic.message); + assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range); + assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity); + }); +} diff --git a/lsp-sample/client/src/test/helper.ts b/lsp-sample/client/src/test/helper.ts index 22121c1c..b595b3f1 100644 --- a/lsp-sample/client/src/test/helper.ts +++ b/lsp-sample/client/src/test/helper.ts @@ -40,9 +40,6 @@ export const getDocUri = (p: string) => { }; export async function setTestContent(content: string): Promise { - const all = new vscode.Range( - doc.positionAt(0), - doc.positionAt(doc.getText().length) - ); + const all = new vscode.Range(doc.positionAt(0), doc.positionAt(doc.getText().length)); return editor.edit(eb => eb.replace(all, content)); } diff --git a/lsp-sample/client/src/test/index.ts b/lsp-sample/client/src/test/index.ts index 7fedf55f..bcb2a5b3 100644 --- a/lsp-sample/client/src/test/index.ts +++ b/lsp-sample/client/src/test/index.ts @@ -7,9 +7,9 @@ import * as testRunner from 'vscode/lib/testrunner'; testRunner.configure({ - ui: 'bdd', - useColors: true, - timeout: 100000 + ui: 'bdd', + useColors: true, + timeout: 100000 }); -module.exports = testRunner; \ No newline at end of file +module.exports = testRunner; diff --git a/lsp-sample/server/src/server.ts b/lsp-sample/server/src/server.ts index bee1a7fb..184e8ae2 100644 --- a/lsp-sample/server/src/server.ts +++ b/lsp-sample/server/src/server.ts @@ -35,10 +35,8 @@ connection.onInitialize((params: InitializeParams) => { // Does the client support the `workspace/configuration` request? // If not, we will fall back using global settings - hasConfigurationCapability = - capabilities.workspace && !!capabilities.workspace.configuration; - hasWorkspaceFolderCapability = - capabilities.workspace && !!capabilities.workspace.workspaceFolders; + hasConfigurationCapability = capabilities.workspace && !!capabilities.workspace.configuration; + hasWorkspaceFolderCapability = capabilities.workspace && !!capabilities.workspace.workspaceFolders; hasDiagnosticRelatedInformationCapability = capabilities.textDocument && capabilities.textDocument.publishDiagnostics && @@ -58,10 +56,7 @@ connection.onInitialize((params: InitializeParams) => { connection.onInitialized(() => { if (hasConfigurationCapability) { // Register for all configuration changes. - connection.client.register( - DidChangeConfigurationNotification.type, - undefined - ); + connection.client.register(DidChangeConfigurationNotification.type, undefined); } if (hasWorkspaceFolderCapability) { connection.workspace.onDidChangeWorkspaceFolders(_event => { @@ -89,9 +84,7 @@ connection.onDidChangeConfiguration(change => { // Reset all cached document settings documentSettings.clear(); } else { - globalSettings = ( - (change.settings.languageServerExample || defaultSettings) - ); + globalSettings = (change.settings.languageServerExample || defaultSettings); } // Revalidate all open text documents @@ -202,11 +195,9 @@ connection.onCompletion( connection.onCompletionResolve( (item: CompletionItem): CompletionItem => { if (item.data === 1) { - (item.detail = 'TypeScript details'), - (item.documentation = 'TypeScript documentation'); + (item.detail = 'TypeScript details'), (item.documentation = 'TypeScript documentation'); } else if (item.data === 2) { - (item.detail = 'JavaScript details'), - (item.documentation = 'JavaScript documentation'); + (item.detail = 'JavaScript details'), (item.documentation = 'JavaScript documentation'); } return item; } diff --git a/multi-diagnostics-sample/src/extension.ts b/multi-diagnostics-sample/src/extension.ts index 0476b0d8..31ef5513 100644 --- a/multi-diagnostics-sample/src/extension.ts +++ b/multi-diagnostics-sample/src/extension.ts @@ -3,32 +3,34 @@ import * as vscode from 'vscode'; import * as path from 'path'; export function activate(context: vscode.ExtensionContext) { - - const collection = vscode.languages.createDiagnosticCollection('test'); - if (vscode.window.activeTextEditor) { - updateDiagnostics(vscode.window.activeTextEditor.document, collection); - } - context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(e => updateDiagnostics(e.document, collection))); - + const collection = vscode.languages.createDiagnosticCollection('test'); + if (vscode.window.activeTextEditor) { + updateDiagnostics(vscode.window.activeTextEditor.document, collection); + } + context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(e => updateDiagnostics(e.document, collection))); } function updateDiagnostics(document: vscode.TextDocument, collection: vscode.DiagnosticCollection): void { - if (document && path.basename(document.uri.fsPath) === 'sample-demo.rs') { - collection.set(document.uri, [{ - code: '', - message: 'cannot assign twice to immutable variable `x`', - range: new vscode.Range(new vscode.Position(3, 4), new vscode.Position(3, 10)), - severity: vscode.DiagnosticSeverity.Error, - source: '', - relatedInformation: [ - new vscode.DiagnosticRelatedInformation(new vscode.Location(document.uri, new vscode.Range(new vscode.Position(1, 8), new vscode.Position(1, 9))), 'first assignment to `x`') - ] - }]); - } else { - collection.clear(); - } + if (document && path.basename(document.uri.fsPath) === 'sample-demo.rs') { + collection.set(document.uri, [ + { + code: '', + message: 'cannot assign twice to immutable variable `x`', + range: new vscode.Range(new vscode.Position(3, 4), new vscode.Position(3, 10)), + severity: vscode.DiagnosticSeverity.Error, + source: '', + relatedInformation: [ + new vscode.DiagnosticRelatedInformation( + new vscode.Location(document.uri, new vscode.Range(new vscode.Position(1, 8), new vscode.Position(1, 9))), + 'first assignment to `x`' + ) + ] + } + ]); + } else { + collection.clear(); + } } // this method is called when your extension is deactivated -export function deactivate() { -} \ No newline at end of file +export function deactivate() {} diff --git a/multi-diagnostics-sample/src/test/extension.test.ts b/multi-diagnostics-sample/src/test/extension.test.ts index a7a297f7..f364cca4 100644 --- a/multi-diagnostics-sample/src/test/extension.test.ts +++ b/multi-diagnostics-sample/src/test/extension.test.ts @@ -12,11 +12,10 @@ import * as assert from 'assert'; // import * as myExtension from '../extension'; // Defines a Mocha test suite to group tests of similar kind together -suite("Extension Tests", function () { - - // Defines a Mocha unit test - test("Something 1", function() { - assert.equal(-1, [1, 2, 3].indexOf(5)); - assert.equal(-1, [1, 2, 3].indexOf(0)); - }); -}); \ No newline at end of file +suite('Extension Tests', function() { + // Defines a Mocha unit test + test('Something 1', function() { + assert.equal(-1, [1, 2, 3].indexOf(5)); + assert.equal(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/multi-diagnostics-sample/src/test/index.ts b/multi-diagnostics-sample/src/test/index.ts index 9fa2ea0d..27dc468f 100644 --- a/multi-diagnostics-sample/src/test/index.ts +++ b/multi-diagnostics-sample/src/test/index.ts @@ -15,8 +15,8 @@ import * as testRunner from 'vscode/lib/testrunner'; // You can directly control Mocha options by uncommenting the following lines // See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info testRunner.configure({ - ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) - useColors: true // colored output from test results + ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) + useColors: true // colored output from test results }); -module.exports = testRunner; \ No newline at end of file +module.exports = testRunner; diff --git a/nodefs-provider-sample/src/extension.ts b/nodefs-provider-sample/src/extension.ts index 247af688..04d67d18 100644 --- a/nodefs-provider-sample/src/extension.ts +++ b/nodefs-provider-sample/src/extension.ts @@ -11,265 +11,292 @@ import * as mkdirp from 'mkdirp'; import * as rimraf from 'rimraf'; export function activate(context: vscode.ExtensionContext) { - vscode.workspace.registerFileSystemProvider('datei', new DateiFileSystemProvider(), { - isCaseSensitive: process.platform === 'linux' - }); + vscode.workspace.registerFileSystemProvider('datei', new DateiFileSystemProvider(), { + isCaseSensitive: process.platform === 'linux' + }); } class DateiFileSystemProvider implements vscode.FileSystemProvider { + private _onDidChangeFile: vscode.EventEmitter; - private _onDidChangeFile: vscode.EventEmitter; + constructor() { + this._onDidChangeFile = new vscode.EventEmitter(); + } - constructor() { - this._onDidChangeFile = new vscode.EventEmitter(); - } + get onDidChangeFile(): vscode.Event { + return this._onDidChangeFile.event; + } - get onDidChangeFile(): vscode.Event { - return this._onDidChangeFile.event; - } + watch(uri: vscode.Uri, options: { recursive: boolean; excludes: string[] }): vscode.Disposable { + const watcher = fs.watch( + uri.fsPath, + { recursive: options.recursive }, + async (event: string, filename: string | Buffer) => { + const filepath = path.join(uri.fsPath, _.normalizeNFC(filename.toString())); - watch(uri: vscode.Uri, options: { recursive: boolean; excludes: string[]; }): vscode.Disposable { - const watcher = fs.watch(uri.fsPath, { recursive: options.recursive }, async (event: string, filename: string | Buffer) => { - const filepath = path.join(uri.fsPath, _.normalizeNFC(filename.toString())); + // TODO support excludes (using minimatch library?) - // TODO support excludes (using minimatch library?) + this._onDidChangeFile.fire([ + { + type: + event === 'change' + ? vscode.FileChangeType.Changed + : (await _.exists(filepath)) + ? vscode.FileChangeType.Created + : vscode.FileChangeType.Deleted, + uri: uri.with({ path: filepath }) + } as vscode.FileChangeEvent + ]); + } + ); - this._onDidChangeFile.fire([{ - type: event === 'change' ? vscode.FileChangeType.Changed : await _.exists(filepath) ? vscode.FileChangeType.Created : vscode.FileChangeType.Deleted, - uri: uri.with({ path: filepath }) - } as vscode.FileChangeEvent]); - }); + return { dispose: () => watcher.close() }; + } - return { dispose: () => watcher.close() }; - } + stat(uri: vscode.Uri): vscode.FileStat | Thenable { + return this._stat(uri.fsPath); + } - stat(uri: vscode.Uri): vscode.FileStat | Thenable { - return this._stat(uri.fsPath); - } + async _stat(path: string): Promise { + return new FileStat(await _.stat(path)); + } - async _stat(path: string): Promise { - return new FileStat(await _.stat(path)); - } + readDirectory(uri: vscode.Uri): [string, vscode.FileType][] | Thenable<[string, vscode.FileType][]> { + return this._readDirectory(uri); + } - readDirectory(uri: vscode.Uri): [string, vscode.FileType][] | Thenable<[string, vscode.FileType][]> { - return this._readDirectory(uri); - } + async _readDirectory(uri: vscode.Uri): Promise<[string, vscode.FileType][]> { + const children = await _.readdir(uri.fsPath); - async _readDirectory(uri: vscode.Uri): Promise<[string, vscode.FileType][]> { - const children = await _.readdir(uri.fsPath); + const result: [string, vscode.FileType][] = []; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + const stat = await this._stat(path.join(uri.fsPath, child)); + result.push([child, stat.type]); + } - const result: [string, vscode.FileType][] = []; - for (let i = 0; i < children.length; i++) { - const child = children[i]; - const stat = await this._stat(path.join(uri.fsPath, child)); - result.push([child, stat.type]); - } + return Promise.resolve(result); + } - return Promise.resolve(result); - } + createDirectory(uri: vscode.Uri): void | Thenable { + return _.mkdir(uri.fsPath); + } - createDirectory(uri: vscode.Uri): void | Thenable { - return _.mkdir(uri.fsPath); - } + readFile(uri: vscode.Uri): Uint8Array | Thenable { + return _.readfile(uri.fsPath); + } - readFile(uri: vscode.Uri): Uint8Array | Thenable { - return _.readfile(uri.fsPath); - } + writeFile( + uri: vscode.Uri, + content: Uint8Array, + options: { create: boolean; overwrite: boolean } + ): void | Thenable { + return this._writeFile(uri, content, options); + } - writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean; }): void | Thenable { - return this._writeFile(uri, content, options); - } + async _writeFile( + uri: vscode.Uri, + content: Uint8Array, + options: { create: boolean; overwrite: boolean } + ): Promise { + const exists = await _.exists(uri.fsPath); + if (!exists) { + if (!options.create) { + throw vscode.FileSystemError.FileNotFound(); + } - async _writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean; }): Promise { - const exists = await _.exists(uri.fsPath); - if (!exists) { - if (!options.create) { - throw vscode.FileSystemError.FileNotFound(); - } + await _.mkdir(path.dirname(uri.fsPath)); + } else { + if (!options.overwrite) { + throw vscode.FileSystemError.FileExists(); + } + } - await _.mkdir(path.dirname(uri.fsPath)); - } else { - if (!options.overwrite) { - throw vscode.FileSystemError.FileExists(); - } - } + return _.writefile(uri.fsPath, content as Buffer); + } - return _.writefile(uri.fsPath, content as Buffer); - } + delete(uri: vscode.Uri, options: { recursive: boolean }): void | Thenable { + if (options.recursive) { + return _.rmrf(uri.fsPath); + } - delete(uri: vscode.Uri, options: { recursive: boolean; }): void | Thenable { - if (options.recursive) { - return _.rmrf(uri.fsPath); - } + return _.unlink(uri.fsPath); + } - return _.unlink(uri.fsPath); - } + rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean }): void | Thenable { + return this._rename(oldUri, newUri, options); + } - rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; }): void | Thenable { - return this._rename(oldUri, newUri, options); - } + async _rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean }): Promise { + const exists = await _.exists(newUri.fsPath); + if (exists) { + if (!options.overwrite) { + throw vscode.FileSystemError.FileExists(); + } else { + await _.rmrf(newUri.fsPath); + } + } - async _rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; }): Promise { - const exists = await _.exists(newUri.fsPath); - if (exists) { - if (!options.overwrite) { - throw vscode.FileSystemError.FileExists(); - } else { - await _.rmrf(newUri.fsPath); - } - } + const parentExists = await _.exists(path.dirname(newUri.fsPath)); + if (!parentExists) { + await _.mkdir(path.dirname(newUri.fsPath)); + } - const parentExists = await _.exists(path.dirname(newUri.fsPath)); - if (!parentExists) { - await _.mkdir(path.dirname(newUri.fsPath)); - } + return _.rename(oldUri.fsPath, newUri.fsPath); + } - return _.rename(oldUri.fsPath, newUri.fsPath); - } - - // TODO can implement a fast copy() method with node.js 8.x new fs.copy method + // TODO can implement a fast copy() method with node.js 8.x new fs.copy method } -export function deactivate() { } +export function deactivate() {} //#region Utilities namespace _ { + function handleResult( + resolve: (result: T) => void, + reject: (error: Error) => void, + error: Error | null | undefined, + result: T + ): void { + if (error) { + reject(massageError(error)); + } else { + resolve(result); + } + } - function handleResult(resolve: (result: T) => void, reject: (error: Error) => void, error: Error | null | undefined, result: T): void { - if (error) { - reject(massageError(error)); - } else { - resolve(result); - } - } + function massageError(error: Error & { code?: string }): Error { + if (error.code === 'ENOENT') { + return vscode.FileSystemError.FileNotFound(); + } - function massageError(error: Error & { code?: string }): Error { - if (error.code === 'ENOENT') { - return vscode.FileSystemError.FileNotFound(); - } + if (error.code === 'EISDIR') { + return vscode.FileSystemError.FileIsADirectory(); + } - if (error.code === 'EISDIR') { - return vscode.FileSystemError.FileIsADirectory(); - } + if (error.code === 'EEXIST') { + return vscode.FileSystemError.FileExists(); + } - if (error.code === 'EEXIST') { - return vscode.FileSystemError.FileExists(); - } + if (error.code === 'EPERM' || error.code === 'EACCESS') { + return vscode.FileSystemError.NoPermissions(); + } - if (error.code === 'EPERM' || error.code === 'EACCESS') { - return vscode.FileSystemError.NoPermissions(); - } + return error; + } - return error; - } + export function checkCancellation(token: vscode.CancellationToken): void { + if (token.isCancellationRequested) { + throw new Error('Operation cancelled'); + } + } - export function checkCancellation(token: vscode.CancellationToken): void { - if (token.isCancellationRequested) { - throw new Error('Operation cancelled'); - } - } + export function normalizeNFC(items: string): string; + export function normalizeNFC(items: string[]): string[]; + export function normalizeNFC(items: string | string[]): string | string[] { + if (process.platform !== 'darwin') { + return items; + } - export function normalizeNFC(items: string): string; - export function normalizeNFC(items: string[]): string[]; - export function normalizeNFC(items: string | string[]): string | string[] { - if (process.platform !== 'darwin') { - return items; - } + if (Array.isArray(items)) { + return items.map(item => item.normalize('NFC')); + } - if (Array.isArray(items)) { - return items.map(item => item.normalize('NFC')); - } + return items.normalize('NFC'); + } - return items.normalize('NFC'); - } + export function readdir(path: string): Promise { + return new Promise((resolve, reject) => { + fs.readdir(path, (error, children) => handleResult(resolve, reject, error, normalizeNFC(children))); + }); + } - export function readdir(path: string): Promise { - return new Promise((resolve, reject) => { - fs.readdir(path, (error, children) => handleResult(resolve, reject, error, normalizeNFC(children))); - }); - } + export function stat(path: string): Promise { + return new Promise((resolve, reject) => { + fs.stat(path, (error, stat) => handleResult(resolve, reject, error, stat)); + }); + } - export function stat(path: string): Promise { - return new Promise((resolve, reject) => { - fs.stat(path, (error, stat) => handleResult(resolve, reject, error, stat)); - }); - } + export function readfile(path: string): Promise { + return new Promise((resolve, reject) => { + fs.readFile(path, (error, buffer) => handleResult(resolve, reject, error, buffer)); + }); + } - export function readfile(path: string): Promise { - return new Promise((resolve, reject) => { - fs.readFile(path, (error, buffer) => handleResult(resolve, reject, error, buffer)); - }); - } + export function writefile(path: string, content: Buffer): Promise { + return new Promise((resolve, reject) => { + fs.writeFile(path, content, error => handleResult(resolve, reject, error, void 0)); + }); + } - export function writefile(path: string, content: Buffer): Promise { - return new Promise((resolve, reject) => { - fs.writeFile(path, content, error => handleResult(resolve, reject, error, void 0)); - }); - } + export function exists(path: string): Promise { + return new Promise((resolve, reject) => { + fs.exists(path, exists => handleResult(resolve, reject, null, exists)); + }); + } - export function exists(path: string): Promise { - return new Promise((resolve, reject) => { - fs.exists(path, exists => handleResult(resolve, reject, null, exists)); - }); - } + export function rmrf(path: string): Promise { + return new Promise((resolve, reject) => { + rimraf(path, error => handleResult(resolve, reject, error, void 0)); + }); + } - export function rmrf(path: string): Promise { - return new Promise((resolve, reject) => { - rimraf(path, error => handleResult(resolve, reject, error, void 0)); - }); - } + export function mkdir(path: string): Promise { + return new Promise((resolve, reject) => { + mkdirp(path, error => handleResult(resolve, reject, error, void 0)); + }); + } - export function mkdir(path: string): Promise { - return new Promise((resolve, reject) => { - mkdirp(path, error => handleResult(resolve, reject, error, void 0)); - }); - } + export function rename(oldPath: string, newPath: string): Promise { + return new Promise((resolve, reject) => { + fs.rename(oldPath, newPath, error => handleResult(resolve, reject, error, void 0)); + }); + } - export function rename(oldPath: string, newPath: string): Promise { - return new Promise((resolve, reject) => { - fs.rename(oldPath, newPath, error => handleResult(resolve, reject, error, void 0)); - }); - } - - export function unlink(path: string): Promise { - return new Promise((resolve, reject) => { - fs.unlink(path, error => handleResult(resolve, reject, error, void 0)); - }); - } + export function unlink(path: string): Promise { + return new Promise((resolve, reject) => { + fs.unlink(path, error => handleResult(resolve, reject, error, void 0)); + }); + } } export class FileStat implements vscode.FileStat { + constructor(private fsStat: fs.Stats) {} - constructor(private fsStat: fs.Stats) { } + get type(): vscode.FileType { + return this.fsStat.isFile() + ? vscode.FileType.File + : this.fsStat.isDirectory() + ? vscode.FileType.Directory + : this.fsStat.isSymbolicLink() + ? vscode.FileType.SymbolicLink + : vscode.FileType.Unknown; + } - get type(): vscode.FileType { - return this.fsStat.isFile() ? vscode.FileType.File : this.fsStat.isDirectory() ? vscode.FileType.Directory : this.fsStat.isSymbolicLink() ? vscode.FileType.SymbolicLink : vscode.FileType.Unknown; - } + get isFile(): boolean | undefined { + return this.fsStat.isFile(); + } - get isFile(): boolean | undefined { - return this.fsStat.isFile(); - } + get isDirectory(): boolean | undefined { + return this.fsStat.isDirectory(); + } - get isDirectory(): boolean | undefined { - return this.fsStat.isDirectory(); - } + get isSymbolicLink(): boolean | undefined { + return this.fsStat.isSymbolicLink(); + } - get isSymbolicLink(): boolean | undefined { - return this.fsStat.isSymbolicLink(); - } + get size(): number { + return this.fsStat.size; + } - get size(): number { - return this.fsStat.size; - } + get ctime(): number { + return this.fsStat.ctime.getTime(); + } - get ctime(): number { - return this.fsStat.ctime.getTime(); - } - - get mtime(): number { - return this.fsStat.mtime.getTime(); - } + get mtime(): number { + return this.fsStat.mtime.getTime(); + } } -//#endregion \ No newline at end of file +//#endregion diff --git a/nodefs-provider-sample/src/test/extension.test.ts b/nodefs-provider-sample/src/test/extension.test.ts index a7a297f7..f364cca4 100644 --- a/nodefs-provider-sample/src/test/extension.test.ts +++ b/nodefs-provider-sample/src/test/extension.test.ts @@ -12,11 +12,10 @@ import * as assert from 'assert'; // import * as myExtension from '../extension'; // Defines a Mocha test suite to group tests of similar kind together -suite("Extension Tests", function () { - - // Defines a Mocha unit test - test("Something 1", function() { - assert.equal(-1, [1, 2, 3].indexOf(5)); - assert.equal(-1, [1, 2, 3].indexOf(0)); - }); -}); \ No newline at end of file +suite('Extension Tests', function() { + // Defines a Mocha unit test + test('Something 1', function() { + assert.equal(-1, [1, 2, 3].indexOf(5)); + assert.equal(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/nodefs-provider-sample/src/test/index.ts b/nodefs-provider-sample/src/test/index.ts index 9fa2ea0d..27dc468f 100644 --- a/nodefs-provider-sample/src/test/index.ts +++ b/nodefs-provider-sample/src/test/index.ts @@ -15,8 +15,8 @@ import * as testRunner from 'vscode/lib/testrunner'; // You can directly control Mocha options by uncommenting the following lines // See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info testRunner.configure({ - ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) - useColors: true // colored output from test results + ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) + useColors: true // colored output from test results }); -module.exports = testRunner; \ No newline at end of file +module.exports = testRunner; diff --git a/progress-sample/src/extension.ts b/progress-sample/src/extension.ts index bf72808c..3bfef7b2 100644 --- a/progress-sample/src/extension.ts +++ b/progress-sample/src/extension.ts @@ -4,40 +4,55 @@ 'use strict'; -import { ExtensionContext, StatusBarAlignment, window, StatusBarItem, Selection, workspace, TextEditor, commands, ProgressLocation } from 'vscode'; +import { + ExtensionContext, + StatusBarAlignment, + window, + StatusBarItem, + Selection, + workspace, + TextEditor, + commands, + ProgressLocation +} from 'vscode'; export function activate(context: ExtensionContext) { - context.subscriptions.push(commands.registerCommand('extension.startTask', () => { - window.withProgress({ - location: ProgressLocation.Notification, - title: "I am long running!", - cancellable: true - }, (progress, token) => { - token.onCancellationRequested(() => { - console.log("User canceled the long running operation") - }); + context.subscriptions.push( + commands.registerCommand('extension.startTask', () => { + window.withProgress( + { + location: ProgressLocation.Notification, + title: 'I am long running!', + cancellable: true + }, + (progress, token) => { + token.onCancellationRequested(() => { + console.log('User canceled the long running operation'); + }); - progress.report({ increment: 0 }); + progress.report({ increment: 0 }); - setTimeout(() => { - progress.report({ increment: 10, message: "I am long running! - still going..." }); - }, 1000); + setTimeout(() => { + progress.report({ increment: 10, message: 'I am long running! - still going...' }); + }, 1000); - setTimeout(() => { - progress.report({ increment: 40, message: "I am long running! - still going even more..." }); - }, 2000); + setTimeout(() => { + progress.report({ increment: 40, message: 'I am long running! - still going even more...' }); + }, 2000); - setTimeout(() => { - progress.report({ increment: 50, message: "I am long running! - almost there..." }); - }, 3000); + setTimeout(() => { + progress.report({ increment: 50, message: 'I am long running! - almost there...' }); + }, 3000); - var p = new Promise(resolve => { - setTimeout(() => { - resolve(); - }, 5000); - }); + var p = new Promise(resolve => { + setTimeout(() => { + resolve(); + }, 5000); + }); - return p; - }); - })); + return p; + } + ); + }) + ); } diff --git a/quickinput-sample/src/extension.ts b/quickinput-sample/src/extension.ts index 107b6153..9fccbd0d 100644 --- a/quickinput-sample/src/extension.ts +++ b/quickinput-sample/src/extension.ts @@ -11,22 +11,23 @@ import { multiStepInput } from './multiStepInput'; import { quickOpen } from './quickOpen'; export function activate(context: ExtensionContext) { - context.subscriptions.push(commands.registerCommand('samples.quickInput', async () => { - const options: { [key: string]: (context: ExtensionContext) => Promise } = { - showQuickPick, - showInputBox, - multiStepInput, - quickOpen, - }; - const quickPick = window.createQuickPick(); - quickPick.items = Object.keys(options).map(label => ({ label })); - quickPick.onDidChangeSelection(selection => { - if (selection[0]) { - options[selection[0].label](context) - .catch(console.error); - } - }); - quickPick.onDidHide(() => quickPick.dispose()); - quickPick.show(); - })); + context.subscriptions.push( + commands.registerCommand('samples.quickInput', async () => { + const options: { [key: string]: (context: ExtensionContext) => Promise } = { + showQuickPick, + showInputBox, + multiStepInput, + quickOpen + }; + const quickPick = window.createQuickPick(); + quickPick.items = Object.keys(options).map(label => ({ label })); + quickPick.onDidChangeSelection(selection => { + if (selection[0]) { + options[selection[0].label](context).catch(console.error); + } + }); + quickPick.onDidHide(() => quickPick.dispose()); + quickPick.show(); + }) + ); } diff --git a/quickinput-sample/src/multiStepInput.ts b/quickinput-sample/src/multiStepInput.ts index e2f824f1..ca0fb21c 100644 --- a/quickinput-sample/src/multiStepInput.ts +++ b/quickinput-sample/src/multiStepInput.ts @@ -3,27 +3,43 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { QuickPickItem, window, Disposable, CancellationToken, QuickInputButton, QuickInput, ExtensionContext, QuickInputButtons, Uri } from 'vscode'; +import { + QuickPickItem, + window, + Disposable, + CancellationToken, + QuickInputButton, + QuickInput, + ExtensionContext, + QuickInputButtons, + Uri +} from 'vscode'; /** * A multi-step input using window.createQuickPick() and window.createInputBox(). - * + * * This first part uses the helper class `MultiStepInput` that wraps the API for the multi-step case. */ export async function multiStepInput(context: ExtensionContext) { - class MyButton implements QuickInputButton { - constructor(public iconPath: { light: Uri; dark: Uri; }, public tooltip: string) { } + constructor(public iconPath: { light: Uri; dark: Uri }, public tooltip: string) {} } - const createResourceGroupButton = new MyButton({ - dark: Uri.file(context.asAbsolutePath('resources/dark/add.svg')), - light: Uri.file(context.asAbsolutePath('resources/light/add.svg')), - }, 'Create Resource Group'); - - const resourceGroups: QuickPickItem[] = ['vscode-data-function', 'vscode-appservice-microservices', 'vscode-appservice-monitor', 'vscode-appservice-preview', 'vscode-appservice-prod'] - .map(label => ({ label })); + const createResourceGroupButton = new MyButton( + { + dark: Uri.file(context.asAbsolutePath('resources/dark/add.svg')), + light: Uri.file(context.asAbsolutePath('resources/light/add.svg')) + }, + 'Create Resource Group' + ); + const resourceGroups: QuickPickItem[] = [ + 'vscode-data-function', + 'vscode-appservice-microservices', + 'vscode-appservice-monitor', + 'vscode-appservice-preview', + 'vscode-appservice-prod' + ].map(label => ({ label })); interface State { title: string; @@ -105,9 +121,7 @@ export async function multiStepInput(context: ExtensionContext) { function shouldResume() { // Could show a notification with the option to resume. - return new Promise((resolve, reject) => { - - }); + return new Promise((resolve, reject) => {}); } async function validateNameIsUnique(name: string) { @@ -116,25 +130,25 @@ export async function multiStepInput(context: ExtensionContext) { return name === 'vscode' ? 'Name not unique' : undefined; } - async function getAvailableRuntimes(resourceGroup: QuickPickItem | string, token?: CancellationToken): Promise { + async function getAvailableRuntimes( + resourceGroup: QuickPickItem | string, + token?: CancellationToken + ): Promise { // ...retrieve... await new Promise(resolve => setTimeout(resolve, 1000)); - return ['Node 8.9', 'Node 6.11', 'Node 4.5'] - .map(label => ({ label })); + return ['Node 8.9', 'Node 6.11', 'Node 4.5'].map(label => ({ label })); } const state = await collectInputs(); window.showInformationMessage(`Creating Application Service '${state.name}'`); } - // ------------------------------------------------------- // Helper code that wraps the API for the multi-step case. // ------------------------------------------------------- - class InputFlowAction { - private constructor() { } + private constructor() {} static back = new InputFlowAction(); static cancel = new InputFlowAction(); static resume = new InputFlowAction(); @@ -165,7 +179,6 @@ interface InputBoxParameters { } class MultiStepInput { - static async run(start: InputStep) { const input = new MultiStepInput(); return input.stepThrough(start); @@ -202,7 +215,16 @@ class MultiStepInput { } } - async showQuickPick>({ title, step, totalSteps, items, activeItem, placeholder, buttons, shouldResume }: P) { + async showQuickPick>({ + title, + step, + totalSteps, + items, + activeItem, + placeholder, + buttons, + shouldResume + }: P) { const disposables: Disposable[] = []; try { return await new Promise((resolve, reject) => { @@ -215,10 +237,7 @@ class MultiStepInput { if (activeItem) { input.activeItems = [activeItem]; } - input.buttons = [ - ...(this.steps.length > 1 ? [QuickInputButtons.Back] : []), - ...(buttons || []) - ]; + input.buttons = [...(this.steps.length > 1 ? [QuickInputButtons.Back] : []), ...(buttons || [])]; disposables.push( input.onDidTriggerButton(item => { if (item === QuickInputButtons.Back) { @@ -230,9 +249,8 @@ class MultiStepInput { input.onDidChangeSelection(items => resolve(items[0])), input.onDidHide(() => { (async () => { - reject(shouldResume && await shouldResume() ? InputFlowAction.resume : InputFlowAction.cancel); - })() - .catch(reject); + reject(shouldResume && (await shouldResume()) ? InputFlowAction.resume : InputFlowAction.cancel); + })().catch(reject); }) ); if (this.current) { @@ -246,7 +264,16 @@ class MultiStepInput { } } - async showInputBox

({ title, step, totalSteps, value, prompt, validate, buttons, shouldResume }: P) { + async showInputBox

({ + title, + step, + totalSteps, + value, + prompt, + validate, + buttons, + shouldResume + }: P) { const disposables: Disposable[] = []; try { return await new Promise((resolve, reject) => { @@ -256,10 +283,7 @@ class MultiStepInput { input.totalSteps = totalSteps; input.value = value || ''; input.prompt = prompt; - input.buttons = [ - ...(this.steps.length > 1 ? [QuickInputButtons.Back] : []), - ...(buttons || []) - ]; + input.buttons = [...(this.steps.length > 1 ? [QuickInputButtons.Back] : []), ...(buttons || [])]; let validating = validate(''); disposables.push( input.onDidTriggerButton(item => { @@ -289,9 +313,8 @@ class MultiStepInput { }), input.onDidHide(() => { (async () => { - reject(shouldResume && await shouldResume() ? InputFlowAction.resume : InputFlowAction.cancel); - })() - .catch(reject); + reject(shouldResume && (await shouldResume()) ? InputFlowAction.resume : InputFlowAction.cancel); + })().catch(reject); }) ); if (this.current) { diff --git a/quickinput-sample/src/quickOpen.ts b/quickinput-sample/src/quickOpen.ts index 3fb95cfa..54c9ccf3 100644 --- a/quickinput-sample/src/quickOpen.ts +++ b/quickinput-sample/src/quickOpen.ts @@ -11,7 +11,7 @@ import { workspace } from 'vscode'; /** * A file opener using window.createQuickPick(). - * + * * It shows how the list of items can be dynamically updated based on * the user's input in the filter field. */ @@ -24,10 +24,9 @@ export async function quickOpen() { } class FileItem implements QuickPickItem { - label: string; description: string; - + constructor(public base: Uri, public uri: Uri) { this.label = path.basename(uri.fsPath); this.description = path.dirname(path.relative(base.fsPath, uri.fsPath)); @@ -35,11 +34,10 @@ class FileItem implements QuickPickItem { } class MessageItem implements QuickPickItem { - label: string; description = ''; detail: string; - + constructor(public base: Uri, public message: string) { this.label = message.replace(/\r?\n/g, ' '); this.detail = base.fsPath; @@ -62,7 +60,7 @@ async function pickFile() { } input.busy = true; const cwds = workspace.workspaceFolders ? workspace.workspaceFolders.map(f => f.uri.fsPath) : [process.cwd()]; - const q = process.platform === 'win32' ? '"' : '\''; + const q = process.platform === 'win32' ? '"' : "'"; rgs = cwds.map(cwd => { const rg = cp.exec(`rg --files -g ${q}*${value}*${q}`, { cwd }, (err, stdout) => { const i = rgs.indexOf(rg); @@ -73,14 +71,13 @@ async function pickFile() { if (!err) { input.items = input.items.concat( stdout - .split('\n').slice(0, 50) + .split('\n') + .slice(0, 50) .map(relative => new FileItem(Uri.file(cwd), Uri.file(path.join(cwd, relative)))) ); } if (err && !(err).killed && (err).code !== 1 && err.message) { - input.items = input.items.concat([ - new MessageItem(Uri.file(cwd), err.message) - ]); + input.items = input.items.concat([new MessageItem(Uri.file(cwd), err.message)]); } rgs.splice(i, 1); if (!rgs.length) { diff --git a/smart-template-strings-sample/src/extension.ts b/smart-template-strings-sample/src/extension.ts index ad3c8c23..d588e10a 100644 --- a/smart-template-strings-sample/src/extension.ts +++ b/smart-template-strings-sample/src/extension.ts @@ -6,44 +6,47 @@ import * as html from 'vscode-html-languageservice'; import { TextDocument, Position } from 'vscode-languageserver-types'; export function activate(context: vscode.ExtensionContext) { + // create and keep html language service + const service = html.getLanguageService(); - // create and keep html language service - const service = html.getLanguageService(); + vscode.languages.registerCompletionItemProvider(['typescript', 'javascript'], { + provideCompletionItems(doc, pos) { + const offset = doc.offsetAt(pos); + const source = ts.createSourceFile(doc.fileName, doc.getText(), ts.ScriptTarget.Latest, true); - vscode.languages.registerCompletionItemProvider(['typescript', 'javascript'], { - provideCompletionItems(doc, pos) { + let token = (ts as any).getTokenAtPosition(source, offset); + let template: ts.TaggedTemplateExpression; + while (token) { + if (token.kind === ts.SyntaxKind.TaggedTemplateExpression) { + template = token; + break; + } + token = token.parent; + } - const offset = doc.offsetAt(pos); - const source = ts.createSourceFile(doc.fileName, doc.getText(), ts.ScriptTarget.Latest, true); + if ( + !template || + template.tag.getText() !== 'html' || + (offset < template.template.pos && offset > template.template.end) + ) { + return; + } - let token = (ts as any).getTokenAtPosition(source, offset) - let template: ts.TaggedTemplateExpression; - while (token) { - if (token.kind === ts.SyntaxKind.TaggedTemplateExpression) { - template = token; - break; - } - token = token.parent; - } + const content = template.template.getText().slice(1, -1); + const embeddedDoc = TextDocument.create( + doc.uri.with({ scheme: 'html-fake' }).toString(), + 'html', + doc.version, + content + ); + const htmlDoc = service.parseHTMLDocument(embeddedDoc); - if (!template - || template.tag.getText() !== 'html' - || (offset < template.template.pos && offset > template.template.end) - ) { - return; - } + const list = service.doComplete(embeddedDoc, Position.create(0, offset - template.template.pos - 1), htmlDoc); - const content = template.template.getText().slice(1, -1); - const embeddedDoc = TextDocument.create(doc.uri.with({ scheme: 'html-fake' }).toString(), 'html', doc.version, content); - const htmlDoc = service.parseHTMLDocument(embeddedDoc); - - const list = service.doComplete(embeddedDoc, Position.create(0, offset - template.template.pos - 1), htmlDoc); - - return list.items.map(item => { - // translate to vscode items - return new vscode.CompletionItem(item.label); - }) - } - }); + return list.items.map(item => { + // translate to vscode items + return new vscode.CompletionItem(item.label); + }); + } + }); } - diff --git a/statusbar-sample/src/extension.ts b/statusbar-sample/src/extension.ts index 8a2a688f..ca830c76 100644 --- a/statusbar-sample/src/extension.ts +++ b/statusbar-sample/src/extension.ts @@ -4,7 +4,16 @@ 'use strict'; -import { ExtensionContext, StatusBarAlignment, window, StatusBarItem, Selection, workspace, TextEditor, commands } from 'vscode'; +import { + ExtensionContext, + StatusBarAlignment, + window, + StatusBarItem, + Selection, + workspace, + TextEditor, + commands +} from 'vscode'; export function activate(context: ExtensionContext) { const status = window.createStatusBarItem(StatusBarAlignment.Right, 100); @@ -17,9 +26,11 @@ export function activate(context: ExtensionContext) { context.subscriptions.push(workspace.onDidOpenTextDocument(e => updateStatus(status))); context.subscriptions.push(workspace.onDidCloseTextDocument(e => updateStatus(status))); - context.subscriptions.push(commands.registerCommand('extension.selectedLines', () => { - window.showInformationMessage(getSelectedLines()); - })); + context.subscriptions.push( + commands.registerCommand('extension.selectedLines', () => { + window.showInformationMessage(getSelectedLines()); + }) + ); updateStatus(status); } @@ -44,7 +55,7 @@ function getSelectedLines(): string { if (editor) { let lines = 0; editor.selections.forEach(selection => { - lines += (selection.end.line - selection.start.line + 1); + lines += selection.end.line - selection.start.line + 1; }); if (lines > 0) { diff --git a/task-provider-sample/src/extension.ts b/task-provider-sample/src/extension.ts index 883c7337..409acef0 100644 --- a/task-provider-sample/src/extension.ts +++ b/task-provider-sample/src/extension.ts @@ -19,9 +19,9 @@ export function activate(_context: vscode.ExtensionContext): void { let pattern = path.join(workspaceRoot, 'Rakefile'); let rakePromise: Thenable | undefined = undefined; let fileWatcher = vscode.workspace.createFileSystemWatcher(pattern); - fileWatcher.onDidChange(() => rakePromise = undefined); - fileWatcher.onDidCreate(() => rakePromise = undefined); - fileWatcher.onDidDelete(() => rakePromise = undefined); + fileWatcher.onDidChange(() => (rakePromise = undefined)); + fileWatcher.onDidCreate(() => (rakePromise = undefined)); + fileWatcher.onDidDelete(() => (rakePromise = undefined)); taskProvider = vscode.tasks.registerTaskProvider('rake', { provideTasks: () => { if (!rakePromise) { @@ -43,7 +43,7 @@ export function deactivate(): void { function exists(file: string): Promise { return new Promise((resolve, _reject) => { - fs.exists(file, (value) => { + fs.exists(file, value => { resolve(value); }); }); @@ -107,7 +107,7 @@ async function getRakeTasks(): Promise { return emptyTasks; } let rakeFile = path.join(workspaceRoot, 'Rakefile'); - if (!await exists(rakeFile)) { + if (!(await exists(rakeFile))) { return emptyTasks; } diff --git a/terminal-sample/src/extension.ts b/terminal-sample/src/extension.ts index 3342df2e..22bf6581 100644 --- a/terminal-sample/src/extension.ts +++ b/terminal-sample/src/extension.ts @@ -7,13 +7,13 @@ export function activate(context: vscode.ExtensionContext) { vscode.window.showInformationMessage('Hello World!'); - console.log("Terminals: " + (vscode.window).terminals.length); + console.log('Terminals: ' + (vscode.window).terminals.length); (vscode.window).onDidOpenTerminal(e => { - console.log("Terminal opened. Total count: " + (vscode.window).terminals.length); + console.log('Terminal opened. Total count: ' + (vscode.window).terminals.length); e.onDidWriteData(data => { - console.log("Terminal data: ", data); + console.log('Terminal data: ', data); }); }); @@ -22,86 +22,106 @@ export function activate(context: vscode.ExtensionContext) { }); // vscode.window.createTerminal - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.createTerminal', () => { - vscode.window.createTerminal(`Ext Terminal #${NEXT_TERM_ID++}`); - vscode.window.showInformationMessage('Hello World 2!'); - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.createAndSend', () => { - const terminal = vscode.window.createTerminal(`Ext Terminal #${NEXT_TERM_ID++}`); - terminal.sendText("echo 'Sent text immediately after creating'"); - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.createZshLoginShell', () => { - vscode.window.createTerminal(`Ext Terminal #${NEXT_TERM_ID++}`, '/bin/zsh', ['-l']); - })); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.createTerminal', () => { + vscode.window.createTerminal(`Ext Terminal #${NEXT_TERM_ID++}`); + vscode.window.showInformationMessage('Hello World 2!'); + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.createAndSend', () => { + const terminal = vscode.window.createTerminal(`Ext Terminal #${NEXT_TERM_ID++}`); + terminal.sendText("echo 'Sent text immediately after creating'"); + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.createZshLoginShell', () => { + vscode.window.createTerminal(`Ext Terminal #${NEXT_TERM_ID++}`, '/bin/zsh', ['-l']); + }) + ); // Terminal.hide - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.hide', () => { - if (ensureTerminalExists()) { - selectTerminal().then(terminal => terminal.hide()); - } - })); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.hide', () => { + if (ensureTerminalExists()) { + selectTerminal().then(terminal => terminal.hide()); + } + }) + ); // Terminal.show - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.show', () => { - if (ensureTerminalExists()) { - selectTerminal().then(terminal => terminal.show()); - } - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.showPreserveFocus', () => { - if (ensureTerminalExists()) { - selectTerminal().then(terminal => terminal.show(true)); - } - })); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.show', () => { + if (ensureTerminalExists()) { + selectTerminal().then(terminal => terminal.show()); + } + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.showPreserveFocus', () => { + if (ensureTerminalExists()) { + selectTerminal().then(terminal => terminal.show(true)); + } + }) + ); // Terminal.sendText - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.sendText', () => { - if (ensureTerminalExists()) { - selectTerminal().then(terminal => terminal.sendText("echo 'Hello world!'")); - } - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.sendTextNoNewLine', () => { - if (ensureTerminalExists()) { - selectTerminal().then(terminal => terminal.sendText("echo 'Hello world!'", false)); - } - })); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.sendText', () => { + if (ensureTerminalExists()) { + selectTerminal().then(terminal => terminal.sendText("echo 'Hello world!'")); + } + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.sendTextNoNewLine', () => { + if (ensureTerminalExists()) { + selectTerminal().then(terminal => terminal.sendText("echo 'Hello world!'", false)); + } + }) + ); // Terminal.dispose - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.dispose', () => { - if (ensureTerminalExists()) { - selectTerminal().then(terminal => { - if (terminal) { - terminal.dispose(); - } - }); - } - })); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.dispose', () => { + if (ensureTerminalExists()) { + selectTerminal().then(terminal => { + if (terminal) { + terminal.dispose(); + } + }); + } + }) + ); // Terminal.processId - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.processId', () => { - selectTerminal().then(terminal => { - terminal.processId.then((processId) => { - if (processId) { - vscode.window.showInformationMessage(`Terminal.processId: ${processId}`); - } else { - vscode.window.showInformationMessage('Terminal does not have a process ID'); - } + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.processId', () => { + selectTerminal().then(terminal => { + terminal.processId.then(processId => { + if (processId) { + vscode.window.showInformationMessage(`Terminal.processId: ${processId}`); + } else { + vscode.window.showInformationMessage('Terminal does not have a process ID'); + } + }); }); - }); - })); + }) + ); // vscode.window.onDidCloseTerminal - vscode.window.onDidCloseTerminal((terminal) => { + vscode.window.onDidCloseTerminal(terminal => { vscode.window.showInformationMessage(`onDidCloseTerminal, name: ${terminal.name}`); }); - // vvv Proposed APIs in 1.23 below vvv - // vscode.window.terminals - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.terminals', () => { - selectTerminal(); - })); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.terminals', () => { + selectTerminal(); + }) + ); // vscode.window.onDidOpenTerminal if ('onDidOpenTerminal' in vscode.window) { @@ -109,80 +129,98 @@ export function activate(context: vscode.ExtensionContext) { vscode.window.showInformationMessage(`onDidOpenTerminal, name: ${terminal.name}`); }); } - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.onDidWriteData', () => { - selectTerminal().then(terminal => { - vscode.window.showInformationMessage(`onDidWriteData listener attached for terminal: ${terminal.name}, check the devtools console to see events`); - (terminal).onDidWriteData((data: string) => { - console.log('onDidWriteData: ' + data); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.onDidWriteData', () => { + selectTerminal().then(terminal => { + vscode.window.showInformationMessage( + `onDidWriteData listener attached for terminal: ${terminal.name}, check the devtools console to see events` + ); + (terminal).onDidWriteData((data: string) => { + console.log('onDidWriteData: ' + data); + }); }); - }); - })); + }) + ); // vvv Proposed APIs in 1.25 below vvv let renderer; - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.terminalRendererCreate', () => { - renderer = (vscode.window).createTerminalRenderer('renderer'); - renderer.write(colorText('~~~ Hello world! ~~~')); - renderer.onDidChangeMaximumDimensions(dim => { - console.log(`Dimensions for renderer changed: columns=${dim.columns}, rows=${dim.rows}`); - }); - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.terminalRendererName', () => { - if (!renderer) { - return; - } - vscode.window.showInputBox({ placeHolder: "Enter a new name" }).then(value => { - if (!value) { + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.terminalRendererCreate', () => { + renderer = (vscode.window).createTerminalRenderer('renderer'); + renderer.write(colorText('~~~ Hello world! ~~~')); + renderer.onDidChangeMaximumDimensions(dim => { + console.log(`Dimensions for renderer changed: columns=${dim.columns}, rows=${dim.rows}`); + }); + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.terminalRendererName', () => { + if (!renderer) { return; } - renderer.name = value; - }); - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.terminalRendererWrite', () => { - if (!renderer) { - return; - } - vscode.window.showInputBox({ placeHolder: "Enter text to write" }).then(value => { - if (!value) { - return; - } - // Note that entering characters like `\r` in the input box will result in `\\r` being written - renderer.write(value); - }); - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.createFakeShell', () => { - const shell = (vscode.window).createTerminalRenderer('fake shell'); - shell.write('Type and press enter to echo the text\r\n\r\n'); - let line = ''; - shell.onDidAcceptInput(data => { - if (data === '\r') { - shell.write(`\r\necho: "${colorText(line)}"\r\n\n`); - line = ''; - return; - } - line += data; - shell.write(data); - }); - shell.terminal.show(); - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.maximumDimensions', () => { - renderer.maximumDimensions.then(dimensions => { - vscode.window.showInformationMessage(`TerminalRenderer.maximumDimensions: columns=${dimensions.columns}, rows=${dimensions.rows}`); - }); - })); - context.subscriptions.push(vscode.commands.registerCommand('terminalTest.dimensions', () => { - vscode.window.showInputBox({ placeHolder: "Enter columns" }).then(columns => { - if (!columns) { - return; - } - vscode.window.showInputBox({ placeHolder: "Enter rows" }).then(rows => { - if (!rows) { + vscode.window.showInputBox({ placeHolder: 'Enter a new name' }).then(value => { + if (!value) { return; } - renderer.dimensions = { columns: parseInt(columns, 10), rows: parseInt(rows, 10) }; + renderer.name = value; }); - }); - })); + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.terminalRendererWrite', () => { + if (!renderer) { + return; + } + vscode.window.showInputBox({ placeHolder: 'Enter text to write' }).then(value => { + if (!value) { + return; + } + // Note that entering characters like `\r` in the input box will result in `\\r` being written + renderer.write(value); + }); + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.createFakeShell', () => { + const shell = (vscode.window).createTerminalRenderer('fake shell'); + shell.write('Type and press enter to echo the text\r\n\r\n'); + let line = ''; + shell.onDidAcceptInput(data => { + if (data === '\r') { + shell.write(`\r\necho: "${colorText(line)}"\r\n\n`); + line = ''; + return; + } + line += data; + shell.write(data); + }); + shell.terminal.show(); + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.maximumDimensions', () => { + renderer.maximumDimensions.then(dimensions => { + vscode.window.showInformationMessage( + `TerminalRenderer.maximumDimensions: columns=${dimensions.columns}, rows=${dimensions.rows}` + ); + }); + }) + ); + context.subscriptions.push( + vscode.commands.registerCommand('terminalTest.dimensions', () => { + vscode.window.showInputBox({ placeHolder: 'Enter columns' }).then(columns => { + if (!columns) { + return; + } + vscode.window.showInputBox({ placeHolder: 'Enter rows' }).then(rows => { + if (!rows) { + return; + } + renderer.dimensions = { columns: parseInt(columns, 10), rows: parseInt(rows, 10) }; + }); + }); + }) + ); } function colorText(text: string): string { @@ -212,7 +250,7 @@ function selectTerminal(): Thenable { label: `name: ${t.name}`, terminal: t }; - }) + }); return vscode.window.showQuickPick(items).then(item => { return item.terminal; }); @@ -224,4 +262,4 @@ function ensureTerminalExists(): boolean { return false; } return true; -} \ No newline at end of file +} diff --git a/tree-view-sample/src/extension.ts b/tree-view-sample/src/extension.ts index f236fc55..8e5995ca 100644 --- a/tree-view-sample/src/extension.ts +++ b/tree-view-sample/src/extension.ts @@ -2,9 +2,9 @@ import * as vscode from 'vscode'; -import { DepNodeProvider } from './nodeDependencies' -import { JsonOutlineProvider } from './jsonOutline' -import { FtpExplorer } from './ftpExplorer.textDocumentContentProvider' +import { DepNodeProvider } from './nodeDependencies'; +import { JsonOutlineProvider } from './jsonOutline'; +import { FtpExplorer } from './ftpExplorer.textDocumentContentProvider'; import { FileExplorer } from './fileExplorer'; export function activate(context: vscode.ExtensionContext) { @@ -19,14 +19,19 @@ export function activate(context: vscode.ExtensionContext) { vscode.window.registerTreeDataProvider('nodeDependencies', nodeDependenciesProvider); vscode.commands.registerCommand('nodeDependencies.refreshEntry', () => nodeDependenciesProvider.refresh()); - vscode.commands.registerCommand('nodeDependencies.addEntry', node => vscode.window.showInformationMessage('Successfully called add entry')); - vscode.commands.registerCommand('nodeDependencies.deleteEntry', node => vscode.window.showInformationMessage('Successfully called delete entry')); - vscode.commands.registerCommand('extension.openPackageOnNpm', moduleName => vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(`https://www.npmjs.com/package/${moduleName}`))); + vscode.commands.registerCommand('nodeDependencies.addEntry', node => + vscode.window.showInformationMessage('Successfully called add entry') + ); + vscode.commands.registerCommand('nodeDependencies.deleteEntry', node => + vscode.window.showInformationMessage('Successfully called delete entry') + ); + vscode.commands.registerCommand('extension.openPackageOnNpm', moduleName => + vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(`https://www.npmjs.com/package/${moduleName}`)) + ); vscode.window.registerTreeDataProvider('jsonOutline', jsonOutlineProvider); vscode.commands.registerCommand('jsonOutline.refresh', () => jsonOutlineProvider.refresh()); vscode.commands.registerCommand('jsonOutline.refreshNode', offset => jsonOutlineProvider.refresh(offset)); vscode.commands.registerCommand('jsonOutline.renameNode', offset => jsonOutlineProvider.rename(offset)); vscode.commands.registerCommand('extension.openJsonSelection', range => jsonOutlineProvider.select(range)); - } diff --git a/tree-view-sample/src/fileExplorer.ts b/tree-view-sample/src/fileExplorer.ts index f7bfbc50..b080953d 100644 --- a/tree-view-sample/src/fileExplorer.ts +++ b/tree-view-sample/src/fileExplorer.ts @@ -7,8 +7,12 @@ import * as rimraf from 'rimraf'; //#region Utilities namespace _ { - - function handleResult(resolve: (result: T) => void, reject: (error: Error) => void, error: Error | null | undefined, result: T): void { + function handleResult( + resolve: (result: T) => void, + reject: (error: Error) => void, + error: Error | null | undefined, + result: T + ): void { if (error) { reject(massageError(error)); } else { @@ -112,11 +116,16 @@ namespace _ { } export class FileStat implements vscode.FileStat { - - constructor(private fsStat: fs.Stats) { } + constructor(private fsStat: fs.Stats) {} get type(): vscode.FileType { - return this.fsStat.isFile() ? vscode.FileType.File : this.fsStat.isDirectory() ? vscode.FileType.Directory : this.fsStat.isSymbolicLink() ? vscode.FileType.SymbolicLink : vscode.FileType.Unknown; + return this.fsStat.isFile() + ? vscode.FileType.File + : this.fsStat.isDirectory() + ? vscode.FileType.Directory + : this.fsStat.isSymbolicLink() + ? vscode.FileType.SymbolicLink + : vscode.FileType.Unknown; } get isFile(): boolean | undefined { @@ -145,14 +154,13 @@ export class FileStat implements vscode.FileStat { } interface Entry { - uri: vscode.Uri, - type: vscode.FileType + uri: vscode.Uri; + type: vscode.FileType; } //#endregion export class FileSystemProvider implements vscode.TreeDataProvider, vscode.FileSystemProvider { - private _onDidChangeFile: vscode.EventEmitter; constructor() { @@ -163,17 +171,28 @@ export class FileSystemProvider implements vscode.TreeDataProvider, vscod return this._onDidChangeFile.event; } - watch(uri: vscode.Uri, options: { recursive: boolean; excludes: string[]; }): vscode.Disposable { - const watcher = fs.watch(uri.fsPath, { recursive: options.recursive }, async (event: string, filename: string | Buffer) => { - const filepath = path.join(uri.fsPath, _.normalizeNFC(filename.toString())); + watch(uri: vscode.Uri, options: { recursive: boolean; excludes: string[] }): vscode.Disposable { + const watcher = fs.watch( + uri.fsPath, + { recursive: options.recursive }, + async (event: string, filename: string | Buffer) => { + const filepath = path.join(uri.fsPath, _.normalizeNFC(filename.toString())); - // TODO support excludes (using minimatch library?) + // TODO support excludes (using minimatch library?) - this._onDidChangeFile.fire([{ - type: event === 'change' ? vscode.FileChangeType.Changed : await _.exists(filepath) ? vscode.FileChangeType.Created : vscode.FileChangeType.Deleted, - uri: uri.with({ path: filepath }) - } as vscode.FileChangeEvent]); - }); + this._onDidChangeFile.fire([ + { + type: + event === 'change' + ? vscode.FileChangeType.Changed + : (await _.exists(filepath)) + ? vscode.FileChangeType.Created + : vscode.FileChangeType.Deleted, + uri: uri.with({ path: filepath }) + } as vscode.FileChangeEvent + ]); + } + ); return { dispose: () => watcher.close() }; } @@ -211,11 +230,19 @@ export class FileSystemProvider implements vscode.TreeDataProvider, vscod return _.readfile(uri.fsPath); } - writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean; }): void | Thenable { + writeFile( + uri: vscode.Uri, + content: Uint8Array, + options: { create: boolean; overwrite: boolean } + ): void | Thenable { return this._writeFile(uri, content, options); } - async _writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean; }): Promise { + async _writeFile( + uri: vscode.Uri, + content: Uint8Array, + options: { create: boolean; overwrite: boolean } + ): Promise { const exists = await _.exists(uri.fsPath); if (!exists) { if (!options.create) { @@ -232,7 +259,7 @@ export class FileSystemProvider implements vscode.TreeDataProvider, vscod return _.writefile(uri.fsPath, content as Buffer); } - delete(uri: vscode.Uri, options: { recursive: boolean; }): void | Thenable { + delete(uri: vscode.Uri, options: { recursive: boolean }): void | Thenable { if (options.recursive) { return _.rmrf(uri.fsPath); } @@ -240,11 +267,11 @@ export class FileSystemProvider implements vscode.TreeDataProvider, vscod return _.unlink(uri.fsPath); } - rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; }): void | Thenable { + rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean }): void | Thenable { return this._rename(oldUri, newUri, options); } - async _rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean; }): Promise { + async _rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean }): Promise { const exists = await _.exists(newUri.fsPath); if (exists) { if (!options.overwrite) { @@ -278,17 +305,25 @@ export class FileSystemProvider implements vscode.TreeDataProvider, vscod return a[0].localeCompare(b[0]); } return a[1] === vscode.FileType.Directory ? -1 : 1; - }) - return children.map(([name, type]) => ({ uri: vscode.Uri.file(path.join(workspaceFolder.uri.fsPath, name)), type })); + }); + return children.map(([name, type]) => ({ + uri: vscode.Uri.file(path.join(workspaceFolder.uri.fsPath, name)), + type + })); } return []; } getTreeItem(element: Entry): vscode.TreeItem { - const treeItem = new vscode.TreeItem(element.uri, element.type === vscode.FileType.Directory ? vscode.TreeItemCollapsibleState.Collapsed : vscode.TreeItemCollapsibleState.None); + const treeItem = new vscode.TreeItem( + element.uri, + element.type === vscode.FileType.Directory + ? vscode.TreeItemCollapsibleState.Collapsed + : vscode.TreeItemCollapsibleState.None + ); if (element.type === vscode.FileType.File) { - treeItem.command = { command: 'fileExplorer.openFile', title: "Open File", arguments: [element.uri], }; + treeItem.command = { command: 'fileExplorer.openFile', title: 'Open File', arguments: [element.uri] }; treeItem.contextValue = 'file'; } return treeItem; @@ -296,16 +331,15 @@ export class FileSystemProvider implements vscode.TreeDataProvider, vscod } export class FileExplorer { - private fileExplorer: vscode.TreeView; constructor(context: vscode.ExtensionContext) { const treeDataProvider = new FileSystemProvider(); this.fileExplorer = vscode.window.createTreeView('fileExplorer', { treeDataProvider }); - vscode.commands.registerCommand('fileExplorer.openFile', (resource) => this.openResource(resource)); + vscode.commands.registerCommand('fileExplorer.openFile', resource => this.openResource(resource)); } private openResource(resource: vscode.Uri): void { vscode.window.showTextDocument(resource); } -} \ No newline at end of file +} diff --git a/tree-view-sample/src/ftpExplorer.textDocumentContentProvider.ts b/tree-view-sample/src/ftpExplorer.textDocumentContentProvider.ts index 4b37ecd3..86735ea4 100644 --- a/tree-view-sample/src/ftpExplorer.textDocumentContentProvider.ts +++ b/tree-view-sample/src/ftpExplorer.textDocumentContentProvider.ts @@ -8,18 +8,14 @@ interface IEntry { } export interface FtpNode { - resource: vscode.Uri; isDirectory: boolean; - } export class FtpModel { - private nodes: Map = new Map(); - constructor(readonly host: string, private user: string, private password: string) { - } + constructor(readonly host: string, private user: string, private password: string) {} public connect(): Thenable { return new Promise((c, e) => { @@ -30,7 +26,7 @@ export class FtpModel { client.on('error', error => { e('Error while connecting: ' + error.message); - }) + }); client.connect({ host: this.host, @@ -50,7 +46,14 @@ export class FtpModel { client.end(); - return c(this.sort(list.map(entry => ({ resource: vscode.Uri.parse(`ftp://${this.host}///${entry.name}`), isDirectory: entry.type === 'd' })))); + return c( + this.sort( + list.map(entry => ({ + resource: vscode.Uri.parse(`ftp://${this.host}///${entry.name}`), + isDirectory: entry.type === 'd' + })) + ) + ); }); }); }); @@ -66,7 +69,14 @@ export class FtpModel { client.end(); - return c(this.sort(list.map(entry => ({ resource: vscode.Uri.parse(`${node.resource.fsPath}/${entry.name}`), isDirectory: entry.type === 'd' })))); + return c( + this.sort( + list.map(entry => ({ + resource: vscode.Uri.parse(`${node.resource.fsPath}/${entry.name}`), + isDirectory: entry.type === 'd' + })) + ) + ); }); }); }); @@ -94,15 +104,15 @@ export class FtpModel { return e(err); } - let string = '' - stream.on('data', function (buffer) { + let string = ''; + stream.on('data', function(buffer) { if (buffer) { var part = buffer.toString(); string += part; } }); - stream.on('end', function () { + stream.on('end', function() { client.end(); c(string); }); @@ -113,26 +123,26 @@ export class FtpModel { } export class FtpTreeDataProvider implements vscode.TreeDataProvider, vscode.TextDocumentContentProvider { - private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter(); readonly onDidChangeTreeData: vscode.Event = this._onDidChangeTreeData.event; - constructor(private readonly model: FtpModel) { } + constructor(private readonly model: FtpModel) {} public refresh(): any { this._onDidChangeTreeData.fire(); } - public getTreeItem(element: FtpNode): vscode.TreeItem { return { resourceUri: element.resource, collapsibleState: element.isDirectory ? vscode.TreeItemCollapsibleState.Collapsed : void 0, - command: element.isDirectory ? void 0 : { - command: 'ftpExplorer.openFtpResource', - arguments: [element.resource], - title: 'Open FTP Resource' - } + command: element.isDirectory + ? void 0 + : { + command: 'ftpExplorer.openFtpResource', + arguments: [element.resource], + title: 'Open FTP Resource' + } }; } @@ -151,7 +161,6 @@ export class FtpTreeDataProvider implements vscode.TreeDataProvider, vs } export class FtpExplorer { - private ftpViewer: vscode.TreeView; constructor(context: vscode.ExtensionContext) { @@ -186,4 +195,4 @@ export class FtpExplorer { } return null; } -} \ No newline at end of file +} diff --git a/tree-view-sample/src/jsftp.d.ts b/tree-view-sample/src/jsftp.d.ts index 6d23834d..85e945cc 100644 --- a/tree-view-sample/src/jsftp.d.ts +++ b/tree-view-sample/src/jsftp.d.ts @@ -1,46 +1,41 @@ - - import { Readable } from 'stream'; import { EventEmitter } from 'events'; declare namespace JSFtp { + interface JSFtpOptions { + host: string; + port?: number | 21; + user?: string | 'anonymous'; + pass?: string | '@anonymous'; + useList?: boolean; + } + interface Callback { + (err: any, result: T): void; + } - interface JSFtpOptions { - host: string; - port?: number | 21; - user?: string | 'anonymous'; - pass?: string | '@anonymous'; - useList?: boolean - } - - interface Callback { - (err: any, result: T): void; - } - - - interface Entry { - name: string; - size: number; - time: number; - type: 0 | 1; - } + interface Entry { + name: string; + size: number; + time: number; + type: 0 | 1; + } } interface JSFtp extends EventEmitter { - auth(user: string, password: string, callback: JSFtp.Callback): void - keepAlive(wait?: number): void; - ls(path: string, callback: JSFtp.Callback): void; - list(path: string, callback: JSFtp.Callback): void; - put(buffer: Buffer, path: string, callback: JSFtp.Callback): void; - get(path: string, callback: JSFtp.Callback): void; - setType(type: 'A' | 'AN' | 'AT' | 'AC' | 'E' | 'I' | 'L', callback: JSFtp.Callback): void; - raw(command: string, args: any[], callback: JSFtp.Callback): void; - raw(command: string, args: any[], callback: JSFtp.Callback): void; + auth(user: string, password: string, callback: JSFtp.Callback): void; + keepAlive(wait?: number): void; + ls(path: string, callback: JSFtp.Callback): void; + list(path: string, callback: JSFtp.Callback): void; + put(buffer: Buffer, path: string, callback: JSFtp.Callback): void; + get(path: string, callback: JSFtp.Callback): void; + setType(type: 'A' | 'AN' | 'AT' | 'AC' | 'E' | 'I' | 'L', callback: JSFtp.Callback): void; + raw(command: string, args: any[], callback: JSFtp.Callback): void; + raw(command: string, args: any[], callback: JSFtp.Callback): void; } interface JSFtpConstructor { - new(options: JSFtp.JSFtpOptions): JSFtp; + new (options: JSFtp.JSFtpOptions): JSFtp; } declare const JSFtp: JSFtpConstructor; diff --git a/tree-view-sample/src/jsonOutline.ts b/tree-view-sample/src/jsonOutline.ts index 20983b9b..41ab9c45 100644 --- a/tree-view-sample/src/jsonOutline.ts +++ b/tree-view-sample/src/jsonOutline.ts @@ -4,7 +4,6 @@ import * as path from 'path'; import { isNumber } from 'util'; export class JsonOutlineProvider implements vscode.TreeDataProvider { - private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter(); readonly onDidChangeTreeData: vscode.Event = this._onDidChangeTreeData.event; @@ -34,30 +33,34 @@ export class JsonOutlineProvider implements vscode.TreeDataProvider { } rename(offset: number): void { - vscode.window.showInputBox({ placeHolder: 'Enter the new label' }) - .then(value => { - if (value !== null && value !== undefined) { - this.editor.edit(editBuilder => { - const path = json.getLocation(this.text, offset).path - let propertyNode = json.findNodeAtLocation(this.tree, path); - if (propertyNode.parent.type !== 'array') { - propertyNode = propertyNode.parent.children[0]; - } - const range = new vscode.Range(this.editor.document.positionAt(propertyNode.offset), this.editor.document.positionAt(propertyNode.offset + propertyNode.length)); - editBuilder.replace(range, `"${value}"`); - setTimeout(() => { - this.parseTree(); - this.refresh(offset); - }, 100) - }); - } - }); + vscode.window.showInputBox({ placeHolder: 'Enter the new label' }).then(value => { + if (value !== null && value !== undefined) { + this.editor.edit(editBuilder => { + const path = json.getLocation(this.text, offset).path; + let propertyNode = json.findNodeAtLocation(this.tree, path); + if (propertyNode.parent.type !== 'array') { + propertyNode = propertyNode.parent.children[0]; + } + const range = new vscode.Range( + this.editor.document.positionAt(propertyNode.offset), + this.editor.document.positionAt(propertyNode.offset + propertyNode.length) + ); + editBuilder.replace(range, `"${value}"`); + setTimeout(() => { + this.parseTree(); + this.refresh(offset); + }, 100); + }); + } + }); } private onActiveEditorChanged(): void { if (vscode.window.activeTextEditor) { if (vscode.window.activeTextEditor.document.uri.scheme === 'file') { - const enabled = vscode.window.activeTextEditor.document.languageId === 'json' || vscode.window.activeTextEditor.document.languageId === 'jsonc'; + const enabled = + vscode.window.activeTextEditor.document.languageId === 'json' || + vscode.window.activeTextEditor.document.languageId === 'jsonc'; vscode.commands.executeCommand('setContext', 'jsonOutlineEnabled', enabled); if (enabled) { this.refresh(); @@ -92,7 +95,7 @@ export class JsonOutlineProvider implements vscode.TreeDataProvider { getChildren(offset?: number): Thenable { if (offset) { - const path = json.getLocation(this.text, offset).path + const path = json.getLocation(this.text, offset).path; const node = json.findNodeAtLocation(this.tree, path); return Promise.resolve(this.getChildrenOffsets(node)); } else { @@ -103,7 +106,7 @@ export class JsonOutlineProvider implements vscode.TreeDataProvider { private getChildrenOffsets(node: json.Node): number[] { const offsets: number[] = []; for (const child of node.children) { - const childPath = json.getLocation(this.text, child.offset).path + const childPath = json.getLocation(this.text, child.offset).path; const childNode = json.findNodeAtLocation(this.tree, childPath); if (childNode) { offsets.push(childNode.offset); @@ -113,15 +116,27 @@ export class JsonOutlineProvider implements vscode.TreeDataProvider { } getTreeItem(offset: number): vscode.TreeItem { - const path = json.getLocation(this.text, offset).path + const path = json.getLocation(this.text, offset).path; const valueNode = json.findNodeAtLocation(this.tree, path); if (valueNode) { let hasChildren = valueNode.type === 'object' || valueNode.type === 'array'; - let treeItem: vscode.TreeItem = new vscode.TreeItem(this.getLabel(valueNode), hasChildren ? valueNode.type === 'object' ? vscode.TreeItemCollapsibleState.Expanded : vscode.TreeItemCollapsibleState.Collapsed : vscode.TreeItemCollapsibleState.None); + let treeItem: vscode.TreeItem = new vscode.TreeItem( + this.getLabel(valueNode), + hasChildren + ? valueNode.type === 'object' + ? vscode.TreeItemCollapsibleState.Expanded + : vscode.TreeItemCollapsibleState.Collapsed + : vscode.TreeItemCollapsibleState.None + ); treeItem.command = { command: 'extension.openJsonSelection', title: '', - arguments: [new vscode.Range(this.editor.document.positionAt(valueNode.offset), this.editor.document.positionAt(valueNode.offset + valueNode.length))] + arguments: [ + new vscode.Range( + this.editor.document.positionAt(valueNode.offset), + this.editor.document.positionAt(valueNode.offset + valueNode.length) + ) + ] }; treeItem.iconPath = this.getIcon(valueNode); treeItem.contextValue = valueNode.type; @@ -140,19 +155,19 @@ export class JsonOutlineProvider implements vscode.TreeDataProvider { return { light: this.context.asAbsolutePath(path.join('resources', 'light', 'boolean.svg')), dark: this.context.asAbsolutePath(path.join('resources', 'dark', 'boolean.svg')) - } + }; } if (nodeType === 'string') { return { light: this.context.asAbsolutePath(path.join('resources', 'light', 'string.svg')), dark: this.context.asAbsolutePath(path.join('resources', 'dark', 'string.svg')) - } + }; } if (nodeType === 'number') { return { light: this.context.asAbsolutePath(path.join('resources', 'light', 'number.svg')), dark: this.context.asAbsolutePath(path.join('resources', 'dark', 'number.svg')) - } + }; } return null; } @@ -167,8 +182,7 @@ export class JsonOutlineProvider implements vscode.TreeDataProvider { return prefix + ':[ ]'; } return prefix + ':' + node.value.toString(); - } - else { + } else { const property = node.parent.children[0].value.toString(); if (node.type === 'array' || node.type === 'object') { if (node.type === 'object') { @@ -178,8 +192,13 @@ export class JsonOutlineProvider implements vscode.TreeDataProvider { return '[ ] ' + property; } } - const value = this.editor.document.getText(new vscode.Range(this.editor.document.positionAt(node.offset), this.editor.document.positionAt(node.offset + node.length))) + const value = this.editor.document.getText( + new vscode.Range( + this.editor.document.positionAt(node.offset), + this.editor.document.positionAt(node.offset + node.length) + ) + ); return `${property}: ${value}`; } } -} \ No newline at end of file +} diff --git a/tree-view-sample/src/nodeDependencies.ts b/tree-view-sample/src/nodeDependencies.ts index b6f26870..e04eea5d 100644 --- a/tree-view-sample/src/nodeDependencies.ts +++ b/tree-view-sample/src/nodeDependencies.ts @@ -3,12 +3,12 @@ import * as fs from 'fs'; import * as path from 'path'; export class DepNodeProvider implements vscode.TreeDataProvider { - - private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter(); + private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter< + Dependency | undefined + >(); readonly onDidChangeTreeData: vscode.Event = this._onDidChangeTreeData.event; - constructor(private workspaceRoot: string) { - } + constructor(private workspaceRoot: string) {} refresh(): void { this._onDidChangeTreeData.fire(); @@ -23,9 +23,11 @@ export class DepNodeProvider implements vscode.TreeDataProvider { vscode.window.showInformationMessage('No dependency in empty workspace'); return Promise.resolve([]); } - + if (element) { - return Promise.resolve(this.getDepsInPackageJson(path.join(this.workspaceRoot, 'node_modules', element.label, 'package.json'))); + return Promise.resolve( + this.getDepsInPackageJson(path.join(this.workspaceRoot, 'node_modules', element.label, 'package.json')) + ); } else { const packageJsonPath = path.join(this.workspaceRoot, 'package.json'); if (this.pathExists(packageJsonPath)) { @@ -35,7 +37,6 @@ export class DepNodeProvider implements vscode.TreeDataProvider { return Promise.resolve([]); } } - } /** @@ -55,7 +56,7 @@ export class DepNodeProvider implements vscode.TreeDataProvider { arguments: [moduleName] }); } - } + }; const deps = packageJson.dependencies ? Object.keys(packageJson.dependencies).map(dep => toDep(dep, packageJson.dependencies[dep])) @@ -81,7 +82,6 @@ export class DepNodeProvider implements vscode.TreeDataProvider { } class Dependency extends vscode.TreeItem { - constructor( public readonly label: string, private version: string, @@ -92,7 +92,7 @@ class Dependency extends vscode.TreeItem { } get tooltip(): string { - return `${this.label}-${this.version}` + return `${this.label}-${this.version}`; } iconPath = { @@ -101,5 +101,4 @@ class Dependency extends vscode.TreeItem { }; contextValue = 'dependency'; - } diff --git a/vim-sample/src/common.ts b/vim-sample/src/common.ts index b1fd460f..f42c3105 100644 --- a/vim-sample/src/common.ts +++ b/vim-sample/src/common.ts @@ -14,9 +14,9 @@ export enum Mode { } export interface ModifierKeys { - ctrl?: boolean, - alt?: boolean, - shifit?: boolean + ctrl?: boolean; + alt?: boolean; + shifit?: boolean; } export class DeleteRegister { @@ -42,12 +42,10 @@ export interface IController { } export abstract class AbstractCommandDescriptor { - public abstract createCommand(args?: any): Command; - } export interface Command { - commandId: string, - args?: any[] + commandId: string; + args?: any[]; } diff --git a/vim-sample/src/controller.ts b/vim-sample/src/controller.ts index e3385b4c..2dec6d46 100644 --- a/vim-sample/src/controller.ts +++ b/vim-sample/src/controller.ts @@ -4,15 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { - TextEditorCursorStyle, - Position, - Range, - Selection, - TextEditor, - TextEditorRevealType, - window -} from 'vscode'; +import { TextEditorCursorStyle, Position, Range, Selection, TextEditor, TextEditorRevealType, window } from 'vscode'; import { Words } from './words'; import { MotionState, Motion } from './motions'; @@ -25,19 +17,28 @@ export interface ITypeResult { } export class Controller implements IController { - private _currentMode: Mode; private _currentInput: string; private _motionState: MotionState; private _isVisual: boolean; - public get motionState(): MotionState { return this._motionState; } - public findMotion(input: string): Motion { return Mappings.findMotion(input); } - public isMotionPrefix(input: string): boolean { return Mappings.isMotionPrefix(input); } + public get motionState(): MotionState { + return this._motionState; + } + public findMotion(input: string): Motion { + return Mappings.findMotion(input); + } + public isMotionPrefix(input: string): boolean { + return Mappings.isMotionPrefix(input); + } private _deleteRegister: DeleteRegister; - public setDeleteRegister(register: DeleteRegister): void { this._deleteRegister = register; } - public getDeleteRegister(): DeleteRegister { return this._deleteRegister; } + public setDeleteRegister(register: DeleteRegister): void { + this._deleteRegister = register; + } + public getDeleteRegister(): DeleteRegister { + return this._deleteRegister; + } constructor() { this._motionState = new MotionState(); @@ -180,11 +181,13 @@ export class Controller implements IController { if (this._currentMode === Mode.REPLACE) { let pos = editor.selection.active; - editor.edit((builder) => { - builder.replace(new Range(pos.line, pos.character, pos.line, pos.character + 1), text); - }).then(() => { - setPositionAndReveal(editor, pos.line, pos.character + 1); - }); + editor + .edit(builder => { + builder.replace(new Range(pos.line, pos.character, pos.line, pos.character + 1), text); + }) + .then(() => { + setPositionAndReveal(editor, pos.line, pos.character + 1); + }); return Promise.resolve({ hasConsumedInput: true, @@ -207,7 +210,7 @@ export class Controller implements IController { if (this._currentMode === Mode.REPLACE) { let pos = editor.selection.active; - editor.edit((builder) => { + editor.edit(builder => { builder.replace(new Range(pos.line, pos.character - replaceCharCnt, pos.line, pos.character), text); }); @@ -219,7 +222,7 @@ export class Controller implements IController { private _interpretNormalModeInput(editor: TextEditor, modifierKeys: ModifierKeys): Thenable { if (this._currentInput.startsWith(':')) { - return window.showInputBox({ value: 'tabm' }).then((value) => { + return window.showInputBox({ value: 'tabm' }).then(value => { return this._findMapping(value || '', editor, modifierKeys); }); } diff --git a/vim-sample/src/extension.ts b/vim-sample/src/extension.ts index 5ac15dc4..46b0385b 100644 --- a/vim-sample/src/extension.ts +++ b/vim-sample/src/extension.ts @@ -18,7 +18,7 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.commands.registerCommand(commandId, run)); } function registerCtrlKeyBinding(key: string): void { - registerCommandNice(key, function (args) { + registerCommandNice(key, function(args) { if (!vscode.window.activeTextEditor) { return; } @@ -28,34 +28,34 @@ export function activate(context: vscode.ExtensionContext) { let vimExt = new VimExt(); - registerCommandNice('type', function (args) { + registerCommandNice('type', function(args) { if (!vscode.window.activeTextEditor) { return; } vimExt.type(args.text); }); - registerCommandNice('replacePreviousChar', function (args) { + registerCommandNice('replacePreviousChar', function(args) { if (!vscode.window.activeTextEditor) { return; } vimExt.replacePrevChar(args.text, args.replaceCharCnt); }); - registerCommandNice('compositionStart', function (args) { + registerCommandNice('compositionStart', function(args) { if (!vscode.window.activeTextEditor) { return; } vimExt.compositionStart(); }); - registerCommandNice('compositionEnd', function (args) { + registerCommandNice('compositionEnd', function(args) { if (!vscode.window.activeTextEditor) { return; } vimExt.compositionEnd(); }); - registerCommandNice('vim.goToNormalMode', function (args) { + registerCommandNice('vim.goToNormalMode', function(args) { vimExt.goToNormalMode(); }); - registerCommandNice('vim.clearInput', function (args) { + registerCommandNice('vim.clearInput', function(args) { vimExt.clearInput(); }); // registerCommandNice('paste', function(args) { @@ -84,7 +84,6 @@ function getConfiguredWordSeparators(): string { } class VimExt { - private _inNormalMode: ContextKey; private _hasInput: ContextKey; private _statusBar: StatusBar; @@ -95,16 +94,16 @@ class VimExt { this._hasInput = new ContextKey('vim.hasInput'); this._statusBar = new StatusBar(); - this._controller = new Controller() + this._controller = new Controller(); - vscode.window.onDidChangeActiveTextEditor((textEditor) => { + vscode.window.onDidChangeActiveTextEditor(textEditor => { if (!textEditor) { return; } this._ensureState(); }); - vscode.window.onDidChangeTextEditorSelection((e) => { + vscode.window.onDidChangeTextEditorSelection(e => { let isVisual = this._controller.getVisual(); if (!isVisual) { @@ -154,7 +153,7 @@ class VimExt { } public type(text: string, modifierKeys: ModifierKeys = { ctrl: false, shifit: false, alt: false }): void { - this._controller.type(vscode.window.activeTextEditor, text, modifierKeys).then((r) => { + this._controller.type(vscode.window.activeTextEditor, text, modifierKeys).then(r => { if (r.hasConsumedInput) { this._ensureState(); if (r.executeEditorCommand) { @@ -186,7 +185,7 @@ class VimExt { } public compositionEnd(): void { - this._controller.compositionEnd(vscode.window.activeTextEditor).then((r) => { + this._controller.compositionEnd(vscode.window.activeTextEditor).then(r => { if (r.hasConsumedInput) { this._ensureState(); if (r.executeEditorCommand) { diff --git a/vim-sample/src/mappings.ts b/vim-sample/src/mappings.ts index 98867420..f3760c44 100644 --- a/vim-sample/src/mappings.ts +++ b/vim-sample/src/mappings.ts @@ -9,43 +9,47 @@ import { Motion, Motions } from './motions'; import { Operator, Operators } from './operators'; import { IController, Command, AbstractCommandDescriptor, ModifierKeys } from './common'; -const CHAR_TO_BINDING: { [char: string]: any; } = {}; +const CHAR_TO_BINDING: { [char: string]: any } = {}; function defineBinding(char: string, value: any, modifierKeys: ModifierKeys): void { let key = modifierKeys.ctrl ? 'CTRL + ' + char : char; CHAR_TO_BINDING[key] = value; -}; +} function getBinding(char: string, modifierKeys: ModifierKeys): any { let key = modifierKeys.ctrl ? 'CTRL + ' + char : char; return CHAR_TO_BINDING[key]; -}; +} function defineOperator(char: string, operator: Operator, modifierKeys: ModifierKeys = {}): void { defineBinding(char + '__operator__', operator, modifierKeys); -}; +} function getOperator(char: string, modifierKeys: ModifierKeys = {}): Operator { return getBinding(char + '__operator__', modifierKeys); -}; +} function defineCommand(char: string, commandId: string, modifierKeys: ModifierKeys = {}): void { defineBinding(char + '__command__', { commandId: commandId }, modifierKeys); -}; +} function getCommand(char: string, modifierKeys: ModifierKeys = {}): Command { return getBinding(char + '__command__', modifierKeys); -}; +} function defineMotion(char: string, motion: Motion, modifierKeys: ModifierKeys = {}): void { defineBinding(char + '__motion__', motion, modifierKeys); -}; +} function getMotion(char: string, modifierKeys: ModifierKeys = {}): Motion { return getBinding(char + '__motion__', modifierKeys); -}; +} -function defineMotionCommand(char: string, motionCommand: AbstractCommandDescriptor, modifierKeys: ModifierKeys = {}): void { +function defineMotionCommand( + char: string, + motionCommand: AbstractCommandDescriptor, + modifierKeys: ModifierKeys = {} +): void { defineBinding(char + '__motioncommand__', motionCommand, modifierKeys); -}; +} function getMotionCommand(char: string, modifierKeys: ModifierKeys = {}): AbstractCommandDescriptor { return getBinding(char + '__motioncommand__', modifierKeys); -}; +} // Operators defineOperator('x', Operators.DeleteCharUnderCursor); @@ -120,14 +124,12 @@ defineMotionCommand('zb', Motions.RevealCurrentLineAtBottom); defineMotionCommand('zc', Motions.FoldUnder); defineMotionCommand('zo', Motions.UnfoldUnder); - export interface IFoundOperator { runNormal(controller: IController, editor: TextEditor): boolean; runVisual(controller: IController, editor: TextEditor): boolean; } export class Mappings { - public static findMotion(input: string): Motion { let parsed = _parseNumberAndString(input); let motion = getMotion(parsed.input.substr(0, 1)); @@ -150,7 +152,11 @@ export class Mappings { return command; } - private static findMotionCommandFromNumberAndString(numberAndString: INumberAndString, isVisual: boolean, modifierKeys: ModifierKeys): Command { + private static findMotionCommandFromNumberAndString( + numberAndString: INumberAndString, + isVisual: boolean, + modifierKeys: ModifierKeys + ): Command { let motionCommand = getMotionCommand(numberAndString.input.substr(0, 1), modifierKeys); if (!motionCommand) { motionCommand = getMotionCommand(numberAndString.input.substr(0, 2), modifierKeys); @@ -164,7 +170,12 @@ export class Mappings { if (!motionCommand) { motionCommand = getMotionCommand(numberAndString.input, modifierKeys); } - return motionCommand ? motionCommand.createCommand({ isVisual: isVisual, repeat: numberAndString.hasRepeatCount ? numberAndString.repeatCount : undefined }) : null; + return motionCommand + ? motionCommand.createCommand({ + isVisual: isVisual, + repeat: numberAndString.hasRepeatCount ? numberAndString.repeatCount : undefined + }) + : null; } public static findOperator(input: string, modifierKeys: ModifierKeys): IFoundOperator { @@ -223,7 +234,7 @@ function _parseNumberAndString(input: string, numberAtBeginning: boolean = true) hasRepeatCount: false, repeatCount: 1, input: input - } + }; } interface INumberAndString { diff --git a/vim-sample/src/motions.ts b/vim-sample/src/motions.ts index d08d4d1d..ec38a0a4 100644 --- a/vim-sample/src/motions.ts +++ b/vim-sample/src/motions.ts @@ -9,7 +9,6 @@ import { Words, WordCharacters } from './words'; import { Command, AbstractCommandDescriptor } from './common'; export class MotionState { - public anchor: Position; public cursorDesiredCharacter: number; public wordCharacterClass: WordCharacters; @@ -19,7 +18,6 @@ export class MotionState { this.wordCharacterClass = null; this.anchor = null; } - } export abstract class Motion { @@ -34,7 +32,6 @@ export abstract class Motion { } class RepeatingMotion extends Motion { - private _actual: Motion; private _repeatCount: number; @@ -56,7 +53,7 @@ class NextCharacterMotion extends Motion { public run(doc: TextDocument, pos: Position, state: MotionState): Position { if (pos.character === doc.lineAt(pos.line).text.length) { // on last character - return ((pos.line + 1 < doc.lineCount) ? new Position(pos.line + 1, 0) : pos); + return pos.line + 1 < doc.lineCount ? new Position(pos.line + 1, 0) : pos; } return new Position(pos.line, pos.character + 1); @@ -80,7 +77,7 @@ class DownMotion extends Motion { public run(doc: TextDocument, pos: Position, state: MotionState): Position { let line = pos.line; - state.cursorDesiredCharacter = (state.cursorDesiredCharacter === -1 ? pos.character : state.cursorDesiredCharacter); + state.cursorDesiredCharacter = state.cursorDesiredCharacter === -1 ? pos.character : state.cursorDesiredCharacter; if (line < doc.lineCount - 1) { line++; @@ -95,7 +92,7 @@ class UpMotion extends Motion { public run(doc: TextDocument, pos: Position, state: MotionState): Position { let line = pos.line; - state.cursorDesiredCharacter = (state.cursorDesiredCharacter === -1 ? pos.character : state.cursorDesiredCharacter); + state.cursorDesiredCharacter = state.cursorDesiredCharacter === -1 ? pos.character : state.cursorDesiredCharacter; if (line > 0) { line--; @@ -138,7 +135,7 @@ class NextWordStartMotion extends Motion { if (pos.character >= lineContent.length - 1) { // cursor at end of line - return ((pos.line + 1 < doc.lineCount) ? new Position(pos.line + 1, 0) : pos); + return pos.line + 1 < doc.lineCount ? new Position(pos.line + 1, 0) : pos; } let nextWord = Words.findNextWord(doc, pos, state.wordCharacterClass); @@ -171,7 +168,7 @@ class NextWordEndMotion extends Motion { if (pos.character >= lineContent.length - 1) { // no content on this line or cursor at end of line - return ((pos.line + 1 < doc.lineCount) ? new Position(pos.line + 1, 0) : pos); + return pos.line + 1 < doc.lineCount ? new Position(pos.line + 1, 0) : pos; } let nextWord = Words.findNextWord(doc, pos, state.wordCharacterClass); @@ -201,7 +198,6 @@ class GoToLineUndefinedMotion extends Motion { } abstract class GoToLineMotion extends Motion { - protected firstNonWhitespaceChar(doc: TextDocument, line: number): number { let lineContent = doc.lineAt(line).text; let character = 0; @@ -214,7 +210,6 @@ abstract class GoToLineMotion extends Motion { } return character; } - } class GoToFirstLineMotion extends GoToLineMotion { @@ -245,7 +240,6 @@ class GoToLineDefinedMotion extends GoToLineMotion { } class CursorMoveCommand extends AbstractCommandDescriptor { - constructor(private to: string, private by?: string) { super(); } @@ -256,7 +250,7 @@ class CursorMoveCommand extends AbstractCommandDescriptor { by: this.by, value: args.repeat || 1, select: !!args.isVisual - } + }; return { commandId: 'cursorMove', args: cursorMoveArgs @@ -265,7 +259,6 @@ class CursorMoveCommand extends AbstractCommandDescriptor { } class EditorScrollCommand extends AbstractCommandDescriptor { - constructor(private to: string, private by?: string) { super(); } @@ -276,7 +269,7 @@ class EditorScrollCommand extends AbstractCommandDescriptor { by: this.by, value: args.repeat || 1, revealCursor: true - } + }; return { commandId: 'editorScroll', args: editorScrollArgs @@ -285,7 +278,6 @@ class EditorScrollCommand extends AbstractCommandDescriptor { } class RevealCurrentLineCommand extends AbstractCommandDescriptor { - constructor(private at: string) { super(); } @@ -304,7 +296,6 @@ class RevealCurrentLineCommand extends AbstractCommandDescriptor { } class MoveActiveEditorCommandByPosition extends AbstractCommandDescriptor { - constructor() { super(); } @@ -313,7 +304,7 @@ class MoveActiveEditorCommandByPosition extends AbstractCommandDescriptor { let moveActiveEditorArgs: any = { to: args.repeat === void 0 ? 'last' : 'position', value: args.repeat !== void 0 ? args.repeat + 1 : undefined - } + }; return { commandId: 'moveActiveEditor', args: moveActiveEditorArgs @@ -322,7 +313,6 @@ class MoveActiveEditorCommandByPosition extends AbstractCommandDescriptor { } class MoveActiveEditorCommand extends AbstractCommandDescriptor { - constructor(private to: string) { super(); } @@ -331,7 +321,7 @@ class MoveActiveEditorCommand extends AbstractCommandDescriptor { let moveActiveEditorArgs: any = { to: this.to, value: args.repeat ? args.repeat : 1 - } + }; return { commandId: 'moveActiveEditor', args: moveActiveEditorArgs @@ -339,7 +329,6 @@ class MoveActiveEditorCommand extends AbstractCommandDescriptor { } } class FoldCommand extends AbstractCommandDescriptor { - constructor() { super(); } @@ -348,7 +337,7 @@ class FoldCommand extends AbstractCommandDescriptor { let foldEditorArgs: any = { levels: args.repeat ? args.repeat : 1, direction: 'up' - } + }; return { commandId: 'editor.fold', args: foldEditorArgs @@ -357,7 +346,6 @@ class FoldCommand extends AbstractCommandDescriptor { } class UnfoldCommand extends AbstractCommandDescriptor { - constructor() { super(); } @@ -366,7 +354,7 @@ class UnfoldCommand extends AbstractCommandDescriptor { let foldEditorArgs: any = { levels: args.repeat ? args.repeat : 1, direction: 'up' - } + }; return { commandId: 'editor.unfold', args: foldEditorArgs diff --git a/vim-sample/src/operators.ts b/vim-sample/src/operators.ts index d173ff2f..8c49c3d3 100644 --- a/vim-sample/src/operators.ts +++ b/vim-sample/src/operators.ts @@ -9,7 +9,6 @@ import { MotionState, Motion, Motions } from './motions'; import { Mode, IController, DeleteRegister } from './common'; export abstract class Operator { - public abstract runNormalMode(ctrl: IController, ed: TextEditor, repeatCount: number, args: string): boolean; public abstract runVisualMode(ctrl: IController, ed: TextEditor, args: string): boolean; @@ -32,7 +31,7 @@ export abstract class Operator { protected delete(ctrl: IController, ed: TextEditor, isWholeLine: boolean, range: Range): void { ctrl.setDeleteRegister(new DeleteRegister(isWholeLine, ed.document.getText(range))); - ed.edit((builder) => { + ed.edit(builder => { builder.delete(range); }); } @@ -81,7 +80,11 @@ class VisualOperator extends OperatorWithNoArgs { class DeleteCharUnderCursorOperator extends Operator { public runNormalMode(ctrl: IController, ed: TextEditor, repeatCount: number, args: string): boolean { - let to = Motions.NextCharacter.repeat(repeatCount > 1, repeatCount).run(this.doc(ed), this.pos(ed), ctrl.motionState); + let to = Motions.NextCharacter.repeat(repeatCount > 1, repeatCount).run( + this.doc(ed), + this.pos(ed), + ctrl.motionState + ); let from = this.pos(ed); this.delete(ctrl, ed, false, new Range(from.line, from.character, to.line, to.character)); @@ -134,7 +137,6 @@ abstract class OperatorWithMotion extends Operator { public runNormalMode(ctrl: IController, ed: TextEditor, repeatCount: number, args: string): boolean { let motion = ctrl.findMotion(args); if (!motion) { - // is it motion building if (ctrl.isMotionPrefix(args)) { return false; @@ -151,7 +153,6 @@ abstract class OperatorWithMotion extends Operator { } class DeleteToOperator extends OperatorWithMotion { - public runNormalMode(ctrl: IController, ed: TextEditor, repeatCount: number, args: string): boolean { if (args === 'd') { // dd @@ -177,7 +178,6 @@ class DeleteToOperator extends OperatorWithMotion { } class PutOperator extends Operator { - public runNormalMode(ctrl: IController, ed: TextEditor, repeatCount: number, args: string): boolean { let register = ctrl.getDeleteRegister(); if (!register) { @@ -189,7 +189,7 @@ class PutOperator extends Operator { let pos = this.pos(ed); if (!register.isWholeLine) { - ed.edit((builder) => { + ed.edit(builder => { builder.insert(new Position(pos.line, pos.character + 1), str); }); return true; @@ -206,7 +206,7 @@ class PutOperator extends Operator { str = '\n' + str; } - ed.edit((builder) => { + ed.edit(builder => { builder.insert(new Position(insertLine, insertCharacter), str); }); @@ -223,7 +223,7 @@ class PutOperator extends Operator { let str = register.content; let sel = this.sel(ed); - ed.edit((builder) => { + ed.edit(builder => { builder.replace(sel, str); }); @@ -232,7 +232,6 @@ class PutOperator extends Operator { } class ReplaceOperator extends Operator { - public runNormalMode(ctrl: IController, ed: TextEditor, repeatCount: number, args: string): boolean { if (args.length === 0) { // input not ready @@ -247,7 +246,7 @@ class ReplaceOperator extends Operator { return true; } - ed.edit((builder) => { + ed.edit(builder => { builder.replace(new Range(pos.line, pos.character, pos.line, toCharacter), repeatString(args, repeatCount)); }); @@ -274,7 +273,7 @@ class ReplaceOperator extends Operator { } } - ed.edit((builder) => { + ed.edit(builder => { builder.replace(sel, dstString); }); @@ -283,7 +282,6 @@ class ReplaceOperator extends Operator { } class ReplaceModeOperator extends Operator { - public runNormalMode(ctrl: IController, ed: TextEditor, repeatCount: number, args: string): boolean { ctrl.setMode(Mode.REPLACE); return true; @@ -294,11 +292,9 @@ class ReplaceModeOperator extends Operator { ctrl.setMode(Mode.INSERT); return true; } - } class ChangeOperator extends OperatorWithMotion { - protected _runNormalMode(ctrl: IController, ed: TextEditor, motion: Motion): boolean { let to = motion.run(this.doc(ed), this.pos(ed), ctrl.motionState); let from = this.pos(ed); @@ -340,5 +336,5 @@ export const Operators = { Put: new PutOperator(), Replace: new ReplaceOperator(), Change: new ChangeOperator(), - ReplaceMode: new ReplaceModeOperator(), + ReplaceMode: new ReplaceModeOperator() }; diff --git a/vim-sample/src/words.ts b/vim-sample/src/words.ts index 10f12daf..5367f517 100644 --- a/vim-sample/src/words.ts +++ b/vim-sample/src/words.ts @@ -27,7 +27,6 @@ export interface IWord { } export class Words { - public static createWordCharacters(wordSeparators: string): WordCharacters { let result: CharacterClass[] = []; @@ -47,43 +46,67 @@ export class Words { } public static findNextWord(doc: TextDocument, pos: Position, wordCharacterClass: WordCharacters): IWord { - let lineContent = doc.lineAt(pos.line).text; let wordType = WordType.NONE; let len = lineContent.length; for (let chIndex = pos.character; chIndex < len; chIndex++) { let chCode = lineContent.charCodeAt(chIndex); - let chClass = (wordCharacterClass[chCode] || CharacterClass.REGULAR); + let chClass = wordCharacterClass[chCode] || CharacterClass.REGULAR; if (chClass === CharacterClass.REGULAR) { if (wordType === WordType.SEPARATOR) { - return this._createWord(lineContent, wordType, this._findStartOfWord(lineContent, wordCharacterClass, wordType, chIndex - 1), chIndex); + return this._createWord( + lineContent, + wordType, + this._findStartOfWord(lineContent, wordCharacterClass, wordType, chIndex - 1), + chIndex + ); } wordType = WordType.REGULAR; } else if (chClass === CharacterClass.WORD_SEPARATOR) { if (wordType === WordType.REGULAR) { - return this._createWord(lineContent, wordType, this._findStartOfWord(lineContent, wordCharacterClass, wordType, chIndex - 1), chIndex); + return this._createWord( + lineContent, + wordType, + this._findStartOfWord(lineContent, wordCharacterClass, wordType, chIndex - 1), + chIndex + ); } wordType = WordType.SEPARATOR; } else if (chClass === CharacterClass.WHITESPACE) { if (wordType !== WordType.NONE) { - return this._createWord(lineContent, wordType, this._findStartOfWord(lineContent, wordCharacterClass, wordType, chIndex - 1), chIndex); + return this._createWord( + lineContent, + wordType, + this._findStartOfWord(lineContent, wordCharacterClass, wordType, chIndex - 1), + chIndex + ); } } } if (wordType !== WordType.NONE) { - return this._createWord(lineContent, wordType, this._findStartOfWord(lineContent, wordCharacterClass, wordType, len - 1), len); + return this._createWord( + lineContent, + wordType, + this._findStartOfWord(lineContent, wordCharacterClass, wordType, len - 1), + len + ); } return null; } - private static _findStartOfWord(lineContent: string, wordCharacterClass: WordCharacters, wordType: WordType, startIndex: number): number { + private static _findStartOfWord( + lineContent: string, + wordCharacterClass: WordCharacters, + wordType: WordType, + startIndex: number + ): number { for (let chIndex = startIndex; chIndex >= 0; chIndex--) { let chCode = lineContent.charCodeAt(chIndex); - let chClass = (wordCharacterClass[chCode] || CharacterClass.REGULAR); + let chClass = wordCharacterClass[chCode] || CharacterClass.REGULAR; if (chClass === CharacterClass.WHITESPACE) { return chIndex + 1; diff --git a/webpack-sample/src/extension.ts b/webpack-sample/src/extension.ts index 6969adfe..41868378 100644 --- a/webpack-sample/src/extension.ts +++ b/webpack-sample/src/extension.ts @@ -8,10 +8,9 @@ import * as vscode from 'vscode'; import { add } from './math'; export function activate(context: vscode.ExtensionContext) { + let disposable = vscode.commands.registerCommand('extension.helloWebpack', () => { + vscode.window.showInformationMessage(`41 + 1 = ${add(41, 1)}`); + }); - let disposable = vscode.commands.registerCommand('extension.helloWebpack', () => { - vscode.window.showInformationMessage(`41 + 1 = ${add(41, 1)}`); - }); - - context.subscriptions.push(disposable); + context.subscriptions.push(disposable); } diff --git a/webpack-sample/src/math.ts b/webpack-sample/src/math.ts index ee03e1b7..f7a080c3 100644 --- a/webpack-sample/src/math.ts +++ b/webpack-sample/src/math.ts @@ -5,9 +5,9 @@ 'use strict'; export function add(a: number, b: number): number { - return a + b; + return a + b; } export function sub(a: number, b: number): number { - return a - b; + return a - b; } diff --git a/webview-sample/src/extension.ts b/webview-sample/src/extension.ts index c320f8db..0b434810 100644 --- a/webview-sample/src/extension.ts +++ b/webview-sample/src/extension.ts @@ -2,164 +2,173 @@ import * as path from 'path'; import * as vscode from 'vscode'; const cats = { - 'Coding Cat': 'https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif', - 'Compiling Cat': 'https://media.giphy.com/media/mlvseq9yvZhba/giphy.gif', - 'Testing Cat': 'https://media.giphy.com/media/3oriO0OEd9QIDdllqo/giphy.gif' + 'Coding Cat': 'https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif', + 'Compiling Cat': 'https://media.giphy.com/media/mlvseq9yvZhba/giphy.gif', + 'Testing Cat': 'https://media.giphy.com/media/3oriO0OEd9QIDdllqo/giphy.gif' }; export function activate(context: vscode.ExtensionContext) { + context.subscriptions.push( + vscode.commands.registerCommand('catCoding.start', () => { + CatCodingPanel.createOrShow(context.extensionPath); + }) + ); - context.subscriptions.push(vscode.commands.registerCommand('catCoding.start', () => { - CatCodingPanel.createOrShow(context.extensionPath); - })); + context.subscriptions.push( + vscode.commands.registerCommand('catCoding.doRefactor', () => { + if (CatCodingPanel.currentPanel) { + CatCodingPanel.currentPanel.doRefactor(); + } + }) + ); - context.subscriptions.push(vscode.commands.registerCommand('catCoding.doRefactor', () => { - if (CatCodingPanel.currentPanel) { - CatCodingPanel.currentPanel.doRefactor(); - } - })); - - if (vscode.window.registerWebviewPanelSerializer) { - // Make sure we register a serilizer in activation event - vscode.window.registerWebviewPanelSerializer(CatCodingPanel.viewType, { - async deserializeWebviewPanel(webviewPanel: vscode.WebviewPanel, state: any) { - console.log(`Got state: ${state}`); - CatCodingPanel.revive(webviewPanel, context.extensionPath); - } - }); - } + if (vscode.window.registerWebviewPanelSerializer) { + // Make sure we register a serilizer in activation event + vscode.window.registerWebviewPanelSerializer(CatCodingPanel.viewType, { + async deserializeWebviewPanel(webviewPanel: vscode.WebviewPanel, state: any) { + console.log(`Got state: ${state}`); + CatCodingPanel.revive(webviewPanel, context.extensionPath); + } + }); + } } /** * Manages cat coding webview panels */ class CatCodingPanel { - /** - * Track the currently panel. Only allow a single panel to exist at a time. - */ - public static currentPanel: CatCodingPanel | undefined; + /** + * Track the currently panel. Only allow a single panel to exist at a time. + */ + public static currentPanel: CatCodingPanel | undefined; - public static readonly viewType = 'catCoding'; + public static readonly viewType = 'catCoding'; - private readonly _panel: vscode.WebviewPanel; - private readonly _extensionPath: string; - private _disposables: vscode.Disposable[] = []; + private readonly _panel: vscode.WebviewPanel; + private readonly _extensionPath: string; + private _disposables: vscode.Disposable[] = []; - public static createOrShow(extensionPath: string) { - const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined; + public static createOrShow(extensionPath: string) { + const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined; - // If we already have a panel, show it. - if (CatCodingPanel.currentPanel) { - CatCodingPanel.currentPanel._panel.reveal(column); - return; - } + // If we already have a panel, show it. + if (CatCodingPanel.currentPanel) { + CatCodingPanel.currentPanel._panel.reveal(column); + return; + } - // Otherwise, create a new panel. - const panel = vscode.window.createWebviewPanel(CatCodingPanel.viewType, "Cat Coding", column || vscode.ViewColumn.One, { - // Enable javascript in the webview - enableScripts: true, + // Otherwise, create a new panel. + const panel = vscode.window.createWebviewPanel( + CatCodingPanel.viewType, + 'Cat Coding', + column || vscode.ViewColumn.One, + { + // Enable javascript in the webview + enableScripts: true, - // And restric the webview to only loading content from our extension's `media` directory. - localResourceRoots: [ - vscode.Uri.file(path.join(extensionPath, 'media')) - ] - }); + // And restric the webview to only loading content from our extension's `media` directory. + localResourceRoots: [vscode.Uri.file(path.join(extensionPath, 'media'))] + } + ); - CatCodingPanel.currentPanel = new CatCodingPanel(panel, extensionPath); - } + CatCodingPanel.currentPanel = new CatCodingPanel(panel, extensionPath); + } - public static revive(panel: vscode.WebviewPanel, extensionPath: string) { - CatCodingPanel.currentPanel = new CatCodingPanel(panel, extensionPath); - } + public static revive(panel: vscode.WebviewPanel, extensionPath: string) { + CatCodingPanel.currentPanel = new CatCodingPanel(panel, extensionPath); + } - private constructor( - panel: vscode.WebviewPanel, - extensionPath: string - ) { - this._panel = panel; - this._extensionPath = extensionPath; + private constructor(panel: vscode.WebviewPanel, extensionPath: string) { + this._panel = panel; + this._extensionPath = extensionPath; - // Set the webview's initial html content - this._update(); + // Set the webview's initial html content + this._update(); - // Listen for when the panel is disposed - // This happens when the user closes the panel or when the panel is closed programatically - this._panel.onDidDispose(() => this.dispose(), null, this._disposables); + // Listen for when the panel is disposed + // This happens when the user closes the panel or when the panel is closed programatically + this._panel.onDidDispose(() => this.dispose(), null, this._disposables); - // Update the content based on view changes - this._panel.onDidChangeViewState(e => { - if (this._panel.visible) { - this._update() - } - }, null, this._disposables); + // Update the content based on view changes + this._panel.onDidChangeViewState( + e => { + if (this._panel.visible) { + this._update(); + } + }, + null, + this._disposables + ); - // Handle messages from the webview - this._panel.webview.onDidReceiveMessage(message => { - switch (message.command) { - case 'alert': - vscode.window.showErrorMessage(message.text); - return; - } - }, null, this._disposables); - } + // Handle messages from the webview + this._panel.webview.onDidReceiveMessage( + message => { + switch (message.command) { + case 'alert': + vscode.window.showErrorMessage(message.text); + return; + } + }, + null, + this._disposables + ); + } - public doRefactor() { - // Send a message to the webview webview. - // You can send any JSON serializable data. - this._panel.webview.postMessage({ command: 'refactor' }); - } + public doRefactor() { + // Send a message to the webview webview. + // You can send any JSON serializable data. + this._panel.webview.postMessage({ command: 'refactor' }); + } - public dispose() { - CatCodingPanel.currentPanel = undefined; + public dispose() { + CatCodingPanel.currentPanel = undefined; - // Clean up our resources - this._panel.dispose(); + // Clean up our resources + this._panel.dispose(); - while (this._disposables.length) { - const x = this._disposables.pop(); - if (x) { - x.dispose(); - } - } - } + while (this._disposables.length) { + const x = this._disposables.pop(); + if (x) { + x.dispose(); + } + } + } - private _update() { + private _update() { + const z = 1 + 2; + // Vary the webview's content based on where it is located in the editor. + switch (this._panel.viewColumn) { + case vscode.ViewColumn.Two: + this._updateForCat('Compiling Cat'); + return; - const z = 1 + 2; - // Vary the webview's content based on where it is located in the editor. - switch (this._panel.viewColumn) { - case vscode.ViewColumn.Two: - this._updateForCat('Compiling Cat'); - return; + case vscode.ViewColumn.Three: + this._updateForCat('Testing Cat'); + return; - case vscode.ViewColumn.Three: - this._updateForCat('Testing Cat'); - return; + case vscode.ViewColumn.One: + default: + this._updateForCat('Coding Cat'); + return; + } + } - case vscode.ViewColumn.One: - default: - this._updateForCat('Coding Cat'); - return; - } - } + private _updateForCat(catName: keyof typeof cats) { + this._panel.title = catName; + this._panel.webview.html = this._getHtmlForWebview(cats[catName]); + } - private _updateForCat(catName: keyof typeof cats) { - this._panel.title = catName; - this._panel.webview.html = this._getHtmlForWebview(cats[catName]); - } + private _getHtmlForWebview(catGif: string) { + // Local path to main script run in the webview + const scriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'media', 'main.js')); - private _getHtmlForWebview(catGif: string) { + // And the uri we use to load this script in the webview + const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); - // Local path to main script run in the webview - const scriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'media', 'main.js')); + // Use a nonce to whitelist which scripts can be run + const nonce = getNonce(); - // And the uri we use to load this script in the webview - const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); - - // Use a nonce to whitelist which scripts can be run - const nonce = getNonce(); - - return ` + return ` @@ -180,14 +189,14 @@ class CatCodingPanel { `; - } + } } function getNonce() { - let text = ""; - const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; -} \ No newline at end of file + let text = ''; + const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; +}