@@ -1047,6 +1047,144 @@ final class SwiftDriverTests: XCTestCase {
10471047 XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -serialize-diagnostics-path " ) ) )
10481048 }
10491049
1050+ func testEmitConstValues( ) throws {
1051+ do { // Just single files
1052+ var driver = try Driver ( args: [ " swiftc " , " foo.swift " , " bar.swift " , " baz.swift " ,
1053+ " -module-name " , " Foo " , " -emit-const-values " ] )
1054+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1055+ XCTAssertEqual ( plannedJobs. count, 4 )
1056+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1057+ XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( " -emit-const-values-path " ) )
1058+ XCTAssertTrue ( plannedJobs [ 0 ] . outputs. contains ( where: { $0. type == . swiftConstValues } ) )
1059+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1060+ XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( " -emit-const-values-path " ) )
1061+ XCTAssertTrue ( plannedJobs [ 1 ] . outputs. contains ( where: { $0. type == . swiftConstValues } ) )
1062+ XCTAssertEqual ( plannedJobs [ 2 ] . kind, . compile)
1063+ XCTAssertTrue ( plannedJobs [ 2 ] . commandLine. contains ( " -emit-const-values-path " ) )
1064+ XCTAssertTrue ( plannedJobs [ 2 ] . outputs. contains ( where: { $0. type == . swiftConstValues } ) )
1065+ XCTAssertEqual ( plannedJobs [ 3 ] . kind, . link)
1066+ }
1067+
1068+ do { // Just single files with emit-module
1069+ var driver = try Driver ( args: [ " swiftc " , " foo.swift " , " bar.swift " , " baz.swift " , " -emit-module " ,
1070+ " -module-name " , " Foo " , " -emit-const-values " ] )
1071+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1072+ XCTAssertEqual ( plannedJobs. count, 4 )
1073+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . emitModule)
1074+ // Ensure the emit-module job does *not* contain this flag
1075+ XCTAssertFalse ( plannedJobs [ 0 ] . commandLine. contains ( " -emit-const-values-path " ) )
1076+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1077+ XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( " -emit-const-values-path " ) )
1078+ XCTAssertTrue ( plannedJobs [ 1 ] . outputs. contains ( where: { $0. type == . swiftConstValues } ) )
1079+ XCTAssertEqual ( plannedJobs [ 2 ] . kind, . compile)
1080+ XCTAssertTrue ( plannedJobs [ 2 ] . commandLine. contains ( " -emit-const-values-path " ) )
1081+ XCTAssertTrue ( plannedJobs [ 2 ] . outputs. contains ( where: { $0. type == . swiftConstValues } ) )
1082+ XCTAssertEqual ( plannedJobs [ 3 ] . kind, . compile)
1083+ XCTAssertTrue ( plannedJobs [ 3 ] . commandLine. contains ( " -emit-const-values-path " ) )
1084+ XCTAssertTrue ( plannedJobs [ 3 ] . outputs. contains ( where: { $0. type == . swiftConstValues } ) )
1085+ }
1086+
1087+ do { // Batch
1088+ var driver = try Driver ( args: [ " swiftc " , " foo.swift " , " bar.swift " , " baz.swift " ,
1089+ " -enable-batch-mode " , " -driver-batch-size-limit " , " 2 " ,
1090+ " -module-name " , " Foo " , " -emit-const-values " ] )
1091+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1092+ XCTAssertEqual ( plannedJobs. count, 3 )
1093+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1094+ XCTAssertTrue ( plannedJobs [ 0 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " foo.swift " ,
1095+ " bar.swift " ] ) )
1096+ XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( " -emit-const-values-path " ) )
1097+ XCTAssertEqual ( plannedJobs [ 0 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 2 )
1098+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1099+ XCTAssertTrue ( plannedJobs [ 1 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " baz.swift " ] ) )
1100+ XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( " -emit-const-values-path " ) )
1101+ XCTAssertEqual ( plannedJobs [ 1 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 1 )
1102+ XCTAssertEqual ( plannedJobs [ 2 ] . kind, . link)
1103+ }
1104+
1105+ try withTemporaryFile { fileMapFile in // Batch with output-file-map
1106+ let outputMapContents = """
1107+ {
1108+ " foo.swift " : {
1109+ " object " : " /tmp/foo.build/foo.swift.o " ,
1110+ " const-values " : " /tmp/foo.build/foo.swiftconstvalues "
1111+ },
1112+ " bar.swift " : {
1113+ " object " : " /tmp/foo.build/bar.swift.o " ,
1114+ " const-values " : " /tmp/foo.build/bar.swiftconstvalues "
1115+ },
1116+ " baz.swift " : {
1117+ " object " : " /tmp/foo.build/baz.swift.o " ,
1118+ " const-values " : " /tmp/foo.build/baz.swiftconstvalues "
1119+ }
1120+ }
1121+ """
1122+ try localFileSystem. writeFileContents ( fileMapFile. path) { $0 <<< outputMapContents }
1123+ var driver = try Driver ( args: [ " swiftc " , " foo.swift " , " bar.swift " , " baz.swift " ,
1124+ " -enable-batch-mode " , " -driver-batch-size-limit " , " 2 " ,
1125+ " -module-name " , " Foo " , " -emit-const-values " ,
1126+ " -output-file-map " , fileMapFile. path. description] )
1127+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1128+ XCTAssertEqual ( plannedJobs. count, 3 )
1129+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1130+ XCTAssertTrue ( plannedJobs [ 0 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " foo.swift " ,
1131+ " bar.swift " ] ) )
1132+ XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( subsequence: [ . flag( " -emit-const-values-path " ) , . path( . absolute( . init( " /tmp/foo.build/foo.swiftconstvalues " ) ) ) ] ) )
1133+ XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( subsequence: [ . flag( " -emit-const-values-path " ) , . path( . absolute( . init( " /tmp/foo.build/bar.swiftconstvalues " ) ) ) ] ) )
1134+ XCTAssertEqual ( plannedJobs [ 0 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 2 )
1135+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1136+ XCTAssertTrue ( plannedJobs [ 1 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " baz.swift " ] ) )
1137+ XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( " -emit-const-values-path " ) )
1138+ XCTAssertEqual ( plannedJobs [ 1 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 1 )
1139+ XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( subsequence: [ . flag( " -emit-const-values-path " ) , . path( . absolute( . init( " /tmp/foo.build/baz.swiftconstvalues " ) ) ) ] ) )
1140+ XCTAssertEqual ( plannedJobs [ 2 ] . kind, . link)
1141+ }
1142+
1143+ do { // WMO
1144+ var driver = try Driver ( args: [ " swiftc " , " foo.swift " , " bar.swift " , " baz.swift " ,
1145+ " -whole-module-optimization " ,
1146+ " -module-name " , " Foo " , " -emit-const-values " ] )
1147+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1148+ XCTAssertEqual ( plannedJobs. count, 2 )
1149+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1150+ XCTAssertEqual ( plannedJobs [ 0 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 1 )
1151+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
1152+ }
1153+
1154+ try withTemporaryFile { fileMapFile in // WMO with output-file-map
1155+ let outputMapContents = """
1156+ {
1157+ " " : {
1158+ " const-values " : " /tmp/foo.build/foo.master.swiftconstvalues "
1159+ },
1160+ " foo.swift " : {
1161+ " object " : " /tmp/foo.build/foo.swift.o " ,
1162+ " const-values " : " /tmp/foo.build/foo.swiftconstvalues "
1163+ },
1164+ " bar.swift " : {
1165+ " object " : " /tmp/foo.build/bar.swift.o " ,
1166+ " const-values " : " /tmp/foo.build/bar.swiftconstvalues "
1167+ },
1168+ " baz.swift " : {
1169+ " object " : " /tmp/foo.build/baz.swift.o " ,
1170+ " const-values " : " /tmp/foo.build/baz.swiftconstvalues "
1171+ }
1172+ }
1173+ """
1174+ try localFileSystem. writeFileContents ( fileMapFile. path) { $0 <<< outputMapContents }
1175+ var driver = try Driver ( args: [ " swiftc " , " foo.swift " , " bar.swift " , " baz.swift " ,
1176+ " -whole-module-optimization " ,
1177+ " -module-name " , " Foo " , " -emit-const-values " ,
1178+ " -output-file-map " , fileMapFile. path. description] )
1179+ let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1180+ XCTAssertEqual ( plannedJobs. count, 2 )
1181+ XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1182+ XCTAssertEqual ( plannedJobs [ 0 ] . outputs. first ( where: { $0. type == . swiftConstValues } ) ? . file,
1183+ . absolute( . init( " /tmp/foo.build/foo.master.swiftconstvalues " ) ) )
1184+ XCTAssertEqual ( plannedJobs [ 1 ] . kind, . link)
1185+ }
1186+ }
1187+
10501188 func testEmitModuleSepratelyEmittingDiagnosticsWithOutputFileMap( ) throws {
10511189 try withTemporaryDirectory { path in
10521190 let outputFileMap = path. appending ( component: " outputFileMap.json " )
0 commit comments