From: Stephen Kelly Date: Sun, 17 Jan 2021 16:22:41 +0000 (+0000) Subject: Add API to retrieve a clade kind from ASTNodeKind X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=0cd0eb6e0a8133ec86d884c1bbc9c3cbd1769c0b;p=android-x86%2Fexternal-llvm-project.git Add API to retrieve a clade kind from ASTNodeKind Differential Revision: https://reviews.llvm.org/D94877 --- diff --git a/clang/include/clang/AST/ASTTypeTraits.h b/clang/include/clang/AST/ASTTypeTraits.h index a91f6b0c1a6..57195a9d606 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 49335ff37c4..b040f9e4cc4 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 998488f1f1f..18e8b8431b4 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));