Skip to content

Commit 7f9ecdc

Browse files
Merge pull request #324 from SwiftFiddle/fix-unexpectednode
Show unexpected node correctly on 5.8
2 parents 371ba71 + 5282149 commit 7f9ecdc

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

Sources/App/Controllers/TokenVisitor.swift

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ final class TokenVisitor: SyntaxRewriter {
3333
let title: String
3434
let content: String
3535
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)"
3939
type = "Token"
4040
} else {
41-
title = "\(node.withoutTrivia())"
41+
title = sourceAccurateText(node)
4242
content = "\(syntaxNodeType)"
4343
type = "Syntax"
4444
}
@@ -139,8 +139,8 @@ final class TokenVisitor: SyntaxRewriter {
139139
return token
140140
}
141141

142-
current.text = token
143-
.text
142+
let text = sourceAccurateText(token)
143+
current.text = text
144144
.escapeHTML()
145145
.replaceInvisiblesWithHTML()
146146
.replaceHTMLWhitespacesWithSymbols()
@@ -193,7 +193,18 @@ final class TokenVisitor: SyntaxRewriter {
193193
let startColumn = start.column ?? 1
194194
let endRow = end.line ?? 1
195195
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+
197208
list.append(
198209
"<span class='token \(kind.escapeHTML()) \(token.presence.rawValue.lowercased())' " +
199210
"data-title='\(token.text.escapeHTML().replaceInvisiblesWithSymbols())' " +
@@ -239,6 +250,26 @@ final class TokenVisitor: SyntaxRewriter {
239250
}
240251
}
241252

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+
242273
private extension String {
243274
func escapeHTML() -> String {
244275
var string = self

Tests/AppTests/Fixtures/test-1-4.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
Result
1414
</span>
1515
</span>
16-
<span class='GenericParameterClause' data-title='&lt;' data-content='GenericParameterClauseSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
16+
<span class='GenericParameterClause' data-title='&lt;' data-content='GenericParameterClauseSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
1717
<span class='Token' data-title='&lt;' data-content='leftAngle' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
1818
<span class='token leftAngle present' data-title='&lt;' data-content='leftAngle' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
1919
&lt;

Tests/AppTests/Fixtures/test-2-4.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
Result
1414
</span>
1515
</span>
16-
<span class='GenericParameterClause' data-title='&lt;' data-content='GenericParameterClauseSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
16+
<span class='GenericParameterClause' data-title='&lt;' data-content='GenericParameterClauseSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
1717
<span class='Token' data-title='&lt;' data-content='leftAngle' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
1818
<span class='token leftAngle present' data-title='&lt;' data-content='leftAngle' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
1919
&lt;

0 commit comments

Comments
 (0)