Core: Return a Result<> from IDocument::setContents

Change-Id: Ia3daa231e87414160c2c12b25c685664088d337a
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2025-04-16 15:07:50 +02:00
parent 10e361c4be
commit b2c98dc218
21 changed files with 62 additions and 72 deletions

View File

@@ -90,7 +90,7 @@ public:
void setSizes(quint64 startAddr, qint64 range, int blockSize = 4096);
QByteArray contents() const final { return dataMid(0, m_size); }
bool setContents(const QByteArray &contents) final;
Utils::Result<> setContents(const QByteArray &contents) final;
ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const final
{
@@ -2107,14 +2107,14 @@ BinEditorDocument::BinEditorDocument()
m_newRangeRequestHandler = [this](quint64 offset) { provideNewRange(offset); };
}
bool BinEditorDocument::setContents(const QByteArray &contents)
Result<> BinEditorDocument::setContents(const QByteArray &contents)
{
clear();
if (!contents.isEmpty()) {
setSizes(0, contents.length(), contents.length());
addData(0, contents);
}
return true;
return ResultOk;
}
Result<> BinEditorDocument::openImpl(const FilePath &filePath, quint64 offset)

View File

@@ -156,7 +156,7 @@ public:
Result<> saveImpl(const Utils::FilePath &filePath, bool autoSave) override;
bool setContents(const QByteArray &contents) override;
Result<> setContents(const QByteArray &contents) override;
QString fallbackSaveAsFileName() const override;
@@ -418,7 +418,7 @@ Result<> JsonSettingsDocument::saveImpl(const FilePath &newFilePath, bool autoSa
m_ceSettings.toMap(store);
}
Utils::FilePath path = newFilePath.isEmpty() ? filePath() : newFilePath;
FilePath path = newFilePath.isEmpty() ? filePath() : newFilePath;
if (!newFilePath.isEmpty() && !autoSave) {
setPreferredDisplayName({});
@@ -438,17 +438,17 @@ bool JsonSettingsDocument::isModified() const
return m_ceSettings.isDirty();
}
bool JsonSettingsDocument::setContents(const QByteArray &contents)
Result<> JsonSettingsDocument::setContents(const QByteArray &contents)
{
auto result = storeFromJson(contents);
QTC_ASSERT_RESULT(result, return false);
Result<Store> result = storeFromJson(contents);
QTC_ASSERT_RESULT(result, return ResultError(result.error()));
m_ceSettings.fromMap(*result);
m_ceSettings.fromMap(result.value());
emit settingsChanged();
emit changed();
emit contentsChanged();
return true;
return ResultOk;
}
QString JsonSettingsDocument::fallbackSaveAsFileName() const

View File

