From 1ea640433736d599a2ec0cb716924db1560f59a3 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 21 Jun 2016 11:16:39 +0200 Subject: CppTools: Allow prefering getter names with "get" prefix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We default to "foo()" for e.g. a member variable "m_foo", but other coding styles require "getFoo()". Task-number: QTCREATORBUG-16452 Change-Id: I9ccfdf88e4c469bc1c06fde855ad754faf2bd238 Reviewed-by: André Hartmann --- src/plugins/cppeditor/cppeditorplugin.h | 1 + src/plugins/cppeditor/cppquickfix_test.cpp | 79 +++++++++++++++++++++++ src/plugins/cppeditor/cppquickfixes.cpp | 3 +- src/plugins/cpptools/cppcodestylesettings.cpp | 64 ++++++++++-------- src/plugins/cpptools/cppcodestylesettings.h | 5 ++ src/plugins/cpptools/cppcodestylesettingspage.cpp | 4 ++ src/plugins/cpptools/cppcodestylesettingspage.ui | 27 ++++++++ 7 files changed, 156 insertions(+), 27 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h index eb59a3a079..35c7fca23e 100644 --- a/src/plugins/cppeditor/cppeditorplugin.h +++ b/src/plugins/cppeditor/cppeditorplugin.h @@ -117,6 +117,7 @@ private slots: void test_quickfix_GenerateGetterSetter_basicGetterWithPrefixAndNamespaceToCpp(); void test_quickfix_GenerateGetterSetter_onlyGetter(); + void test_quickfix_GenerateGetterSetter_onlyGetter_DontPreferGetterWithGet(); void test_quickfix_GenerateGetterSetter_onlySetter(); void test_quickfix_GenerateGetterSetter_offerGetterWhenSetterPresent(); void test_quickfix_GenerateGetterSetter_offerSetterWhenGetterPresent(); diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index ddd2b5097d..742106252a 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -1890,6 +1890,85 @@ void CppEditorPlugin::test_quickfix_GenerateGetterSetter_onlySetter() QuickFixOperationTest(testDocuments, &factory, ProjectPartHeaderPaths(), 2); } +class CppCodeStyleSettingsChanger { +public: + CppCodeStyleSettingsChanger(const CppCodeStyleSettings &settings); + ~CppCodeStyleSettingsChanger(); // Restore original + + static CppCodeStyleSettings currentSettings(); + +private: + void setSettings(const CppCodeStyleSettings &settings); + + CppCodeStyleSettings m_originalSettings; +}; + +CppCodeStyleSettingsChanger::CppCodeStyleSettingsChanger(const CppCodeStyleSettings &settings) +{ + m_originalSettings = currentSettings(); + setSettings(settings); +} + +CppCodeStyleSettingsChanger::~CppCodeStyleSettingsChanger() +{ + setSettings(m_originalSettings); +} + +void CppCodeStyleSettingsChanger::setSettings(const CppCodeStyleSettings &settings) +{ + QVariant variant; + variant.setValue(settings); + + CppCodeStylePreferences *preferences = CppToolsSettings::instance()->cppCodeStyle(); + preferences->currentDelegate()->setValue(variant); +} + +CppCodeStyleSettings CppCodeStyleSettingsChanger::currentSettings() +{ + CppCodeStylePreferences *preferences = CppToolsSettings::instance()->cppCodeStyle(); + return preferences->currentDelegate()->value().value(); +} + +void CppEditorPlugin::test_quickfix_GenerateGetterSetter_onlyGetter_DontPreferGetterWithGet() +{ + CppCodeStyleSettings modifiedSettings = CppCodeStyleSettingsChanger::currentSettings(); + modifiedSettings.preferGetterNameWithoutGetPrefix = false; + CppCodeStyleSettingsChanger changer(modifiedSettings); + + QList testDocuments; + QByteArray original; + QByteArray expected; + + // Header File + original = + "class Foo\n" + "{\n" + "public:\n" + " int m_bar@;\n" + "};\n"; + expected = + "class Foo\n" + "{\n" + "public:\n" + " int m_bar@;\n" + " int getBar() const;\n" + "};\n"; + testDocuments << QuickFixTestDocument::create("file.h", original, expected); + + // Source File + original.resize(0); + expected = + "\n" + "int Foo::getBar() const\n" + "{\n" + " return m_bar;\n" + "}\n"; + testDocuments << QuickFixTestDocument::create("file.cpp", original, expected); + + GenerateGetterSetter factory; + QuickFixOperationTest(testDocuments, &factory, ProjectPartHeaderPaths(), 1); +} + /// Checks: Offer a "generate getter" quick fix if there is a setter void CppEditorPlugin::test_quickfix_GenerateGetterSetter_offerGetterWhenSetterPresent() { diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index 604243d6d3..cb9df1eb31 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -5967,9 +5967,10 @@ void GenerateGetterSetterOperation::determineGetterSetterNames() m_baseName = QLatin1String("value"); // Getter Name + const CppCodeStyleSettings settings = CppCodeStyleSettings::currentProjectCodeStyle(); const bool hasValidBaseName = m_baseName != m_variableString; const bool getPrefixIsAlreadyUsed = hasClassMemberWithGetPrefix(m_classSpecifier->symbol); - if (hasValidBaseName && !getPrefixIsAlreadyUsed) { + if (settings.preferGetterNameWithoutGetPrefix && hasValidBaseName && !getPrefixIsAlreadyUsed) { m_getterName = m_baseName; } else { const QString baseNameWithCapital = m_baseName.left(1).toUpper() + m_baseName.mid(1); diff --git a/src/plugins/cpptools/cppcodestylesettings.cpp b/src/plugins/cpptools/cppcodestylesettings.cpp index a0d618225c..06d396e59c 100644 --- a/src/plugins/cpptools/cppcodestylesettings.cpp +++ b/src/plugins/cpptools/cppcodestylesettings.cpp @@ -59,6 +59,7 @@ static const char bindStarToLeftSpecifierKey[] = "BindStarToLeftSpecifier"; static const char bindStarToRightSpecifierKey[] = "BindStarToRightSpecifier"; static const char extraPaddingForConditionsIfConfusingAlignKey[] = "ExtraPaddingForConditionsIfConfusingAlign"; static const char alignAssignmentsKey[] = "AlignAssignments"; +static const char shortGetterNameKey[] = "ShortGetterName"; using namespace CppTools; @@ -85,6 +86,7 @@ CppCodeStyleSettings::CppCodeStyleSettings() : , bindStarToRightSpecifier(false) , extraPaddingForConditionsIfConfusingAlign(true) , alignAssignments(false) + , preferGetterNameWithoutGetPrefix(true) { } @@ -121,6 +123,7 @@ void CppCodeStyleSettings::toMap(const QString &prefix, QVariantMap *map) const map->insert(prefix + QLatin1String(bindStarToRightSpecifierKey), bindStarToRightSpecifier); map->insert(prefix + QLatin1String(extraPaddingForConditionsIfConfusingAlignKey), extraPaddingForConditionsIfConfusingAlign); map->insert(prefix + QLatin1String(alignAssignmentsKey), alignAssignments); + map->insert(prefix + QLatin1String(shortGetterNameKey), preferGetterNameWithoutGetPrefix); } void CppCodeStyleSettings::fromMap(const QString &prefix, const QVariantMap &map) @@ -165,6 +168,8 @@ void CppCodeStyleSettings::fromMap(const QString &prefix, const QVariantMap &map extraPaddingForConditionsIfConfusingAlign).toBool(); alignAssignments = map.value(prefix + QLatin1String(alignAssignmentsKey), alignAssignments).toBool(); + preferGetterNameWithoutGetPrefix = map.value(prefix + QLatin1String(shortGetterNameKey), + preferGetterNameWithoutGetPrefix).toBool(); } bool CppCodeStyleSettings::equals(const CppCodeStyleSettings &rhs) const @@ -188,7 +193,37 @@ bool CppCodeStyleSettings::equals(const CppCodeStyleSettings &rhs) const && bindStarToLeftSpecifier == rhs.bindStarToLeftSpecifier && bindStarToRightSpecifier == rhs.bindStarToRightSpecifier && extraPaddingForConditionsIfConfusingAlign == rhs.extraPaddingForConditionsIfConfusingAlign - && alignAssignments == rhs.alignAssignments; + && alignAssignments == rhs.alignAssignments + && preferGetterNameWithoutGetPrefix == rhs.preferGetterNameWithoutGetPrefix + ; +} + +CppCodeStyleSettings CppCodeStyleSettings::currentProjectCodeStyle() +{ + ProjectExplorer::Project *project = ProjectExplorer::ProjectTree::currentProject(); + if (!project) + return currentGlobalCodeStyle(); + + ProjectExplorer::EditorConfiguration *editorConfiguration = project->editorConfiguration(); + QTC_ASSERT(editorConfiguration, return currentGlobalCodeStyle()); + + TextEditor::ICodeStylePreferences *codeStylePreferences + = editorConfiguration->codeStyle(Constants::CPP_SETTINGS_ID); + QTC_ASSERT(codeStylePreferences, return currentGlobalCodeStyle()); + + CppCodeStylePreferences *cppCodeStylePreferences + = dynamic_cast(codeStylePreferences); + QTC_ASSERT(cppCodeStylePreferences, return currentGlobalCodeStyle()); + + return cppCodeStylePreferences->currentCodeStyleSettings(); +} + +CppCodeStyleSettings CppCodeStyleSettings::currentGlobalCodeStyle() +{ + CppCodeStylePreferences *cppCodeStylePreferences = CppToolsSettings::instance()->cppCodeStyle(); + QTC_ASSERT(cppCodeStylePreferences, return CppCodeStyleSettings()); + + return cppCodeStylePreferences->currentCodeStyleSettings(); } static void configureOverviewWithCodeStyleSettings(CPlusPlus::Overview &overview, @@ -207,37 +242,14 @@ static void configureOverviewWithCodeStyleSettings(CPlusPlus::Overview &overview CPlusPlus::Overview CppCodeStyleSettings::currentProjectCodeStyleOverview() { - ProjectExplorer::Project *project = ProjectExplorer::ProjectTree::currentProject(); - if (!project) - return currentGlobalCodeStyleOverview(); - - ProjectExplorer::EditorConfiguration *editorConfiguration = project->editorConfiguration(); - QTC_ASSERT(editorConfiguration, return currentGlobalCodeStyleOverview()); - - TextEditor::ICodeStylePreferences *codeStylePreferences - = editorConfiguration->codeStyle(Constants::CPP_SETTINGS_ID); - QTC_ASSERT(codeStylePreferences, return currentGlobalCodeStyleOverview()); - - CppCodeStylePreferences *cppCodeStylePreferences - = dynamic_cast(codeStylePreferences); - QTC_ASSERT(cppCodeStylePreferences, return currentGlobalCodeStyleOverview()); - - CppCodeStyleSettings settings = cppCodeStylePreferences->currentCodeStyleSettings(); - CPlusPlus::Overview overview; - configureOverviewWithCodeStyleSettings(overview, settings); + configureOverviewWithCodeStyleSettings(overview, currentProjectCodeStyle()); return overview; } CPlusPlus::Overview CppCodeStyleSettings::currentGlobalCodeStyleOverview() { CPlusPlus::Overview overview; - - CppCodeStylePreferences *cppCodeStylePreferences = CppToolsSettings::instance()->cppCodeStyle(); - QTC_ASSERT(cppCodeStylePreferences, return overview); - - CppCodeStyleSettings settings = cppCodeStylePreferences->currentCodeStyleSettings(); - - configureOverviewWithCodeStyleSettings(overview, settings); + configureOverviewWithCodeStyleSettings(overview, currentGlobalCodeStyle()); return overview; } diff --git a/src/plugins/cpptools/cppcodestylesettings.h b/src/plugins/cpptools/cppcodestylesettings.h index 60dcc2fbf6..f69d72d0ab 100644 --- a/src/plugins/cpptools/cppcodestylesettings.h +++ b/src/plugins/cpptools/cppcodestylesettings.h @@ -80,6 +80,8 @@ public: // b bool alignAssignments; + bool preferGetterNameWithoutGetPrefix; + void toSettings(const QString &category, QSettings *s) const; void fromSettings(const QString &category, const QSettings *s); @@ -90,6 +92,9 @@ public: bool operator==(const CppCodeStyleSettings &s) const { return equals(s); } bool operator!=(const CppCodeStyleSettings &s) const { return !equals(s); } + static CppCodeStyleSettings currentProjectCodeStyle(); + static CppCodeStyleSettings currentGlobalCodeStyle(); + /*! Returns an Overview configured by the current project's code style. If no current project is available or an error occurs when getting the diff --git a/src/plugins/cpptools/cppcodestylesettingspage.cpp b/src/plugins/cpptools/cppcodestylesettingspage.cpp index 8af93ff100..46d6ee6985 100644 --- a/src/plugins/cpptools/cppcodestylesettingspage.cpp +++ b/src/plugins/cpptools/cppcodestylesettingspage.cpp @@ -321,6 +321,8 @@ CppCodeStylePreferencesWidget::CppCodeStylePreferencesWidget(QWidget *parent) this, &CppCodeStylePreferencesWidget::slotCodeStyleSettingsChanged); connect(m_ui->bindStarToRightSpecifier, &QCheckBox::toggled, this, &CppCodeStylePreferencesWidget::slotCodeStyleSettingsChanged); + connect(m_ui->preferGetterNamesWithoutGet, &QCheckBox::toggled, + this, &CppCodeStylePreferencesWidget::slotCodeStyleSettingsChanged); m_ui->categoryTab->setCurrentIndex(0); @@ -380,6 +382,7 @@ CppCodeStyleSettings CppCodeStylePreferencesWidget::cppCodeStyleSettings() const set.bindStarToRightSpecifier = m_ui->bindStarToRightSpecifier->isChecked(); set.extraPaddingForConditionsIfConfusingAlign = m_ui->extraPaddingConditions->isChecked(); set.alignAssignments = m_ui->alignAssignments->isChecked(); + set.preferGetterNameWithoutGetPrefix = m_ui->preferGetterNamesWithoutGet->isChecked(); return set; } @@ -413,6 +416,7 @@ void CppCodeStylePreferencesWidget::setCodeStyleSettings(const CppCodeStyleSetti m_ui->bindStarToRightSpecifier->setChecked(s.bindStarToRightSpecifier); m_ui->extraPaddingConditions->setChecked(s.extraPaddingForConditionsIfConfusingAlign); m_ui->alignAssignments->setChecked(s.alignAssignments); + m_ui->preferGetterNamesWithoutGet->setChecked(s.preferGetterNameWithoutGetPrefix); m_blockUpdates = wasBlocked; if (preview) updatePreview(); diff --git a/src/plugins/cpptools/cppcodestylesettingspage.ui b/src/plugins/cpptools/cppcodestylesettingspage.ui index 0206b96549..9934259608 100644 --- a/src/plugins/cpptools/cppcodestylesettingspage.ui +++ b/src/plugins/cpptools/cppcodestylesettingspage.ui @@ -484,6 +484,33 @@ if they would align to the next line + + + Getter and Setter + + + + + + Prefer getter names without "get" + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + -- cgit v1.2.1