forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -0,0 +1,5 @@
|
||||
class Foo {
|
||||
void method();
|
||||
};
|
||||
|
||||
void Foo::m
|
Reference in New Issue
Block a user