diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h index d04335d60da..acc97f10826 100644 --- a/src/plugins/cppeditor/cppeditorplugin.h +++ b/src/plugins/cppeditor/cppeditorplugin.h @@ -109,6 +109,7 @@ private slots: void test_quickfix_GenerateGetterSetter_onlyGetter_DontPreferGetterWithGet(); void test_quickfix_GenerateGetterSetter_onlySetter(); void test_quickfix_GenerateGetterSetter_onlySetterHeaderFile(); + void test_quickfix_GenerateGetterSetter_onlySetterHeaderFileWithIncludeGuard(); void test_quickfix_GenerateGetterSetter_offerGetterWhenSetterPresent(); void test_quickfix_GenerateGetterSetter_offerSetterWhenGetterPresent(); void test_quickfix_GenerateGettersSetters_data(); diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index cd12ee6004d..396a207ef1f 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -2267,6 +2267,38 @@ void CppEditorPlugin::test_quickfix_GenerateGetterSetter_onlySetterHeaderFile() QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 2); } +void CppEditorPlugin::test_quickfix_GenerateGetterSetter_onlySetterHeaderFileWithIncludeGuard() +{ + QList testDocuments; + const QByteArray original = + "#ifndef FILE__H__DECLARED\n" + "#define FILE__H__DECLARED\n" + "class Foo\n" + "{\n" + "public:\n" + " int bar@;\n" + "};\n" + "#endif\n"; + const QByteArray expected = + "#ifndef FILE__H__DECLARED\n" + "#define FILE__H__DECLARED\n" + "class Foo\n" + "{\n" + "public:\n" + " int bar@;\n" + " void setBar(int value);\n" + "};\n\n" + "inline void Foo::setBar(int value)\n" + "{\n" + " bar = value;\n" + "}\n" + "#endif\n"; + + testDocuments << QuickFixTestDocument::create("file.h", original, expected); + GenerateGetterSetter factory; + QuickFixOperationTest(testDocuments, &factory, ProjectExplorer::HeaderPaths(), 2); +} + class CppCodeStyleSettingsChanger { public: CppCodeStyleSettingsChanger(const CppCodeStyleSettings &settings); diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index 4ef453e615c..aea20b8accf 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -226,10 +226,21 @@ InsertionLocation insertLocationForMethodDefinition(Symbol *symbol, const bool u const InsertionPointLocator locator(refactoring); const QList list = locator.methodDefinition(symbol, useSymbolFinder, fileName); - for (int i = 0; i < list.count(); ++i) { + const bool isHeader = ProjectFile::isHeader(ProjectFile::classify(fileName)); + const bool hasIncludeGuard = isHeader + && !file->cppDocument()->includeGuardMacroName().isEmpty(); + int lastLine; + if (hasIncludeGuard) { + const TranslationUnit * const tu = file->cppDocument()->translationUnit(); + tu->getTokenStartPosition(tu->ast()->lastToken(), &lastLine); + } + int i = 0; + for ( ; i < list.count(); ++i) { InsertionLocation location = list.at(i); if (!location.isValid() || location.fileName() != fileName) continue; + if (hasIncludeGuard && location.line() == lastLine) + continue; if (!requiredNamespaces.isEmpty()) { NSVisitor visitor(file.data(), requiredNamespaces, file->position(location.line(), location.column()));