Commit Graph

26 Commits

Author SHA1 Message Date
Alex Hoppen
b20683252b [libSyntax] Eliminate loop and memory allocation translating ParsedRawSyntaxNode to RecordedOrDeferredNode 2021-03-12 08:47:08 +01:00
Alex Hoppen
a7703566e9 [libSyntax] Inline commonly called methods in ParsedRawSyntaxRecorder 2021-03-12 08:46:54 +01:00
Alex Hoppen
f7410ff0e7 Merge pull request #36385 from ahoppen/pr/no-range-in-parsedrawsyntaxnode
[libSyntax] Only keep track of range in ParsedRawSyntaxNode if verifying element ranges
2021-03-12 08:16:56 +01:00
Alex Hoppen
350ac1514c [libSyntax] Only keep track of range in ParsedRawSyntaxNode if verifying element ranges
This makes ParsedRawSyntaxNode a zero-cost wrapper around RecordedOrDeferredNode in the case that ranges are not verified.
2021-03-11 19:58:59 +01:00
Alex Hoppen
ab7c51b9e2 [libSyntax] Improve data structure in RawSyntax
It turns out that the bitpacked Commons struct is actually fairly expensive because the CPU needs to apply bitmasks to fetch the IsToken and Presence flag. We've got padding space available, so we might as well properly align these boolean flags.

Also on a source level, replace a couple of bit-restricted unsigned fields by their representing type (e.g. SyntaxKind).

Finally, we can pull out the common bits to RawSyntax and have the Bits union only contain the token- or layout-specific fields.
This also allows us to initialise these fields in the constructor's initialiser list (instead of in the initialiser body).

Lastly, change copyToArenaIfNecessary to work on a char *& and length, which allows us to initialise leading/trailing trivia/token text in the initialiser list and adjust if necessary later.
2021-03-11 07:56:47 +01:00
Alex Hoppen
e6da01b912 [libSyntax] Remove getData method from ParsedRawSyntaxNode
The getData and getRecordedOrDeferredNode methods broke the move-only semantics of ParsedRawSyntaxNode because it allowed retrieving the data without resetting it.

Change most uses to use takeData or takeRecordedOrDeferredNode instead of the get methods.

