forked from qt-creator/qt-creator
Clang: Fix highlighting of function in using declaration
Change-Id: I0f646ce22cdc95e5932650a3fb2fe34b8d4a89a3 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io> Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -296,6 +296,16 @@ Cursor Cursor::argument(int index) const
|
|||||||
return clang_Cursor_getArgument(cxCursor, index);
|
return clang_Cursor_getArgument(cxCursor, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned Cursor::overloadedDeclarationsCount() const
|
||||||
|
{
|
||||||
|
return clang_getNumOverloadedDecls(cxCursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
Cursor Cursor::overloadedDeclaration(unsigned index) const
|
||||||
|
{
|
||||||
|
return clang_getOverloadedDecl(cxCursor, index);
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool isNotUnexposedLValueReference(const Cursor &argument, const Type &argumentType)
|
bool isNotUnexposedLValueReference(const Cursor &argument, const Type &argumentType)
|
||||||
|
|||||||
@@ -93,6 +93,9 @@ public:
|
|||||||
Cursor functionBaseDeclaration() const;
|
Cursor functionBaseDeclaration() const;
|
||||||
Cursor functionBase() const;
|
Cursor functionBase() const;
|
||||||
Cursor argument(int index) const;
|
Cursor argument(int index) const;
|
||||||
|
unsigned overloadedDeclarationsCount() const;
|
||||||
|
Cursor overloadedDeclaration(unsigned index) const;
|
||||||
|
|
||||||
void collectOutputArgumentRangesTo(
|
void collectOutputArgumentRangesTo(
|
||||||
std::vector<CXSourceRange> &outputArgumentRanges) const;
|
std::vector<CXSourceRange> &outputArgumentRanges) const;
|
||||||
std::vector<CXSourceRange> outputArgumentRanges() const;
|
std::vector<CXSourceRange> outputArgumentRanges() const;
|
||||||
|
|||||||
@@ -157,6 +157,18 @@ void HighlightingMark::referencedTypeKind(const Cursor &cursor)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HighlightingMark::overloadedDeclRefKind(const Cursor &cursor)
|
||||||
|
{
|
||||||
|
types.mainHighlightingType = HighlightingType::Function;
|
||||||
|
|
||||||
|
// Workaround https://bugs.llvm.org//show_bug.cgi?id=33256 - SomeType in
|
||||||
|
// "using N::SomeType" is mistakenly considered as a CXCursor_OverloadedDeclRef.
|
||||||
|
if (cursor.overloadedDeclarationsCount() >= 1
|
||||||
|
&& cursor.overloadedDeclaration(0).kind() != CXCursor_FunctionDecl) {
|
||||||
|
types.mainHighlightingType = HighlightingType::Type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void HighlightingMark::variableKind(const Cursor &cursor)
|
void HighlightingMark::variableKind(const Cursor &cursor)
|
||||||
{
|
{
|
||||||
if (cursor.isLocalVariable())
|
if (cursor.isLocalVariable())
|
||||||
@@ -298,7 +310,6 @@ void HighlightingMark::identifierKind(const Cursor &cursor, Recursion recursion)
|
|||||||
case CXCursor_TemplateTemplateParameter:
|
case CXCursor_TemplateTemplateParameter:
|
||||||
case CXCursor_UnionDecl:
|
case CXCursor_UnionDecl:
|
||||||
case CXCursor_StructDecl:
|
case CXCursor_StructDecl:
|
||||||
case CXCursor_OverloadedDeclRef:
|
|
||||||
case CXCursor_TemplateRef:
|
case CXCursor_TemplateRef:
|
||||||
case CXCursor_Namespace:
|
case CXCursor_Namespace:
|
||||||
case CXCursor_NamespaceRef:
|
case CXCursor_NamespaceRef:
|
||||||
@@ -317,6 +328,7 @@ void HighlightingMark::identifierKind(const Cursor &cursor, Recursion recursion)
|
|||||||
case CXCursor_ObjCProtocolRef:
|
case CXCursor_ObjCProtocolRef:
|
||||||
case CXCursor_ObjCClassRef:
|
case CXCursor_ObjCClassRef:
|
||||||
case CXCursor_ObjCSuperClassRef: types.mainHighlightingType = HighlightingType::Type; break;
|
case CXCursor_ObjCSuperClassRef: types.mainHighlightingType = HighlightingType::Type; break;
|
||||||
|
case CXCursor_OverloadedDeclRef: overloadedDeclRefKind(cursor); break;
|
||||||
case CXCursor_FunctionTemplate: types.mainHighlightingType = HighlightingType::Function; break;
|
case CXCursor_FunctionTemplate: types.mainHighlightingType = HighlightingType::Function; break;
|
||||||
case CXCursor_EnumConstantDecl: types.mainHighlightingType = HighlightingType::Enumeration; break;
|
case CXCursor_EnumConstantDecl: types.mainHighlightingType = HighlightingType::Enumeration; break;
|
||||||
case CXCursor_PreprocessingDirective: types.mainHighlightingType = HighlightingType::Preprocessor; break;
|
case CXCursor_PreprocessingDirective: types.mainHighlightingType = HighlightingType::Preprocessor; break;
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void identifierKind(const Cursor &cursor, Recursion recursion);
|
void identifierKind(const Cursor &cursor, Recursion recursion);
|
||||||
void referencedTypeKind(const Cursor &cursor);
|
void referencedTypeKind(const Cursor &cursor);
|
||||||
|
void overloadedDeclRefKind(const Cursor &cursor);
|
||||||
void variableKind(const Cursor &cursor);
|
void variableKind(const Cursor &cursor);
|
||||||
void fieldKind(const Cursor &cursor);
|
void fieldKind(const Cursor &cursor);
|
||||||
bool isVirtualMethodDeclarationOrDefinition(const Cursor &cursor) const;
|
bool isVirtualMethodDeclarationOrDefinition(const Cursor &cursor) const;
|
||||||
|
|||||||
@@ -551,3 +551,6 @@ struct NonConstReferenceMemberInitialization
|
|||||||
|
|
||||||
template<class T> class Coo;
|
template<class T> class Coo;
|
||||||
template<class T> class Coo<T*>;
|
template<class T> class Coo<T*>;
|
||||||
|
|
||||||
|
namespace N { void goo(); }
|
||||||
|
using N::goo;
|
||||||
|
|||||||
@@ -1112,6 +1112,13 @@ TEST_F(HighlightingMarks, ClassTemplateParticalSpecialization)
|
|||||||
ASSERT_THAT(infos[6], HasOnlyType(HighlightingType::Type));
|
ASSERT_THAT(infos[6], HasOnlyType(HighlightingType::Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(HighlightingMarks, UsingFunction)
|
||||||
|
{
|
||||||
|
const auto infos = translationUnit.highlightingMarksInRange(sourceRange(556, 27));
|
||||||
|
|
||||||
|
ASSERT_THAT(infos[3], HasOnlyType(HighlightingType::Function));
|
||||||
|
}
|
||||||
|
|
||||||
Data *HighlightingMarks::d;
|
Data *HighlightingMarks::d;
|
||||||
|
|
||||||
void HighlightingMarks::SetUpTestCase()
|
void HighlightingMarks::SetUpTestCase()
|
||||||
|
|||||||
Reference in New Issue
Block a user