forked from carbon-language/carbon-lang
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Typed wrappers around parse tree nodes (carbon-language#3534)
These are intended to allow the structure of a parse tree node to be described more precisely in code, to support these use cases: - Automated checking that the parse tree conforms to the expected structure. (Added to `Tree::Verify`.) - Easier reading and understanding of the structure of the parse tree by toolchain developers. (See `parse/typed_nodes.h`.) - Easier navigation of the parse tree, for example for tooling uses and for use when forming diagnostics. On this last point, an object representing the file may be inspecting using `Tree::ExtractFile`, as in: ``` auto file = tree->ExtractFile(); for (AnyDeclId decl_id : file.decls) { // `decl_id` is convertible to a `NodeId`. if (std::optional<FunctionDecl> fn_decl = tree->ExtractAs<FunctionDecl>(decl_id)) { // fn_decl->params is a `TuplePatternId` (which extends `NodeId`) // that is guaranteed to reference a `TuplePattern`. std::optional<TuplePattern> params = tree->Extract(fn_decl->params); // `params` has a value unless there was an error in that node. } else if (auto class_def = tree->ExtractAs<ClassDefinition>(decl_id)) { // ... } } ``` The `Extract...` functions collect the child nodes into the typed parse node's fields (internally using a `Tree::SiblingIterator`) for easy access. However, this is not as fast as directly observing the tree structure using the postorder strategy being used by the check stage. These functions rely on using struct reflection on the typed parse node definitions from `parse/typed_nodes.h` to get the expected structure of child nodes and then populate them. Note that validating these in `Tree::Verify` adds significant cost to it, and is currently included in the parsing stage. Without this change, a 10 mloc test case of lex & parse takes 4.129 s ± 0.041 s. With this change, it takes 5.768 s ± 0.036 s. This builds upon and completes carbon-language#3393. Co-authored-by: Richard Smith <[email protected]> --------- Co-authored-by: Richard Smith <[email protected]> Co-authored-by: Chandler Carruth <[email protected]>
- Loading branch information
1 parent
fe24ebc
commit 2e97f27
Showing
38 changed files
with
1,865 additions
and
76 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.