Commit 748dde4
committed
[SwiftParser] Intern source text per parsed token
Previously, parsing interned the entire source buffer into the
`RawSyntaxArena`, so a parsed token's `wholeText` pointed into it and
the whole buffer stayed resident for the lifetime of the tree. For
incremental reparsing this is wasteful: each reparse allocates a fresh
arena that copies the full source again, even though most nodes are
reused from the previous tree.
Instead, intern each parsed token's text into the node allocator at
token creation. The resulting tree is self-contained and no longer
references the source buffer, so the buffer only needs to stay valid for
the duration of the parse. The static `parse`/`parseIncrementally`
methods, string-interpolation literal construction, `NameMatcher`, and
the plugin macro-expansion host now lex directly over the caller's
buffer via the new no-copy `Parser.withParser` entry points, copying
nothing. The `Parser(_:)` initializers, whose parse happens after the
initializer returns, instead keep a `Parser`-owned copy of the source
that is freed when the `Parser` is destroyed.
The source buffer is no longer null-terminated; all lexer reads are
bounds-checked against the buffer length, so the trailing NUL was
unnecessary. Add `testParseBufferEOFEdgeCases` covering EOF-adjacent
lexing (unterminated comments/strings, truncated UTF-8, etc.) over
exactly-sized allocations so the absence of the terminator is verified
under AddressSanitizer.1 parent a8b1c53 commit 748dde4
8 files changed
Lines changed: 287 additions & 97 deletions
File tree
- Sources
- SwiftCompilerPluginMessageHandling
- SwiftIDEUtils
- SwiftParser
- SwiftSyntaxBuilder
- SwiftSyntax/Raw
- Tests/SwiftParserTest
Lines changed: 21 additions & 18 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
50 | | - | |
51 | | - | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
52 | 54 | | |
53 | 55 | | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
66 | | - | |
67 | | - | |
68 | | - | |
69 | | - | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
70 | 73 | | |
71 | 74 | | |
72 | 75 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| |||
227 | 227 | | |
228 | 228 | | |
229 | 229 | | |
230 | | - | |
231 | | - | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
232 | 233 | | |
233 | 234 | | |
234 | 235 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
26 | | - | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
27 | 32 | | |
28 | 33 | | |
29 | 34 | | |
| |||
33 | 38 | | |
34 | 39 | | |
35 | 40 | | |
36 | | - | |
37 | | - | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
38 | 48 | | |
39 | 49 | | |
40 | 50 | | |
| |||
44 | 54 | | |
45 | 55 | | |
46 | 56 | | |
47 | | - | |
48 | | - | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
49 | 64 | | |
50 | 65 | | |
51 | 66 | | |
| |||
120 | 135 | | |
121 | 136 | | |
122 | 137 | | |
123 | | - | |
124 | | - | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
125 | 145 | | |
126 | 146 | | |
127 | 147 | | |
| |||
133 | 153 | | |
134 | 154 | | |
135 | 155 | | |
136 | | - | |
137 | | - | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
138 | 163 | | |
139 | 164 | | |
140 | 165 | | |
| |||
0 commit comments