diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index c55d331661e662accfcf86f7afa9dc44d3dbcfc9..40095c3aaa5f170eb621fb88d2debac30ec7a222 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -146,7 +146,7 @@ export function normalizePath(resource: URI): URI { export function originalFSPath(uri: URI): string { let value: string; const uriPath = uri.path; - if (uri.authority && uriPath.length > 1 && uri.scheme === 'file') { + if (uri.authority && uriPath.length > 1 && uri.scheme === Schemas.file) { // unc path: file://shares/c$/far/boo value = `//${uri.authority}${uriPath}`; } else if ( diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index 380d16b25946dd615115c84fde2bf09ce2697f56..fa8fae57ec853c942d8e250c894e245f3c275d21 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -10,7 +10,7 @@ import { IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/works import { URI, UriComponents } from 'vs/base/common/uri'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { extname } from 'vs/base/common/path'; -import { dirname, resolvePath, isEqualAuthority, isEqualOrParent, relativePath } from 'vs/base/common/resources'; +import { dirname, resolvePath, isEqualAuthority, isEqualOrParent, relativePath, extname as resourceExtname } from 'vs/base/common/resources'; import * as jsonEdit from 'vs/base/common/jsonEdit'; import * as json from 'vs/base/common/json'; import { Schemas } from 'vs/base/common/network'; @@ -158,8 +158,10 @@ export function isSingleFolderWorkspaceInitializationPayload(obj: any): obj is I const WORKSPACE_SUFFIX = '.' + WORKSPACE_EXTENSION; -export function hasWorkspaceFileExtension(path: string) { - return extname(path) === WORKSPACE_SUFFIX; +export function hasWorkspaceFileExtension(path: string | URI) { + const ext = (typeof path === 'string') ? extname(path) : resourceExtname(path); + + return ext === WORKSPACE_SUFFIX; } const SLASH = '/'; diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index 71f28a094c8cb40ddd570e52f4d2db4c3c4ae787..a7775611ea2c4e33bd2e899018fe23af9e273f89 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -61,7 +61,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain } private isWorkspacePath(uri: URI): boolean { - return this.isInsideWorkspacesHome(uri) || hasWorkspaceFileExtension(uri.path); + return this.isInsideWorkspacesHome(uri) || hasWorkspaceFileExtension(uri); } private doResolveWorkspace(path: URI, contents: string): IResolvedWorkspace | null { diff --git a/src/vs/workbench/api/common/apiCommands.ts b/src/vs/workbench/api/common/apiCommands.ts index d0023a72b42ea6afb6fb633dc0bb1be201436a85..917e28c82fec395ad7762cbfb6747c67e8947e05 100644 --- a/src/vs/workbench/api/common/apiCommands.ts +++ b/src/vs/workbench/api/common/apiCommands.ts @@ -52,7 +52,7 @@ export class OpenFolderAPICommand { } const options: IOpenSettings = { forceNewWindow: arg.forceNewWindow, noRecentEntry: arg.noRecentEntry }; uri = URI.revive(uri); - const uriToOpen: IURIToOpen = (hasWorkspaceFileExtension(uri.path) || uri.scheme === Schemas.untitled) ? { workspaceUri: uri } : { folderUri: uri }; + const uriToOpen: IURIToOpen = (hasWorkspaceFileExtension(uri) || uri.scheme === Schemas.untitled) ? { workspaceUri: uri } : { folderUri: uri }; return executor.executeCommand('_files.windowOpen', [uriToOpen], options); } } diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index 74a04554f7acf884db5fe278376be874096134e1..5c4a13a5587f0b6e6bad562d54199519091c6084 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -260,7 +260,7 @@ export class ResourcesDropHandler { return Promise.all(fileOnDiskResources.map(fileOnDiskResource => { // Check for Workspace - if (hasWorkspaceFileExtension(fileOnDiskResource.fsPath)) { + if (hasWorkspaceFileExtension(fileOnDiskResource)) { urisToOpen.push({ workspaceUri: fileOnDiskResource }); return undefined; diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 710296c74e6bce0f9391515ec76f8cfc2903cca5..57d29393cafcab2e1955db483e3dfef9930971b2 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -47,7 +47,8 @@ import { IVisibleEditor } from 'vs/workbench/services/editor/common/editorServic import { withNullAsUndefined } from 'vs/base/common/types'; import { hash } from 'vs/base/common/hash'; import { guessMimeTypes } from 'vs/base/common/mime'; -import { extname } from 'vs/base/common/path'; +import { extname } from 'vs/base/common/resources'; +import { Schemas } from 'vs/base/common/network'; export class EditorGroupView extends Themable implements IEditorGroupView { @@ -520,8 +521,9 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const descriptor = editor.getTelemetryDescriptor(); const resource = editor.getResource(); - if (resource && resource.fsPath) { - descriptor['resource'] = { mimeType: guessMimeTypes(resource.fsPath).join(', '), scheme: resource.scheme, ext: extname(resource.fsPath), path: hash(resource.fsPath) }; + const path = resource ? resource.scheme === Schemas.file ? resource.fsPath : resource.path : undefined; + if (resource && path) { + descriptor['resource'] = { mimeType: guessMimeTypes(path).join(', '), scheme: resource.scheme, ext: extname(resource), path: hash(path) }; /* __GDPR__FRAGMENT__ "EditorTelemetryDescriptor" : { diff --git a/src/vs/workbench/browser/parts/editor/editorWidgets.ts b/src/vs/workbench/browser/parts/editor/editorWidgets.ts index 43ef52ce1147e7d19e9faec46426705a5da4716c..de5aacf53546efe94e52222b547706917280d30c 100644 --- a/src/vs/workbench/browser/parts/editor/editorWidgets.ts +++ b/src/vs/workbench/browser/parts/editor/editorWidgets.ts @@ -139,7 +139,7 @@ export class OpenWorkspaceButtonContribution extends Disposable implements IEdit return false; // we need a model } - if (!hasWorkspaceFileExtension(model.uri.fsPath)) { + if (!hasWorkspaceFileExtension(model.uri)) { return false; // we need a workspace file } diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 88bc332cb9445a9193e5ec97229a9b42e0a7d8f1..d96209b11f30b7daf6a6fcba74ba165e4f7b49e9 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -36,6 +36,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { Parts, IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { RunOnceScheduler } from 'vs/base/common/async'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { Schemas } from 'vs/base/common/network'; export class TitlebarPart extends Part implements ITitleService { @@ -179,7 +180,7 @@ export class TitlebarPart extends Part implements ITitleService { } private updateRepresentedFilename(): void { - const file = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER, filterByScheme: 'file' }); + const file = toResource(this.editorService.activeEditor, { supportSideBySide: SideBySideEditor.MASTER, filterByScheme: Schemas.file }); const path = file ? file.fsPath : ''; // Apply to window diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts index 3b895621d09c52966a503159363c6492bdc28fca..a9375c40f8ad09186b1fc1f9f6047843d8253490 100644 --- a/src/vs/workbench/contrib/files/browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts @@ -38,6 +38,7 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ExplorerService } from 'vs/workbench/contrib/files/common/explorerService'; import { SUPPORTED_ENCODINGS } from 'vs/workbench/services/textfile/common/textfiles'; +import { Schemas } from 'vs/base/common/network'; // Viewlet Action export class OpenExplorerViewletAction extends ShowViewletAction { @@ -59,7 +60,7 @@ class FileUriLabelContribution implements IWorkbenchContribution { constructor(@ILabelService labelService: ILabelService) { labelService.registerFormatter({ - scheme: 'file', + scheme: Schemas.file, formatting: { label: '${authority}${path}', separator: sep, diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 765d33c3c5112701dfd865808a56857de63105b6..ce73adad88fb084beb15cb5ea685f8f85e033837 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -31,6 +31,7 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; import { isEqual, isEqualOrParent, extname, basename } from 'vs/base/common/resources'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { Schemas } from 'vs/base/common/network'; /** * The text file editor model listens to changes to its underlying code editor model and saves these changes through the file service back to the disk. @@ -824,10 +825,11 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil private getTelemetryData(reason: number | undefined): object { const ext = extname(this.resource); const fileName = basename(this.resource); + const path = this.resource.scheme === Schemas.file ? this.resource.fsPath : this.resource.path; const telemetryData = { - mimeType: guessMimeTypes(this.resource.fsPath).join(', '), + mimeType: guessMimeTypes(path).join(', '), ext, - path: hash(this.resource.fsPath), + path: hash(path), reason };