@@ -33,12 +33,12 @@ final class TokenVisitor: SyntaxRewriter {
33
33
let title : String
34
34
let content : String
35
35
let type : String
36
- if let tokenSyntax = node. as ( TokenSyntax . self) {
37
- title = tokenSyntax . text
38
- content = " \( tokenSyntax . tokenKind) "
36
+ if let token = node. as ( TokenSyntax . self) {
37
+ title = sourceAccurateText ( token )
38
+ content = " \( token . tokenKind) "
39
39
type = " Token "
40
40
} else {
41
- title = " \ ( node. withoutTrivia ( ) ) "
41
+ title = sourceAccurateText ( node)
42
42
content = " \( syntaxNodeType) "
43
43
type = " Syntax "
44
44
}
@@ -139,8 +139,8 @@ final class TokenVisitor: SyntaxRewriter {
139
139
return token
140
140
}
141
141
142
- current . text = token
143
- . text
142
+ let text = sourceAccurateText ( token)
143
+ current . text = text
144
144
. escapeHTML ( )
145
145
. replaceInvisiblesWithHTML ( )
146
146
. replaceHTMLWhitespacesWithSymbols ( )
@@ -193,7 +193,18 @@ final class TokenVisitor: SyntaxRewriter {
193
193
let startColumn = start. column ?? 1
194
194
let endRow = end. line ?? 1
195
195
let endColumn = end. column ?? 1
196
- let text = token. presence == . present || showMissingTokens ? token. text : " "
196
+ let text : String
197
+ switch token. presence {
198
+ case . present:
199
+ text = sourceAccurateText ( token)
200
+ case . missing:
201
+ if showMissingTokens {
202
+ text = sourceAccurateText ( token)
203
+ } else {
204
+ text = " "
205
+ }
206
+ }
207
+
197
208
list. append (
198
209
" <span class='token \( kind. escapeHTML ( ) ) \( token. presence. rawValue. lowercased ( ) ) ' " +
199
210
" data-title=' \( token. text. escapeHTML ( ) . replaceInvisiblesWithSymbols ( ) ) ' " +
@@ -239,6 +250,26 @@ final class TokenVisitor: SyntaxRewriter {
239
250
}
240
251
}
241
252
253
+ private func sourceAccurateText( _ syntax: Syntax ) -> String {
254
+ let text = " \( syntax. withoutTrivia ( ) ) "
255
+ let utf8Length = syntax. contentLength. utf8Length
256
+ if text. utf8. count == utf8Length {
257
+ return text
258
+ } else {
259
+ return String ( decoding: syntax. syntaxTextBytes. prefix ( utf8Length) , as: UTF8 . self)
260
+ }
261
+ }
262
+
263
+ private func sourceAccurateText( _ token: TokenSyntax ) -> String {
264
+ let text = token. text
265
+ let utf8Length = token. contentLength. utf8Length
266
+ if text. utf8. count == utf8Length {
267
+ return text
268
+ } else {
269
+ return String ( decoding: token. syntaxTextBytes. prefix ( utf8Length) , as: UTF8 . self)
270
+ }
271
+ }
272
+
242
273
private extension String {
243
274
func escapeHTML( ) -> String {
244
275
var string = self
0 commit comments