forked from qt-creator/qt-creator
ClangFormat: Start to use new file management
- Indenter uses .clang-format file from a dir of editing file or from a parent dir. If there is no such file then indenter starts to use file from a dir with the name current CodeStyle settings. - Test fixed ToDo: Add file absentness processing in case of import Change-Id: If09ef0c598899856b948c214e524bcfd5dad76e2 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -24,7 +24,11 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include "clangformatbaseindenter.h"
|
||||
#include "clangformatconstants.h"
|
||||
#include "clangformatutils.h"
|
||||
#include <coreplugin/icore.h>
|
||||
#include <texteditor/texteditorsettings.h>
|
||||
#include <texteditor/icodestylepreferences.h>
|
||||
|
||||
#include <clang/Tooling/Core/Replacement.h>
|
||||
|
||||
@@ -728,8 +732,22 @@ void ClangFormatBaseIndenter::autoIndent(const QTextCursor &cursor,
|
||||
clang::format::FormatStyle ClangFormatBaseIndenter::styleForFile() const
|
||||
{
|
||||
llvm::Expected<clang::format::FormatStyle> style
|
||||
= clang::format::getStyle("file", m_fileName.toString().toStdString(), "none");
|
||||
= clang::format::getStyle("file", m_fileName.path().toStdString(), "none");
|
||||
|
||||
if (style) {
|
||||
if (*style == clang::format::getNoStyle()) {
|
||||
Utils::FilePath filePath = filePathToCurrentSettings(
|
||||
TextEditor::TextEditorSettings::codeStyle("Cpp")->currentPreferences());
|
||||
|
||||
clang::format::FormatStyle style;
|
||||
style.Language = clang::format::FormatStyle::LK_Cpp;
|
||||
const std::error_code error
|
||||
= clang::format::parseConfiguration(filePath.fileContents().toStdString(), &style);
|
||||
QTC_ASSERT(error.value() == static_cast<int>(clang::format::ParseError::Success),
|
||||
return qtcStyle());
|
||||
|
||||
return style;
|
||||
}
|
||||
addQtcStatementMacros(*style);
|
||||
return *style;
|
||||
}
|
||||
|
@@ -68,8 +68,9 @@ public:
|
||||
|
||||
Utils::optional<int> margin() const override;
|
||||
|
||||
clang::format::FormatStyle styleForFile() const;
|
||||
|
||||
protected:
|
||||
virtual clang::format::FormatStyle styleForFile() const;
|
||||
virtual bool formatCodeInsteadOfIndent() const { return false; }
|
||||
virtual bool formatWhileTyping() const { return false; }
|
||||
virtual int lastSaveRevision() const { return 0; }
|
||||
|
@@ -113,11 +113,8 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc
|
||||
m_ui->setupUi(this);
|
||||
setEnabled(!codeStyle->isReadOnly());
|
||||
|
||||
Utils::FilePath filePath = Core::ICore::userResourcePath();
|
||||
filePath = filePath / "clang-format/"
|
||||
/ Utils::FileUtils::fileSystemFriendlyName(codeStyle->displayName())
|
||||
/ QLatin1String(Constants::SETTINGS_FILE_NAME);
|
||||
m_config = std::make_unique<ClangFormatFile>(filePath, codeStyle->isReadOnly());
|
||||
m_config = std::make_unique<ClangFormatFile>(filePathToCurrentSettings(codeStyle),
|
||||
codeStyle->isReadOnly());
|
||||
|
||||
initChecksAndPreview();
|
||||
showCombobox();
|
||||
|
@@ -40,11 +40,6 @@ ClangFormatIndenter::ClangFormatIndenter(QTextDocument *doc)
|
||||
: ClangFormatBaseIndenter(doc)
|
||||
{}
|
||||
|
||||
FormatStyle ClangFormatIndenter::styleForFile() const
|
||||
{
|
||||
return ClangFormat::styleForFile(m_fileName);
|
||||
}
|
||||
|
||||
bool ClangFormatIndenter::formatCodeInsteadOfIndent() const
|
||||
{
|
||||
return ClangFormatSettings::instance().formatCodeInsteadOfIndent();
|
||||
|
@@ -41,7 +41,6 @@ public:
|
||||
private:
|
||||
bool formatCodeInsteadOfIndent() const override;
|
||||
bool formatWhileTyping() const override;
|
||||
clang::format::FormatStyle styleForFile() const override;
|
||||
int lastSaveRevision() const override;
|
||||
};
|
||||
|
||||
|
@@ -30,7 +30,9 @@
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <cppeditor/cppcodestylesettings.h>
|
||||
#include <texteditor/icodestylepreferences.h>
|
||||
#include <texteditor/tabsettings.h>
|
||||
#include <texteditor/texteditorsettings.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/session.h>
|
||||
#include <utils/qtcassert.h>
|
||||
@@ -208,6 +210,7 @@ void saveStyleToFile(clang::format::FormatStyle style, Utils::FilePath filePath)
|
||||
const int pos = styleStr.find("# BasedOnStyle");
|
||||
if (pos != int(std::string::npos))
|
||||
styleStr.erase(pos, 2);
|
||||
styleStr.append("\n");
|
||||
filePath.writeFileContents(QByteArray::fromStdString(styleStr));
|
||||
}
|
||||
|
||||
@@ -382,6 +385,13 @@ void addQtcStatementMacros(clang::format::FormatStyle &style)
|
||||
}
|
||||
}
|
||||
|
||||
Utils::FilePath filePathToCurrentSettings(const TextEditor::ICodeStylePreferences *codeStyle)
|
||||
{
|
||||
return Core::ICore::userResourcePath() / "clang-format/"
|
||||
/ Utils::FileUtils::fileSystemFriendlyName(codeStyle->displayName())
|
||||
/ QLatin1String(Constants::SETTINGS_FILE_NAME);
|
||||
}
|
||||
|
||||
std::string readFile(const QString &path)
|
||||
{
|
||||
const std::string defaultStyle = clang::format::configurationAsText(qtcStyle());
|
||||
|
@@ -34,6 +34,7 @@
|
||||
|
||||
#include <fstream>
|
||||
|
||||
namespace TextEditor { class ICodeStylePreferences; }
|
||||
namespace ClangFormat {
|
||||
|
||||
// Creates the style for the current project or the global style if needed.
|
||||
@@ -55,4 +56,6 @@ void saveStyleToFile(clang::format::FormatStyle style, Utils::FilePath filePath)
|
||||
|
||||
void addQtcStatementMacros(clang::format::FormatStyle &style);
|
||||
clang::format::FormatStyle qtcStyle();
|
||||
|
||||
Utils::FilePath filePathToCurrentSettings(const TextEditor::ICodeStylePreferences *codeStyle);
|
||||
}
|
||||
|
@@ -52,7 +52,7 @@ public:
|
||||
ClangFormatExtendedTestIndenter(QTextDocument *doc) : ClangFormatTestIndenter(doc) {}
|
||||
|
||||
private:
|
||||
bool formatWhileTyping() const override { return true; }
|
||||
bool formatCodeInsteadOfIndent() const override { return true; }
|
||||
};
|
||||
|
||||
ClangFormatTest::ClangFormatTest()
|
||||
|
Reference in New Issue
Block a user