Author: pcc Date: Fri Nov 22 19:40:07 2013 New Revision: 195540 URL: http://llvm.org/viewvc/llvm-project?rev=195540&view=rev Log: Add Distance parameter to ASTNodeKind::isBaseOf.
This will allow the completer to order results by relevance. Differential Revision: http://llvm-reviews.chandlerc.com/D2209 Modified: cfe/trunk/include/clang/AST/ASTTypeTraits.h cfe/trunk/lib/AST/ASTTypeTraits.cpp cfe/trunk/unittests/AST/ASTTypeTraitsTest.cpp Modified: cfe/trunk/include/clang/AST/ASTTypeTraits.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTTypeTraits.h?rev=195540&r1=195539&r2=195540&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/ASTTypeTraits.h (original) +++ cfe/trunk/include/clang/AST/ASTTypeTraits.h Fri Nov 22 19:40:07 2013 @@ -57,7 +57,9 @@ public: bool isSame(ASTNodeKind Other) const; /// \brief Returns \c true if \c this is a base kind of (or same as) \c Other. - bool isBaseOf(ASTNodeKind Other) const; + /// \param Distance If non-null, used to return the distance between \c this + /// and \c Other in the class hierarchy. + bool isBaseOf(ASTNodeKind Other, unsigned *Distance = 0) const; /// \brief String representation of the kind. StringRef asStringRef() const; @@ -91,7 +93,9 @@ private: /// \brief Returns \c true if \c Base is a base kind of (or same as) \c /// Derived. - static bool isBaseOf(NodeKindId Base, NodeKindId Derived); + /// \param Distance If non-null, used to return the distance between \c Base + /// and \c Derived in the class hierarchy. + static bool isBaseOf(NodeKindId Base, NodeKindId Derived, unsigned *Distance); /// \brief Helper meta-function to convert a kind T to its enum value. /// Modified: cfe/trunk/lib/AST/ASTTypeTraits.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTTypeTraits.cpp?rev=195540&r1=195539&r2=195540&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTTypeTraits.cpp (original) +++ cfe/trunk/lib/AST/ASTTypeTraits.cpp Fri Nov 22 19:40:07 2013 @@ -39,18 +39,24 @@ const ASTNodeKind::KindInfo ASTNodeKind: #include "clang/AST/TypeNodes.def" }; -bool ASTNodeKind::isBaseOf(ASTNodeKind Other) const { - return isBaseOf(KindId, Other.KindId); +bool ASTNodeKind::isBaseOf(ASTNodeKind Other, unsigned *Distance) const { + return isBaseOf(KindId, Other.KindId, Distance); } bool ASTNodeKind::isSame(ASTNodeKind Other) const { return KindId != NKI_None && KindId == Other.KindId; } -bool ASTNodeKind::isBaseOf(NodeKindId Base, NodeKindId Derived) { +bool ASTNodeKind::isBaseOf(NodeKindId Base, NodeKindId Derived, + unsigned *Distance) { if (Base == NKI_None || Derived == NKI_None) return false; - while (Derived != Base && Derived != NKI_None) + unsigned Dist = 0; + while (Derived != Base && Derived != NKI_None) { Derived = AllKindInfo[Derived].ParentId; + ++Dist; + } + if (Distance) + *Distance = Dist; return Derived == Base; } Modified: cfe/trunk/unittests/AST/ASTTypeTraitsTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTTypeTraitsTest.cpp?rev=195540&r1=195539&r2=195540&view=diff ============================================================================== --- cfe/trunk/unittests/AST/ASTTypeTraitsTest.cpp (original) +++ cfe/trunk/unittests/AST/ASTTypeTraitsTest.cpp Fri Nov 22 19:40:07 2013 @@ -34,6 +34,19 @@ TEST(ASTNodeKind, Bases) { EXPECT_TRUE(DNT<Decl>().isSame(DNT<Decl>())); } +TEST(ASTNodeKind, BaseDistances) { + unsigned Distance = 1; + EXPECT_TRUE(DNT<Expr>().isBaseOf(DNT<Expr>(), &Distance)); + EXPECT_EQ(0u, Distance); + + EXPECT_TRUE(DNT<Stmt>().isBaseOf(DNT<IfStmt>(), &Distance)); + EXPECT_EQ(1u, Distance); + + Distance = 3; + EXPECT_TRUE(DNT<DeclaratorDecl>().isBaseOf(DNT<ParmVarDecl>(), &Distance)); + EXPECT_EQ(2u, Distance); +} + TEST(ASTNodeKind, SameBase) { EXPECT_TRUE(DNT<Expr>().isBaseOf(DNT<CallExpr>())); EXPECT_TRUE(DNT<Expr>().isBaseOf(DNT<BinaryOperator>())); _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
