Clang: Highlight invalid declarations as text

...instead of the corresponding declaration color.

Task-number: QTCREATORBUG-18686
Change-Id: Ice4d84816351af79efa286f49516c392bd80da86
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-11-15 13:35:38 +01:00
parent 28d0a5e537
commit 4f20c0d4ed
7 changed files with 42 additions and 0 deletions

View File

@@ -41,4 +41,9 @@ enum class PreferredTranslationUnit
# define IS_PRETTY_DECL_SUPPORTED
#endif
// CLANG-UPGRADE-CHECK: Remove IS_INVALIDDECL_SUPPORTED once we require clang >= 7.0
#if defined(CINDEX_VERSION_HAS_ISINVALIDECL_BACKPORTED) || CINDEX_VERSION_MINOR >= 46
# define IS_INVALIDDECL_SUPPORTED
#endif
} // namespace ClangBackEnd

View File

@@ -29,6 +29,8 @@
#include "sourcelocation.h"
#include "sourcerange.h"
#include "clangbackend_global.h"
#include <ostream>
namespace ClangBackEnd {
@@ -103,6 +105,15 @@ bool Cursor::isDeclaration() const
return clang_isDeclaration(kind());
}
bool Cursor::isInvalidDeclaration() const
{
#ifdef IS_INVALIDDECL_SUPPORTED
return clang_isInvalidDeclaration(cxCursor);
#else
return false;
#endif
}
bool Cursor::isLocalVariable() const
{
switch (semanticParent().kind()) {

View File

@@ -61,6 +61,7 @@ public:
bool isStaticMethod() const;
bool isCompoundType() const;
bool isDeclaration() const;
bool isInvalidDeclaration() const;
bool isLocalVariable() const;
bool isReference() const;
bool isExpression() const;

View File

@@ -308,6 +308,9 @@ void TokenInfo::identifierKind(const Cursor &cursor, Recursion recursion)
{
m_isIdentifier = (cursor.kind() != CXCursor_PreprocessingDirective);
if (cursor.isInvalidDeclaration())
return;
switch (cursor.kind()) {
case CXCursor_Destructor:
case CXCursor_Constructor:

View File

@@ -39,3 +39,9 @@
#else
# define DISABLED_WITHOUT_PRETTYDECL_PATCH(x) DISABLED_##x
#endif
#ifdef IS_INVALIDDECL_SUPPORTED
# define DISABLED_WITHOUT_INVALIDDECL_PATCH(x) x
#else
# define DISABLED_WITHOUT_INVALIDDECL_PATCH(x) DISABLED_##x
#endif

View File

@@ -588,3 +588,5 @@ void BaseClass::VirtualFunction() {}
class WithVirtualFunctionDefined {
virtual void VirtualFunctionDefinition() {};
};
Undeclared u;

View File

@@ -1246,6 +1246,20 @@ TEST_F(TokenInfos, DefineIsNotIdentifier)
ASSERT_THAT(container.isIncludeDirectivePath(), false);
}
TEST_F(TokenInfos, DISABLED_WITHOUT_INVALIDDECL_PATCH(TypeNameOfInvalidDeclarationIsInvalid))
{
const auto infos = translationUnit.tokenInfosInRange(sourceRange(592, 14));
ASSERT_THAT(infos[0], HasOnlyType(HighlightingType::Invalid));
}
TEST_F(TokenInfos, DISABLED_WITHOUT_INVALIDDECL_PATCH(VariableNameOfInvalidDeclarationIsInvalid))
{
const auto infos = translationUnit.tokenInfosInRange(sourceRange(592, 14));
ASSERT_THAT(infos[1], HasOnlyType(HighlightingType::Invalid));
}
Data *TokenInfos::d;
void TokenInfos::SetUpTestCase()