//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2020 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 // //===----------------------------------------------------------------------===// #if compiler(>=6) package import LanguageServerProtocol package import SKLogging #else import LanguageServerProtocol import SKLogging #endif // MARK: - Build settings logger /// Shared logger that only logs build settings for a file once unless they change package actor BuildSettingsLogger { package static let shared = BuildSettingsLogger() private var loggedSettings: [DocumentURI: FileBuildSettings] = [:] package func log(level: LogLevel = .default, settings: FileBuildSettings, for uri: DocumentURI) { guard loggedSettings[uri] != settings else { return } loggedSettings[uri] = settings Self.log(level: level, settings: settings, for: uri) } /// Log the given build settings. /// /// In contrast to the instance method `log`, this will always log the build settings. The instance method only logs /// the build settings if they have changed. package static func log(level: LogLevel = .default, settings: FileBuildSettings, for uri: DocumentURI) { let log = """ Compiler Arguments: \(settings.compilerArguments.joined(separator: "\n")) Working directory: \(settings.workingDirectory ?? "") """ let chunks = splitLongMultilineMessage(message: log) for (index, chunk) in chunks.enumerated() { logger.log( level: level, """ Build settings for \(uri.forLogging) (\(index + 1)/\(chunks.count)) \(chunk) """ ) } } }