Skip to content

Commit c7fe498

Browse files
committed
[JExtract] Santize trivia for declartion signature string
Introduce `triviaSanitizedDescription` that prints tokens with trivia condensed into a single whitespace, or removed after opening or before closing parentheses.
1 parent 719379c commit c7fe498

File tree

3 files changed

+54
-10
lines changed

3 files changed

+54
-10
lines changed

Sources/JExtractSwift/Convenience/SwiftSyntax+Extensions.swift

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,17 +177,19 @@ extension DeclSyntaxProtocol {
177177
var signatureString: String {
178178
return switch DeclSyntax(self.detached).as(DeclSyntaxEnum.self) {
179179
case .functionDecl(let node):
180-
node.with(\.body, nil).trimmedDescription
180+
node.with(\.body, nil).triviaSanitizedDescription
181181
case .initializerDecl(let node):
182-
node.with(\.body, nil).trimmedDescription
182+
node.with(\.body, nil).triviaSanitizedDescription
183183
case .classDecl(let node):
184-
node.with(\.memberBlock, "").trimmedDescription
184+
node.with(\.memberBlock, "").triviaSanitizedDescription
185185
case .structDecl(let node):
186-
node.with(\.memberBlock, "").trimmedDescription
186+
node.with(\.memberBlock, "").triviaSanitizedDescription
187187
case .protocolDecl(let node):
188-
node.with(\.memberBlock, "").trimmedDescription
188+
node.with(\.memberBlock, "").triviaSanitizedDescription
189189
case .accessorDecl(let node):
190-
node.with(\.body, nil).trimmedDescription
190+
node.with(\.body, nil).triviaSanitizedDescription
191+
case .subscriptDecl(let node):
192+
node.with(\.accessorBlock, nil).triviaSanitizedDescription
191193
case .variableDecl(let node):
192194
node
193195
.with(\.bindings, PatternBindingListSyntax(
@@ -197,9 +199,47 @@ extension DeclSyntaxProtocol {
197199
.with(\.initializer, nil)
198200
}
199201
))
200-
.trimmedDescription
202+
.triviaSanitizedDescription
201203
default:
202204
fatalError("unimplemented \(self.kind)")
203205
}
204206
}
207+
208+
/// Syntax text but without unnecessary trivia.
209+
///
210+
/// Connective trivia are condensed into a single whitespace, but no space
211+
/// after opening or before closing parentheses
212+
var triviaSanitizedDescription: String {
213+
let visitor = TriviaSanitizingDescriptionVisitor(viewMode: .sourceAccurate)
214+
visitor.walk(self.trimmed)
215+
return visitor.result
216+
}
217+
}
218+
219+
class TriviaSanitizingDescriptionVisitor: SyntaxVisitor {
220+
var result: String = ""
221+
222+
var prevTokenKind: TokenKind = .endOfFile
223+
var prevHadTrailingSpace: Bool = false
224+
225+
override func visit(_ node: TokenSyntax) -> SyntaxVisitorContinueKind {
226+
let tokenKind = node.tokenKind
227+
switch (prevTokenKind, tokenKind) {
228+
case
229+
// No whitespace after open parentheses.
230+
(.leftAngle, _), (.leftParen, _), (.leftSquare, _), (.endOfFile, _),
231+
// No whitespace before close parentheses.
232+
(_, .rightAngle), (_, .rightParen), (_, .rightSquare):
233+
break
234+
default:
235+
if prevHadTrailingSpace || !node.leadingTrivia.isEmpty {
236+
result += " "
237+
}
238+
}
239+
result += node.text
240+
prevTokenKind = tokenKind
241+
prevHadTrailingSpace = !node.trailingTrivia.isEmpty
242+
243+
return .skipChildren
244+
}
205245
}

Sources/JExtractSwift/ImportedDecls.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ public final class ImportedFunc: ImportedDecl, CustomStringConvertible {
5050
var translatedSignature: TranslatedFunctionSignature
5151

5252
public var signatureString: String {
53-
// FIXME: Remove comments and normalize trivia.
5453
self.swiftDecl.signatureString
5554
}
5655

Tests/JExtractSwiftTests/MethodImportTests.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,16 @@ final class MethodImportTests {
2828
import _StringProcessing
2929
import _SwiftConcurrencyShims
3030
31-
public func helloWorld()
31+
/// Hello World!
32+
public func /*comment*/helloWorld()
3233
3334
public func globalTakeInt(i: Int)
3435
35-
public func globalTakeIntLongString(i32: Int32, l: Int64, s: String)
36+
public func globalTakeIntLongString(
37+
i32: Int32,
38+
l: Int64,
39+
s: String
40+
)
3641
3742
public func globalReturnClass() -> MySwiftClass
3843

0 commit comments

Comments
 (0)