user14912052
user14912052

Reputation: 11

about vscode api for executeCommand("explorer.newFolder")

I want callback for after newFolder,

executeCommand("explorer.newFolder").then(value => console.log(value))

but The value is not the value of folderName.

Upvotes: 0

Views: 363

Answers (1)

myeongkil kim
myeongkil kim

Reputation: 2586

I analyzed the code of the command you executed.

The explorer.newFolder command is defined as NEW_FOLDER_COMMAND_ID, and is connected with the openExplorerAndCreate handler. (The result is received through the handler of CommndsRegistry.)

The return of the openExplorerAndCreateis a callback function (Promise). When i look closely inside,, if the input parameter is not isFolder, that is, if it is a file, a callback function is provided by the return commandService.executeCommand(NEW_UNTITLED_FILE_COMMAND_ID); command.\

but if it is a folder, there is no return value. That is undefined.

in vscode API documentation
return type of executeCommand() is Thenable<T | undefined>. That is, in the case of the corresponding command, it is returned as undefined, not Thenable<T>. If an error is not thrown and undefined is returned, it can be determined that it has been normally executed.

// src/vs/workbench/contrib/files/browser/fileAction.ts
...
export const NEW_FOLDER_COMMAND_ID = 'explorer.newFolder';
...
CommandsRegistry.registerCommand({
    id: NEW_FOLDER_COMMAND_ID,
    handler: async (accessor) => {
        await openExplorerAndCreate(accessor, true);
    }
});
...
async function openExplorerAndCreate(accessor: ServicesAccessor, isFolder: boolean): Promise<void> {
    const explorerService = accessor.get(IExplorerService);
    const fileService = accessor.get(IFileService);
    const editorService = accessor.get(IEditorService);
    const viewsService = accessor.get(IViewsService);
    const notificationService = accessor.get(INotificationService);
    const commandService = accessor.get(ICommandService);

    const wasHidden = !viewsService.isViewVisible(VIEW_ID);
    const view = await viewsService.openView(VIEW_ID, true);
    if (wasHidden) {
        // Give explorer some time to resolve itself #111218
        await timeout(500);
    }
    if (!view) {
        // Can happen in empty workspace case (https://github.com/microsoft/vscode/issues/100604)

        if (isFolder) {
            throw new Error('Open a folder or workspace first.');
        }

        return commandService.executeCommand(NEW_UNTITLED_FILE_COMMAND_ID);
    }

    const stats = explorerService.getContext(false);
    const stat = stats.length > 0 ? stats[0] : undefined;
    let folder: ExplorerItem;
    if (stat) {
        folder = stat.isDirectory ? stat : (stat.parent || explorerService.roots[0]);
    } else {
        folder = explorerService.roots[0];
    }

    if (folder.isReadonly) {
        throw new Error('Parent folder is readonly.');
    }

    const newStat = new NewExplorerItem(fileService, folder, isFolder);
    folder.addChild(newStat);

    const onSuccess = async (value: string): Promise<void> => {
        try {
            const resourceToCreate = resources.joinPath(folder.resource, value);
            await explorerService.applyBulkEdit([new ResourceFileEdit(undefined, resourceToCreate, { folder: isFolder })], {
                undoLabel: nls.localize('createBulkEdit', "Create {0}", value),
                progressLabel: nls.localize('creatingBulkEdit', "Creating {0}", value)
            });
            await refreshIfSeparator(value, explorerService);

            if (isFolder) {
                await explorerService.select(resourceToCreate, true);
            } else {
                await editorService.openEditor({ resource: resourceToCreate, options: { pinned: true } });
            }
        } catch (error) {
            onErrorWithRetry(notificationService, error, () => onSuccess(value));
        }
    };

    await explorerService.setEditable(newStat, {
        validationMessage: value => validateFileName(newStat, value),
        onFinish: async (value, success) => {
            folder.removeChild(newStat);
            await explorerService.setEditable(newStat, null);
            if (success) {
                onSuccess(value);
            }
        }
    });
}

Upvotes: 1

Related Questions