Home | History | Annotate | Download | only in AST
      1 //===- unittest/AST/ASTContextParentMapTest.cpp - AST parent map test -----===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // Tests for the getParents(...) methods of ASTContext.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/AST/ASTContext.h"
     15 #include "MatchVerifier.h"
     16 #include "clang/ASTMatchers/ASTMatchFinder.h"
     17 #include "clang/ASTMatchers/ASTMatchers.h"
     18 #include "clang/Tooling/Tooling.h"
     19 #include "gtest/gtest.h"
     20 
     21 namespace clang {
     22 namespace ast_matchers {
     23 
     24 TEST(GetParents, ReturnsParentForDecl) {
     25   MatchVerifier<Decl> Verifier;
     26   EXPECT_TRUE(
     27       Verifier.match("class C { void f(); };",
     28                      cxxMethodDecl(hasParent(recordDecl(hasName("C"))))));
     29 }
     30 
     31 TEST(GetParents, ReturnsParentForStmt) {
     32   MatchVerifier<Stmt> Verifier;
     33   EXPECT_TRUE(Verifier.match("class C { void f() { if (true) {} } };",
     34                              ifStmt(hasParent(compoundStmt()))));
     35 }
     36 
     37 TEST(GetParents, ReturnsParentForTypeLoc) {
     38   MatchVerifier<TypeLoc> Verifier;
     39   EXPECT_TRUE(
     40       Verifier.match("namespace a { class b {}; } void f(a::b) {}",
     41                      typeLoc(hasParent(typeLoc(hasParent(functionDecl()))))));
     42 }
     43 
     44 TEST(GetParents, ReturnsParentForNestedNameSpecifierLoc) {
     45   MatchVerifier<NestedNameSpecifierLoc> Verifier;
     46   EXPECT_TRUE(Verifier.match("namespace a { class b {}; } void f(a::b) {}",
     47                              nestedNameSpecifierLoc(hasParent(typeLoc()))));
     48 }
     49 
     50 TEST(GetParents, ReturnsParentInsideTemplateInstantiations) {
     51   MatchVerifier<Decl> DeclVerifier;
     52   EXPECT_TRUE(DeclVerifier.match(
     53       "template<typename T> struct C { void f() {} };"
     54       "void g() { C<int> c; c.f(); }",
     55       cxxMethodDecl(hasName("f"),
     56                  hasParent(cxxRecordDecl(isTemplateInstantiation())))));
     57   EXPECT_TRUE(DeclVerifier.match(
     58       "template<typename T> struct C { void f() {} };"
     59       "void g() { C<int> c; c.f(); }",
     60       cxxMethodDecl(hasName("f"),
     61                  hasParent(cxxRecordDecl(unless(isTemplateInstantiation()))))));
     62   EXPECT_FALSE(DeclVerifier.match(
     63       "template<typename T> struct C { void f() {} };"
     64       "void g() { C<int> c; c.f(); }",
     65       cxxMethodDecl(
     66           hasName("f"),
     67           allOf(hasParent(cxxRecordDecl(unless(isTemplateInstantiation()))),
     68                 hasParent(cxxRecordDecl(isTemplateInstantiation()))))));
     69 }
     70 
     71 TEST(GetParents, ReturnsMultipleParentsInTemplateInstantiations) {
     72   MatchVerifier<Stmt> TemplateVerifier;
     73   EXPECT_TRUE(TemplateVerifier.match(
     74       "template<typename T> struct C { void f() {} };"
     75       "void g() { C<int> c; c.f(); }",
     76       compoundStmt(allOf(
     77           hasAncestor(cxxRecordDecl(isTemplateInstantiation())),
     78           hasAncestor(cxxRecordDecl(unless(isTemplateInstantiation())))))));
     79 }
     80 
     81 } // end namespace ast_matchers
     82 } // end namespace clang
     83