Page MenuHomePhabricator

[AST] Split parent map traversal logic into ParentMapContext.h

Authored by rnk on Dec 10 2019, 4:01 PM.



The only part of ASTContext.h that requires most AST types to be
complete is the parent map. Nothing in Clang proper uses the ParentMap,
so split it out into its own class. Make ASTContext own the
ParentMapContext so there is still a one-to-one relationship.

After this change, 562 fewer files depend on ASTTypeTraits.h, and 66
fewer depend on TypeLoc.h:

$ diff -u deps-before.txt deps-after.txt | \
  grep '^[-+] ' | sort | uniq -c | sort -nr | less
    562 -    ../clang/include/clang/AST/ASTTypeTraits.h
    340 +    ../clang/include/clang/AST/ParentMapContext.h
     66 -    ../clang/include/clang/AST/TypeLocNodes.def
     66 -    ../clang/include/clang/AST/TypeLoc.h
     15 -    ../clang/include/clang/AST/TemplateBase.h

I computed deps-before.txt and deps-after.txt with ninja -t deps.

This removes a common and key dependency on TemplateBase.h and

This also has the effect of breaking the ParentMap RecursiveASTVisitor
instantiation into its own file, which roughly halves the compilation
time of ASTContext.cpp (29.75s -> 17.66s). The new file takes 13.8s to

I left behind forwarding methods for getParents(), but clients will need
to include a new header to make them work:

#include "clang/AST/ParentMapContext.h"

I noticed that this parent map functionality is unfortunately duplicated
in ParentMap.h, which only works for Stmt nodes.

Diff Detail

Event Timeline

rnk created this revision.Dec 10 2019, 4:01 PM
Herald added projects: Restricted Project, Restricted Project. · View Herald TranscriptDec 10 2019, 4:01 PM
rsmith accepted this revision.Dec 14 2019, 3:18 PM
This revision is now accepted and ready to land.Dec 14 2019, 3:18 PM
rnk planned changes to this revision.Dec 18 2019, 12:59 PM
rnk marked an inline comment as done.
rnk added inline comments.

Turns out this only worked for me locally because of delayed template parsing. I will have to think harder about how to preserve the API while not requiring complete types here. I could make an overload set, but I worry it will be inconveniently large.

rnk updated this revision to Diff 240050.Jan 23 2020, 4:41 PM
  • Move things around while retaining API compatibility for getParents
This revision is now accepted and ready to land.Jan 23 2020, 4:41 PM
rnk added a comment.Jan 23 2020, 4:42 PM

I think I can land this version, but I'll wait until tomorrow so I'll be around to debug fallout.

This revision was automatically updated to reflect the committed changes.

Should this new class have some tests?