Skip to content

Commit be0dd73

Browse files
committed
Support folding of function parameter clauses
Fixes #898 rdar://116877123
1 parent fbb77c6 commit be0dd73

File tree

2 files changed

+36
-24
lines changed

2 files changed

+36
-24
lines changed

Sources/SourceKitLSP/Swift/FoldingRange.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ fileprivate final class FoldingRangeFinder: SyntaxAnyVisitor {
131131
end: braced.rightBrace.positionAfterSkippingLeadingTrivia
132132
)
133133
}
134+
if let parenthesized = node.asProtocol(ParenthesizedSyntax.self) {
135+
return self.addFoldingRange(
136+
start: parenthesized.leftParen.endPositionBeforeTrailingTrivia,
137+
end: parenthesized.rightParen.positionAfterSkippingLeadingTrivia
138+
)
139+
}
134140
return .visitChildren
135141
}
136142

@@ -149,19 +155,13 @@ fileprivate final class FoldingRangeFinder: SyntaxAnyVisitor {
149155
}
150156

151157
override func visit(_ node: FunctionCallExprSyntax) -> SyntaxVisitorContinueKind {
152-
let start = node.leftParen?.endPositionBeforeTrailingTrivia ?? node.arguments.position
153-
let end =
154-
if !node.additionalTrailingClosures.isEmpty {
155-
node.additionalTrailingClosures.endPositionBeforeTrailingTrivia
156-
} else if let trailingClosure = node.trailingClosure {
157-
trailingClosure.endPositionBeforeTrailingTrivia
158-
} else if let rightParen = node.rightParen {
159-
rightParen.positionAfterSkippingLeadingTrivia
160-
} else {
161-
// Should never happen because the call should have either a trailing closure or a closing ')'
162-
node.arguments.endPositionBeforeTrailingTrivia
163-
}
164-
return self.addFoldingRange(start: start, end: end)
158+
if let leftParen = node.leftParen, let rightParen = node.rightParen {
159+
return self.addFoldingRange(
160+
start: leftParen.endPositionBeforeTrailingTrivia,
161+
end: rightParen.positionAfterSkippingLeadingTrivia
162+
)
163+
}
164+
return .visitChildren
165165
}
166166

167167
override func visit(_ node: SubscriptCallExprSyntax) -> SyntaxVisitorContinueKind {

Tests/SourceKitLSPTests/FoldingRangeTests.swift

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -317,32 +317,44 @@ final class FoldingRangeTests: XCTestCase {
317317
func testFoldCallWithTrailingClosure() async throws {
318318
try await assertFoldingRanges(
319319
markedSource: """
320-
doSomething(1️⃣normalArg: 1) {2️⃣
320+
doSomething(1️⃣normalArg: 12️⃣) {3️⃣
321321
_ = $0
322-
3️⃣}4️⃣
322+
4️⃣}
323323
""",
324324
expectedRanges: [
325-
FoldingRangeSpec(from: "1️⃣", to: "4️⃣"),
326-
FoldingRangeSpec(from: "2️⃣", to: "3️⃣"),
325+
FoldingRangeSpec(from: "1️⃣", to: "2️⃣"),
326+
FoldingRangeSpec(from: "3️⃣", to: "4️⃣"),
327327
]
328328
)
329329
}
330330

331331
func testFoldCallWithMultipleTrailingClosures() async throws {
332332
try await assertFoldingRanges(
333333
markedSource: """
334-
doSomething(1️⃣normalArg: 1) {2️⃣
334+
doSomething(1️⃣normalArg: 12️⃣) {3️⃣
335335
_ = $0
336-
3️⃣}
337-
additionalTrailing: {4️⃣
336+
4️⃣}
337+
additionalTrailing: {5️⃣
338338
_ = $0
339-
5️⃣}6️⃣
339+
6️⃣}
340340
""",
341341
expectedRanges: [
342-
FoldingRangeSpec(from: "1️⃣", to: "6️⃣"),
343-
FoldingRangeSpec(from: "2️⃣", to: "3️⃣"),
344-
FoldingRangeSpec(from: "4️⃣", to: "5️⃣"),
342+
FoldingRangeSpec(from: "1️⃣", to: "2️⃣"),
343+
FoldingRangeSpec(from: "3️⃣", to: "4️⃣"),
344+
FoldingRangeSpec(from: "5️⃣", to: "6️⃣"),
345345
]
346346
)
347347
}
348+
349+
func testFoldArgumentsOfFunction() async throws {
350+
try await assertFoldingRanges(
351+
markedSource: """
352+
func foo(1️⃣
353+
arg1: Int,
354+
arg2: Int
355+
2️⃣)
356+
""",
357+
expectedRanges: [FoldingRangeSpec(from: "1️⃣", to: "2️⃣")]
358+
)
359+
}
348360
}

0 commit comments

Comments
 (0)