Closed martong closed 5 years ago
The second step of the full error handling is when we store the errors for the Decls in the "to" context too. For that, however, we have to put these errors in a shared state (among all the ASTImporter objects). https://github.com/martong/clang/compare/mark_erroneous_nodes_in_from_ctx...martong:mark_erroneous_nodes_in_shared_st
Looks good to me.
During import of a specific Decl
D
, it may happen that some AST nodes had already been created before we recognize an error. In this case we signal back the error to the caller, but the "to" context remains polluted with those nodes which had been created. Ideally, those nodes should not had been created, but that time we did not know about the error, the error happened later. Since the AST is immutable (most of the cases we can't remove existing nodes) we choose to mark these nodes as erroneous. Here are the steps of the algorithm: 1) We keep track of the nodes which we visit during the import ofD
: SeeImportPathTy
. 2) If a Decl is already imported and it is already on the import path (we have a cycle) then we copy/store the relevant part of the import path. We store these cycles for each Decl. 3) When we recognize an error during the import ofD
then we set up this error to all Decls in the stored cycles forD
and we clear the stored cycles.