Skip to content

Commit 72035e7

Browse files
committed
Fix parseSignatureBeforeBody
1 parent 975a1df commit 72035e7

File tree

2 files changed

+95
-19
lines changed

2 files changed

+95
-19
lines changed

Tool/Sources/FocusedCodeFinder/ObjectiveC/ObjectiveCCodeFinder.swift

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class ObjectiveCFocusedCodeFinder: KnownLanguageFocusedCodeFinder<
1919
) {
2020
super.init(maxFocusedCodeLineCount: maxFocusedCodeLineCount)
2121
}
22-
22+
2323
public func parseSyntaxTree(from document: Document) -> ASTTree? {
2424
let parser = ASTParser(language: .objectiveC)
2525
return parser.parse(document.content)
@@ -40,9 +40,9 @@ public class ObjectiveCFocusedCodeFinder: KnownLanguageFocusedCodeFinder<
4040
},
4141
range: range
4242
)
43-
43+
4444
let nodes = visitor.findScopeHierarchy()
45-
45+
4646
return .init(nodes: nodes, includes: visitor.includes, imports: visitor.imports)
4747
}
4848

@@ -230,7 +230,7 @@ public class ObjectiveCFocusedCodeFinder: KnownLanguageFocusedCodeFinder<
230230
_ node: ASTNode,
231231
textProvider: @escaping TextProvider
232232
) -> (nodeInfo: NodeInfo?, more: Bool) {
233-
parseSignatureBeforeBody(node, textProvider: textProvider)
233+
parseSignatureBeforeBody(node, fieldNameForName: "selector", textProvider: textProvider)
234234
}
235235

236236
func parseFunctionDefinitionNode(
@@ -261,9 +261,10 @@ public class ObjectiveCFocusedCodeFinder: KnownLanguageFocusedCodeFinder<
261261
extension ObjectiveCFocusedCodeFinder {
262262
func parseSignatureBeforeBody(
263263
_ node: ASTNode,
264+
fieldNameForName: String = "name",
264265
textProvider: @escaping TextProvider
265266
) -> (nodeInfo: NodeInfo?, more: Bool) {
266-
let name = node.contentOfChild(withFieldName: "name", textProvider: textProvider)
267+
let name = node.contentOfChild(withFieldName: fieldNameForName, textProvider: textProvider)
267268
let (
268269
_,
269270
signatureRange,
@@ -303,30 +304,28 @@ extension ASTNode {
303304
return (nil, range, pointRange)
304305
}
305306

306-
let range = self.range.excluding(postfixNode.range)
307-
let pointRange = self.pointRange.excluding(postfixNode.pointRange)
307+
let range = self.range.subtracting(postfixNode.range)
308+
let pointRange = self.pointRange.subtracting(postfixNode.pointRange)
308309
return (postfixNode, range, pointRange)
309310
}
310311
}
311312

312313
extension NSRange {
313-
func excluding(_ range: NSRange) -> NSRange {
314-
let start = max(location, range.location)
315-
let end = min(location + length, range.location + range.length)
314+
func subtracting(_ range: NSRange) -> NSRange {
315+
let start = lowerBound
316+
let end = Swift.max(lowerBound, Swift.min(upperBound, range.lowerBound))
316317
return NSRange(location: start, length: end - start)
317318
}
318319
}
319320

320321
extension Range where Bound == Point {
321-
func excluding(_ range: Range<Bound>) -> Range<Bound> {
322-
let start = Point(
323-
row: Swift.max(lowerBound.row, range.lowerBound.row),
324-
column: Swift.max(lowerBound.column, range.lowerBound.column)
325-
)
326-
let end = Point(
327-
row: Swift.min(upperBound.row, range.upperBound.row),
328-
column: Swift.min(upperBound.column, range.upperBound.column)
329-
)
322+
func subtracting(_ range: Range<Bound>) -> Range<Bound> {
323+
let start = lowerBound
324+
let end = if range.lowerBound >= upperBound {
325+
upperBound
326+
} else {
327+
Swift.max(range.lowerBound, lowerBound)
328+
}
330329
return Range(uncheckedBounds: (start, end))
331330
}
332331
}

Tool/Tests/FocusedCodeFinderTests/ObjectiveCFocusedCodeFinderTests.swift

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,80 @@ import SuggestionModel
33
import XCTest
44

55
@testable import FocusedCodeFinder
6+
7+
final class ObjectiveCFocusedCodeFinder_Selection_Tests: XCTestCase {
8+
func test_selecting_a_line_inside_the_method_the_scope_should_be_the_method() {
9+
let code = """
10+
@implementation Foo
11+
- (void)foo {
12+
NSInteger foo = 0;
13+
NSLog(@"Hello");
14+
NSLog(@"World");
15+
}
16+
@end
17+
"""
18+
let range = CursorRange(
19+
start: CursorPosition(line: 2, character: 0),
20+
end: CursorPosition(line: 2, character: 4)
21+
)
22+
let context = ObjectiveCFocusedCodeFinder().findFocusedCode(
23+
in: document(code: code),
24+
containingRange: range
25+
)
26+
XCTAssertEqual(context, .init(
27+
scope: .scope(signature: [
28+
.init(
29+
signature: "@implementation Foo",
30+
name: "Foo",
31+
range: .init(startPair: (0, 0), endPair: (6, 4))
32+
),
33+
.init(
34+
signature: "- (void)foo",
35+
name: "foo",
36+
range: .init(startPair: (1, 0), endPair: (5, 1))
37+
),
38+
]),
39+
contextRange: .init(startPair: (1, 0), endPair: (5, 1)),
40+
focusedRange: range,
41+
focusedCode: """
42+
NSInteger foo = 0;
43+
44+
""",
45+
imports: [],
46+
includes: []
47+
))
48+
}
49+
50+
func test_selecting_a_line_inside_a_function_the_scope_should_be_the_function() {
51+
let code = """
52+
void foo() {
53+
NSInteger foo = 0;
54+
NSLog(@"Hello");
55+
NSLog(@"World");
56+
}
57+
"""
58+
let range = CursorRange(startPair: (2, 0), endPair: (2, 4))
59+
let context = ObjectiveCFocusedCodeFinder().findFocusedCode(
60+
in: document(code: code),
61+
containingRange: range
62+
)
63+
XCTAssertEqual(context, .init(
64+
scope: .scope(signature: [
65+
.init(
66+
signature: "void foo()",
67+
name: "foo",
68+
range: .init(startPair: (0, 0), endPair: (4, 1))
69+
),
70+
]),
71+
contextRange: .init(startPair: (0, 0), endPair: (4, 1)),
72+
focusedRange: range,
73+
focusedCode: """
74+
NSLog(@"Hello");
75+
76+
""",
77+
imports: [],
78+
includes: []
79+
))
80+
}
81+
}
82+

0 commit comments

Comments
 (0)