//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// import LanguageServerProtocol /// The build target sources request is sent from the client to the server to /// query for the list of text documents and directories that are belong to a /// build target. The sources response must not include sources that are /// external to the workspace. public struct BuildTargetSourcesRequest: RequestType, Hashable { public static let method: String = "buildTarget/sources" public typealias Response = BuildTargetSourcesResponse public var targets: [BuildTargetIdentifier] public init(targets: [BuildTargetIdentifier]) { self.targets = targets } } public struct BuildTargetSourcesResponse: ResponseType, Hashable { public var items: [SourcesItem] public init(items: [SourcesItem]) { self.items = items } } public struct SourcesItem: Codable, Hashable, Sendable { public var target: BuildTargetIdentifier /// The text documents and directories that belong to this build target. public var sources: [SourceItem] public init(target: BuildTargetIdentifier, sources: [SourceItem]) { self.target = target self.sources = sources } } public struct SourceItem: Codable, Hashable, Sendable { /// Either a text document or a directory. A directory entry must end with a /// forward slash "/" and a directory entry implies that every nested text /// document within the directory belongs to this source item. public var uri: URI /// Type of file of the source item, such as whether it is file or directory. public var kind: SourceItemKind /// Indicates if this source is automatically generated by the build and is /// not intended to be manually edited by the user. public var generated: Bool /// Kind of data to expect in the `data` field. If this field is not set, the kind of data is not specified. public var dataKind: SourceItemDataKind? /// Language-specific metadata about this source item. public var data: LSPAny? public init( uri: URI, kind: SourceItemKind, generated: Bool, dataKind: SourceItemDataKind? = nil, data: LSPAny? = nil ) { self.uri = uri self.kind = kind self.generated = generated self.dataKind = dataKind self.data = data } } public enum SourceItemKind: Int, Codable, Hashable, Sendable { /// The source item references a normal file. case file = 1 /// The source item references a directory. case directory = 2 } public struct SourceItemDataKind: RawRepresentable, Codable, Hashable, Sendable { public var rawValue: String public init(rawValue: String) { self.rawValue = rawValue } /// `data` field must contain a JvmSourceItemData object. public static let jvm = SourceItemDataKind(rawValue: "jvm") /// `data` field must contain a `SourceKitSourceItemData` object. public static let sourceKit = SourceItemDataKind(rawValue: "sourceKit") } public struct SourceKitSourceItemData: LSPAnyCodable, Codable { public var language: Language? public init(language: Language? = nil) { self.language = language } public init?(fromLSPDictionary dictionary: [String: LanguageServerProtocol.LSPAny]) { if case .string(let language) = dictionary[CodingKeys.language.stringValue] { self.language = Language(rawValue: language) } } public func encodeToLSPAny() -> LanguageServerProtocol.LSPAny { var result: [String: LSPAny] = [:] if let language { result[CodingKeys.language.stringValue] = .string(language.rawValue) } return .dictionary(result) } }