Beautifier: Merge Artistic style file pairs

... to prepare moving the "unusual" functions off the settings/
AbstractSettings base.

Change-Id: I4875bae9f3cec2105eb6d29493d6a6e706c414a7
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
hjk
2023-07-07 07:12:46 +02:00
parent 3d3c78dfc6
commit c8d9b6f5aa
6 changed files with 228 additions and 250 deletions

View File

@@ -5,7 +5,6 @@ add_qtc_plugin(Beautifier
abstractsettings.cpp abstractsettings.h
artisticstyle/artisticstyle.cpp artisticstyle/artisticstyle.h
artisticstyle/artisticstyleconstants.h
artisticstyle/artisticstylesettings.cpp artisticstyle/artisticstylesettings.h
beautifier.qrc
beautifierabstracttool.h
beautifierconstants.h

View File

@@ -6,10 +6,11 @@
#include "artisticstyle.h"
#include "artisticstyleconstants.h"
#include "../abstractsettings.h"
#include "../beautifierconstants.h"
#include "../beautifierplugin.h"
#include "../beautifiertr.h"
#include "../configurationpanel.h"
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h>
@@ -17,6 +18,7 @@
#include <coreplugin/coreconstants.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/icore.h>
#include <coreplugin/idocument.h>
#include <projectexplorer/project.h>
@@ -27,16 +29,227 @@
#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
#include <utils/layoutbuilder.h>
#include <utils/pathchooser.h>
#include <utils/process.h>
#include <utils/stringutils.h>
#include <QAction>
#include <QApplication>
#include <QDateTime>
#include <QFile>
#include <QFileInfo>
#include <QGroupBox>
#include <QMenu>
#include <QRegularExpression>
#include <QVersionNumber>
#include <QXmlStreamWriter>
using namespace TextEditor;
using namespace Utils;
namespace Beautifier::Internal {
// Settings
const char SETTINGS_NAME[] = "artisticstyle";
class ArtisticStyleSettings : public AbstractSettings
{
public:
ArtisticStyleSettings()
: AbstractSettings(SETTINGS_NAME, ".astyle")
{
setVersionRegExp(QRegularExpression("([2-9]{1})\\.([0-9]{1,2})(\\.[1-9]{1})?$"));
command.setLabelText(Tr::tr("Artistic Style command:"));
command.setDefaultValue("astyle");
command.setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle(
Tr::tr(Constants::ARTISTICSTYLE_DISPLAY_NAME)));
useOtherFiles.setSettingsKey("useOtherFiles");
useOtherFiles.setLabelText(Tr::tr("Use file *.astylerc defined in project files"));
useOtherFiles.setDefaultValue(true);
useSpecificConfigFile.setSettingsKey("useSpecificConfigFile");
useSpecificConfigFile.setLabelText(Tr::tr("Use specific config file:"));
specificConfigFile.setSettingsKey("specificConfigFile");
specificConfigFile.setExpectedKind(PathChooser::File);
specificConfigFile.setPromptDialogFilter(Tr::tr("AStyle (*.astylerc)"));
useHomeFile.setSettingsKey("useHomeFile");
useHomeFile.setLabelText(Tr::tr("Use file .astylerc or astylerc in HOME").
replace("HOME", QDir::toNativeSeparators(QDir::home().absolutePath())));
useCustomStyle.setSettingsKey("useCustomStyle");
useCustomStyle.setLabelText(Tr::tr("Use customized style:"));
customStyle.setSettingsKey("customStyle");
documentationFilePath =
Core::ICore::userResourcePath(Beautifier::Constants::SETTINGS_DIRNAME)
.pathAppended(Beautifier::Constants::DOCUMENTATION_DIRNAME)
.pathAppended(SETTINGS_NAME)
.stringAppended(".xml");
read();
}
void createDocumentationFile() const override
{
Process process;
process.setTimeoutS(2);
process.setCommand({command(), {"-h"}});
process.runBlocking();
if (process.result() != ProcessResult::FinishedWithSuccess)
return;
if (!documentationFilePath.exists())
documentationFilePath.parentDir().ensureWritableDir();
QFile file(documentationFilePath.toFSPathString());
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
return;
bool contextWritten = false;
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true);
stream.writeStartDocument("1.0", true);
stream.writeComment("Created " + QDateTime::currentDateTime().toString(Qt::ISODate));
stream.writeStartElement(Constants::DOCUMENTATION_XMLROOT);
// astyle writes its output to 'error'...
const QStringList lines = process.cleanedStdErr().split(QLatin1Char('\n'));
QStringList keys;
QStringList docu;
for (QString line : lines) {
line = line.trimmed();
if ((line.startsWith("--") && !line.startsWith("---")) || line.startsWith("OR ")) {
const QStringList rawKeys = line.split(" OR ", Qt::SkipEmptyParts);
for (QString k : rawKeys) {
k = k.trimmed();
k.remove('#');
keys << k;
if (k.startsWith("--"))
keys << k.right(k.size() - 2);
}
} else {
if (line.isEmpty()) {
if (!keys.isEmpty()) {
// Write entry
stream.writeStartElement(Constants::DOCUMENTATION_XMLENTRY);
stream.writeStartElement(Constants::DOCUMENTATION_XMLKEYS);
for (const QString &key : std::as_const(keys))
stream.writeTextElement(Constants::DOCUMENTATION_XMLKEY, key);
stream.writeEndElement();
const QString text = "<p><span class=\"option\">"
+ keys.filter(QRegularExpression("^\\-")).join(", ") + "</span></p><p>"
+ (docu.join(' ').toHtmlEscaped()) + "</p>";
stream.writeTextElement(Constants::DOCUMENTATION_XMLDOC, text);
stream.writeEndElement();
contextWritten = true;
}
keys.clear();
docu.clear();
} else if (!keys.isEmpty()) {
docu << line;
}
}
}
stream.writeEndElement();
stream.writeEndDocument();
// An empty file causes error messages and a contextless file preventing this function to run
// again in order to generate the documentation successfully. Thus delete the file.
if (!contextWritten) {
file.close();
file.remove();
}
}
BoolAspect useOtherFiles{this};
BoolAspect useSpecificConfigFile{this};
FilePathAspect specificConfigFile{this};
BoolAspect useHomeFile{this};
BoolAspect useCustomStyle{this};
StringAspect customStyle{this};
};
static ArtisticStyleSettings &settings()
{
static ArtisticStyleSettings theSettings;
return theSettings;
}
// ArtisticStyleOptionsPage
class ArtisticStyleOptionsPageWidget : public Core::IOptionsPageWidget
{
public:
ArtisticStyleOptionsPageWidget()
{
QGroupBox *options = nullptr;
auto configurations = new ConfigurationPanel(this);
configurations->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
configurations->setSettings(&settings());
configurations->setCurrentConfiguration(settings().customStyle());
using namespace Layouting;
ArtisticStyleSettings &s = settings();
Column {
Group {
title(Tr::tr("Configuration")),
Form {
s.command, br,
s.supportedMimeTypes
}
},
Group {
title(Tr::tr("Options")),
bindTo(&options),
Column {
s.useOtherFiles,
Row { s.useSpecificConfigFile, s.specificConfigFile },
s.useHomeFile,
Row { s.useCustomStyle, configurations },
}
},
st
}.attachTo(this);
setOnApply([&s, configurations] {
s.customStyle.setValue(configurations->currentConfiguration());
s.save();
});
s.read();
connect(s.command.pathChooser(), &PathChooser::validChanged, options, &QWidget::setEnabled);
options->setEnabled(s.command.pathChooser()->isValid());
}
};
class ArtisticStyleOptionsPage final : public Core::IOptionsPage
{
public:
ArtisticStyleOptionsPage()
{
setId("ArtisticStyle");
setDisplayName(Tr::tr("Artistic Style"));
setCategory(Constants::OPTION_CATEGORY);
setWidgetCreator([] { return new ArtisticStyleOptionsPageWidget; });
}
};
const ArtisticStyleOptionsPage settingsPage;
// Style
ArtisticStyle::ArtisticStyle()
{
Core::ActionContainer *menu = Core::ActionManager::createMenu("ArtisticStyle.Menu");
@@ -48,7 +261,7 @@ ArtisticStyle::ArtisticStyle()
Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu);
connect(&m_settings.supportedMimeTypes, &Utils::BaseAspect::changed,
connect(&settings().supportedMimeTypes, &Utils::BaseAspect::changed,
this, [this] { updateActions(Core::EditorManager::currentEditor()); });
}
@@ -59,7 +272,7 @@ QString ArtisticStyle::id() const
void ArtisticStyle::updateActions(Core::IEditor *editor)
{
m_formatFile->setEnabled(editor && m_settings.isApplicable(editor->document()));
m_formatFile->setEnabled(editor && settings().isApplicable(editor->document()));
}
void ArtisticStyle::formatFile()
@@ -75,10 +288,10 @@ void ArtisticStyle::formatFile()
QString ArtisticStyle::configurationFile() const
{
if (m_settings.useCustomStyle())
return m_settings.styleFileName(m_settings.customStyle());
if (settings().useCustomStyle())
return settings().styleFileName(settings().customStyle());
if (m_settings.useOtherFiles()) {
if (settings().useOtherFiles()) {
if (const ProjectExplorer::Project *project
= ProjectExplorer::ProjectTree::currentProject()) {
const Utils::FilePaths astyleRcfiles = project->files(
@@ -91,13 +304,13 @@ QString ArtisticStyle::configurationFile() const
}
}
if (m_settings.useSpecificConfigFile()) {
const Utils::FilePath file = m_settings.specificConfigFile();
if (settings().useSpecificConfigFile()) {
const Utils::FilePath file = settings().specificConfigFile();
if (file.exists())
return file.toUserOutput();
}
if (m_settings.useHomeFile()) {
if (settings().useHomeFile()) {
const QDir homeDirectory = QDir::home();
QString file = homeDirectory.filePath(".astylerc");
if (QFile::exists(file))
@@ -118,17 +331,17 @@ Command ArtisticStyle::command() const
bool ArtisticStyle::isApplicable(const Core::IDocument *document) const
{
return m_settings.isApplicable(document);
return settings().isApplicable(document);
}
Command ArtisticStyle::command(const QString &cfgFile) const
{
Command command;
command.setExecutable(m_settings.command());
command.setExecutable(settings().command());
command.addOption("-q");
command.addOption("--options=" + cfgFile);
const QVersionNumber version = m_settings.version();
const QVersionNumber version = settings().version();
if (version > QVersionNumber(2, 3)) {
command.setProcessing(Command::PipeProcessing);
if (version == QVersionNumber(2, 4))

View File

@@ -5,7 +5,9 @@
#include "../beautifierabstracttool.h"
#include "artisticstylesettings.h"
QT_BEGIN_NAMESPACE
class QAction;
QT_END_NAMESPACE
namespace Beautifier::Internal {
@@ -25,8 +27,6 @@ private:
TextEditor::Command command(const QString &cfgFile) const;
QAction *m_formatFile = nullptr;
ArtisticStyleSettings m_settings;
ArtisticStyleOptionsPage m_page{&m_settings};
};
} // Beautifier::Internal

View File

@@ -1,201 +0,0 @@
// Copyright (C) 2016 Lorenz Haas
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "artisticstylesettings.h"
#include "artisticstyleconstants.h"
#include "../beautifierconstants.h"
#include "../beautifierplugin.h"
#include "../beautifiertr.h"
#include "../configurationpanel.h"
#include <coreplugin/icore.h>
#include <utils/layoutbuilder.h>
#include <utils/pathchooser.h>
#include <utils/process.h>
#include <utils/stringutils.h>
#include <QApplication>
#include <QDateTime>
#include <QFile>
#include <QFileInfo>
#include <QGroupBox>
#include <QRegularExpression>
#include <QXmlStreamWriter>
using namespace Utils;
namespace Beautifier::Internal {
const char SETTINGS_NAME[] = "artisticstyle";
ArtisticStyleSettings::ArtisticStyleSettings()
: AbstractSettings(SETTINGS_NAME, ".astyle")
{
setVersionRegExp(QRegularExpression("([2-9]{1})\\.([0-9]{1,2})(\\.[1-9]{1})?$"));
command.setLabelText(Tr::tr("Artistic Style command:"));
command.setDefaultValue("astyle");
command.setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle(
Tr::tr(Constants::ARTISTICSTYLE_DISPLAY_NAME)));
useOtherFiles.setSettingsKey("useOtherFiles");
useOtherFiles.setLabelText(Tr::tr("Use file *.astylerc defined in project files"));
useOtherFiles.setDefaultValue(true);
useSpecificConfigFile.setSettingsKey("useSpecificConfigFile");
useSpecificConfigFile.setLabelText(Tr::tr("Use specific config file:"));
specificConfigFile.setSettingsKey("specificConfigFile");
specificConfigFile.setExpectedKind(PathChooser::File);
specificConfigFile.setPromptDialogFilter(Tr::tr("AStyle (*.astylerc)"));
useHomeFile.setSettingsKey("useHomeFile");
useHomeFile.setLabelText(Tr::tr("Use file .astylerc or astylerc in HOME").
replace("HOME", QDir::toNativeSeparators(QDir::home().absolutePath())));
useCustomStyle.setSettingsKey("useCustomStyle");
useCustomStyle.setLabelText(Tr::tr("Use customized style:"));
customStyle.setSettingsKey("customStyle");
documentationFilePath =
Core::ICore::userResourcePath(Beautifier::Constants::SETTINGS_DIRNAME)
.pathAppended(Beautifier::Constants::DOCUMENTATION_DIRNAME)
.pathAppended(SETTINGS_NAME)
.stringAppended(".xml");
read();
}
void ArtisticStyleSettings::createDocumentationFile() const
{
Process process;
process.setTimeoutS(2);
process.setCommand({command(), {"-h"}});
process.runBlocking();
if (process.result() != ProcessResult::FinishedWithSuccess)
return;
if (!documentationFilePath.exists())
documentationFilePath.parentDir().ensureWritableDir();
QFile file(documentationFilePath.toFSPathString());
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
return;
bool contextWritten = false;
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true);
stream.writeStartDocument("1.0", true);
stream.writeComment("Created " + QDateTime::currentDateTime().toString(Qt::ISODate));
stream.writeStartElement(Constants::DOCUMENTATION_XMLROOT);
// astyle writes its output to 'error'...
const QStringList lines = process.cleanedStdErr().split(QLatin1Char('\n'));
QStringList keys;
QStringList docu;
for (QString line : lines) {
line = line.trimmed();
if ((line.startsWith("--") && !line.startsWith("---")) || line.startsWith("OR ")) {
const QStringList rawKeys = line.split(" OR ", Qt::SkipEmptyParts);
for (QString k : rawKeys) {
k = k.trimmed();
k.remove('#');
keys << k;
if (k.startsWith("--"))
keys << k.right(k.size() - 2);
}
} else {
if (line.isEmpty()) {
if (!keys.isEmpty()) {
// Write entry
stream.writeStartElement(Constants::DOCUMENTATION_XMLENTRY);
stream.writeStartElement(Constants::DOCUMENTATION_XMLKEYS);
for (const QString &key : std::as_const(keys))
stream.writeTextElement(Constants::DOCUMENTATION_XMLKEY, key);
stream.writeEndElement();
const QString text = "<p><span class=\"option\">"
+ keys.filter(QRegularExpression("^\\-")).join(", ") + "</span></p><p>"
+ (docu.join(' ').toHtmlEscaped()) + "</p>";
stream.writeTextElement(Constants::DOCUMENTATION_XMLDOC, text);
stream.writeEndElement();
contextWritten = true;
}
keys.clear();
docu.clear();
} else if (!keys.isEmpty()) {
docu << line;
}
}
}
stream.writeEndElement();
stream.writeEndDocument();
// An empty file causes error messages and a contextless file preventing this function to run
// again in order to generate the documentation successfully. Thus delete the file.
if (!contextWritten) {
file.close();
file.remove();
}
}
class ArtisticStyleOptionsPageWidget : public Core::IOptionsPageWidget
{
public:
explicit ArtisticStyleOptionsPageWidget(ArtisticStyleSettings *settings)
{
QGroupBox *options = nullptr;
auto configurations = new ConfigurationPanel(this);
configurations->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
configurations->setSettings(settings);
configurations->setCurrentConfiguration(settings->customStyle());
using namespace Layouting;
ArtisticStyleSettings &s = *settings;
Column {
Group {
title(Tr::tr("Configuration")),
Form {
s.command, br,
s.supportedMimeTypes
}
},
Group {
title(Tr::tr("Options")),
bindTo(&options),
Column {
s.useOtherFiles,
Row { s.useSpecificConfigFile, s.specificConfigFile },
s.useHomeFile,
Row { s.useCustomStyle, configurations },
}
},
st
}.attachTo(this);
setOnApply([&s, configurations] {
s.customStyle.setValue(configurations->currentConfiguration());
s.save();
});
s.read();
connect(s.command.pathChooser(), &PathChooser::validChanged, options, &QWidget::setEnabled);
options->setEnabled(s.command.pathChooser()->isValid());
}
};
ArtisticStyleOptionsPage::ArtisticStyleOptionsPage(ArtisticStyleSettings *settings)
{
setId("ArtisticStyle");
setDisplayName(Tr::tr("Artistic Style"));
setCategory(Constants::OPTION_CATEGORY);
setWidgetCreator([settings] { return new ArtisticStyleOptionsPageWidget(settings); });
}
} // Beautifier::Internal

View File

@@ -1,31 +0,0 @@
// Copyright (C) 2016 Lorenz Haas
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "../abstractsettings.h"
namespace Beautifier::Internal {
class ArtisticStyleSettings : public AbstractSettings
{
public:
ArtisticStyleSettings();
Utils::BoolAspect useOtherFiles{this};
Utils::BoolAspect useSpecificConfigFile{this};
Utils::FilePathAspect specificConfigFile{this};
Utils::BoolAspect useHomeFile{this};
Utils::BoolAspect useCustomStyle{this};
Utils::StringAspect customStyle{this};
void createDocumentationFile() const override;
};
class ArtisticStyleOptionsPage final : public Core::IOptionsPage
{
public:
explicit ArtisticStyleOptionsPage(ArtisticStyleSettings *settings);
};
} // Beautifier::Internal

View File

@@ -36,8 +36,6 @@ QtcPlugin {
"artisticstyle.cpp",
"artisticstyle.h",
"artisticstyleconstants.h",
"artisticstylesettings.cpp",
"artisticstylesettings.h"
]
}