To retrieve the children of a ParsedRawSyntaxNode, we still need a way to access the OpaqueSyntaxNode for inspection by the SyntaxParseActions without resetting it. For this, we still maintain a method with the semantics of getData, but it’s now called getUnsafeOpaqueData to make sure it’s not accidentally used.
2021-03-09 19:10:25 +01:00
Alex Hoppen
439b44b365 [libSyntax] Re-enable dumping of ParsedRawSyntaxNode children
This requires a SyntaxParsingContext to be passed to the dump function
and was thus disabled in an earlier commit
2021-03-09 14:26:08 +01:00
Alex Hoppen
efb91f70a1 [libSyntax] Handle deferred node data in SyntaxParseActions
By now ParsedRawSyntaxNode does not have any knowledge about deferred
node data anymore, which frees up SyntaxParseActions (and, in
particular its sublass SyntaxTreeCreator) to perform optimisations to
more efficiently create and record deferred nodes.
2021-03-09 14:26:08 +01:00
Alex Hoppen
ef485d405e [libSyntax] Create deferred nodes in the ParsedRawSyntaxRecorder
This is a multi-commit effort to push the responsibility of deferred
node handling to the SyntaxParseActions which have more detailed
knowledge of their requirements on deferred nodes and might perform
additional optimisations. For example, the SyntaxTreeCreator can always
create RawSyntax nodes (even for deferred nodes) and decide to simply
not use them, should the deferred nodes not get recorded.
2021-03-03 08:49:59 +01:00
Alex Hoppen
dc8eed4279 [libSyntax] Delete discardRecordedNode
It doesn't do anything anymore and we shouldn't have it, so let's just
remove it.
2021-03-02 20:07:26 +01:00
Alex Hoppen
d3db32df8d Merge pull request #35778 from ahoppen/minor-libsyntax-improvements
[libSyntax] Minor improvements
2021-02-08 09:37:39 +01:00
Alex Hoppen
e5189ea581 [libSyntax] Mark ParsedRawSyntaxRecorder as final 2021-02-05 09:24:11 +01:00
Alex Hoppen
6d5d8da4ed [Lexer] Push trivia piece lexing down to ParsedRawSyntaxRecorder
Next and final stop: SyntaxParseActions
2021-02-05 08:15:54 +01:00
Nathan Hawes
97757e4c2a [Parse] Assert that the children of syntax tree nodes have contiguous source ranges
This should help us catch syntax tree round-tripping issues.
2019-10-18 17:22:01 -07:00
Rintaro Ishizaki
aeec682c90 [SyntaxParse] Prevent memory leak in Syntax parsing
Essentially re-applying b09f87594a
2019-10-15 16:27:32 -07:00
Rintaro Ishizaki
00613db8db Revert "Merge pull request #27230 from rintaro/syntaxparsse-rdar55421369"
This reverts commit b09f87594a, reversing
changes made to d0b7ecab00.
2019-10-14 12:47:23 -07:00
Rintaro Ishizaki
9fa176051d Revert "Merge pull request #27406 from nathawes/add-syntax-range-assertions"
This reverts commit 325204bd0d, reversing
changes made to 066bb61e8f.
2019-10-14 12:38:46 -07:00
Nathan Hawes
f1a21348d2 [Parse] Assert that the children of syntax tree nodes have contiguous source ranges
This should help us catch syntax tree round-tripping issues.
2019-09-27 16:02:27 -07:00
Rintaro Ishizaki
9f642f0bc1 Revert "Merge pull request #27203 from CodaFi/movin-on-up"
This reverts commit 387d2a9aee, reversing
changes made to bf1ab6c29d.
2019-09-17 16:42:44 -07:00
Robert Widmann
d8aaf29617 Revert "Merge pull request #27132 from rintaro/syntaxparse-parsedrawsyntax-moveonly"
This reverts commit e675c4947d, reversing
changes made to 73315ba01e.
2019-09-16 15:10:33 -07:00
Rintaro Ishizaki
b9985dbe87 [SyntaxParse] Fix memory leak for explicit syntax actions
Add SyntaxParseActions::discardRecordedNode() as a workaround for memory
leak during syntax parsing migration.
2019-09-11 16:33:49 -07:00
Rintaro Ishizaki
80085e0d27 [SyntaxParse] Make ParsedRawSyntaxNode move-only
So that we can easily detect 'ParsedSyntaxNode' leaking. When it's
moved, the original node become "null" node. In the destructor of
'ParsedSyntaxNode', assert the node is not "recorded" node.
2019-09-11 16:33:49 -07:00
Argyrios Kyrtzidis
57c1f72cc3 [Parse] Optimize syntax parsing: Make ParsedRawSyntaxNode a POD type
This eliminates the overhead of ParsedRawSyntaxNode needing to do memory management.
If ParsedRawSyntaxNode needs to point to some data the memory is allocated from a bump allocator.

There are also some improvements on how the ParsedSyntaxBuilders work.
2019-01-17 12:17:28 -08:00
Argyrios Kyrtzidis
c7ac859310 [Parse] Optimize syntax parsing: Speed-up Lexer::lexTrivia()
Introduce ParsedTrivia which is a more efficient structure to use during lexing than syntax::Trivia.
2019-01-17 12:10:27 -08:00
Argyrios Kyrtzidis
da6de4b095 Address PR feedback
* Add and improve documentation comments
* Adjust formatting
* Rename recordExactRawSyntax -> rec.recordRawSyntax
2019-01-07 19:56:37 -08:00
Argyrios Kyrtzidis
ab7427723e [Parse/Syntax] Refactoring to decouple the parser from syntax tree creation
Instead of creating syntax nodes directly, modify the parser to invoke an abstract interface 'SyntaxParseActions' while it is parsing the source code.
This decouples the act of parsing from the act of forming a syntax tree representation.
'SyntaxTreeCreator' is an implementation of SyntaxParseActions that handles the logic of creating a syntax tree.
To enforce the layering separation of parsing and syntax tree creation, a static library swiftSyntaxParse is introduced to compose the two.

This decoupling is important for introducing a syntax parser library for SwiftSyntax to directly access parsing.
2019-01-07 19:52:59 -08:00