@@ -25,7 +25,7 @@ public enum DependencyScanningError: Error, DiagnosticData {
2525 case missingRequiredSymbol( String )
2626 case dependencyScanFailed
2727 case failedToInstantiateScanner
28- case failedToInstantiateCAS
28+ case casError ( String )
2929 case missingField( String )
3030 case moduleNameDecodeFailure( String )
3131 case unsupportedDependencyDetailsKind( Int )
@@ -42,8 +42,8 @@ public enum DependencyScanningError: Error, DiagnosticData {
4242 return " libSwiftScan dependency scan query failed "
4343 case . failedToInstantiateScanner:
4444 return " libSwiftScan failed to create scanner instance "
45- case . failedToInstantiateCAS :
46- return " libSwiftScan failed to create CAS "
45+ case . casError ( let reason ) :
46+ return " libSwiftScan CAS error: \( reason ) "
4747 case . missingField( let fieldName) :
4848 return " libSwiftScan scan result missing required field: ` \( fieldName) ` "
4949 case . moduleNameDecodeFailure( let encodedName) :
@@ -281,7 +281,12 @@ internal extension swiftscan_diagnostic_severity_t {
281281 }
282282
283283 @_spi ( Testing) public var supportsCaching : Bool {
284- return api. swiftscan_cas_create != nil &&
284+ return api. swiftscan_cas_options_create != nil &&
285+ api. swiftscan_cas_options_dispose != nil &&
286+ api. swiftscan_cas_options_set_ondisk_path != nil &&
287+ api. swiftscan_cas_options_set_plugin_path != nil &&
288+ api. swiftscan_cas_options_set_option != nil &&
289+ api. swiftscan_cas_create_from_option != nil &&
285290 api. swiftscan_cas_dispose != nil &&
286291 api. swiftscan_compute_cache_key != nil &&
287292 api. swiftscan_cas_store != nil &&
@@ -382,16 +387,42 @@ internal extension swiftscan_diagnostic_severity_t {
382387 }
383388 }
384389
385- func createCAS( casPath: String ) throws {
386- self . cas = api. swiftscan_cas_create ( casPath. cString ( using: String . Encoding. utf8) )
390+ func createCAS( pluginPath: String ? , onDiskPath: String ? , pluginOptions: [ String : String ] ) throws {
391+ func getCASError( ) throws -> DependencyScanningError {
392+ guard supportsScannerDiagnostics else {
393+ return DependencyScanningError . casError ( " unknown reason " )
394+ }
395+ let diags = try queryScannerDiagnostics ( )
396+ try resetScannerDiagnostics ( )
397+ let msg = diags. map { $0. message } . joined ( separator: " , " )
398+ return DependencyScanningError . casError ( msg)
399+ }
400+ guard let casOpts = api. swiftscan_cas_options_create ( scanner) else {
401+ throw try getCASError ( )
402+ }
403+ defer {
404+ api. swiftscan_cas_options_dispose ( casOpts)
405+ }
406+ if let path = pluginPath {
407+ api. swiftscan_cas_options_set_plugin_path ( casOpts, path)
408+ }
409+ if let path = onDiskPath {
410+ api. swiftscan_cas_options_set_ondisk_path ( casOpts, path)
411+ }
412+ for (name, value) in pluginOptions {
413+ guard !api. swiftscan_cas_options_set_option ( casOpts, name, value) else {
414+ throw try getCASError ( )
415+ }
416+ }
417+ self . cas = api. swiftscan_cas_create_from_option ( casOpts)
387418 guard self . cas != nil else {
388- throw DependencyScanningError . failedToInstantiateCAS
419+ throw try getCASError ( )
389420 }
390421 }
391422
392423 func store( data: Data ) throws -> String {
393424 guard let scan_cas = self . cas else {
394- throw DependencyScanningError . failedToInstantiateCAS
425+ throw DependencyScanningError . casError ( " CAS is not created " )
395426 }
396427 let bytes = UnsafeMutablePointer< UInt8> . allocate( capacity: data. count)
397428 data. copyBytes ( to: bytes, count: data. count)
@@ -420,7 +451,7 @@ internal extension swiftscan_diagnostic_severity_t {
420451
421452 func computeCacheKeyForOutput( kind: FileType , commandLine: [ String ] , input: String ) throws -> String {
422453 guard let scan_cas = self . cas else {
423- throw DependencyScanningError . failedToInstantiateCAS
454+ throw DependencyScanningError . casError ( " CAS is not created " )
424455 }
425456 var casid : swiftscan_string_ref_t = swiftscan_string_ref_t ( )
426457 withArrayOfCStrings ( commandLine) { commandArray in
@@ -513,7 +544,13 @@ private extension swiftscan_functions_t {
513544 self . swiftscan_clang_detail_get_module_cache_key =
514545 try loadOptional ( " swiftscan_clang_detail_get_module_cache_key " )
515546
547+ self . swiftscan_cas_options_create = try loadOptional ( " swiftscan_cas_options_create " )
548+ self . swiftscan_cas_options_set_plugin_path = try loadOptional ( " swiftscan_cas_options_set_plugin_path " )
549+ self . swiftscan_cas_options_set_ondisk_path = try loadOptional ( " swiftscan_cas_options_set_ondisk_path " )
550+ self . swiftscan_cas_options_set_option = try loadOptional ( " swiftscan_cas_options_set_option " )
551+ self . swiftscan_cas_options_dispose = try loadOptional ( " swiftscan_cas_options_dispose " )
516552 self . swiftscan_cas_create = try loadOptional ( " swiftscan_cas_create " )
553+ self . swiftscan_cas_create_from_option = try loadOptional ( " swiftscan_cas_create_from_option " )
517554 self . swiftscan_cas_dispose = try loadOptional ( " swiftscan_cas_dispose " )
518555 self . swiftscan_compute_cache_key =
519556 try loadOptional ( " swiftscan_compute_cache_key " )
0 commit comments