Skip to content

Commit

Permalink
[vscode] No error message if vscode.open command is invoked with reso…
Browse files Browse the repository at this point in the history
…urce that doesn't exist eclipse-theia#5667

Signed-off-by: Victor Rubezhny <vrubezhny@redhat.com>
  • Loading branch information
vrubezhny committed Mar 3, 2020
1 parent d828b01 commit c29970a
Showing 1 changed file with 62 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor';
import { inject, injectable } from 'inversify';
import { Position } from '@theia/plugin-ext/lib/common/plugin-api-rpc';
import URI from 'vscode-uri';
import { FileSystem, FileStat } from '@theia/filesystem/lib/common';
import { MessageClient, MessageType } from '@theia/core/lib/common';

export namespace VscodeCommands {
export const OPEN: Command = {
Expand Down Expand Up @@ -89,6 +91,10 @@ export class PluginVscodeCommandsContribution implements CommandContribution {
protected readonly quickOpen: PrefixQuickOpenService;
@inject(WorkspaceService)
protected readonly workspaceService: WorkspaceService;
@inject(FileSystem)
protected readonly fileSystem: FileSystem;
@inject(MessageClient)
protected readonly messages: MessageClient;

registerCommands(commands: CommandRegistry): void {
commands.registerCommand(VscodeCommands.OPEN, {
Expand All @@ -97,22 +103,29 @@ export class PluginVscodeCommandsContribution implements CommandContribution {
if (!resource) {
throw new Error(`${VscodeCommands.OPEN.id} command requires at least URI argument.`);
}

if (!URI.isUri(resource)) {
throw new Error(`Invalid argument for ${VscodeCommands.OPEN.id} command with URI argument. Found ${resource}`);
}

let options: TextDocumentShowOptions | undefined;
if (typeof columnOrOptions === 'number') {
options = {
viewColumn: columnOrOptions
};
} else if (columnOrOptions) {
options = {
...columnOrOptions
};
if (await this.shouldCreateBeforeOpen(new TheiaURI(resource))) {
const uri = new TheiaURI(resource);
const msg = `Unable to open "${uri}": <p>File not found!`;
this.messages.showMessage({ type: MessageType.Error, text: msg, actions: ['CREATE'] })
.then(res => {
if (res === 'CREATE') {
this.getOrCreateDirectory(uri.parent).then(parent => {
if (parent) {
this.fileSystem.createFile(resource.toString()).then(async () => {
await this.openEditor(resource, columnOrOptions);
});
}
});
}
});
} else {
await this.openEditor(resource, columnOrOptions);
}
const editorOptions = DocumentsMainImpl.toEditorOpenerOptions(this.shell, options);
await open(this.openerService, new TheiaURI(resource), editorOptions);
}
});

Expand Down Expand Up @@ -445,4 +458,42 @@ export class PluginVscodeCommandsContribution implements CommandContribution {
}
);
}

protected async shouldCreateBeforeOpen(uri: TheiaURI): Promise<boolean> {
// Do not try to create a document which scheme is not a file
if (uri.scheme !== 'file') {
return false;
}
const stat = await this.fileSystem.getFileStat(uri.toString());
if (stat && !stat.isDirectory) {
return false;
}
return true;
}

protected async openEditor(uri: URI, columnOrOptions?: ViewColumn | TextDocumentShowOptions): Promise<object | undefined> {
let options: TextDocumentShowOptions | undefined;
if (typeof columnOrOptions === 'number') {
options = {
viewColumn: columnOrOptions
};
} else if (columnOrOptions) {
options = {
...columnOrOptions
};
}
const editorOptions = DocumentsMainImpl.toEditorOpenerOptions(this.shell, options);
return open(this.openerService, new TheiaURI(uri), editorOptions);
}

protected async getOrCreateDirectory(uri: TheiaURI): Promise<FileStat | undefined> {
const stat = await this.fileSystem.getFileStat(uri.toString());
if (stat) {
if (stat.isDirectory) {
return stat;
}
return this.getOrCreateDirectory(uri.parent);
}
return this.fileSystem.createFolder(uri.toString());
}
}

0 comments on commit c29970a

Please sign in to comment.