kde-extraapps/kdevplatform/language/codegen/documentchangeset.h
2015-07-26 14:23:17 +03:00

142 lines
5.4 KiB
C++

/*
Copyright 2008 David Nolden <david.nolden.kdevelop@art-master.de>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef KDEVPLATFORM_DOCUMENTCHANGESET_H
#define KDEVPLATFORM_DOCUMENTCHANGESET_H
#include <language/editor/simplerange.h>
#include <language/duchain/indexedstring.h>
#include <KSharedPtr>
#include <KUrl>
#include "coderepresentation.h"
namespace KDevelop {
struct DocumentChangeSetPrivate;
class KDEVPLATFORMLANGUAGE_EXPORT DocumentChange : public QSharedData
{
public:
DocumentChange(const IndexedString& document, const SimpleRange& range, const QString& oldText, const QString& newText) :
m_document(document), m_range(range), m_oldText(oldText), m_newText(newText), m_ignoreOldText(false) {
//Clean the URL, so we don't get the same file be stored as a different one
KUrl url(m_document.toUrl());
url.cleanPath();
m_document = IndexedString(url);
}
IndexedString m_document;
SimpleRange m_range;
QString m_oldText;
QString m_newText;
bool m_ignoreOldText; //Set this to disable the verification of m_oldText. This can be used to overwrite arbitrary text, but is dangerous!
};
typedef KSharedPtr<DocumentChange> DocumentChangePointer;
/**
* Object representing an arbitrary set of changes to an arbitrary set of files that can be applied atomically.
*/
class KDEVPLATFORMLANGUAGE_EXPORT DocumentChangeSet
{
public:
DocumentChangeSet();
~DocumentChangeSet();
DocumentChangeSet(const DocumentChangeSet& rhs);
DocumentChangeSet& operator=(const DocumentChangeSet& rhs);
//Returns true on success
struct ChangeResult
{
ChangeResult(bool success)
: m_success(success)
{ }
ChangeResult(const QString& failureReason, const DocumentChangePointer& reasonChange = DocumentChangePointer())
: m_failureReason(failureReason)
, m_reasonChange(reasonChange)
, m_success(false)
{ }
operator bool() const
{
return m_success;
}
/// Reason why the change failed
QString m_failureReason;
/// Specific change that caused the problem (might be 0)
DocumentChangePointer m_reasonChange;
bool m_success;
};
/// Add an individual local change to this change-set.
ChangeResult addChange(const DocumentChange& change);
ChangeResult addChange(const DocumentChangePointer& change);
///given a file @old, rename it to the @newname
ChangeResult addDocumentRenameChange(const IndexedString& oldFile, const IndexedString& newname);
enum ReplacementPolicy {
IgnoreFailedChange,///If this is given, all changes that could not be applied are simply ignored
WarnOnFailedChange,///If this is given to applyAllChanges, a warning is given when a change could not be applied,
///but following changes are applied, and success is returned.
StopOnFailedChange ///If this is given to applyAllChanges, then all replacements are reverted and an error returned on problems (default)
};
///@param policy What should be done when a change could not be applied?
void setReplacementPolicy(ReplacementPolicy policy);
enum FormatPolicy {
NoAutoFormat, ///If this option is given, no automatic formatting is applied
AutoFormatChanges, ///If this option is given, all changes are automatically reformatted using the formatter plugin for the mime type (default)
AutoFormatChangesKeepIndentation ///Same as AutoFormatChanges, except that the indentation of inserted lines is kept equal
};
///@param policy How the changed text should be formatted. The default is AutoFormatChanges.
void setFormatPolicy(FormatPolicy policy);
enum DUChainUpdateHandling {
NoUpdate, ///No updates will be scheduled
SimpleUpdate ///The changed documents will be added to the background parser, plus all documents that are currently open and recursively import those documents (default)
//FullUpdate ///All documents in all open projects that recursively import any of the changed documents will be updated
};
///@param policy Whether a duchain update should be triggered for all affected documents
void setUpdateHandling(DUChainUpdateHandling policy);
enum ActivationPolicy {
Activate, ///The affected files will be activated
DoNotActivate ///The affected files will not be activated (default)
};
///@param policy Whether the affected documents should be activated when the change is applied
void setActivationPolicy(ActivationPolicy policy);
/// Apply all the changes registered in this changeset to the actual files
ChangeResult applyAllChanges();
private:
DocumentChangeSetPrivate * d;
};
}
#endif