/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import URI from 'vs/base/common/uri'; import { normalize } from 'vs/base/common/paths'; import { relative } from 'path'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { IResourceEdit } from 'vs/editor/common/services/bulkEdit'; import { TPromise } from 'vs/base/common/winjs.base'; import { fromRange, EndOfLine } from 'vs/workbench/api/node/extHostTypeConverters'; import { MainContext, MainThreadWorkspaceShape } from './extHost.protocol'; import * as vscode from 'vscode'; export class ExtHostWorkspace { private static _requestIdPool = 0; private _proxy: MainThreadWorkspaceShape; private _workspacePath: string; constructor(threadService: IThreadService, workspacePath: string) { this._proxy = threadService.get(MainContext.MainThreadWorkspace); this._workspacePath = workspacePath; } getPath(): string { return this._workspacePath; } getRelativePath(pathOrUri: string | vscode.Uri): string { let path: string; if (typeof pathOrUri === 'string') { path = pathOrUri; } else if (typeof pathOrUri !== 'undefined') { path = pathOrUri.fsPath; } if (!path) { return path; } if (!this._workspacePath) { return normalize(path); } let result = relative(this._workspacePath, path); if (!result || result.indexOf('..') === 0) { return normalize(path); } return normalize(result); } findFiles(include: string, exclude: string, maxResults?: number, token?: vscode.CancellationToken): Thenable { const requestId = ExtHostWorkspace._requestIdPool++; const result = this._proxy.$startSearch(include, exclude, maxResults, requestId); if (token) { token.onCancellationRequested(() => this._proxy.$cancelSearch(requestId)); } return result; } saveAll(includeUntitled?: boolean): Thenable { return this._proxy.$saveAll(includeUntitled); } appyEdit(edit: vscode.WorkspaceEdit): TPromise { let resourceEdits: IResourceEdit[] = []; let entries = edit.entries(); for (let entry of entries) { let [uri, edits] = entry; for (let edit of edits) { resourceEdits.push({ resource: uri, newText: edit.newText, newEol: EndOfLine.from(edit.newEol), range: edit.range && fromRange(edit.range) }); } } return this._proxy.$applyWorkspaceEdit(resourceEdits); } }