Files
sourcekit-lsp/Sources/SwiftSourceKitPluginCommon/DynamicallyLoadedSourceKitdD+forPlugin.swift
Ben Barham add109d2d8 Avoid crashing when loading client plugins from the same path
When `DYLD_(FRAMEWORK|LIBRARY)_PATH` is set, `dlopen` will first check
if the basename of the provided path is within any of its search paths.
Thus it's possible that only a single library is loaded for each
toolchain, rather than a separate like we expect. The paths should be
equal in this case, since the client plugin is loaded based on the path
of `sourcekitd.framework` (and we should only have one for the same
reason). Allow this case and just avoid re-initializing.
2025-09-26 12:22:59 -07:00

38 lines
1.1 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2024 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 Foundation
import SKLogging
package import SourceKitD
import SwiftExtensions
extension SourceKitD {
private static nonisolated(unsafe) var _forPlugin: SourceKitD?
package static var isPluginLoaded: Bool {
return _forPlugin != nil
}
package static var forPlugin: SourceKitD {
get {
guard let _forPlugin else {
fatalError("forPlugin must only be accessed after it was set in sourcekitd_plugin_initialize_2")
}
return _forPlugin
}
set {
precondition(_forPlugin == nil, "SourceKitD.forPlugin must not be set twice")
_forPlugin = newValue
}
}
}