Skip to content

Commit 2b027e9

Browse files
committed
Update focused code finder
1 parent 71bc6e7 commit 2b027e9

File tree

4 files changed

+157
-150
lines changed

4 files changed

+157
-150
lines changed

Tool/Sources/ASTParser/TreeCursor.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Foundation
22
import SwiftTreeSitter
33

4-
extension TreeCursor {
4+
public extension TreeCursor {
55
/// Deep first search nodes.
66
/// - Parameter skipChildren: Check if children of a `Node` should be skipped.
77
func deepFirstSearch(
@@ -13,7 +13,7 @@ extension TreeCursor {
1313

1414
// MARK: - Search
1515

16-
protocol Cursor {
16+
public protocol Cursor {
1717
associatedtype Node
1818
var currentNode: Node? { get }
1919
func goToFirstChild() -> Bool
@@ -22,32 +22,32 @@ protocol Cursor {
2222
}
2323

2424
extension TreeCursor: Cursor {
25-
func goToNextSibling() -> Bool {
25+
public func goToNextSibling() -> Bool {
2626
gotoNextSibling()
2727
}
28-
29-
func goToParent() -> Bool {
28+
29+
public func goToParent() -> Bool {
3030
gotoParent()
3131
}
3232
}
3333

34-
struct CursorDeepFirstSearchSequence<C: Cursor>: Sequence {
34+
public struct CursorDeepFirstSearchSequence<C: Cursor>: Sequence {
3535
let cursor: C
3636
let skipChildren: (C.Node) -> Bool
3737

38-
func makeIterator() -> CursorDeepFirstSearchIterator<C> {
38+
public func makeIterator() -> CursorDeepFirstSearchIterator {
3939
return CursorDeepFirstSearchIterator(
4040
cursor: cursor,
4141
skipChildren: skipChildren
4242
)
4343
}
4444

45-
struct CursorDeepFirstSearchIterator<C: Cursor>: IteratorProtocol {
45+
public struct CursorDeepFirstSearchIterator: IteratorProtocol {
4646
let cursor: C
4747
let skipChildren: (C.Node) -> Bool
4848
var isEnded = false
4949

50-
mutating func next() -> C.Node? {
50+
public mutating func next() -> C.Node? {
5151
guard !isEnded else { return nil }
5252
let currentNode = cursor.currentNode
5353
let hasChild = {

Tool/Sources/FocusedCodeFinder/FocusedCodeFinder.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public struct CodeContext: Equatable {
2626
public var focusedRange: CursorRange
2727
public var focusedCode: String
2828
public var imports: [String]
29+
public var includes: [String]
2930

3031
public static var empty: CodeContext {
3132
.init(scope: .file, contextRange: .zero, focusedRange: .zero, focusedCode: "", imports: [])
@@ -36,13 +37,15 @@ public struct CodeContext: Equatable {
3637
contextRange: CursorRange,
3738
focusedRange: CursorRange,
3839
focusedCode: String,
39-
imports: [String]
40+
imports: [String],
41+
includes: [String]
4042
) {
4143
self.scope = scope
4244
self.contextRange = contextRange
4345
self.focusedRange = focusedRange
4446
self.focusedCode = focusedCode
4547
self.imports = imports
48+
self.includes = includes
4649
}
4750
}
4851

Tool/Sources/FocusedCodeFinder/SwiftFocusedCodeFinder.swift renamed to Tool/Sources/FocusedCodeFinder/Swift/SwiftFocusedCodeFinder.swift

Lines changed: 2 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ public struct SwiftFocusedCodeFinder: FocusedCodeFinderType {
131131
contextRange: contextRange,
132132
focusedRange: codeRange,
133133
focusedCode: code,
134-
imports: visitor.imports
134+
imports: visitor.imports,
135+
includes: []
135136
)
136137
}
137138
}
@@ -465,142 +466,3 @@ extension String {
465466
}
466467
}
467468

468-
// MARK: - Visitors
469-
470-
extension SwiftFocusedCodeFinder {
471-
final class SwiftScopeHierarchySyntaxVisitor: SyntaxVisitor {
472-
let tree: SyntaxProtocol
473-
let code: String
474-
let range: CursorRange
475-
let locationConverter: SourceLocationConverter
476-
477-
var imports: [String] = []
478-
private var _scopeHierarchy: [SyntaxProtocol] = []
479-
480-
/// The nodes containing the current range, sorted from inner to outer.
481-
func findScopeHierarchy(_ node: some SyntaxProtocol) -> [SyntaxProtocol] {
482-
walk(node)
483-
return _scopeHierarchy.sorted { $0.position.utf8Offset > $1.position.utf8Offset }
484-
}
485-
486-
/// The nodes containing the current range, sorted from inner to outer.
487-
func findScopeHierarchy() -> [SyntaxProtocol] {
488-
walk(tree)
489-
return _scopeHierarchy.sorted { $0.position.utf8Offset > $1.position.utf8Offset }
490-
}
491-
492-
init(
493-
tree: SyntaxProtocol,
494-
code: String,
495-
range: CursorRange,
496-
locationConverter: SourceLocationConverter
497-
) {
498-
self.tree = tree
499-
self.code = code
500-
self.range = range
501-
self.locationConverter = locationConverter
502-
super.init(viewMode: .sourceAccurate)
503-
}
504-
505-
func skipChildrenIfPossible(_ node: SyntaxProtocol) -> SyntaxVisitorContinueKind {
506-
if _scopeHierarchy.count > 5 { return .skipChildren }
507-
if !nodeContainsRange(node) { return .skipChildren }
508-
return .visitChildren
509-
}
510-
511-
func captureNodeIfPossible(_ node: SyntaxProtocol) -> SyntaxVisitorContinueKind {
512-
if _scopeHierarchy.count > 5 { return .skipChildren }
513-
if !nodeContainsRange(node) { return .skipChildren }
514-
_scopeHierarchy.append(node)
515-
return .visitChildren
516-
}
517-
518-
func nodeContainsRange(_ node: SyntaxProtocol) -> Bool {
519-
let sourceRange = node.sourceRange(converter: locationConverter)
520-
let cursorRange = CursorRange(sourceRange: sourceRange)
521-
return cursorRange.strictlyContains(range)
522-
}
523-
524-
// skip if possible
525-
526-
override func visit(_ node: MemberDeclBlockSyntax) -> SyntaxVisitorContinueKind {
527-
skipChildrenIfPossible(node)
528-
}
529-
530-
override func visit(_ node: MemberDeclListItemSyntax) -> SyntaxVisitorContinueKind {
531-
skipChildrenIfPossible(node)
532-
}
533-
534-
// capture if possible
535-
536-
override func visit(_ node: ImportDeclSyntax) -> SyntaxVisitorContinueKind {
537-
imports.append(node.path.trimmedDescription)
538-
return .skipChildren
539-
}
540-
541-
override func visit(_ node: StructDeclSyntax) -> SyntaxVisitorContinueKind {
542-
captureNodeIfPossible(node)
543-
}
544-
545-
override func visit(_ node: ClassDeclSyntax) -> SyntaxVisitorContinueKind {
546-
captureNodeIfPossible(node)
547-
}
548-
549-
override func visit(_ node: EnumDeclSyntax) -> SyntaxVisitorContinueKind {
550-
captureNodeIfPossible(node)
551-
}
552-
553-
override func visit(_ node: ActorDeclSyntax) -> SyntaxVisitorContinueKind {
554-
captureNodeIfPossible(node)
555-
}
556-
557-
override func visit(_ node: MacroDeclSyntax) -> SyntaxVisitorContinueKind {
558-
captureNodeIfPossible(node)
559-
}
560-
561-
override func visit(_ node: ProtocolDeclSyntax) -> SyntaxVisitorContinueKind {
562-
captureNodeIfPossible(node)
563-
}
564-
565-
override func visit(_ node: ExtensionDeclSyntax) -> SyntaxVisitorContinueKind {
566-
captureNodeIfPossible(node)
567-
}
568-
569-
override func visit(_ node: FunctionDeclSyntax) -> SyntaxVisitorContinueKind {
570-
captureNodeIfPossible(node)
571-
}
572-
573-
override func visit(_ node: SubscriptDeclSyntax) -> SyntaxVisitorContinueKind {
574-
captureNodeIfPossible(node)
575-
}
576-
577-
override func visit(_ node: ClosureExprSyntax) -> SyntaxVisitorContinueKind {
578-
captureNodeIfPossible(node)
579-
}
580-
581-
override func visit(_ node: VariableDeclSyntax) -> SyntaxVisitorContinueKind {
582-
captureNodeIfPossible(node)
583-
}
584-
585-
override func visit(_ node: AccessorDeclSyntax) -> SyntaxVisitorContinueKind {
586-
captureNodeIfPossible(node)
587-
}
588-
589-
override func visit(_ node: InitializerDeclSyntax) -> SyntaxVisitorContinueKind {
590-
captureNodeIfPossible(node)
591-
}
592-
593-
override func visit(_ node: DeinitializerDeclSyntax) -> SyntaxVisitorContinueKind {
594-
captureNodeIfPossible(node)
595-
}
596-
597-
override func visit(_ node: FunctionCallExprSyntax) -> SyntaxVisitorContinueKind {
598-
captureNodeIfPossible(node)
599-
}
600-
601-
override func visit(_ node: SwitchCaseSyntax) -> SyntaxVisitorContinueKind {
602-
captureNodeIfPossible(node)
603-
}
604-
}
605-
}
606-
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import ASTParser
2+
import Foundation
3+
import Preferences
4+
import SuggestionModel
5+
import SwiftParser
6+
import SwiftSyntax
7+
8+
final class SwiftScopeHierarchySyntaxVisitor: SyntaxVisitor {
9+
let tree: SyntaxProtocol
10+
let code: String
11+
let range: CursorRange
12+
let locationConverter: SourceLocationConverter
13+
14+
var imports: [String] = []
15+
private var _scopeHierarchy: [SyntaxProtocol] = []
16+
17+
/// The nodes containing the current range, sorted from inner to outer.
18+
func findScopeHierarchy(_ node: some SyntaxProtocol) -> [SyntaxProtocol] {
19+
walk(node)
20+
return _scopeHierarchy.sorted { $0.position.utf8Offset > $1.position.utf8Offset }
21+
}
22+
23+
/// The nodes containing the current range, sorted from inner to outer.
24+
func findScopeHierarchy() -> [SyntaxProtocol] {
25+
walk(tree)
26+
return _scopeHierarchy.sorted { $0.position.utf8Offset > $1.position.utf8Offset }
27+
}
28+
29+
init(
30+
tree: SyntaxProtocol,
31+
code: String,
32+
range: CursorRange,
33+
locationConverter: SourceLocationConverter
34+
) {
35+
self.tree = tree
36+
self.code = code
37+
self.range = range
38+
self.locationConverter = locationConverter
39+
super.init(viewMode: .sourceAccurate)
40+
}
41+
42+
func skipChildrenIfPossible(_ node: SyntaxProtocol) -> SyntaxVisitorContinueKind {
43+
if _scopeHierarchy.count > 5 { return .skipChildren }
44+
if !nodeContainsRange(node) { return .skipChildren }
45+
return .visitChildren
46+
}
47+
48+
func captureNodeIfPossible(_ node: SyntaxProtocol) -> SyntaxVisitorContinueKind {
49+
if _scopeHierarchy.count > 5 { return .skipChildren }
50+
if !nodeContainsRange(node) { return .skipChildren }
51+
_scopeHierarchy.append(node)
52+
return .visitChildren
53+
}
54+
55+
func nodeContainsRange(_ node: SyntaxProtocol) -> Bool {
56+
let sourceRange = node.sourceRange(converter: locationConverter)
57+
let cursorRange = CursorRange(sourceRange: sourceRange)
58+
return cursorRange.strictlyContains(range)
59+
}
60+
61+
// skip if possible
62+
63+
override func visit(_ node: MemberDeclBlockSyntax) -> SyntaxVisitorContinueKind {
64+
skipChildrenIfPossible(node)
65+
}
66+
67+
override func visit(_ node: MemberDeclListItemSyntax) -> SyntaxVisitorContinueKind {
68+
skipChildrenIfPossible(node)
69+
}
70+
71+
// capture if possible
72+
73+
override func visit(_ node: ImportDeclSyntax) -> SyntaxVisitorContinueKind {
74+
imports.append(node.path.trimmedDescription)
75+
return .skipChildren
76+
}
77+
78+
override func visit(_ node: StructDeclSyntax) -> SyntaxVisitorContinueKind {
79+
captureNodeIfPossible(node)
80+
}
81+
82+
override func visit(_ node: ClassDeclSyntax) -> SyntaxVisitorContinueKind {
83+
captureNodeIfPossible(node)
84+
}
85+
86+
override func visit(_ node: EnumDeclSyntax) -> SyntaxVisitorContinueKind {
87+
captureNodeIfPossible(node)
88+
}
89+
90+
override func visit(_ node: ActorDeclSyntax) -> SyntaxVisitorContinueKind {
91+
captureNodeIfPossible(node)
92+
}
93+
94+
override func visit(_ node: MacroDeclSyntax) -> SyntaxVisitorContinueKind {
95+
captureNodeIfPossible(node)
96+
}
97+
98+
override func visit(_ node: ProtocolDeclSyntax) -> SyntaxVisitorContinueKind {
99+
captureNodeIfPossible(node)
100+
}
101+
102+
override func visit(_ node: ExtensionDeclSyntax) -> SyntaxVisitorContinueKind {
103+
captureNodeIfPossible(node)
104+
}
105+
106+
override func visit(_ node: FunctionDeclSyntax) -> SyntaxVisitorContinueKind {
107+
captureNodeIfPossible(node)
108+
}
109+
110+
override func visit(_ node: SubscriptDeclSyntax) -> SyntaxVisitorContinueKind {
111+
captureNodeIfPossible(node)
112+
}
113+
114+
override func visit(_ node: ClosureExprSyntax) -> SyntaxVisitorContinueKind {
115+
captureNodeIfPossible(node)
116+
}
117+
118+
override func visit(_ node: VariableDeclSyntax) -> SyntaxVisitorContinueKind {
119+
captureNodeIfPossible(node)
120+
}
121+
122+
override func visit(_ node: AccessorDeclSyntax) -> SyntaxVisitorContinueKind {
123+
captureNodeIfPossible(node)
124+
}
125+
126+
override func visit(_ node: InitializerDeclSyntax) -> SyntaxVisitorContinueKind {
127+
captureNodeIfPossible(node)
128+
}
129+
130+
override func visit(_ node: DeinitializerDeclSyntax) -> SyntaxVisitorContinueKind {
131+
captureNodeIfPossible(node)
132+
}
133+
134+
override func visit(_ node: FunctionCallExprSyntax) -> SyntaxVisitorContinueKind {
135+
captureNodeIfPossible(node)
136+
}
137+
138+
override func visit(_ node: SwitchCaseSyntax) -> SyntaxVisitorContinueKind {
139+
captureNodeIfPossible(node)
140+
}
141+
}
142+

0 commit comments

Comments
 (0)