Skip to content

Commit c68859c

Browse files
committed
add toggle to run with or without multi file context
1 parent 572b76c commit c68859c

3 files changed

Lines changed: 55 additions & 5 deletions

File tree

Core/Sources/HostApp/Benchmark/Domain/Manager/BenchmarkManager.swift

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
2626
@WorkspaceActor
2727
private let workspacePool: WorkspacePool
2828

29+
private let isMultiFileEnabledSubject = CurrentValueSubject<Bool, Never>(true)
30+
var isMultiFileEnabled: AnyPublisher<Bool, Never> {
31+
isMultiFileEnabledSubject.eraseToAnyPublisher()
32+
}
33+
2934
init(benchmarkSettingsRepository: BenchmarkSettingsRepository) {
3035
@Dependency(\.workspacePool) var workspacePool
3136
BuiltinExtensionManager.shared.setupExtensions([
@@ -67,7 +72,14 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
6772
workspaceProvider: ManualWorkspaceProvider(workspace: workspace),
6873
parser: SwiftProgrammingLanguageSyntaxParser()
6974
)
70-
let relevantSymbols = await multiFileContextManager.retrieveRelevantSymbolsForFileContent(content: content)
75+
let relevantSymbols: [SymbolContent] = await {
76+
if isMultiFileEnabledSubject.value {
77+
let symbols = await multiFileContextManager.retrieveRelevantSymbolsForFileContent(content: content)
78+
return Array(symbols.values)
79+
} else {
80+
return []
81+
}
82+
}()
7183

7284
let suggestionRequest = SuggestionProvider.SuggestionRequest(
7385
fileURL: entrypoint.fileURL,
@@ -80,7 +92,7 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
8092
tabSize: 4,
8193
indentSize: 4,
8294
usesTabsForIndentation: false,
83-
relevantCodeSnippets: []
95+
relevantCodeSnippets: relevantSymbols.mapToRelevantCodeSnippets()
8496
)
8597
let workspaceInfo = WorkspaceInfo(workspaceURL: xcodeWorkspaceFileURL, projectURL: benchmarkDirectory)
8698
do {
@@ -92,7 +104,7 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
92104
return .init(
93105
suggestion: firstSuggestion,
94106
fileURL: entrypoint.fileURL,
95-
relevantSymbolsFromRequest: Array(relevantSymbols.values)
107+
relevantSymbolsFromRequest: relevantSymbols
96108
)
97109
} catch {
98110
print("CK \(error)")
@@ -182,9 +194,20 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
182194
}
183195
}
184196

197+
let contextFolderName = isMultiFileEnabledSubject.value ? "with context" : "without context"
198+
let contextFolder = outputBenchmarkDir.appendingPathComponent(contextFolderName, isDirectory: true)
199+
if !fileManager.fileExists(atPath: contextFolder.path, isDirectory: &isDirectory) || !isDirectory.boolValue {
200+
do {
201+
try fileManager.createDirectory(at: contextFolder, withIntermediateDirectories: true, attributes: nil)
202+
} catch {
203+
print("Failed to create context directory:", error)
204+
return
205+
}
206+
}
207+
185208
let timestamp = ISO8601DateFormatter().string(from: Date())
186209
let reformattedTimestamp = timestamp.replacingOccurrences(of: ":", with: "-")
187-
let outputFileURL = outputBenchmarkDir.appendingPathComponent("Task-\(taskNumber)-\(reformattedTimestamp).json")
210+
let outputFileURL = contextFolder.appendingPathComponent("Task-\(taskNumber)-\(reformattedTimestamp).json")
188211

189212
do {
190213
let dto = suggestion.toStoredDTO(timestamp: timestamp)
@@ -249,6 +272,11 @@ class RealtimeSuggestionControllerBenchmarkManager: BenchmarkManager {
249272

250273
return nil
251274
}
275+
276+
@MainActor
277+
func updateMultiFileContextState(_ newValue: Bool) {
278+
isMultiFileEnabledSubject.send(newValue)
279+
}
252280
}
253281

254282
struct MetadataDTO: Codable {
@@ -419,3 +447,15 @@ extension SymbolContent {
419447
)
420448
}
421449
}
450+
451+
extension Array where Element == SymbolContent {
452+
func mapToRelevantCodeSnippets() -> [SuggestionProvider.RelevantCodeSnippet] {
453+
map { symbol in
454+
.init(
455+
content: symbol.content,
456+
priority: 0,
457+
filePath: symbol.fileURL
458+
)
459+
}
460+
}
461+
}

Core/Sources/HostApp/Benchmark/Presentation/View/BenchmarkView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ struct BenchmarkView: View {
1212
var body: some View {
1313
ScrollView {
1414
VStack {
15-
HStack {
15+
HStack(spacing: 20) {
1616
Text("Run Benchmark")
1717
.font(.title)
1818
.frame(maxWidth: .infinity, alignment: .leading)
19+
Toggle("Multi File Context Enabled", isOn: $viewModel.isMultiFileContextEnabled)
1920
OutputConfigurationButtonView(module: module)
2021
}
2122
.padding(.vertical)

Core/Sources/HostApp/Benchmark/Presentation/ViewModel/BenchmarkViewModel.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ import Toast
33

44
class BenchmarkViewModel: ObservableObject {
55
@Published var benchmarkDirectories: [BenchmarkDirectory] = []
6+
@Published var isMultiFileContextEnabled: Bool = true {
7+
didSet {
8+
guard oldValue != isMultiFileContextEnabled else { return }
9+
Task { await benchmarkManager.updateMultiFileContextState(isMultiFileContextEnabled) }
10+
}
11+
}
612

713
private let benchmarkSettingsRepository: BenchmarkSettingsRepository
814
private let benchmarkManager: RealtimeSuggestionControllerBenchmarkManager
@@ -12,6 +18,9 @@ class BenchmarkViewModel: ObservableObject {
1218
init(benchmarkSettingsRepository: BenchmarkSettingsRepository) {
1319
self.benchmarkSettingsRepository = benchmarkSettingsRepository
1420
self.benchmarkManager = RealtimeSuggestionControllerBenchmarkManager(benchmarkSettingsRepository: benchmarkSettingsRepository)
21+
benchmarkManager.isMultiFileEnabled
22+
.assign(to: \.isMultiFileContextEnabled, on: self)
23+
.store(in: &cancellables)
1524
}
1625

1726
func loadBenchmarkDirectories() {

0 commit comments

Comments
 (0)