clangbackend: Fix missing completion for private member functions

... when trying to complete the name of a function definition. libclang
tags such completions as "not accessible", even though we are not in a
call context.

Fixes: QTCREATORBUG-25244
Change-Id: I4b03b1a43be7a85c37c7d2b2bfe2d83112075674
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2021-01-20 15:40:37 +01:00
parent 6564234dd9
commit bfb63acb09
3 changed files with 28 additions and 2 deletions

View File

@@ -362,7 +362,11 @@ void CodeCompletionsExtractor::extractAvailability()
currentCodeCompletion_.availability = CodeCompletion::NotAvailable; currentCodeCompletion_.availability = CodeCompletion::NotAvailable;
break; break;
case CXAvailability_NotAccessible: case CXAvailability_NotAccessible:
currentCodeCompletion_.availability = CodeCompletion::NotAccessible; // QTCREATORBUG-25244
if (currentCodeCompletion_.completionKind == CodeCompletion::FunctionDefinitionCompletionKind)
currentCodeCompletion_.availability = CodeCompletion::Available;
else
currentCodeCompletion_.availability = CodeCompletion::NotAccessible;
break; break;
} }
} }

View File

@@ -158,6 +158,7 @@ protected:
Document constructorDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), compilationArguments, {}, documents}; Document constructorDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), compilationArguments, {}, documents};
Document constructorMemberInitDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructorMemberInitialization.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 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; using CodeCompletionsExtractorSlowTest = CodeCompletionsExtractor;
@@ -602,9 +603,12 @@ TEST_F(CodeCompletionsExtractorSlowTest, NotAccessibleFunction)
unsavedFiles.unsavedFile(functionDocument.filePath()), unsavedFiles.unsavedFile(functionDocument.filePath()),
completeResults.data()); 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"), ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("NotAccessibleFunction"),
CodeCompletion::FunctionDefinitionCompletionKind, CodeCompletion::FunctionDefinitionCompletionKind,
CodeCompletion::NotAccessible)); CodeCompletion::Available));
} }
TEST_F(CodeCompletionsExtractorSlowTest, NotAvailableFunction) TEST_F(CodeCompletionsExtractorSlowTest, NotAvailableFunction)
@@ -824,6 +828,19 @@ TEST_F(CodeCompletionsExtractorSlowTest, ExtractAll)
ASSERT_THAT(codeCompletions.empty(), false); 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, ClangCodeCompleteResults CodeCompletionsExtractor::getResults(const Document &document,
uint line, uint line,
uint column, uint column,

View File

@@ -0,0 +1,5 @@
class Foo {
void method();
};
void Foo::m