summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenz Haas <lykurg@gmail.com>2016-03-16 21:17:10 +0100
committerLorenz Haas <lorenz.haas@histomatics.de>2016-04-14 20:07:05 +0000
commit3310fbc8f2f00aacf4f3c3bb373f49b1549db8bd (patch)
tree98dbe3317e88a8355219239720210ebd7e848bd6
parente63f5035928b25d50e10497c6dcb381b0be9bebb (diff)
downloadqt-creator-3310fbc8f2f00aacf4f3c3bb373f49b1549db8bd.tar.gz
Beautifier: Fix clang-format's custom style handling
Instead of dealing with clang-format's YAML format use proper command line parameters. Task-number: QTCREATORBUG-15604 Change-Id: Ie0b22aff105c8d208d30e2e945b0036b0b8606c1 Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
-rw-r--r--src/plugins/beautifier/abstractsettings.cpp74
-rw-r--r--src/plugins/beautifier/abstractsettings.h7
-rw-r--r--src/plugins/beautifier/beautifierplugin.cpp1
-rw-r--r--src/plugins/beautifier/clangformat/clangformat.cpp16
-rw-r--r--src/plugins/beautifier/clangformat/clangformatsettings.cpp16
-rw-r--r--src/plugins/beautifier/clangformat/clangformatsettings.h5
6 files changed, 70 insertions, 49 deletions
diff --git a/src/plugins/beautifier/abstractsettings.cpp b/src/plugins/beautifier/abstractsettings.cpp
index dd8d83e10d..577fdc1948 100644
--- a/src/plugins/beautifier/abstractsettings.cpp
+++ b/src/plugins/beautifier/abstractsettings.cpp
@@ -41,11 +41,11 @@ namespace Internal {
AbstractSettings::AbstractSettings(const QString &name, const QString &ending)
: m_version(0)
- , m_name(name)
, m_ending(ending)
, m_styleDir(Core::ICore::userResourcePath() + QLatin1Char('/')
+ QLatin1String(Beautifier::Constants::SETTINGS_DIRNAME) + QLatin1Char('/')
- + m_name)
+ + name)
+ , m_name(name)
{
}
@@ -97,7 +97,7 @@ void AbstractSettings::setStyle(const QString &key, const QString &value)
void AbstractSettings::removeStyle(const QString &key)
{
m_styles.remove(key);
- m_stylesToRemove << key + m_ending;
+ m_stylesToRemove << key;
}
void AbstractSettings::replaceStyle(const QString &oldKey, const QString &newKey,
@@ -178,18 +178,13 @@ void AbstractSettings::save()
if (m_stylesToRemove.isEmpty() && m_styles.isEmpty())
return;
- if (!m_styleDir.exists()) {
- const QString path = m_styleDir.absolutePath();
- if (!(m_styleDir.mkpath(path)
- && m_styleDir.cd(path))) {
- BeautifierPlugin::showError(tr("Cannot save styles. %1 does not exist.").arg(path));
- return;
- }
+ // remove old files and possible subfolder
+ foreach (const QString &key, m_stylesToRemove) {
+ const QFileInfo fi(styleFileName(key));
+ QFile::remove(fi.absoluteFilePath());
+ if (fi.absoluteDir() != m_styleDir)
+ m_styleDir.rmdir(fi.absolutePath());
}
-
- // remove old files
- foreach (const QString &file, m_stylesToRemove)
- m_styleDir.remove(file);
m_stylesToRemove.clear();
QMap<QString, QString>::const_iterator iStyles = m_styles.constBegin();
@@ -200,7 +195,14 @@ void AbstractSettings::save()
continue;
}
- Utils::FileSaver saver(styleFileName(iStyles.key()));
+ const QFileInfo fi(styleFileName(iStyles.key()));
+ if (!(m_styleDir.mkpath(fi.absolutePath()))) {
+ BeautifierPlugin::showError(tr("Cannot save styles. %1 does not exist.")
+ .arg(fi.absolutePath()));
+ continue;
+ }
+
+ Utils::FileSaver saver(fi.absoluteFilePath());
if (saver.hasError()) {
BeautifierPlugin::showError(tr("Cannot open file \"%1\": %2.")
.arg(saver.fileName())
@@ -242,29 +244,10 @@ void AbstractSettings::read()
s->endGroup();
s->endGroup();
- // Read styles
- if (!m_styleDir.exists())
- return;
-
- m_stylesToRemove.clear();
m_styles.clear();
- const QStringList files
- = m_styleDir.entryList(QStringList() << QLatin1Char('*') + m_ending,
- QDir::Files | QDir::Readable | QDir::NoDotAndDotDot);
- foreach (const QString &filename, files) {
- // do not allow empty file names
- if (filename == m_ending)
- continue;
-
- QFile file(m_styleDir.absoluteFilePath(filename));
- if (file.open(QIODevice::ReadOnly)) {
- m_styles.insert(filename.left(filename.length() - m_ending.length()),
- QString::fromLocal8Bit(file.readAll()));
- }
- }
-
m_changedStyles.clear();
m_stylesToRemove.clear();
+ readStyles();
}
void AbstractSettings::readDocumentation()
@@ -324,5 +307,26 @@ void AbstractSettings::readDocumentation()
}
}
+void AbstractSettings::readStyles()
+{
+ if (!m_styleDir.exists())
+ return;
+
+ const QStringList files
+ = m_styleDir.entryList(QStringList() << QLatin1Char('*') + m_ending,
+ QDir::Files | QDir::Readable | QDir::NoDotAndDotDot);
+ foreach (const QString &filename, files) {
+ // do not allow empty file names
+ if (filename == m_ending)
+ continue;
+
+ QFile file(m_styleDir.absoluteFilePath(filename));
+ if (file.open(QIODevice::ReadOnly)) {
+ m_styles.insert(filename.left(filename.length() - m_ending.length()),
+ QString::fromLocal8Bit(file.readAll()));
+ }
+ }
+}
+
} // namespace Internal
} // namespace Beautifier
diff --git a/src/plugins/beautifier/abstractsettings.h b/src/plugins/beautifier/abstractsettings.h
index 88c1dce543..186adf7522 100644
--- a/src/plugins/beautifier/abstractsettings.h
+++ b/src/plugins/beautifier/abstractsettings.h
@@ -59,7 +59,7 @@ public:
void setStyle(const QString &key, const QString &value);
void removeStyle(const QString &key);
void replaceStyle(const QString &oldKey, const QString &newKey, const QString &value);
- QString styleFileName(const QString &key) const;
+ virtual QString styleFileName(const QString &key) const;
QString command() const;
void setCommand(const QString &command);
@@ -73,13 +73,14 @@ protected:
QMap<QString, QString> m_styles;
QMap<QString, QVariant> m_settings;
int m_version;
+ QString m_ending;
+ QDir m_styleDir;
void readDocumentation();
+ virtual void readStyles();
private:
QString m_name;
- QString m_ending;
- QDir m_styleDir;
QStringList m_stylesToRemove;
QSet<QString> m_changedStyles;
QString m_command;
diff --git a/src/plugins/beautifier/beautifierplugin.cpp b/src/plugins/beautifier/beautifierplugin.cpp
index dd1fb2c16f..2483ecc9d6 100644
--- a/src/plugins/beautifier/beautifierplugin.cpp
+++ b/src/plugins/beautifier/beautifierplugin.cpp
@@ -119,6 +119,7 @@ FormatTask format(FormatTask task)
case Command::PipeProcessing: {
QProcess process;
QStringList options = task.command.options();
+ options.replaceInStrings(QLatin1String("%filename"), QFileInfo(task.filePath).fileName());
options.replaceInStrings(QLatin1String("%file"), task.filePath);
process.start(executable, options);
if (!process.waitForStarted(3000)) {
diff --git a/src/plugins/beautifier/clangformat/clangformat.cpp b/src/plugins/beautifier/clangformat/clangformat.cpp
index 800b3e4c18..0e77d2c291 100644
--- a/src/plugins/beautifier/clangformat/clangformat.cpp
+++ b/src/plugins/beautifier/clangformat/clangformat.cpp
@@ -132,23 +132,19 @@ Command ClangFormat::command(int offset, int length) const
if (m_settings->usePredefinedStyle()) {
command.addOption(QLatin1String("-style=") + m_settings->predefinedStyle());
+ command.addOption(QLatin1String("-assume-filename=%filename"));
} else {
- // The clang-format option file is YAML
- const QStringList lines = m_settings->style(m_settings->customStyle())
- .split(QLatin1Char('\n'), QString::SkipEmptyParts);
- const QStringList options = Utils::filtered(lines, [](const QString &s) -> bool {
- const QString option = s.trimmed();
- return !(option.startsWith(QLatin1Char('#')) || option == QLatin1String("---"));
- });
- command.addOption(QLatin1String("-style={") + options.join(QLatin1String(", "))
- + QLatin1Char('}'));
+ command.addOption(QLatin1String("-style=file"));
+ const QString path =
+ QFileInfo(m_settings->styleFileName(m_settings->customStyle())).absolutePath();
+ command.addOption(QLatin1String("-assume-filename=") + path + QDir::separator()
+ + QLatin1String("%filename"));
}
if (offset != -1) {
command.addOption(QLatin1String("-offset=") + QString::number(offset));
command.addOption(QLatin1String("-length=") + QString::number(length));
}
- command.addOption(QLatin1String("-assume-filename=%file"));
return command;
}
diff --git a/src/plugins/beautifier/clangformat/clangformatsettings.cpp b/src/plugins/beautifier/clangformat/clangformatsettings.cpp
index bbc23e8963..aad5a4f6a0 100644
--- a/src/plugins/beautifier/clangformat/clangformatsettings.cpp
+++ b/src/plugins/beautifier/clangformat/clangformatsettings.cpp
@@ -48,7 +48,6 @@ const char kFormatEntireFileFallback[] = "formatEntireFileFallback";
ClangFormatSettings::ClangFormatSettings() :
AbstractSettings(QLatin1String(Constants::ClangFormat::SETTINGS_NAME),
QLatin1String(".clang-format"))
-
{
setCommand(QLatin1String("clang-format"));
m_settings.insert(QLatin1String(kUsePredefinedStyle), QVariant(true));
@@ -225,6 +224,21 @@ QStringList ClangFormatSettings::predefinedStyles() const
<< QLatin1String("File");
}
+QString ClangFormatSettings::styleFileName(const QString &key) const
+{
+ return m_styleDir.absolutePath() + QLatin1Char('/') + key + QLatin1Char('/') + m_ending;
+}
+
+void ClangFormatSettings::readStyles()
+{
+ const QStringList dirs = m_styleDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);
+ for (const QString &dir : dirs) {
+ QFile file(m_styleDir.absoluteFilePath(dir + QLatin1Char('/') + m_ending));
+ if (file.open(QIODevice::ReadOnly))
+ m_styles.insert(dir, QString::fromLocal8Bit(file.readAll()));
+ }
+}
+
} // namespace ClangFormat
} // namespace Internal
} // namespace Beautifier
diff --git a/src/plugins/beautifier/clangformat/clangformatsettings.h b/src/plugins/beautifier/clangformat/clangformatsettings.h
index f73a6cc7fd..0211f1e524 100644
--- a/src/plugins/beautifier/clangformat/clangformatsettings.h
+++ b/src/plugins/beautifier/clangformat/clangformatsettings.h
@@ -57,6 +57,11 @@ public:
void setFormatEntireFileFallback(bool formatEntireFileFallback);
QStringList predefinedStyles() const;
+
+ QString styleFileName(const QString &key) const override;
+
+private:
+ void readStyles() override;
};
} // namespace ClangFormat