Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions Sources/SWBBuildService/BuildDescriptionMessages.swift
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ struct BuildDescriptionConfiguredTargetsMsg: MessageHandler {
func handle(request: Request, message: BuildDescriptionConfiguredTargetsRequest) async throws -> BuildDescriptionConfiguredTargetsResponse {
let buildDescription = try await request.buildDescription(for: message)

var configuredTargetIdentifiersByGUID: [String: ConfiguredTargetIdentifier] = [:]
for configuredTarget in buildDescription.allConfiguredTargets {
configuredTargetIdentifiersByGUID[configuredTarget.guid.stringValue] = ConfiguredTargetIdentifier(rawGUID: configuredTarget.guid.stringValue, targetGUID: TargetGUID(rawValue: configuredTarget.target.guid))
}

let dependencyRelationships = Dictionary(
buildDescription.targetDependencies.map { (ConfiguredTarget.GUID(id: $0.target.guid), [$0]) },
uniquingKeysWith: { $0 + $1 }
Expand All @@ -116,10 +121,9 @@ struct BuildDescriptionConfiguredTargetsMsg: MessageHandler {

let dependencyRelationships = dependencyRelationships[configuredTarget.guid]
return BuildDescriptionConfiguredTargetsResponse.ConfiguredTargetInfo(
guid: ConfiguredTargetGUID(configuredTarget.guid.stringValue),
target: TargetGUID(rawValue: configuredTarget.target.guid),
identifier: ConfiguredTargetIdentifier(rawGUID: configuredTarget.guid.stringValue, targetGUID: TargetGUID(rawValue: configuredTarget.target.guid)),
name: configuredTarget.target.name,
dependencies: Set(dependencyRelationships?.flatMap(\.targetDependencies).map { ConfiguredTargetGUID($0.guid) } ?? []),
dependencies: Set(dependencyRelationships?.flatMap(\.targetDependencies).compactMap { configuredTargetIdentifiersByGUID[$0.guid] } ?? []),
toolchain: toolchain
)
}
Expand All @@ -143,7 +147,7 @@ fileprivate extension SourceLanguage {

struct BuildDescriptionConfiguredTargetSourcesMsg: MessageHandler {
private struct UnknownConfiguredTargetIDError: Error, CustomStringConvertible {
let configuredTarget: ConfiguredTargetGUID
let configuredTarget: ConfiguredTargetIdentifier
var description: String { "Unknown configured target: \(configuredTarget)" }
}

Expand All @@ -161,9 +165,9 @@ struct BuildDescriptionConfiguredTargetSourcesMsg: MessageHandler {
}

let indexingInfoInput = TaskGenerateIndexingInfoInput(requestedSourceFile: nil, outputPathOnly: true, enableIndexBuildArena: false)
let sourcesItems = try message.configuredTargets.map { configuredTargetGuid in
guard let target = configuredTargetsByID[ConfiguredTarget.GUID(id: configuredTargetGuid.rawValue)] else {
throw UnknownConfiguredTargetIDError(configuredTarget: configuredTargetGuid)
let sourcesItems = try message.configuredTargets.map { configuredTargetIdentifier in
guard let target = configuredTargetsByID[ConfiguredTarget.GUID(id: configuredTargetIdentifier.rawGUID)] else {
throw UnknownConfiguredTargetIDError(configuredTarget: configuredTargetIdentifier)
}
let sourceFiles = buildDescription.taskStore.tasksForTarget(target).flatMap { task in
task.generateIndexingInfo(input: indexingInfoInput).compactMap { (entry) -> SourceFileInfo? in
Expand All @@ -174,7 +178,7 @@ struct BuildDescriptionConfiguredTargetSourcesMsg: MessageHandler {
)
}
}
return ConfiguredTargetSourceFilesInfo(configuredTarget: configuredTargetGuid, sourceFiles: sourceFiles)
return ConfiguredTargetSourceFilesInfo(configuredTarget: configuredTargetIdentifier, sourceFiles: sourceFiles)
}
return BuildDescriptionConfiguredTargetSourcesResponse(targetSourceFileInfos: sourcesItems)
}
Expand All @@ -190,7 +194,7 @@ struct IndexBuildSettingsMsg: MessageHandler {
func handle(request: Request, message: IndexBuildSettingsRequest) async throws -> IndexBuildSettingsResponse {
let (buildRequest, buildDescription) = try await request.buildRequestAndDescription(for: message)

let configuredTarget = buildDescription.allConfiguredTargets.filter { $0.guid.stringValue == message.configuredTarget.rawValue }.only
let configuredTarget = buildDescription.allConfiguredTargets.filter { $0.guid.stringValue == message.configuredTarget.rawGUID }.only

let indexingInfoInput = TaskGenerateIndexingInfoInput(
requestedSourceFile: message.file,
Expand Down
34 changes: 16 additions & 18 deletions Sources/SWBProtocol/BuildDescriptionMessages.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@ public import SWBUtil

// MARK: Support types

public struct ConfiguredTargetGUID: Hashable, Sendable, Codable {
public var rawValue: String
public struct ConfiguredTargetIdentifier: Hashable, Sendable, Codable {
public var rawGUID: String
public var targetGUID: TargetGUID

public init(_ rawValue: String) {
self.rawValue = rawValue
public init(rawGUID: String, targetGUID: TargetGUID) {
self.rawGUID = rawGUID
self.targetGUID = targetGUID
}
}

Expand Down Expand Up @@ -61,25 +63,21 @@ public struct BuildDescriptionConfiguredTargetsResponse: Message, SerializableCo

public struct ConfiguredTargetInfo: SerializableCodable, Equatable, Sendable {
/// The GUID of this configured target
public let guid: ConfiguredTargetGUID

/// The GUID of the target from which this configured target was created
public let target: TargetGUID
public let identifier: ConfiguredTargetIdentifier

/// A name of the target that may be displayed to the user
public let name: String

/// The configured targets that this target depends on
public let dependencies: Set<ConfiguredTargetGUID>
public let dependencies: Set<ConfiguredTargetIdentifier>

/// The path of the toolchain that should be used to build this target.
///
/// `nil` if the toolchain for this target could not be determined due to an error.
public let toolchain: Path?

public init(guid: ConfiguredTargetGUID, target: TargetGUID, name: String, dependencies: Set<ConfiguredTargetGUID>, toolchain: Path?) {
self.guid = guid
self.target = target
public init(identifier: ConfiguredTargetIdentifier, name: String, dependencies: Set<ConfiguredTargetIdentifier>, toolchain: Path?) {
self.identifier = identifier
self.name = name
self.dependencies = dependencies
self.toolchain = toolchain
Expand Down Expand Up @@ -108,9 +106,9 @@ public struct BuildDescriptionConfiguredTargetSourcesRequest: SessionMessage, Re
public let request: BuildRequestMessagePayload

/// The configured targets for which to load source file information
public let configuredTargets: [ConfiguredTargetGUID]
public let configuredTargets: [ConfiguredTargetIdentifier]

public init(sessionHandle: String, buildDescriptionID: BuildDescriptionID, request: BuildRequestMessagePayload, configuredTargets: [ConfiguredTargetGUID]) {
public init(sessionHandle: String, buildDescriptionID: BuildDescriptionID, request: BuildRequestMessagePayload, configuredTargets: [ConfiguredTargetIdentifier]) {
self.sessionHandle = sessionHandle
self.buildDescriptionID = buildDescriptionID
self.request = request
Expand Down Expand Up @@ -148,12 +146,12 @@ public struct BuildDescriptionConfiguredTargetSourcesResponse: Message, Serializ

public struct ConfiguredTargetSourceFilesInfo: SerializableCodable, Equatable, Sendable {
/// The configured target to which this info belongs
public let configuredTarget: ConfiguredTargetGUID
public let configuredTarget: ConfiguredTargetIdentifier

/// Information about the source files in this source file
public let sourceFiles: [SourceFileInfo]

public init(configuredTarget: ConfiguredTargetGUID, sourceFiles: [SourceFileInfo]) {
public init(configuredTarget: ConfiguredTargetIdentifier, sourceFiles: [SourceFileInfo]) {
self.configuredTarget = configuredTarget
self.sourceFiles = sourceFiles
}
Expand Down Expand Up @@ -182,7 +180,7 @@ public struct IndexBuildSettingsRequest: SessionMessage, RequestMessage, Seriali
public let request: BuildRequestMessagePayload

/// The configured target in whose context the build settings of the source file should be loaded
public let configuredTarget: ConfiguredTargetGUID
public let configuredTarget: ConfiguredTargetIdentifier

/// The path of the source file for which the build settings should be loaded
public let file: Path
Expand All @@ -191,7 +189,7 @@ public struct IndexBuildSettingsRequest: SessionMessage, RequestMessage, Seriali
sessionHandle: String,
buildDescriptionID: BuildDescriptionID,
request: BuildRequestMessagePayload,
configuredTarget: ConfiguredTargetGUID,
configuredTarget: ConfiguredTargetIdentifier,
file: Path
) {
self.sessionHandle = sessionHandle
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftBuild/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ add_library(SwiftBuild
SWBBuildServiceSession.swift
SWBChannel.swift
SWBClientExchangeSupport.swift
SWBConfiguredTargetGUID.swift
SWBConfiguredTargetIdentifier.swift
SWBConfiguredTargetInfo.swift
SWBConfiguredTargetSourceFilesInfo.swift
SWBDocumentationSupport.swift
Expand Down
8 changes: 4 additions & 4 deletions Sources/SwiftBuild/SWBBuildServiceSession.swift
Original file line number Diff line number Diff line change
Expand Up @@ -393,25 +393,25 @@ public final class SWBBuildServiceSession: Sendable {
return response.configuredTargets.map { SWBConfiguredTargetInfo($0) }
}

public func sources(of configuredTargets: [SWBConfiguredTargetGUID], buildDescription: SWBBuildDescriptionID, buildRequest: SWBBuildRequest) async throws -> [SWBConfiguredTargetSourceFilesInfo] {
public func sources(of configuredTargets: [SWBConfiguredTargetIdentifier], buildDescription: SWBBuildDescriptionID, buildRequest: SWBBuildRequest) async throws -> [SWBConfiguredTargetSourceFilesInfo] {
let response = try await service.send(
request: BuildDescriptionConfiguredTargetSourcesRequest(
sessionHandle: uid,
buildDescriptionID: BuildDescriptionID(buildDescription),
request: buildRequest.messagePayloadRepresentation,
configuredTargets: configuredTargets.map { ConfiguredTargetGUID($0) }
configuredTargets: configuredTargets.map { ConfiguredTargetIdentifier($0) }
)
)
return response.targetSourceFileInfos.map { SWBConfiguredTargetSourceFilesInfo($0) }
}

public func indexCompilerArguments(of file: AbsolutePath, in configuredTarget: SWBConfiguredTargetGUID, buildDescription: SWBBuildDescriptionID, buildRequest: SWBBuildRequest) async throws -> [String] {
public func indexCompilerArguments(of file: AbsolutePath, in configuredTarget: SWBConfiguredTargetIdentifier, buildDescription: SWBBuildDescriptionID, buildRequest: SWBBuildRequest) async throws -> [String] {
let buildSettings = try await service.send(
request: IndexBuildSettingsRequest(
sessionHandle: uid,
buildDescriptionID: BuildDescriptionID(buildDescription),
request: buildRequest.messagePayloadRepresentation,
configuredTarget: ConfiguredTargetGUID(configuredTarget),
configuredTarget: ConfiguredTargetIdentifier(configuredTarget),
file: Path(file.pathString)
)
)
Expand Down
31 changes: 0 additions & 31 deletions Sources/SwiftBuild/SWBConfiguredTargetGUID.swift

This file was deleted.

33 changes: 33 additions & 0 deletions Sources/SwiftBuild/SWBConfiguredTargetIdentifier.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import SWBProtocol

public struct SWBConfiguredTargetIdentifier: Hashable, Sendable {
public var rawGUID: String
public var targetGUID: SWBTargetGUID

public init(rawGUID: String, targetGUID: SWBTargetGUID) {
self.rawGUID = rawGUID
self.targetGUID = targetGUID
}

init(configuredTargetIdentifier: ConfiguredTargetIdentifier) {
self.init(rawGUID: configuredTargetIdentifier.rawGUID, targetGUID: SWBTargetGUID(configuredTargetIdentifier.targetGUID))
}
}

extension ConfiguredTargetIdentifier {
init(_ identifier: SWBConfiguredTargetIdentifier) {
self.init(rawGUID: identifier.rawGUID, targetGUID: TargetGUID(rawValue: identifier.targetGUID.rawValue))
}
}
17 changes: 6 additions & 11 deletions Sources/SwiftBuild/SWBConfiguredTargetInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,31 @@ import SWBProtocol

public struct SWBConfiguredTargetInfo {
/// The GUID of this configured target
public let guid: SWBConfiguredTargetGUID

/// The GUID of the target from which this configured target was created
public let target: SWBTargetGUID
public let identifier: SWBConfiguredTargetIdentifier

/// A name of the target that may be displayed to the user
public let name: String

/// The configured targets that this target depends on
public let dependencies: Set<SWBConfiguredTargetGUID>
public let dependencies: Set<SWBConfiguredTargetIdentifier>

/// The path of the toolchain that should be used to build this target.
///
/// `nil` if the toolchain for this target could not be determined due to an error.
public let toolchain: AbsolutePath?

public init(guid: SWBConfiguredTargetGUID, target: SWBTargetGUID, name: String, dependencies: Set<SWBConfiguredTargetGUID>, toolchain: AbsolutePath?) {
self.guid = guid
self.target = target
public init(identifier: SWBConfiguredTargetIdentifier, name: String, dependencies: Set<SWBConfiguredTargetIdentifier>, toolchain: AbsolutePath?) {
self.identifier = identifier
self.name = name
self.dependencies = dependencies
self.toolchain = toolchain
}

init(_ configuredTargetInfo: BuildDescriptionConfiguredTargetsResponse.ConfiguredTargetInfo) {
self.init(
guid: SWBConfiguredTargetGUID(configuredTargetInfo.guid),
target: SWBTargetGUID(configuredTargetInfo.target),
identifier: SWBConfiguredTargetIdentifier(configuredTargetIdentifier: configuredTargetInfo.identifier),
name: configuredTargetInfo.name,
dependencies: Set(configuredTargetInfo.dependencies.map { SWBConfiguredTargetGUID($0) }),
dependencies: Set(configuredTargetInfo.dependencies.map { SWBConfiguredTargetIdentifier(configuredTargetIdentifier: $0) }),
toolchain: AbsolutePath(configuredTargetInfo.toolchain)
)
}
Expand Down
6 changes: 3 additions & 3 deletions Sources/SwiftBuild/SWBConfiguredTargetSourceFilesInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,18 @@ public struct SWBConfiguredTargetSourceFilesInfo: Equatable, Sendable {
}

/// The configured target to which this info belongs
public let configuredTarget: SWBConfiguredTargetGUID
public let configuredTarget: SWBConfiguredTargetIdentifier

/// Information about the source files in this source file
public let sourceFiles: [SourceFileInfo]

public init(configuredTarget: SWBConfiguredTargetGUID, sourceFiles: [SWBConfiguredTargetSourceFilesInfo.SourceFileInfo]) {
public init(configuredTarget: SWBConfiguredTargetIdentifier, sourceFiles: [SWBConfiguredTargetSourceFilesInfo.SourceFileInfo]) {
self.configuredTarget = configuredTarget
self.sourceFiles = sourceFiles
}

init(_ sourceFilesInfo: BuildDescriptionConfiguredTargetSourcesResponse.ConfiguredTargetSourceFilesInfo) {
self.configuredTarget = SWBConfiguredTargetGUID(sourceFilesInfo.configuredTarget)
self.configuredTarget = SWBConfiguredTargetIdentifier(configuredTargetIdentifier: sourceFilesInfo.configuredTarget)
self.sourceFiles = sourceFilesInfo.sourceFiles.map { SourceFileInfo($0) }
}
}
Loading