@@ -67,7 +67,12 @@ fileprivate enum NodesDescriptionPart {
67
67
}
68
68
69
69
static func descriptionParts( for nodes: some Sequence < Syntax > ) -> [ NodesDescriptionPart ] {
70
+ // For each token that we modified (e.g. made it present), map to the original token in `nodes`
71
+ var originalTokens : [ TokenSyntax : TokenSyntax ] = [ : ]
72
+
73
+ // Accumulates the result
70
74
var parts : [ NodesDescriptionPart ] = [ ]
75
+
71
76
for missingNode in nodes {
72
77
if let token = missingNode. as ( TokenSyntax . self) {
73
78
let newPart : NodesDescriptionPart
@@ -77,10 +82,12 @@ fileprivate enum NodesDescriptionPart {
77
82
let ( rawKind, text) = token. tokenKind. decomposeToRaw ( )
78
83
if let text = text, !text. isEmpty {
79
84
let presentToken = token. with ( \. presence, . present)
85
+ originalTokens [ presentToken] = token
80
86
newPart = . tokensWithDefaultText( [ presentToken] )
81
87
} else if let defaultText = rawKind. defaultText {
82
88
let newKind = TokenKind . fromRaw ( kind: rawKind, text: String ( syntaxText: defaultText) )
83
89
let presentToken = token. with ( \. tokenKind, newKind) . with ( \. presence, . present)
90
+ originalTokens [ presentToken] = token
84
91
newPart = . tokensWithDefaultText( [ presentToken] )
85
92
} else {
86
93
newPart = . tokenWithoutDefaultText( token)
@@ -89,7 +96,15 @@ fileprivate enum NodesDescriptionPart {
89
96
90
97
switch ( parts. last, newPart) {
91
98
case ( . tokensWithDefaultText( let previousTokens) , . tokensWithDefaultText( let newTokens) ) :
92
- parts [ parts. count - 1 ] = . tokensWithDefaultText( previousTokens + newTokens)
99
+ // Merge `tokensWithDefaultText` if they occur consecutively in the tree
100
+ if let lastPrevious = previousTokens. last,
101
+ let firstNew = newTokens. first,
102
+ originalTokens [ lastPrevious, default: lastPrevious] . nextToken ( viewMode: . all) == originalTokens [ firstNew, default: firstNew]
103
+ {
104
+ parts [ parts. count - 1 ] = . tokensWithDefaultText( previousTokens + newTokens)
105
+ } else {
106
+ parts. append ( newPart)
107
+ }
93
108
default :
94
109
parts. append ( newPart)
95
110
}
0 commit comments