@@ -1420,6 +1420,7 @@ final class ExplicitModuleBuildTests: XCTestCase {
1420
1420
throw XCTSkip ( " libSwiftScan does not support diagnostics query. " )
1421
1421
}
1422
1422
1423
+ // Missing Swift Interface dependency
1423
1424
try withTemporaryDirectory { path in
1424
1425
let main = path. appending ( component: " testDependencyScanning.swift " )
1425
1426
try localFileSystem. writeFileContents ( main, bytes: " import S; " )
@@ -1462,8 +1463,22 @@ final class ExplicitModuleBuildTests: XCTestCase {
1462
1463
XCTAssertEqual ( potentialDiags? . count, 5 )
1463
1464
let diags = try XCTUnwrap ( potentialDiags)
1464
1465
let error = diags [ 0 ]
1465
- XCTAssertEqual ( error. message, " Unable to find module dependency: 'unknown_module' " )
1466
1466
XCTAssertEqual ( error. severity, . error)
1467
+ if try dependencyOracle. supportsDiagnosticSourceLocations ( ) {
1468
+ XCTAssertEqual ( error. message,
1469
+ """
1470
+ Unable to find module dependency: 'unknown_module'
1471
+ import unknown_module
1472
+ ^
1473
+
1474
+ """ )
1475
+ let sourceLoc = try XCTUnwrap ( error. sourceLocation)
1476
+ XCTAssertTrue ( sourceLoc. bufferIdentifier. hasSuffix ( " I.swiftinterface " ) )
1477
+ XCTAssertEqual ( sourceLoc. lineNumber, 3 )
1478
+ XCTAssertEqual ( sourceLoc. columnNumber, 8 )
1479
+ } else {
1480
+ XCTAssertEqual ( error. message, " Unable to find module dependency: 'unknown_module' " )
1481
+ }
1467
1482
let noteI = diags [ 1 ]
1468
1483
XCTAssertTrue ( noteI. message. starts ( with: " a dependency of Swift module 'I': " ) )
1469
1484
XCTAssertEqual ( noteI. severity, . note)
@@ -1474,7 +1489,85 @@ final class ExplicitModuleBuildTests: XCTestCase {
1474
1489
XCTAssertTrue ( noteS. message. starts ( with: " a dependency of Swift module 'S': " ) )
1475
1490
XCTAssertEqual ( noteS. severity, . note)
1476
1491
let noteTest = diags [ 4 ]
1477
- XCTAssertEqual ( noteTest. message, " a dependency of main module 'testDependencyScanning' " )
1492
+ if try dependencyOracle. supportsDiagnosticSourceLocations ( ) {
1493
+ XCTAssertEqual ( noteTest. message,
1494
+ """
1495
+ a dependency of main module 'testDependencyScanning'
1496
+ import unknown_module
1497
+ ^
1498
+
1499
+ """
1500
+ )
1501
+ } else {
1502
+ XCTAssertEqual ( noteTest. message, " a dependency of main module 'testDependencyScanning' " )
1503
+ }
1504
+ XCTAssertEqual ( noteTest. severity, . note)
1505
+ }
1506
+
1507
+ // Missing main module dependency
1508
+ try withTemporaryDirectory { path in
1509
+ let main = path. appending ( component: " testDependencyScanning.swift " )
1510
+ try localFileSystem. writeFileContents ( main, bytes: " import FooBar " )
1511
+ let sdkArgumentsForTesting = ( try ? Driver . sdkArgumentsForTesting ( ) ) ?? [ ]
1512
+ var driver = try Driver ( args: [ " swiftc " ,
1513
+ " -I " , stdlibPath. nativePathString ( escaped: true ) ,
1514
+ " -I " , shimsPath. nativePathString ( escaped: true ) ,
1515
+ " -explicit-module-build " ,
1516
+ " -working-directory " , path. nativePathString ( escaped: true ) ,
1517
+ " -disable-clang-target " ,
1518
+ main. nativePathString ( escaped: true ) ] + sdkArgumentsForTesting,
1519
+ env: ProcessEnv . vars)
1520
+ let resolver = try ArgsResolver ( fileSystem: localFileSystem)
1521
+ var scannerCommand = try driver. dependencyScannerInvocationCommand ( ) . 1 . map { try resolver. resolve ( $0) }
1522
+ if scannerCommand. first == " -frontend " {
1523
+ scannerCommand. removeFirst ( )
1524
+ }
1525
+ var scanDiagnostics : [ ScannerDiagnosticPayload ] = [ ]
1526
+ let _ =
1527
+ try dependencyOracle. getDependencies ( workingDirectory: path,
1528
+ commandLine: scannerCommand,
1529
+ diagnostics: & scanDiagnostics)
1530
+ let potentialDiags : [ ScannerDiagnosticPayload ] ?
1531
+ if try dependencyOracle. supportsPerScanDiagnostics ( ) {
1532
+ potentialDiags = scanDiagnostics
1533
+ print ( " Using Per-Scan diagnostics " )
1534
+ } else {
1535
+ potentialDiags = try dependencyOracle. getScannerDiagnostics ( )
1536
+ print ( " Using Scanner-Global diagnostics " )
1537
+ }
1538
+ XCTAssertEqual ( potentialDiags? . count, 2 )
1539
+ let diags = try XCTUnwrap ( potentialDiags)
1540
+ let error = diags [ 0 ]
1541
+ XCTAssertEqual ( error. severity, . error)
1542
+ if try dependencyOracle. supportsDiagnosticSourceLocations ( ) {
1543
+ XCTAssertEqual ( error. message,
1544
+ """
1545
+ Unable to find module dependency: 'FooBar'
1546
+ import FooBar
1547
+ ^
1548
+
1549
+ """ )
1550
+
1551
+ let sourceLoc = try XCTUnwrap ( error. sourceLocation)
1552
+ XCTAssertTrue ( sourceLoc. bufferIdentifier. hasSuffix ( " testDependencyScanning.swift " ) )
1553
+ XCTAssertEqual ( sourceLoc. lineNumber, 1 )
1554
+ XCTAssertEqual ( sourceLoc. columnNumber, 8 )
1555
+ } else {
1556
+ XCTAssertEqual ( error. message, " Unable to find module dependency: 'FooBar' " )
1557
+ }
1558
+ let noteTest = diags [ 1 ]
1559
+ if try dependencyOracle. supportsDiagnosticSourceLocations ( ) {
1560
+ XCTAssertEqual ( noteTest. message,
1561
+ """
1562
+ a dependency of main module 'testDependencyScanning'
1563
+ import FooBar
1564
+ ^
1565
+
1566
+ """
1567
+ )
1568
+ } else {
1569
+ XCTAssertEqual ( noteTest. message, " a dependency of main module 'testDependencyScanning' " )
1570
+ }
1478
1571
XCTAssertEqual ( noteTest. severity, . note)
1479
1572
}
1480
1573
}
0 commit comments