function saveAll() {
        // Do in serial because doSave shows error UI for each file, and we don't want to stack
        // multiple dialogs on top of each other
        return Async.doSequentially(
            DocumentManager.getWorkingSet(),
            function (file) {
                var doc = DocumentManager.getOpenDocumentForPath(file.fullPath);
                if (doc) {
                    return doSave(doc);
                } else {
                    // working set entry that was never actually opened - ignore
                    return (new $.Deferred()).resolve().promise();
                }
            },
            false
        );
    }
Saves all unsaved documents. Returns a Promise that will be resolved once ALL the save
operations have been completed. If ANY save operation fails, an error dialog is immediately
shown and the other files wait to save until it is dismissed; after all files have been
processed, the Promise is rejected if any ONE save operation failed.

@return {$.Promise}