@@ -1047,6 +1047,144 @@ final class SwiftDriverTests: XCTestCase {
1047
1047
XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( . flag( " -serialize-diagnostics-path " ) ) )
1048
1048
}
1049
1049
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
+
1050
1188
func testEmitModuleSepratelyEmittingDiagnosticsWithOutputFileMap( ) throws {
1051
1189
try withTemporaryDirectory { path in
1052
1190
let outputFileMap = path. appending ( component: " outputFileMap.json " )
0 commit comments