diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index 0c8e87648f2..0670584c623 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -132,6 +132,12 @@ static QList toAssistProposalItems( if (codeCompletion.text.isEmpty()) continue; // It's an OverloadCandidate which has text but no typedText. + // Don't offer symbols that are not accessible here. + if (codeCompletion.availability == CodeCompletion::NotAvailable + || codeCompletion.availability == CodeCompletion::NotAccessible) { + continue; + } + const QString name = codeCompletion.completionKind == CodeCompletion::KeywordCompletionKind ? CompletionChunksToTextConverter::convertToName(codeCompletion.chunks) : codeCompletion.text.toString(); diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp index fe533f59315..86948ccaafd 100644 --- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp +++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp @@ -552,6 +552,30 @@ void ClangCodeCompletionTest::testCompleteMembers() QVERIFY(!hasSnippet(t.proposal, "class")); // Snippet } +void ClangCodeCompletionTest::testCompleteMembersFromInside() +{ + ProjectLessCompletionTest t("membercompletion-inside.cpp"); + + QVERIFY(hasItem(t.proposal, "publicFunc")); + QVERIFY(hasItem(t.proposal, "privateFunc")); +} + +void ClangCodeCompletionTest::testCompleteMembersFromOutside() +{ + ProjectLessCompletionTest t("membercompletion-outside.cpp"); + + QVERIFY(hasItem(t.proposal, "publicFunc")); + QVERIFY(!hasItem(t.proposal, "privateFunc")); +} + +void ClangCodeCompletionTest::testCompleteMembersFromFriend() +{ + ProjectLessCompletionTest t("membercompletion-friend.cpp"); + + QVERIFY(hasItem(t.proposal, "publicFunc")); + QVERIFY(hasItem(t.proposal, "privateFunc")); +} + void ClangCodeCompletionTest::testCompleteFunctions() { ProjectLessCompletionTest t("functionCompletion.cpp"); diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.h b/src/plugins/clangcodemodel/test/clangcodecompletion_test.h index f2b64048e83..d04a5828faa 100644 --- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.h +++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.h @@ -44,6 +44,9 @@ private slots: void testCompleteGlobals(); void testCompleteMembers(); + void testCompleteMembersFromInside(); + void testCompleteMembersFromOutside(); + void testCompleteMembersFromFriend(); void testCompleteFunctions(); void testCompleteConstructor(); void testCompleteClassAndConstructor(); diff --git a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc index a44f6b77411..9690d8bee6e 100644 --- a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc +++ b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc @@ -24,5 +24,8 @@ dotToArrowCorrection.cpp noDotToArrowCorrectionForFloats.cpp classAndConstructorCompletion.cpp + membercompletion-outside.cpp + membercompletion-inside.cpp + membercompletion-friend.cpp diff --git a/src/plugins/clangcodemodel/test/data/membercompletion-friend.cpp b/src/plugins/clangcodemodel/test/data/membercompletion-friend.cpp new file mode 100644 index 00000000000..000990be680 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/membercompletion-friend.cpp @@ -0,0 +1,15 @@ +static void friendFunc(); + +class C { + friend void friendFunc(); +public: + void publicFunc() {}; + +private: + void privateFunc() {} +}; + +void friendFunc() +{ + C().p /* COMPLETE HERE */ +} diff --git a/src/plugins/clangcodemodel/test/data/membercompletion-inside.cpp b/src/plugins/clangcodemodel/test/data/membercompletion-inside.cpp new file mode 100644 index 00000000000..f1dd1ae51a1 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/membercompletion-inside.cpp @@ -0,0 +1,11 @@ +class C { +public: + C() { + p /* COMPLETE HERE */ + } + void publicFunc() {}; + +private: + void privateFunc() {} +}; + diff --git a/src/plugins/clangcodemodel/test/data/membercompletion-outside.cpp b/src/plugins/clangcodemodel/test/data/membercompletion-outside.cpp new file mode 100644 index 00000000000..812b3bcd237 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/membercompletion-outside.cpp @@ -0,0 +1,15 @@ +class C { +public: + C() {} + void publicFunc() {}; + +private: + void privateFunc() {} +}; + +void f() +{ + C c; + c.p /* COMPLETE HERE */ +} +