Skip to content

Commit f0518f6

Browse files
committed
[Dependency Scanning] Add a field of source-imported dependencies
For the main source module, provide info on which dependencies are directly imported into the user program, explicitly ('import' statement) or implicitly (e.g. stdlib). Thist list does not include Swift overlay dependencies, cross-import dependencies, bridging header dependencies.
1 parent e9b21cf commit f0518f6

File tree

12 files changed

+82
-0
lines changed

12 files changed

+82
-0
lines changed

include/swift-c/DependencyScan/DependencyScan.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,10 @@ SWIFTSCAN_PUBLIC swiftscan_string_set_t *
212212
swiftscan_swift_textual_detail_get_swift_overlay_dependencies(
213213
swiftscan_module_details_t details);
214214

215+
SWIFTSCAN_PUBLIC swiftscan_string_set_t *
216+
swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies(
217+
swiftscan_module_details_t details);
218+
215219
SWIFTSCAN_PUBLIC swiftscan_string_ref_t
216220
swiftscan_swift_textual_detail_get_cas_fs_root_id(
217221
swiftscan_module_details_t details);

include/swift/DependencyScan/DependencyScanImpl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ typedef struct {
102102
/// Clang module dependencies
103103
swiftscan_string_set_t *swift_overlay_module_dependencies;
104104

105+
/// Directly-imported in source module dependencies
106+
swiftscan_string_set_t *source_import_module_dependencies;
107+
105108
/// Options to the compile command required to build this module interface
106109
swiftscan_string_set_t *command_line;
107110

lib/DependencyScan/DependencyScanJSON.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,9 @@ void writeJSON(llvm::raw_ostream &out,
424424
bool hasOverlayDependencies =
425425
swiftTextualDeps->swift_overlay_module_dependencies &&
426426
swiftTextualDeps->swift_overlay_module_dependencies->count > 0;
427+
bool hasSourceImportedDependencies =
428+
swiftTextualDeps->source_import_module_dependencies &&
429+
swiftTextualDeps->source_import_module_dependencies->count > 0;
427430
bool commaAfterBridgingHeaderPath = hasOverlayDependencies;
428431
bool commaAfterFramework =
429432
hasBridgingHeader || commaAfterBridgingHeaderPath;
@@ -448,6 +451,11 @@ void writeJSON(llvm::raw_ostream &out,
448451
/*trailingComma=*/true);
449452
writeMacroDependencies(out, swiftTextualDeps->macro_dependencies, 5,
450453
/*trailingComma=*/true);
454+
if (hasSourceImportedDependencies) {
455+
writeDependencies(out, swiftTextualDeps->source_import_module_dependencies,
456+
"sourceImportedDependencies", 5,
457+
/*trailingComma=*/true);
458+
}
451459
writeJSONSingleField(out, "isFramework", swiftTextualDeps->is_framework,
452460
5, commaAfterFramework);
453461
/// Bridging header and its source file dependencies, if any.

lib/DependencyScan/DependencyScanningTool.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ static swiftscan_dependency_graph_t generateHollowDiagnosticOutput(
222222
c_string_utils::create_empty_set(),
223223
c_string_utils::create_empty_set(),
224224
c_string_utils::create_empty_set(),
225+
c_string_utils::create_empty_set(),
225226
c_string_utils::create_null(),
226227
false,
227228
false,

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,7 @@ generateFullDependencyGraph(const CompilerInstance &instance,
786786
swiftTextualDeps->textualModuleDetails.bridgingSourceFiles),
787787
create_set(clangHeaderDependencyNames),
788788
create_set(bridgedOverlayDependencyNames),
789+
/*sourceImportedDependencies*/ create_set({}),
789790
create_set(swiftTextualDeps->textualModuleDetails.buildCommandLine),
790791
/*bridgingHeaderBuildCommand*/ create_set({}),
791792
create_clone(swiftTextualDeps->contextHash.c_str()),
@@ -813,12 +814,25 @@ generateFullDependencyGraph(const CompilerInstance &instance,
813814
bridgeDependencyIDs(swiftSourceDeps->swiftOverlayDependencies,
814815
bridgedOverlayDependencyNames);
815816

817+
// Create a set of directly-source-imported dependencies
818+
std::vector<ModuleDependencyID> sourceImportDependencies;
819+
std::copy(swiftSourceDeps->importedSwiftModules.begin(),
820+
swiftSourceDeps->importedSwiftModules.end(),
821+
std::back_inserter(sourceImportDependencies));
822+
std::copy(swiftSourceDeps->importedClangModules.begin(),
823+
swiftSourceDeps->importedClangModules.end(),
824+
std::back_inserter(sourceImportDependencies));
825+
std::vector<std::string> bridgedSourceImportedDependencyNames;
826+
bridgeDependencyIDs(sourceImportDependencies,
827+
bridgedSourceImportedDependencyNames);
828+
816829
details->swift_textual_details = {
817830
moduleInterfacePath, create_empty_set(), bridgingHeaderPath,
818831
create_set(
819832
swiftSourceDeps->textualModuleDetails.bridgingSourceFiles),
820833
create_set(clangHeaderDependencyNames),
821834
create_set(bridgedOverlayDependencyNames),
835+
create_set(bridgedSourceImportedDependencyNames),
822836
create_set(swiftSourceDeps->textualModuleDetails.buildCommandLine),
823837
create_set(swiftSourceDeps->bridgingHeaderBuildCommandLine),
824838
/*contextHash*/

lib/Tooling/libSwiftScan/libSwiftScan.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ void swiftscan_dependency_info_details_dispose(
6161
details_impl->swift_textual_details.bridging_module_dependencies);
6262
swiftscan_string_set_dispose(
6363
details_impl->swift_textual_details.swift_overlay_module_dependencies);
64+
swiftscan_string_set_dispose(
65+
details_impl->swift_textual_details.source_import_module_dependencies);
6466
swiftscan_string_set_dispose(
6567
details_impl->swift_textual_details.command_line);
6668
swiftscan_string_dispose(details_impl->swift_textual_details.context_hash);
@@ -326,6 +328,11 @@ swiftscan_string_set_t *swiftscan_swift_textual_detail_get_swift_overlay_depende
326328
return details->swift_textual_details.swift_overlay_module_dependencies;
327329
}
328330

331+
swiftscan_string_set_t *swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies(
332+
swiftscan_module_details_t details) {
333+
return details->swift_textual_details.source_import_module_dependencies;
334+
}
335+
329336
swiftscan_string_ref_t swiftscan_swift_textual_detail_get_cas_fs_root_id(
330337
swiftscan_module_details_t details) {
331338
return details->swift_textual_details.cas_fs_root_id;

lib/Tooling/libSwiftScan/libSwiftScan.exports

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ swiftscan_swift_textual_detail_get_bridging_pch_command_line
2222
swiftscan_swift_textual_detail_get_context_hash
2323
swiftscan_swift_textual_detail_get_is_framework
2424
swiftscan_swift_textual_detail_get_swift_overlay_dependencies
25+
swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies
2526
swiftscan_swift_textual_detail_get_cas_fs_root_id
2627
swiftscan_swift_textual_detail_get_module_cache_key
2728
swiftscan_swift_textual_detail_get_user_module_version

test/ModuleInterface/clang-args-transitive-availability.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import ImportsMacroSpecificClangModule
1616
// CHECK-DAG: "swift": "Swift"
1717
// CHECK-DAG: "swift": "SwiftOnoneSupport"
1818

19+
// Additional occurence in source-imported dependencies field
20+
//CHECK: "swift": "ImportsMacroSpecificClangModule"
21+
1922
//CHECK: "swift": "ImportsMacroSpecificClangModule"
2023
//CHECK-NEXT: },
2124
//CHECK-NEXT: {

test/ModuleInterface/clang-session-transitive.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import TestModule
1616
// CHECK-DAG: "swift": "Swift"
1717
// CHECK-DAG: "swift": "SwiftOnoneSupport"
1818

19+
// Additional occurence in source-imported dependencies field
20+
// CHECK: "swift": "TestModule"
21+
1922
// CHECK: "swift": "TestModule"
2023
// CHECK-NEXT: },
2124
// CHECK-NEXT: {

test/ModuleInterface/extension-transitive-availability.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ func foo() {
1717
// CHECK-DAG: "swift": "Swift"
1818
// CHECK-DAG: "swift": "SwiftOnoneSupport"
1919

20+
// Additional occurence in source-imported dependencies field
21+
// CHECK: "swift": "ExtensionAvailable"
22+
2023
// CHECK: "swift": "ExtensionAvailable"
2124
// CHECK-NEXT: },
2225
// CHECK-NEXT: {

test/ScanDependencies/binary_framework_dependency.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,15 @@
1515

1616
import Foo
1717

18+
// Appears as a dependency of the main module
1819
// CHECK: "swiftPrebuiltExternal": "Foo"
20+
21+
// Appears as, specifically, a source-imported dependency of the main module
22+
// CHECK: "swiftPrebuiltExternal": "Foo"
23+
24+
// Actual node in the dependency graph for module 'Foo'
1925
// CHECK: "swiftPrebuiltExternal": "Foo"
26+
2027
// CHECK-NEXT: },
2128
// CHECK-NEXT: {
2229
// CHECK-NEXT: "modulePath":
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %empty-directory(%t/module-cache)
3+
// RUN: %target-swift-frontend -scan-dependencies -module-cache-path %t/module-cache %s -o %t/deps.json -I %S/Inputs/CHeaders -I %S/Inputs/Swift -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import
4+
// Check the contents of the JSON output
5+
// RUN: %validate-json %t/deps.json | %FileCheck %s
6+
7+
// Ensure that round-trip serialization does not affect result
8+
// RUN: %target-swift-frontend -scan-dependencies -test-dependency-scan-cache-serialization -module-cache-path %t/module-cache %s -o %t/deps.json -I %S/Inputs/CHeaders -I %S/Inputs/Swift -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import
9+
// RUN: %validate-json %t/deps.json | %FileCheck %s
10+
11+
// REQUIRES: executable_test
12+
// REQUIRES: objc_interop
13+
14+
import C
15+
16+
// CHECK: "sourceImportedDependencies": [
17+
// CHECK-NEXT: {
18+
// CHECK-DAG: "swift": "Swift"
19+
// CHECK-DAG: "swift": "SwiftOnoneSupport"
20+
// CHECK-DAG: "clang": "C"
21+
// CHECK-NEXT: }
22+
// CHECK-NEXT: ]
23+
24+
// CHECK: "swiftOverlayDependencies": [
25+
// CHECK-NEXT: {
26+
// CHECK-NEXT: "swift": "A"
27+
// CHECK-NEXT: }
28+
// CHECK-NEXT: ]

0 commit comments

Comments
 (0)