@@ -2811,41 +2811,12 @@ final class SwiftDriverTests: XCTestCase {
2811
2811
] )
2812
2812
let plannedJobs = try driver1. planBuild ( ) . removingAutolinkExtractJobs ( )
2813
2813
XCTAssertEqual ( plannedJobs. count, 1 )
2814
- let suppleArg = " -supplementary-output-file-map "
2815
- // Make sure we are using supplementary file map
2816
- XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( suppleArg) ) )
2817
- let args = plannedJobs [ 0 ] . commandLine
2818
- var fileMapPath : VirtualPath ?
2819
- for pair in args. enumerated ( ) {
2820
- if pair. element == . flag( suppleArg) {
2821
- let filemap = args [ pair. offset + 1 ]
2822
- switch filemap {
2823
- case . path( let p) :
2824
- fileMapPath = p
2825
- default :
2826
- break
2827
- }
2828
- }
2829
- }
2830
- XCTAssert ( fileMapPath != nil )
2831
- switch fileMapPath! {
2832
- case . fileList( _, let list) :
2833
- switch list {
2834
- case . outputFileMap( let map) :
2835
- // This is to match the legacy driver behavior
2836
- // Make sure the supplementary output map has an entry for the Swift file
2837
- // under indexing and its indexData entry is the primary output file
2838
- let entry = map. entries [ VirtualPath . relative ( try RelativePath ( validating: " foo5.swift " ) ) . intern ( ) ] !
2839
- XCTAssert ( VirtualPath . lookup ( entry [ . indexData] !) == . absolute( try . init( validating: " /tmp/t.o " ) ) )
2840
- return
2841
- default :
2842
- break
2843
- }
2844
- break
2845
- default :
2846
- break
2847
- }
2848
- XCTAssert ( false )
2814
+ let map = try XCTUnwrap ( plannedJobs [ 0 ] . commandLine. supplementaryOutputFilemap)
2815
+ // This is to match the legacy driver behavior
2816
+ // Make sure the supplementary output map has an entry for the Swift file
2817
+ // under indexing and its indexData entry is the primary output file
2818
+ let entry = map. entries [ VirtualPath . relative ( try RelativePath ( validating: " foo5.swift " ) ) . intern ( ) ] !
2819
+ XCTAssert ( VirtualPath . lookup ( entry [ . indexData] !) == . absolute( try . init( validating: " /tmp/t.o " ) ) )
2849
2820
}
2850
2821
2851
2822
func testMultiThreadedWholeModuleOptimizationCompiles( ) throws {
@@ -2917,14 +2888,7 @@ final class SwiftDriverTests: XCTestCase {
2917
2888
XCTAssertEqual ( plannedJobs. count, 2 )
2918
2889
let compileJob = plannedJobs [ 0 ]
2919
2890
XCTAssertEqual ( compileJob. kind, . compile)
2920
- XCTAssert ( compileJob. commandLine. contains ( . flag( " -supplementary-output-file-map " ) ) )
2921
- let argIdx = try XCTUnwrap ( compileJob. commandLine. firstIndex ( where: { $0 == . flag( " -supplementary-output-file-map " ) } ) )
2922
- let supplOutputs = compileJob. commandLine [ argIdx+ 1 ]
2923
- guard case let . path( path) = supplOutputs,
2924
- case let . fileList( _, fileList) = path,
2925
- case let . outputFileMap( outFileMap) = fileList else {
2926
- throw StringError ( " Unexpected argument for output file map " )
2927
- }
2891
+ let outFileMap = try XCTUnwrap ( compileJob. commandLine. supplementaryOutputFilemap)
2928
2892
let firstKey : String = try VirtualPath . lookup ( XCTUnwrap ( outFileMap. entries. keys. first) ) . description
2929
2893
XCTAssertEqual ( firstKey, " foo.swift " )
2930
2894
}
@@ -3073,14 +3037,7 @@ final class SwiftDriverTests: XCTestCase {
3073
3037
XCTAssertEqual ( plannedJobs. count, 2 )
3074
3038
XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
3075
3039
print ( plannedJobs [ 0 ] . commandLine. joinedUnresolvedArguments)
3076
- XCTAssert ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -supplementary-output-file-map " ) ) )
3077
- let argIdx = try XCTUnwrap ( plannedJobs [ 0 ] . commandLine. firstIndex ( where: { $0 == . flag( " -supplementary-output-file-map " ) } ) )
3078
- let supplOutputs = plannedJobs [ 0 ] . commandLine [ argIdx+ 1 ]
3079
- guard case let . path( path) = supplOutputs,
3080
- case let . fileList( _, fileList) = path,
3081
- case let . outputFileMap( outFileMap) = fileList else {
3082
- throw StringError ( " Unexpected argument for output file map " )
3083
- }
3040
+ let outFileMap = try XCTUnwrap ( plannedJobs [ 0 ] . commandLine. supplementaryOutputFilemap)
3084
3041
XCTAssertEqual ( outFileMap. entries. values. first? . keys. first, fileType)
3085
3042
}
3086
3043
@@ -6636,48 +6593,21 @@ final class SwiftDriverTests: XCTestCase {
6636
6593
let plannedJobs = try driver. planBuild ( )
6637
6594
6638
6595
let jobA = plannedJobs [ 0 ]
6639
- let flagA = jobA. commandLine. firstIndex ( of: . flag( " -supplementary-output-file-map " ) ) !
6640
- let fileListArgumentA = jobA. commandLine [ jobA. commandLine. index ( after: flagA) ]
6641
- guard case let . path( . fileList( _, fileListA) ) = fileListArgumentA else {
6642
- XCTFail ( " Argument wasn't a filelist " )
6643
- return
6644
- }
6645
- guard case let . outputFileMap( mapA) = fileListA else {
6646
- XCTFail ( " FileList wasn't OutputFileMap " )
6647
- return
6648
- }
6596
+ let mapA = try XCTUnwrap ( jobA. commandLine. supplementaryOutputFilemap)
6649
6597
let filesA = try XCTUnwrap ( mapA. entries [ VirtualPath . relative ( try RelativePath ( validating: " a.swift " ) ) . intern ( ) ] )
6650
6598
XCTAssertTrue ( filesA. keys. contains ( . swiftModule) )
6651
6599
XCTAssertTrue ( filesA. keys. contains ( . swiftDocumentation) )
6652
6600
XCTAssertTrue ( filesA. keys. contains ( . swiftSourceInfoFile) )
6653
6601
6654
6602
let jobB = plannedJobs [ 1 ]
6655
- let flagB = jobB. commandLine. firstIndex ( of: . flag( " -supplementary-output-file-map " ) ) !
6656
- let fileListArgumentB = jobB. commandLine [ jobB. commandLine. index ( after: flagB) ]
6657
- guard case let . path( . fileList( _, fileListB) ) = fileListArgumentB else {
6658
- XCTFail ( " Argument wasn't a filelist " )
6659
- return
6660
- }
6661
- guard case let . outputFileMap( mapB) = fileListB else {
6662
- XCTFail ( " FileList wasn't OutputFileMap " )
6663
- return
6664
- }
6603
+ let mapB = try XCTUnwrap ( jobB. commandLine. supplementaryOutputFilemap)
6665
6604
let filesB = try XCTUnwrap ( mapB. entries [ VirtualPath . relative ( try RelativePath ( validating: " b.swift " ) ) . intern ( ) ] )
6666
6605
XCTAssertTrue ( filesB. keys. contains ( . swiftModule) )
6667
6606
XCTAssertTrue ( filesB. keys. contains ( . swiftDocumentation) )
6668
6607
XCTAssertTrue ( filesB. keys. contains ( . swiftSourceInfoFile) )
6669
6608
6670
6609
let jobC = plannedJobs [ 2 ]
6671
- let flagC = jobC. commandLine. firstIndex ( of: . flag( " -supplementary-output-file-map " ) ) !
6672
- let fileListArgumentC = jobC. commandLine [ jobC. commandLine. index ( after: flagC) ]
6673
- guard case let . path( . fileList( _, fileListC) ) = fileListArgumentC else {
6674
- XCTFail ( " Argument wasn't a filelist " )
6675
- return
6676
- }
6677
- guard case let . outputFileMap( mapC) = fileListC else {
6678
- XCTFail ( " FileList wasn't OutputFileMap " )
6679
- return
6680
- }
6610
+ let mapC = try XCTUnwrap ( jobC. commandLine. supplementaryOutputFilemap)
6681
6611
let filesC = try XCTUnwrap ( mapC. entries [ VirtualPath . relative ( try RelativePath ( validating: " c.swift " ) ) . intern ( ) ] )
6682
6612
XCTAssertTrue ( filesC. keys. contains ( . swiftModule) )
6683
6613
XCTAssertTrue ( filesC. keys. contains ( . swiftDocumentation) )
@@ -6800,29 +6730,11 @@ final class SwiftDriverTests: XCTestCase {
6800
6730
let plannedJobs = try driver. planBuild ( )
6801
6731
6802
6732
let jobA = plannedJobs [ 0 ]
6803
- let flagA = jobA. commandLine. firstIndex ( of: . flag( " -supplementary-output-file-map " ) ) !
6804
- let fileListArgumentA = jobA. commandLine [ jobA. commandLine. index ( after: flagA) ]
6805
- guard case let . path( . fileList( _, fileListA) ) = fileListArgumentA else {
6806
- XCTFail ( " Argument wasn't a filelist " )
6807
- return
6808
- }
6809
- guard case let . outputFileMap( mapA) = fileListA else {
6810
- XCTFail ( " FileList wasn't OutputFileMap " )
6811
- return
6812
- }
6733
+ let mapA = try XCTUnwrap ( jobA. commandLine. supplementaryOutputFilemap)
6813
6734
XCTAssertEqual ( mapA. entries, [ VirtualPath . relative ( try . init( validating: " a.swift " ) ) . intern ( ) : [ : ] ] )
6814
6735
6815
6736
let jobB = plannedJobs [ 1 ]
6816
- let flagB = jobB. commandLine. firstIndex ( of: . flag( " -supplementary-output-file-map " ) ) !
6817
- let fileListArgumentB = jobB. commandLine [ jobB. commandLine. index ( after: flagB) ]
6818
- guard case let . path( . fileList( _, fileListB) ) = fileListArgumentB else {
6819
- XCTFail ( " Argument wasn't a filelist " )
6820
- return
6821
- }
6822
- guard case let . outputFileMap( mapB) = fileListB else {
6823
- XCTFail ( " FileList wasn't OutputFileMap " )
6824
- return
6825
- }
6737
+ let mapB = try XCTUnwrap ( jobB. commandLine. supplementaryOutputFilemap)
6826
6738
XCTAssertEqual ( mapB. entries, [ VirtualPath . relative ( try . init( validating: " b.swift " ) ) . intern ( ) : [ : ] ] )
6827
6739
}
6828
6740
@@ -6831,16 +6743,7 @@ final class SwiftDriverTests: XCTestCase {
6831
6743
let plannedJobs = try driver. planBuild ( )
6832
6744
6833
6745
let jobA = plannedJobs [ 0 ]
6834
- let flagA = jobA. commandLine. firstIndex ( of: . flag( " -supplementary-output-file-map " ) ) !
6835
- let fileListArgumentA = jobA. commandLine [ jobA. commandLine. index ( after: flagA) ]
6836
- guard case let . path( . fileList( _, fileListA) ) = fileListArgumentA else {
6837
- XCTFail ( " Argument wasn't a filelist " )
6838
- return
6839
- }
6840
- guard case let . outputFileMap( mapA) = fileListA else {
6841
- XCTFail ( " FileList wasn't OutputFileMap " )
6842
- return
6843
- }
6746
+ let mapA = try XCTUnwrap ( jobA. commandLine. supplementaryOutputFilemap)
6844
6747
XCTAssertEqual ( mapA. entries, [ VirtualPath . relative ( try . init( validating: " a.swift " ) ) . intern ( ) : [ : ] ] )
6845
6748
}
6846
6749
}
@@ -7325,6 +7228,35 @@ final class SwiftDriverTests: XCTestCase {
7325
7228
let emitModuleJob = try XCTUnwrap ( jobs. first ( where: { $0. kind == . emitModule} ) )
7326
7229
XCTAssertTrue ( emitModuleJob. commandLine. contains ( . flag( " -experimental-lazy-typecheck " ) ) )
7327
7230
}
7231
+
7232
+ func testEmitAPIDescriptorEmitModule( ) throws {
7233
+ try withTemporaryDirectory { path in
7234
+ let apiDescriptorPath = path. appending ( component: " api.json " ) . nativePathString ( escaped: true )
7235
+ var driver = try Driver ( args: [ " swiftc " , " foo.swift " , " bar.swift " , " baz.swift " ,
7236
+ " -emit-module " , " -module-name " , " Test " ,
7237
+ " -emit-api-descriptor-path " , apiDescriptorPath] )
7238
+
7239
+ let jobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
7240
+ let emitModuleJob = try jobs. findJob ( . emitModule)
7241
+ XCTAssert ( emitModuleJob. commandLine. contains ( . flag( " -emit-api-descriptor-path " ) ) )
7242
+ }
7243
+ }
7244
+
7245
+ func testEmitAPIDescriptorWholeModuleOptimization( ) throws {
7246
+ try withTemporaryDirectory { path in
7247
+ let apiDescriptorPath = path. appending ( component: " api.json " ) . nativePathString ( escaped: true )
7248
+ var driver = try Driver ( args: [ " swiftc " , " -whole-module-optimization " ,
7249
+ " -driver-filelist-threshold=0 " ,
7250
+ " foo.swift " , " bar.swift " , " baz.swift " ,
7251
+ " -module-name " , " Test " , " -emit-module " ,
7252
+ " -emit-api-descriptor-path " , apiDescriptorPath] )
7253
+
7254
+ let jobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
7255
+ let compileJob = try jobs. findJob ( . compile)
7256
+ let supplementaryOutputs = try XCTUnwrap ( compileJob. commandLine. supplementaryOutputFilemap)
7257
+ XCTAssertNotNil ( supplementaryOutputs. entries. values. first ? [ . jsonAPIDescriptor] )
7258
+ }
7259
+ }
7328
7260
}
7329
7261
7330
7262
func assertString(
@@ -7394,4 +7326,19 @@ private extension Array where Element == Job.ArgTemplate {
7394
7326
}
7395
7327
}
7396
7328
}
7329
+
7330
+ var supplementaryOutputFilemap : OutputFileMap ? {
7331
+ get throws {
7332
+ guard let argIdx = firstIndex ( where: { $0 == . flag( " -supplementary-output-file-map " ) } ) else {
7333
+ return nil
7334
+ }
7335
+ let supplementaryOutputs = self [ argIdx + 1 ]
7336
+ guard case let . path( path) = supplementaryOutputs,
7337
+ case let . fileList( _, fileList) = path,
7338
+ case let . outputFileMap( outputFileMap) = fileList else {
7339
+ throw StringError ( " Unexpected argument for output file map " )
7340
+ }
7341
+ return outputFileMap
7342
+ }
7343
+ }
7397
7344
}
0 commit comments