1// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers 2// 3// SPDX-License-Identifier: MPL-2.0 4 5import Foundation 6import TSCBasic 7import llbuild2fx 8 9extension Graph: FXValue where Vertex: Codable {} 10 11extension Keys { 12 struct DependencyGraphOfSourceTree: BuildKey { 13 typealias ValueType = Graph<UnitName> 14 15 let sourceTreeId: LLBDataID 16 static let versionDependencies: [any FXVersioning.Type] = [Keys.UnitMapOfSourceTree.self, Keys.AnalyseImports.self] 17 18 func computeValue(_ ctx: BuildContext<Self>) async throws -> Graph<UnitName> { 19 let unitMap = try await ctx.request(Keys.UnitMapOfSourceTree(sourceTreeId: sourceTreeId)) 20 var edges: [UnitName: Set<UnitName>] = [:] 21 22 for (unitName, unitInfo) in unitMap.units { 23 if edges[unitName] == nil { edges[unitName] = [] } 24 let imports = try await ctx.request(Keys.AnalyseImports(blobId: unitInfo.blobId)) 25 for importedUnitName in imports { 26 edges[unitName]!.insert(importedUnitName) 27 } 28 } 29 30 return Graph(edges: edges) 31 } 32 } 33}