From 0cd0eb6e0a8133ec86d884c1bbc9c3cbd1769c0b Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 17 Jan 2021 16:22:41 +0000 Subject: [PATCH] Add API to retrieve a clade kind from ASTNodeKind Differential Revision: https://reviews.llvm.org/D94877 --- clang/include/clang/AST/ASTTypeTraits.h | 2 ++ clang/lib/AST/ASTTypeTraits.cpp | 11 +++++++++++ clang/unittests/AST/ASTTypeTraitsTest.cpp | 12 ++++++++++++ 3 files changed, 25 insertions(+) diff --git a/clang/include/clang/AST/ASTTypeTraits.h b/clang/include/clang/AST/ASTTypeTraits.h index a91f6b0..57195a9 100644 --- a/clang/include/clang/AST/ASTTypeTraits.h +++ b/clang/include/clang/AST/ASTTypeTraits.h @@ -100,6 +100,8 @@ public: static ASTNodeKind getMostDerivedCommonAncestor(ASTNodeKind Kind1, ASTNodeKind Kind2); + ASTNodeKind getCladeKind() const; + /// Hooks for using ASTNodeKind as a key in a DenseMap. struct DenseMapInfo { // ASTNodeKind() is a good empty key because it is represented as a 0. diff --git a/clang/lib/AST/ASTTypeTraits.cpp b/clang/lib/AST/ASTTypeTraits.cpp index 49335ff..b040f9e 100644 --- a/clang/lib/AST/ASTTypeTraits.cpp +++ b/clang/lib/AST/ASTTypeTraits.cpp @@ -63,6 +63,17 @@ bool ASTNodeKind::isBaseOf(NodeKindId Base, NodeKindId Derived, return Derived == Base; } +ASTNodeKind ASTNodeKind::getCladeKind() const { + NodeKindId LastId = KindId; + while (LastId) { + NodeKindId ParentId = AllKindInfo[LastId].ParentId; + if (ParentId == NKI_None) + return LastId; + LastId = ParentId; + } + return NKI_None; +} + StringRef ASTNodeKind::asStringRef() const { return AllKindInfo[KindId].Name; } ASTNodeKind ASTNodeKind::getMostDerivedType(ASTNodeKind Kind1, diff --git a/clang/unittests/AST/ASTTypeTraitsTest.cpp b/clang/unittests/AST/ASTTypeTraitsTest.cpp index 998488f..18e8b84 100644 --- a/clang/unittests/AST/ASTTypeTraitsTest.cpp +++ b/clang/unittests/AST/ASTTypeTraitsTest.cpp @@ -39,6 +39,18 @@ TEST(ASTNodeKind, Bases) { EXPECT_TRUE(DNT().isSame(DNT())); } +TEST(DynTypedNode, Clades) { + EXPECT_TRUE(DNT().getCladeKind().isSame(DNT())); + EXPECT_TRUE(DNT().getCladeKind().isSame(DNT())); + + EXPECT_TRUE(DNT().getCladeKind().isSame(DNT())); + EXPECT_TRUE(DNT().getCladeKind().isSame(DNT())); + + EXPECT_FALSE(DNT().getCladeKind().isSame(DNT())); + + EXPECT_TRUE(ASTNodeKind().getCladeKind().isNone()); +} + TEST(ASTNodeKind, BaseDistances) { unsigned Distance = 1; EXPECT_TRUE(DNT().isBaseOf(DNT(), &Distance)); -- 2.7.4