Skip to content

Commit 7cafffa

Browse files
committed
Start to add unit tests. This has found a few flaws that need to be resolved, marked by the TODOs or test failures.
1 parent dde29d6 commit 7cafffa

File tree

2 files changed

+226
-26
lines changed

2 files changed

+226
-26
lines changed
Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===--------------- GeneratePCHJob.swift - Swift Autolink Extract ----===//
1+
//===--------------- GeneratePCHJob.swift - Generate PCH Job ----===//
22
//
33
// This source file is part of the Swift.org open source project
44
//
@@ -14,30 +14,31 @@ import TSCBasic
1414
import TSCUtility
1515

1616
extension Driver {
17-
mutating func generatePCHJob(input: TypedVirtualPath) throws -> Job {
18-
var inputs = [TypedVirtualPath]()
19-
var outputs = [TypedVirtualPath]()
20-
21-
var commandLine: [Job.ArgTemplate] = swiftCompilerPrefixArgs.map { Job.ArgTemplate.flag($0) }
22-
23-
inputs.append(input)
24-
commandLine.appendPath(input.file)
25-
commandLine.appendFlag(.emitPch)
26-
27-
try addCommonFrontendOptions(commandLine: &commandLine)
28-
29-
if let outputDirectory = parsedOptions.getLastArgument(.pchOutputDir)?.asSingle {
30-
outputs.append(.init(file: try VirtualPath(path: outputDirectory), type: .pch))
31-
try commandLine.appendLast(.pchOutputDir, from: &parsedOptions)
32-
}
33-
34-
return Job(
35-
kind: .generatePCH,
36-
tool: .absolute(try toolchain.getToolPath(.swiftCompiler)),
37-
commandLine: commandLine,
38-
displayInputs: [],
39-
inputs: inputs,
40-
outputs: outputs
41-
)
17+
mutating func generatePCHJob(input: TypedVirtualPath) throws -> Job {
18+
var inputs = [TypedVirtualPath]()
19+
var outputs = [TypedVirtualPath]()
20+
21+
var commandLine: [Job.ArgTemplate] = swiftCompilerPrefixArgs.map { Job.ArgTemplate.flag($0) }
22+
23+
inputs.append(input)
24+
commandLine.appendPath(input.file)
25+
commandLine.appendFlag(.emitPch)
26+
27+
try addCommonFrontendOptions(commandLine: &commandLine)
28+
try commandLine.appendLast(.indexStorePath, from: &parsedOptions)
29+
30+
if let outputDirectory = parsedOptions.getLastArgument(.pchOutputDir)?.asSingle {
31+
outputs.append(.init(file: try VirtualPath(path: outputDirectory), type: .pch))
32+
try commandLine.appendLast(.pchOutputDir, from: &parsedOptions)
4233
}
34+
35+
return Job(
36+
kind: .generatePCH,
37+
tool: .absolute(try toolchain.getToolPath(.swiftCompiler)),
38+
commandLine: commandLine,
39+
displayInputs: [],
40+
inputs: inputs,
41+
outputs: outputs
42+
)
43+
}
4344
}

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,205 @@ final class SwiftDriverTests: XCTestCase {
11991199
let driver2 = try Driver(args: ["swift", "main.swift"], env: env)
12001200
XCTAssertNoThrow(try driver2.toolchain.getToolPath(.dsymutil))
12011201
}
1202+
1203+
func testPCHGeneration() throws {
1204+
do {
1205+
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
1206+
let plannedJobs = try driver.planBuild()
1207+
XCTAssertEqual(plannedJobs.count, 2)
1208+
1209+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1210+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1211+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1212+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1213+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1214+
// TODO check outputs for pch
1215+
1216+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1217+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1218+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1219+
XCTAssert(plannedJobs[1].commandLine.contains(.flag("-import-objc-header")))
1220+
// TODO check value of flag
1221+
}
1222+
// ^^^^^^^^^^^^^
1223+
// RUN: %target-build-swift -typecheck -driver-print-jobs -import-objc-header %S/Inputs/bridging-header.h %s 2>&1 | %FileCheck %s -check-prefix=YESPCHJOB
1224+
// YESPCHJOB: {{.*}}swift{{c?(\.exe)?"?}} -frontend {{.*}} -emit-pch -o {{.*}}bridging-header-{{.*}}.pch
1225+
// YESPCHJOB: {{.*}}swift{{c?(\.exe)?"?}} -frontend {{.*}} -import-objc-header {{.*}}bridging-header-{{.*}}.pch
1226+
1227+
do {
1228+
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
1229+
let plannedJobs = try driver.planBuild()
1230+
XCTAssertEqual(plannedJobs.count, 1)
1231+
1232+
XCTAssertEqual(plannedJobs[0].kind, .compile)
1233+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1234+
XCTAssertEqual(plannedJobs[0].inputs[0].file, try VirtualPath(path: "foo.swift"))
1235+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header")))
1236+
}
1237+
1238+
do {
1239+
var driver = try Driver(args: ["swiftc", "-typecheck", "-index-store-path", "idx", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
1240+
let plannedJobs = try driver.planBuild()
1241+
XCTAssertEqual(plannedJobs.count, 2)
1242+
1243+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1244+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1245+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1246+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1247+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1248+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-index-store-path")))
1249+
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "idx"))))
1250+
// TODO check outputs for pch
1251+
1252+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1253+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1254+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1255+
}
1256+
1257+
do {
1258+
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
1259+
let plannedJobs = try driver.planBuild()
1260+
XCTAssertEqual(plannedJobs.count, 2)
1261+
1262+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1263+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1264+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1265+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1266+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1267+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
1268+
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
1269+
// TODO check outputs for pch
1270+
1271+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1272+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1273+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1274+
XCTAssert(plannedJobs[1].commandLine.contains(.flag("-pch-disable-validation")))
1275+
}
1276+
1277+
do {
1278+
var driver = try Driver(args: ["swiftc", "-c", "-embed-bitcode", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
1279+
let plannedJobs = try driver.planBuild()
1280+
XCTAssertEqual(plannedJobs.count, 2)
1281+
1282+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1283+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1284+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1285+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1286+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1287+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
1288+
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
1289+
// TODO check outputs for pch
1290+
1291+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1292+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1293+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1294+
// FIXME: Verify llvm-bc as output
1295+
}
1296+
1297+
do {
1298+
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "foo.swift"])
1299+
let plannedJobs = try driver.planBuild()
1300+
XCTAssertEqual(plannedJobs.count, 1)
1301+
1302+
XCTAssertEqual(plannedJobs[0].kind, .compile)
1303+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1304+
XCTAssertEqual(plannedJobs[0].inputs[0].file, try VirtualPath(path: "foo.swift"))
1305+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header")))
1306+
XCTAssertFalse(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
1307+
}
1308+
1309+
do {
1310+
var driver = try Driver(args: ["swiftc", "-typecheck", "-disable-bridging-pch", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "-whole-module-optimization", "foo.swift"])
1311+
let plannedJobs = try driver.planBuild()
1312+
XCTAssertEqual(plannedJobs.count, 1)
1313+
1314+
XCTAssertEqual(plannedJobs[0].kind, .compile)
1315+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1316+
XCTAssertEqual(plannedJobs[0].inputs[0].file, try VirtualPath(path: "foo.swift"))
1317+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-import-objc-header")))
1318+
XCTAssertFalse(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
1319+
}
1320+
1321+
do {
1322+
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "-serialize-diagnostics", "foo.swift"])
1323+
let plannedJobs = try driver.planBuild()
1324+
XCTAssertEqual(plannedJobs.count, 2)
1325+
1326+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1327+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1328+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1329+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1330+
// TODO -serialize-diagnostics-path {{.*}}bridging-header-{{.*}}.dia{{"?}}
1331+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1332+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
1333+
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
1334+
// TODO check outputs for pch
1335+
1336+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1337+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1338+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1339+
XCTAssert(plannedJobs[1].commandLine.contains(.flag("-pch-disable-validation")))
1340+
}
1341+
1342+
do {
1343+
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "-serialize-diagnostics", "foo.swift", "-emit-module", "-emit-module-path", "/module-path-dir"])
1344+
let plannedJobs = try driver.planBuild()
1345+
XCTAssertEqual(plannedJobs.count, 2)
1346+
1347+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1348+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1349+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1350+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1351+
// TODO -serialize-diagnostics-path {{.*}}/pch/bridging-header-{{.*}}.dia{{"?}}
1352+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1353+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
1354+
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
1355+
// TODO check outputs for pch
1356+
1357+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1358+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1359+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1360+
XCTAssert(plannedJobs[1].commandLine.contains(.flag("-pch-disable-validation")))
1361+
}
1362+
1363+
do {
1364+
var driver = try Driver(args: ["swiftc", "-typecheck", "-import-objc-header", "TestInputHeader.h", "-pch-output-dir", "/pch", "-whole-module-optimization", "foo.swift"])
1365+
let plannedJobs = try driver.planBuild()
1366+
XCTAssertEqual(plannedJobs.count, 2)
1367+
1368+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1369+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1370+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1371+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1372+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1373+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-pch-output-dir")))
1374+
XCTAssert(plannedJobs[0].commandLine.contains(.path(try VirtualPath(path: "/pch"))))
1375+
// TODO check outputs for pch
1376+
1377+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1378+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1379+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1380+
XCTAssertFalse(plannedJobs[1].commandLine.contains(.flag("-pch-disable-validation")))
1381+
}
1382+
1383+
do {
1384+
var driver = try Driver(args: ["swiftc", "-typecheck", "-O", "-import-objc-header", "TestInputHeader.h", "foo.swift"])
1385+
let plannedJobs = try driver.planBuild()
1386+
XCTAssertEqual(plannedJobs.count, 2)
1387+
1388+
XCTAssertEqual(plannedJobs[0].kind, .generatePCH)
1389+
XCTAssertEqual(plannedJobs[0].inputs.count, 1)
1390+
XCTAssertEqual(plannedJobs[0].inputs[0].file, .relative(RelativePath("TestInputHeader.h")))
1391+
XCTAssertEqual(plannedJobs[0].inputs[0].type, .objcHeader)
1392+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-O")))
1393+
XCTAssert(plannedJobs[0].commandLine.contains(.flag("-emit-pch")))
1394+
// TODO check outputs for pch
1395+
1396+
XCTAssertEqual(plannedJobs[1].kind, .compile)
1397+
XCTAssertEqual(plannedJobs[1].inputs.count, 1)
1398+
XCTAssertEqual(plannedJobs[1].inputs[0].file, try VirtualPath(path: "foo.swift"))
1399+
}
1400+
}
12021401
}
12031402

12041403
func assertString(

0 commit comments

Comments
 (0)