[cfe-dev] [ast_matcher] Match variable declaration by type name

Michael Schellenberger Costa via cfe-dev cfe-dev at lists.llvm.org
Mon Jun 10 05:41:00 PDT 2019


Hi,

I am trying to learn more about libTooling and the ast_matcher. In my 
first toy example I wanted to try to match arbitrary variable 
declaration against a given type name, e.g.

foo var1;

baz var2;


I have tried the following matcher


varDecl(hasType(cxxRecordDecl(hasAnyName("foo", "bar")))).bind("var")


However, it seems that this is not able to match the declaration. My 
unit test harness looks like this

myContext runOnCode(const char* const Code = "")
{
     myContext Context;
     auto Factory = llvm::make_unique<myActionFactory>(&Context);
     tooling::runToolOnCode(Factory->create(), Code);
     return Context;
}

where myContext is a simple holder that stores the matched nodes in a 
set. The test looks like this

TEST(variableMatcher, variable)
{
     myContext context = runOnCode("foo var1;");
     auto res = context.getVariables();
     EXPECT_EQ(res.size(), size_t(1));
}


Is the problem that the classes "foo" and "bar" are never declared? If 
so how could I instantiate the tool with the necessary declarations. 
Could I match differently?

As a followup is there a way to differentiate different properties of 
the declarations such as parentheses

foo var1;

foo (var2);


Cheers

Michael




More information about the cfe-dev mailing list