@@ -70,21 +70,6 @@
\ingroup mainclasses
*/
/*!
\enum Core::Utils::Result<>
The OpenResult enum describes whether a file was successfully opened.
\value Success
The file was read successfully and can be handled by this document
type.
\value ReadError
The file could not be opened for reading, either because it does not
exist or because of missing permissions.
\value CannotHandle
This document type could not handle the file content.
*/
/*!
\enum Core::IDocument::ReloadSetting
@@ -391,10 +376,10 @@ QByteArray IDocument::contents() const
\sa contents()
\sa EditorManager::openEditorWithContents()
*/
bool IDocument::setContents(const QByteArray &contents)
Result<> IDocument::setContents(const QByteArray &contents)
{
Q_UNUSED(contents)
return false;
return ResultError(ResultUnimplemented);
}
/*!

View File

@@ -65,7 +65,7 @@ public:
Utils::Result<> save(const Utils::FilePath &filePath = {}, bool autoSave = false);
virtual QByteArray contents() const;
virtual bool setContents(const QByteArray &contents);
virtual Utils::Result<> setContents(const QByteArray &contents);
virtual void formatContents();
const Utils::FilePath &filePath() const;

View File

@@ -114,17 +114,17 @@ QByteArray FormWindowFile::contents() const
return formWindowContents().toUtf8();
}
bool FormWindowFile::setContents(const QByteArray &contents)
Result<> FormWindowFile::setContents(const QByteArray &contents)
{
if (Designer::Constants::Internal::debug)
qDebug() << Q_FUNC_INFO << contents.size();
document()->clear();
QTC_ASSERT(m_formWindow, return false);
QTC_ASSERT(m_formWindow, return ResultError(ResultAssert));
if (contents.isEmpty())
return false;
return ResultError(ResultAssert);
// If we have an override cursor, reset it over Designer loading,
// should it pop up messages about missing resources or such.
@@ -141,11 +141,11 @@ bool FormWindowFile::setContents(const QByteArray &contents)
QApplication::setOverrideCursor(overrideCursor);
if (!success)
return false;
return ResultError(ResultAssert);
syncXmlFromFormWindow();
setShouldAutoSave(false);
return true;
return ResultOk;
}
void FormWindowFile::setFilePath(const FilePath &newName)

View File

@@ -29,7 +29,7 @@ public:
Utils::Result<> open(const Utils::FilePath &filePath,
const Utils::FilePath &realFilePath) override;
QByteArray contents() const override;
bool setContents(const QByteArray &contents) override;
Utils::Result<> setContents(const QByteArray &contents) override;
bool shouldAutoSave() const override;
bool isModified() const override;
bool isSaveAsAllowed() const override;

View File

@@ -208,10 +208,10 @@ bool DiffEditorDocument::ignoreWhitespace() const
return m_ignoreWhitespace;
}
bool DiffEditorDocument::setContents(const QByteArray &contents)
Result<> DiffEditorDocument::setContents(const QByteArray &contents)
{
Q_UNUSED(contents)
return true;
return ResultOk;
}
FilePath DiffEditorDocument::fallbackSaveAsPath() const

View File

@@ -55,7 +55,7 @@ public:
void setIgnoreWhitespace(bool ignore);
bool ignoreWhitespace() const;
bool setContents(const QByteArray &contents) override;
Utils::Result<> setContents(const QByteArray &contents) override;
Utils::FilePath fallbackSaveAsPath() const override;
QString fallbackSaveAsFileName() const override;

View File

@@ -11,6 +11,8 @@
#include <QRegularExpression>
using namespace Utils;
namespace Perforce::Internal {
enum { FileSpecRole = Qt::UserRole + 1 };
@@ -38,12 +40,12 @@ QByteArray PerforceSubmitEditor::fileContents() const
return text.toLocal8Bit();
}
bool PerforceSubmitEditor::setFileContents(const QByteArray &contents)
Result<> PerforceSubmitEditor::setFileContents(const QByteArray &contents)
{
if (!parseText(QString::fromUtf8(contents)))
return false;
return ResultError(ResultAssert); // FIXME: parseText always returns true, why?
updateFields();
return true;
return ResultOk;
}
bool PerforceSubmitEditor::parseText(QString text)

View File

@@ -37,7 +37,7 @@ public:
protected:
QByteArray fileContents() const override;
bool setFileContents(const QByteArray &contents) override;
Utils::Result<> setFileContents(const QByteArray &contents) override;
private:
inline PerforceSubmitEditorWidget *submitEditorWidget();

View File

@@ -51,7 +51,7 @@ public:
Result<> open(const FilePath &filePath, const FilePath &realFilePath) final;
QString plainText() const { return m_model.contents(); }
QByteArray contents() const final { return m_model.contents().toUtf8(); }
bool setContents(const QByteArray &contents) final;
Result<> setContents(const QByteArray &contents) final;
bool shouldAutoSave() const final { return m_shouldAutoSave; }
bool isModified() const final { return m_model.dirty(); }
bool isSaveAsAllowed() const final { return true; }
@@ -236,22 +236,23 @@ Result<> ResourceEditorDocument::saveImpl(const FilePath &filePath, bool autoSav
return ResultOk;
}
bool ResourceEditorDocument::setContents(const QByteArray &contents)
Result<> ResourceEditorDocument::setContents(const QByteArray &contents)
{
TempFileSaver saver;
saver.write(contents);
if (!saver.finalize(ICore::dialogParent()))
return false;
return ResultError(saver.errorString());
const FilePath originalFileName = m_model.filePath();
m_model.setFilePath(saver.filePath());
const bool success = (m_model.reload().has_value());
const Result<> result = m_model.reload();
const bool success = result.has_value();
m_model.setFilePath(originalFileName);
m_shouldAutoSave = false;
if (debugResourceEditorW)
qDebug() << "ResourceEditorW::createNew: " << contents << " (" << saver.filePath() << ") returns " << success;
emit loaded(success);
return success;
return result;
}
void ResourceEditorDocument::setFilePath(const FilePath &newName)

View File

@@ -54,7 +54,7 @@ Result<> ObjectsMapDocument::saveImpl(const FilePath &filePath, bool autoSave)
return ResultOk;
}
Utils::FilePath ObjectsMapDocument::fallbackSaveAsPath() const
FilePath ObjectsMapDocument::fallbackSaveAsPath() const
{
return {};
}
@@ -83,7 +83,7 @@ Result<> ObjectsMapDocument::reload(IDocument::ReloadFlag flag, IDocument::Chang
return result;
}
bool ObjectsMapDocument::buildObjectsMapTree(const QByteArray &contents)
Result<> ObjectsMapDocument::buildObjectsMapTree(const QByteArray &contents)
{
QMap<QString, ObjectsMapTreeItem *> itemForName;
@@ -97,7 +97,7 @@ bool ObjectsMapDocument::buildObjectsMapTree(const QByteArray &contents)
const QString objectName = QString::fromUtf8(line.left(tabPosition).trimmed());
if (!objectName.startsWith(ObjectsMapTreeItem::COLON)) {
qDeleteAll(itemForName);
return false;
return ResultError(Tr::tr("Object name does not start with colon"));
}
ObjectsMapTreeItem *item = new ObjectsMapTreeItem(objectName,
@@ -123,10 +123,10 @@ bool ObjectsMapDocument::buildObjectsMapTree(const QByteArray &contents)
}
m_contentModel->changeRootItem(root);
return true;
return ResultOk;
}
bool ObjectsMapDocument::setContents(const QByteArray &contents)
Result<> ObjectsMapDocument::setContents(const QByteArray &contents)
{
return buildObjectsMapTree(contents);
}

View File

@@ -28,7 +28,7 @@ public:
Utils::Result<> reload(ReloadFlag flag, ChangeType type) override;
bool shouldAutoSave() const override { return true; }
bool setContents(const QByteArray &contents) override;
Utils::Result<> setContents(const QByteArray &contents) override;
QByteArray contents() const override;
ObjectsMapModel *model() const { return m_contentModel; }
@@ -38,7 +38,7 @@ protected:
private:
Utils::Result<> openImpl(const Utils::FilePath &fileName,
const Utils::FilePath &realFileName);
bool buildObjectsMapTree(const QByteArray &contents);
Utils::Result<> buildObjectsMapTree(const QByteArray &contents);
bool writeFile(const Utils::FilePath &fileName) const;
void syncXMLFromEditor();

View File

@@ -9,7 +9,9 @@
#include <vcsbase/submiteditorwidget.h>
#include <vcsbase/submitfilemodel.h>
using namespace Subversion::Internal;
using namespace Utils;
namespace Subversion::Internal {
SubversionSubmitEditor::SubversionSubmitEditor() :
VcsBase::VcsBaseSubmitEditor(new VcsBase::SubmitEditorWidget)
@@ -54,8 +56,10 @@ QByteArray SubversionSubmitEditor::fileContents() const
return description().toUtf8();
}
bool SubversionSubmitEditor::setFileContents(const QByteArray &contents)
Result<> SubversionSubmitEditor::setFileContents(const QByteArray &contents)
{
setDescription(QString::fromUtf8(contents));
return true;
return ResultOk;
}
} // namespace Subversion::Internal

View File

@@ -7,8 +7,7 @@
#include <QPair>
namespace Subversion {
namespace Internal {
namespace Subversion::Internal {
class SubversionSubmitEditor : public VcsBase::VcsBaseSubmitEditor
{
@@ -24,8 +23,7 @@ public:
void setStatusList(const QList<StatusFilePair> &statusOutput);
QByteArray fileContents() const override;
bool setFileContents(const QByteArray &contents) override;
Utils::Result<> setFileContents(const QByteArray &contents) override;
};
} // namespace Internal
} // namespace Subversion
} // namespace Subversion::Internal

View File

@@ -719,7 +719,7 @@ QByteArray TextDocument::contents() const
return plainText().toUtf8();
}
bool TextDocument::setContents(const QByteArray &contents)
Result<> TextDocument::setContents(const QByteArray &contents)
{
return setPlainText(QString::fromUtf8(contents));
}
@@ -860,18 +860,18 @@ Result<> TextDocument::reload(const FilePath &realFilePath)
return result;
}
bool TextDocument::setPlainText(const QString &text)
Result<> TextDocument::setPlainText(const QString &text)
{
if (text.size() > EditorManager::maxTextFileSize()) {
document()->setPlainText(TextEditorWidget::msgTextTooLarge(text.size()));
d->resetRevisions();
document()->setModified(false);
return false;
return ResultError(TextEditorWidget::msgTextTooLarge(text.size()));
}
document()->setPlainText(text);
d->resetRevisions();
document()->setModified(false);
return true;
return ResultOk;
}
Result<> TextDocument::reload(ReloadFlag flag, ChangeType type)

View File

@@ -102,7 +102,7 @@ public:
// IDocument implementation.
QByteArray contents() const override;
bool setContents(const QByteArray &contents) override;
Utils::Result<> setContents(const QByteArray &contents) override;
void formatContents() override;
bool shouldAutoSave() const override;
bool isModified() const override;
@@ -122,7 +122,7 @@ public:
virtual Utils::Result<> reload();
Utils::Result<> reload(const Utils::FilePath &realFilePath);
bool setPlainText(const QString &text);
Utils::Result<> setPlainText(const QString &text);
QTextDocument *document() const;
using SyntaxHighLighterCreator = std::function<SyntaxHighlighter *()>;

View File

@@ -50,7 +50,7 @@ QByteArray SubmitEditorFile::contents() const
return m_editor->fileContents();
}
bool SubmitEditorFile::setContents(const QByteArray &contents)
Result<> SubmitEditorFile::setContents(const QByteArray &contents)
{
return m_editor->setFileContents(contents);
}

View File

@@ -21,7 +21,7 @@ public:
const Utils::FilePath &realFilePath) override;
QByteArray contents() const override;
bool setContents(const QByteArray &contents) override;
Utils::Result<> setContents(const QByteArray &contents) override;
bool isModified() const override { return m_modified; }
ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const override;

View File

@@ -397,10 +397,10 @@ QByteArray VcsBaseSubmitEditor::fileContents() const
return description().toLocal8Bit();
}
bool VcsBaseSubmitEditor::setFileContents(const QByteArray &contents)
Result<> VcsBaseSubmitEditor::setFileContents(const QByteArray &contents)
{
setDescription(QString::fromUtf8(contents));
return true;
return ResultOk;
}
QString VcsBaseSubmitEditor::description() const

View File

@@ -95,7 +95,7 @@ protected:
* the file. The default implementation uses the text
* of the description editor. */
virtual QByteArray fileContents() const;
virtual bool setFileContents(const QByteArray &contents);
virtual Utils::Result<> setFileContents(const QByteArray &contents);
QString description() const;
void setDescription(const QString &text);