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