diff --git a/src/plugins/beautifier/abstractsettings.cpp b/src/plugins/beautifier/abstractsettings.cpp index dd8d83e10d5ff39475ceedd53fad879adf983a94..577fdc1948ad0b185b522bebb34d639c83b59285 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 88c1dce543e34e7683ec3472e98f0249b3b99501..186adf7522ec632473842282cbd947ca810b9332 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 dd1fb2c16f6338e9585d029c4602d0b1e0ebfefd..2483ecc9d621c40cf73b8c2eb748abc45b3495e2 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 800b3e4c184475211e8b5e40eae0bdd739935a0e..0e77d2c291884c06c898d138a9918178e6276dd2 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 bbc23e89631ad384e3f43c46aa76b49f5908bf38..aad5a4f6a02a0b4bf03280f9b76f3fe654c310b6 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 f73a6cc7fd909a43419e228ee898d19c29debfce..0211f1e5247d28b3d42c7f72073ff8bb9e02a1c0 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