diff options
3 files changed, 28 insertions, 2 deletions
diff --git a/src/tools/clangbackend/source/codecompletionsextractor.cpp b/src/tools/clangbackend/source/codecompletionsextractor.cpp index 09bae479fd..c2386149be 100644 --- a/src/tools/clangbackend/source/codecompletionsextractor.cpp +++ b/src/tools/clangbackend/source/codecompletionsextractor.cpp @@ -362,7 +362,11 @@ void CodeCompletionsExtractor::extractAvailability() currentCodeCompletion_.availability = CodeCompletion::NotAvailable; break; case CXAvailability_NotAccessible: - currentCodeCompletion_.availability = CodeCompletion::NotAccessible; + // QTCREATORBUG-25244 + if (currentCodeCompletion_.completionKind == CodeCompletion::FunctionDefinitionCompletionKind) + currentCodeCompletion_.availability = CodeCompletion::Available; + else + currentCodeCompletion_.availability = CodeCompletion::NotAccessible; break; } } diff --git a/tests/unit/unittest/codecompletionsextractor-test.cpp b/tests/unit/unittest/codecompletionsextractor-test.cpp index 509dfd49dc..25c83cd14c 100644 --- a/tests/unit/unittest/codecompletionsextractor-test.cpp +++ b/tests/unit/unittest/codecompletionsextractor-test.cpp @@ -158,6 +158,7 @@ protected: Document constructorDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), compilationArguments, {}, documents}; Document constructorMemberInitDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructorMemberInitialization.cpp"), compilationArguments, {}, documents}; Document briefCommentDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), compilationArguments, {}, documents}; + Document privateFunctionDefinitionDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_private_function_definition.cpp"), compilationArguments, {}, documents}; }; using CodeCompletionsExtractorSlowTest = CodeCompletionsExtractor; @@ -602,9 +603,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, NotAccessibleFunction) unsavedFiles.unsavedFile(functionDocument.filePath()), completeResults.data()); + // Availability should be NotAccessible, but see QTCREATORBUG-25244. + // It's better to offer completion for some non-accessible functions than + // not to offer completion for some accessible ones. ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("NotAccessibleFunction"), CodeCompletion::FunctionDefinitionCompletionKind, - CodeCompletion::NotAccessible)); + CodeCompletion::Available)); } TEST_F(CodeCompletionsExtractorSlowTest, NotAvailableFunction) @@ -824,6 +828,19 @@ TEST_F(CodeCompletionsExtractorSlowTest, ExtractAll) ASSERT_THAT(codeCompletions.empty(), false); } +TEST_F(CodeCompletionsExtractorSlowTest, PrivateFunctionDefinition) +{ + ClangCodeCompleteResults completeResults(getResults(privateFunctionDefinitionDocument, 5, 12)); + + ::CodeCompletionsExtractor extractor( + unsavedFiles.unsavedFile(privateFunctionDefinitionDocument.filePath()), + completeResults.data()); + + ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("method"), + CodeCompletion::FunctionDefinitionCompletionKind, + CodeCompletion::Available)); +} + ClangCodeCompleteResults CodeCompletionsExtractor::getResults(const Document &document, uint line, uint column, diff --git a/tests/unit/unittest/data/complete_extractor_private_function_definition.cpp b/tests/unit/unittest/data/complete_extractor_private_function_definition.cpp new file mode 100644 index 0000000000..c2dd9e3dab --- /dev/null +++ b/tests/unit/unittest/data/complete_extractor_private_function_definition.cpp @@ -0,0 +1,5 @@ +class Foo { + void method(); +}; + +void Foo::m |