[cfe-dev] Using clang-query on the whole project

Kevin Funk kfunk at kde.org
Fri Jun 12 06:54:09 PDT 2015


On Friday 12 June 2015 07:41:36 Manuel Klimek wrote:
> On Thu, Jun 11, 2015 at 11:14 PM Peter Collingbourne <peter at pcc.me.uk>
> 
> wrote:
> > On Thu, Jun 11, 2015 at 11:50:40AM +0000, Manuel Klimek wrote:
> > > On Thu, Jun 11, 2015 at 1:29 PM Jacob Carlborg <doob at me.com> wrote:
> > > > On 2015-06-11 11:24, Kevin Funk wrote:
> > > > > Heya,
> > > > > 
> > > > > I've found clang-query to be useful to query single files. Matching
> > 
> > the
> > 
> > > > Clang
> > > > 
> > > > > AST is easy enough and fast to learn. I don't see how to use
> > 
> > clang-query
> > 
> > > > on a
> > > > 
> > > > > whole project, though, which would be super useful.
> > > > > 
> > > > > A simple example where it's effectively useless: Assume some header
> > > > 
> > > > "global.h"
> > > > 
> > > > > containing "struct Global {};", every file in the project includes
> > 
> > this
> > 
> > > > header.
> > > > 
> > > > > Now the idiomatic way to run clang-query over all the files in the
> > > > 
> > > > project:
> > > > >    clang-query -p $BUILD $(find . -name "*.cpp")
> > > > > 
> > > > > Let's try to find record decls named "Global":
> > > > >    match recordDecl(hasName("Global"), isDefinition())
> > > > > 
> > > > > => You get one match per file / translation unit. But in fact, this
> > 
> > is
> > 
> > > > not
> > > > 
> > > > > really what you want. You want one match here.
> > > > > 
> > > > > So of course this is difficult: clang-query is TU-centric, while for
> > 
> > a
> > 
> > > > whole
> > > > 
> > > > > project you'd "somehow" want a global view over the source code and
> > 
> > not
> > 
> > > > have
> > > > 
> > > > > duplicate results for a query like above.
> > > > > 
> > > > > Questions:
> > > > > - Is it possible to get clang-query to behave like that?
> > > > > 
> > > > >    - Any research/pointers in that regard?
> > > > > 
> > > > > - Is it possible to filter duplicates in the results without
> > > > > external
> > > > 
> > > > tools?
> > > > 
> > > > In theory it should be easy to modify clang-query to check the
> > > > location
> > > > of a declaration and only return declarations for unique locations.
> > > 
> > > Well, the problem is that a clang-query process is started for each TU,
> > 
> > so
> > 
> > > you'd need to somehow tell clang-query which results were in a
> > > completely
> > > different process of clang-query. I don't think this is going to be easy
> > 
> > or
> > 
> > > worth it...
> > 
> > This isn't entirely accurate. Each TU is stored in a separate AST, but all
> > of the ASTs live in a single process. When a match query is run, we simply
> > iterate over a vector of TU ASTs (see MatchQuery::run in Query.cpp). If
> > you
> > wanted to deduplicate results, you could probably do it in MatchQuery::run
> > by pretty printing each result's SourceLocation and using that as a string
> > key.
> 
> That doesn't really scale though. But yea, for small projects it might be
> enough...

Thanks for the pointers! This looks useful indeed.
 
> > Thanks,
> > --
> > Peter

-- 
Kevin Funk | kfunk at kde.org | http://kfunk.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150612/9f5abc78/attachment.sig>


More information about the cfe-dev mailing list