[PATCH] D98774: [AST] De-duplicate empty node introspection

Nico Weber via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 17 08:54:02 PDT 2021


thakis added a comment.

Why were there two copies in the first place? What was the copy in the cmake file good for, why wasn't the one written by generate_cxx_src_locs.py sufficient? But pulling it into its own file seems nicer than having it inline in python or cmake code.

Another observation: it's a bit strange that the empty impl codepath doesn't share any code with the non-empty code path. The py script could do something like

  if use_empty_implementation:
    jsonData = { classesInClade': [] 'classNames': [] }

and then just fall through to the normal generation code and everything should in theory work with much fewer special cases, right?

(What's a "clade"?)

(I still think the whole approach feels off, as mentioned on the other review.)



================
Comment at: clang/lib/Tooling/CMakeLists.txt:38
+      ${BINARY_INCLUDE_DIR}/NodeIntrospection.inc
+      COPYONLY
     )
----------------
Is configure_file(COYPONLY) different from file(COPY)? In what way?

Are you expecting to use cmake vars in the .in file eventually?


================
Comment at: clang/lib/Tooling/CMakeLists.txt:89
       DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json
         ${CMAKE_CURRENT_SOURCE_DIR}/DumpTool/generate_cxx_src_locs.py
       COMMAND
----------------
You need to add a dep on the inc file here so that this step reruns if EmptyNodeIntrospection.inc changes.


================
Comment at: clang/lib/Tooling/CMakeLists.txt:96
+        --empty-implementation
+          "${CMAKE_CURRENT_SOURCE_DIR}/EmptyNodeIntrospection.inc.in"
       COMMAND
----------------
What's the advantage of making a copy above? Why not call the checked-in file `EmptyNodeIntrospection.inc` and pass the path to it directly here?


================
Comment at: clang/lib/Tooling/DumpTool/generate_cxx_src_locs.py:176
                   options.output_file), 'w') as f:
-            f.write("""
-namespace clang {
-namespace tooling {
-
-NodeLocationAccessors NodeIntrospection::GetLocations(clang::Stmt const *) {
-  return {};
-}
-NodeLocationAccessors
-NodeIntrospection::GetLocations(clang::DynTypedNode const &) {
-  return {};
-}
-} // namespace tooling
-} // namespace clang
-    """)
+            f.write(options.empty_implementation)
         sys.exit(0)
----------------
Shouldn't this be `f.write(open(options.empty_implementation).read())`?

If you're changing this, you could also make it so that it only writes the output if it'd be different from what it's there, with something like this:


================
Comment at: llvm/utils/gn/secondary/clang/lib/Tooling/BUILD.gn:8
+    "--use-empty-implementation=1",
+    "--empty-implementation=" + rebase_path(".") + "/EmptyNodeIntrospection.inc",
     "--output-file=" + rebase_path(outputs[0], root_build_dir),
----------------
Don't worry about the gn build, just don't update it at all.

(The input file would have to go into `inputs` for correct incremental builds, the `rebase_path` looks not quite right, there's nothing that copies the .inc.in file to .inc, etc)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98774/new/

https://reviews.llvm.org/D98774



More information about the cfe-commits mailing list