diff --git a/src/libs/clangbackendipc/codecompletion.cpp b/src/libs/clangbackendipc/codecompletion.cpp index f67f7dad04f1df3d36a447c2cd45713a9c509cdf..e2f4753982e60ebb5f709448314158b9e2880dcd 100644 --- a/src/libs/clangbackendipc/codecompletion.cpp +++ b/src/libs/clangbackendipc/codecompletion.cpp @@ -177,6 +177,7 @@ static const char *completionKindToString(CodeCompletion::Kind kind) case CodeCompletion::DestructorCompletionKind: return "Destructor"; case CodeCompletion::VariableCompletionKind: return "Variable"; case CodeCompletion::ClassCompletionKind: return "Class"; + case CodeCompletion::TypeAliasCompletionKind: return "TypeAlias"; case CodeCompletion::TemplateClassCompletionKind: return "TemplateClass"; case CodeCompletion::EnumerationCompletionKind: return "Enumeration"; case CodeCompletion::EnumeratorCompletionKind: return "Enumerator"; diff --git a/src/libs/clangbackendipc/codecompletion.h b/src/libs/clangbackendipc/codecompletion.h index 059496bc547df07d6a602450278e625729974b96..5d29a225763ddff77f1612f6caf9a10b533bec68 100644 --- a/src/libs/clangbackendipc/codecompletion.h +++ b/src/libs/clangbackendipc/codecompletion.h @@ -62,6 +62,7 @@ public: DestructorCompletionKind, VariableCompletionKind, ClassCompletionKind, + TypeAliasCompletionKind, TemplateClassCompletionKind, EnumerationCompletionKind, EnumeratorCompletionKind, diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index fe437f52fca03fab9555b4781972678daded0ae7..0cd362d4da2c09e99c09cabf1bb54332e6b4637d 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -118,6 +118,7 @@ QList<AssistProposalItem *> toAssistProposalItems(const CodeCompletions &complet switch (ccr.completionKind()) { case CodeCompletion::ClassCompletionKind: case CodeCompletion::TemplateClassCompletionKind: + case CodeCompletion::TypeAliasCompletionKind: item->setIcon(m_icons.iconForType(Icons::ClassIconType)); break; case CodeCompletion::EnumerationCompletionKind: item->setIcon(m_icons.iconForType(Icons::EnumIconType)); break; case CodeCompletion::EnumeratorCompletionKind: item->setIcon(m_icons.iconForType(Icons::EnumeratorIconType)); break; @@ -178,6 +179,7 @@ QList<AssistProposalItem *> toAssistProposalItems(const CodeCompletions &complet break; case CodeCompletion::Other: + item->setIcon(m_icons.iconForType(Icons::UnknownIconType)); break; } } diff --git a/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp b/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp index 311cde61ae0c5a506081430ebeb693f6906837ce..3e56090f8302af5424d7e37d1d723db169faca90 100644 --- a/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp +++ b/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp @@ -126,6 +126,10 @@ void CodeCompletionsExtractor::extractCompletionKind() case CXCursor_TemplateTypeParameter: currentCodeCompletion_.setCompletionKind(CodeCompletion::ClassCompletionKind); break; + case CXCursor_TypedefDecl: + case CXCursor_TypeAliasDecl: + currentCodeCompletion_.setCompletionKind(CodeCompletion::TypeAliasCompletionKind); + break; case CXCursor_ClassTemplatePartialSpecialization: case CXCursor_ClassTemplate: case CXCursor_TemplateTemplateParameter: diff --git a/tests/unit/unittest/codecompletionsextractortest.cpp b/tests/unit/unittest/codecompletionsextractortest.cpp index cf31413085b0f26fae7e5c9690cf00981015adbf..d9f070a3baf4e6af169c648bd3da7507753f9182 100644 --- a/tests/unit/unittest/codecompletionsextractortest.cpp +++ b/tests/unit/unittest/codecompletionsextractortest.cpp @@ -281,6 +281,28 @@ TEST_F(CodeCompletionsExtractor, Union) CodeCompletion::Available)); } +TEST_F(CodeCompletionsExtractor, Typedef) +{ + ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + + ::CodeCompletionsExtractor extractor(completeResults.data()); + + ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("TypeDef"), + CodeCompletion::TypeAliasCompletionKind, + CodeCompletion::Available)); +} + +TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias) +{ + ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + + ::CodeCompletionsExtractor extractor(completeResults.data()); + + ASSERT_THAT(extractor, HasCompletion(Utf8StringLiteral("UsingClass"), + CodeCompletion::TypeAliasCompletionKind, + CodeCompletion::Available)); +} + TEST_F(CodeCompletionsExtractor, TemplateTypeParameter) { ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); diff --git a/tests/unit/unittest/data/complete_extractor_class.cpp b/tests/unit/unittest/data/complete_extractor_class.cpp index becfdc3292408de8637ad9b880465b3a72be6c2d..218b5fbe25de5d32b3e65649a98bce99d22d696f 100644 --- a/tests/unit/unittest/data/complete_extractor_class.cpp +++ b/tests/unit/unittest/data/complete_extractor_class.cpp @@ -2,6 +2,7 @@ class Class {}; struct Struct{}; union Union{}; typedef Class TypeDef; +using UsingClass = Class; template<class T> class TemplateClass{}; template<class T> class ClassTemplatePartialSpecialization; template<class T> class ClassTemplatePartialSpecialization<T*>; @@ -13,7 +14,6 @@ template<class T> class ClassTemplatePartialSpecialization<T*>; - template<class TemplateTypeParameter, template<class> class TemplateTemplateParameter> void function() {