Skip to content

Commit c1fa8c8

Browse files
committed
Add symbolGraphUpToDateTracker & remove unwanted transformations
1 parent f318e62 commit c1fa8c8

2 files changed

Lines changed: 30 additions & 14 deletions

File tree

Sources/SemanticIndex/SemanticIndexManager.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ package final actor SemanticIndexManager {
198198

199199
private let indexStoreUpToDateTracker = UpToDateTracker<DocumentURI, BuildTargetIdentifier>()
200200

201+
private let symbolGraphUpToDateTracker = UpToDateTracker<BuildTargetIdentifier, DummySecondaryKey>()
202+
201203
/// The preparation tasks that have been started and are either scheduled in the task scheduler or currently
202204
/// executing.
203205
///
@@ -368,6 +370,7 @@ package final actor SemanticIndexManager {
368370
package func scheduleReindex() async {
369371
await indexStoreUpToDateTracker.markAllKnownOutOfDate()
370372
await preparationUpToDateTracker.markAllKnownOutOfDate()
373+
await symbolGraphUpToDateTracker.markAllKnownOutOfDate()
371374
await scheduleBuildGraphGenerationAndBackgroundIndexAllFiles(indexFilesWithUpToDateUnit: true)
372375
}
373376

@@ -438,6 +441,7 @@ package final actor SemanticIndexManager {
438441
outOfDateTargets.formUnion(changedTargets)
439442
}
440443
}
444+
await symbolGraphUpToDateTracker.markOutOfDate(targetsOfChangedFiles)
441445
outOfDateTargets.formUnion(await buildServerManager.targets(dependingOn: targetsOfChangedFiles))
442446
if !outOfDateTargets.isEmpty {
443447
logger.info(
@@ -476,9 +480,11 @@ package final actor SemanticIndexManager {
476480
"""
477481
)
478482
await preparationUpToDateTracker.markOutOfDate(targetsAndDependencies)
483+
await symbolGraphUpToDateTracker.markOutOfDate(targets)
479484
}
480485
} else {
481486
await preparationUpToDateTracker.markAllKnownOutOfDate()
487+
await symbolGraphUpToDateTracker.markAllKnownOutOfDate()
482488
}
483489

484490
// We need to invalidate the preparation status of the changed files immediately so that we re-prepare its target
@@ -812,6 +818,7 @@ package final actor SemanticIndexManager {
812818
target: target,
813819
language: language,
814820
buildServerManager: self.buildServerManager,
821+
symbolGraphUpToDateTracker: symbolGraphUpToDateTracker,
815822
logMessageToIndexLog: logMessageToIndexLog,
816823
timeout: updateIndexStoreTimeout
817824
)

Sources/SemanticIndex/UpdateSymbolGraphTaskDescription.swift

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
4545
/// The build server manager that is used to get the toolchain and build settings.
4646
private let buildServerManager: BuildServerManager
4747

48+
private let symbolGraphUpToDateTracker: UpToDateTracker<BuildTargetIdentifier, DummySecondaryKey>
49+
4850
private let logMessageToIndexLog:
4951
@Sendable (
5052
_ message: String, _ type: WindowMessageType, _ structure: LanguageServerProtocol.StructuredLogKind
@@ -80,6 +82,7 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
8082
target: BuildTargetIdentifier,
8183
language: Language,
8284
buildServerManager: BuildServerManager,
85+
symbolGraphUpToDateTracker: UpToDateTracker<BuildTargetIdentifier, DummySecondaryKey>,
8386
logMessageToIndexLog:
8487
@escaping @Sendable (
8588
_ message: String, _ type: WindowMessageType, _ structure: LanguageServerProtocol.StructuredLogKind
@@ -90,6 +93,7 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
9093
self.target = target
9194
self.language = language
9295
self.buildServerManager = buildServerManager
96+
self.symbolGraphUpToDateTracker = symbolGraphUpToDateTracker
9397
self.logMessageToIndexLog = logMessageToIndexLog
9498
self.timeout = timeout
9599
}
@@ -98,6 +102,12 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
98102
await withLoggingSubsystemAndScope(subsystem: indexLoggingSubsystem, scope: "update-symbolgraph-\(id % 100)") {
99103
guard language == .swift else { return }
100104

105+
if await symbolGraphUpToDateTracker.isUpToDate(target) {
106+
logger.debug("Not regenerating symbol graph for \(target.forLogging) because it is already up to date")
107+
return
108+
}
109+
110+
let startDate = Date()
101111
let buildSettings: FileBuildSettings
102112
let swiftc: URL
103113

@@ -108,7 +118,7 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
108118
for: firstFile,
109119
in: target,
110120
language: language,
111-
fallbackAfterTimeout: true
121+
fallbackAfterTimeout: false
112122
)
113123
else { return }
114124
buildSettings = resolvedSettings
@@ -164,10 +174,7 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
164174
{
165175
if i + 1 < rawArgs.count {
166176
baseArgs.append(arg)
167-
var next = rawArgs[i + 1]
168-
if next.contains("vscode-local:") {
169-
next = next.replacingOccurrences(of: "vscode-local:", with: "file:")
170-
}
177+
let next = rawArgs[i + 1]
171178
baseArgs.append(next)
172179
i += 2
173180
} else {
@@ -195,14 +202,7 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
195202
baseArgs.append("-wmo")
196203
}
197204

198-
// --- Clean environment ---
199-
var cleanEnvironment = ProcessInfo.processInfo.environment
200-
cleanEnvironment.removeValue(forKey: "SWIFT_DRIVER_SUPPLEMENTARY_OUTPUT_FILE_MAP")
201-
cleanEnvironment.removeValue(forKey: "SWIFT_DRIVER_OUTPUT_FILE_MAP")
202-
cleanEnvironment.removeValue(forKey: "SWIFT_DRIVER_TEMP_DIR")
203-
cleanEnvironment.removeValue(forKey: "SWIFT_DRIVER_RESPONSE_FILE_PATH")
204-
cleanEnvironment.removeValue(forKey: "SWIFT_DRIVER_TOOLNAME")
205-
205+
let environment = ProcessInfo.processInfo.environment
206206
let taskId = "symbol-graph-\(id)"
207207

208208
logMessageToIndexLog(
@@ -219,11 +219,14 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
219219
"-Xfrontend", "-emit-symbol-graph",
220220
"-Xfrontend", "-emit-symbol-graph-dir", "-Xfrontend", symbolGraphDir.pathString,
221221
"-Xfrontend", "-experimental-skip-all-function-bodies",
222+
"-Xfrontend", "-experimental-lazy-typecheck",
223+
"-Xfrontend", "-experimental-skip-non-exportable-decls",
224+
"-Xfrontend", "-experimental-allow-module-with-compiler-errors",
222225
]
223226
do {
224227
let process = Process(
225228
arguments: args,
226-
environment: cleanEnvironment,
229+
environment: environment,
227230
workingDirectory: baseDir,
228231
outputRedirection: .none
229232
)
@@ -232,8 +235,14 @@ package struct UpdateSymbolGraphTaskDescription: IndexTaskDescription {
232235

233236
let result = try await process.waitUntilExit()
234237
let exitStatus = result.exitStatus.exhaustivelySwitchable
238+
let elapsed = Date().timeIntervalSince(startDate) * 1000
239+
240+
logger.log(
241+
"Finished updating symbol graph in \(elapsed, privacy: .public)ms"
242+
)
235243

236244
if exitStatus.isSuccess {
245+
await symbolGraphUpToDateTracker.markUpToDate([target], updateOperationStartDate: startDate)
237246
logMessageToIndexLog(
238247
"""
239248
Symbol graph generation completed successfully.

0 commit comments

Comments
 (0)