diff --git a/include/swift-c/DependencyScan/DependencyScan.h b/include/swift-c/DependencyScan/DependencyScan.h index b558643cbb8..93a9ec2bdc3 100644 --- a/include/swift-c/DependencyScan/DependencyScan.h +++ b/include/swift-c/DependencyScan/DependencyScan.h @@ -212,6 +212,10 @@ SWIFTSCAN_PUBLIC swiftscan_string_set_t * swiftscan_swift_textual_detail_get_swift_overlay_dependencies( swiftscan_module_details_t details); +SWIFTSCAN_PUBLIC swiftscan_string_set_t * +swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies( +swiftscan_module_details_t details); + SWIFTSCAN_PUBLIC swiftscan_string_ref_t swiftscan_swift_textual_detail_get_cas_fs_root_id( swiftscan_module_details_t details); diff --git a/include/swift/DependencyScan/DependencyScanImpl.h b/include/swift/DependencyScan/DependencyScanImpl.h index c5507ea7c73..66f95615269 100644 --- a/include/swift/DependencyScan/DependencyScanImpl.h +++ b/include/swift/DependencyScan/DependencyScanImpl.h @@ -102,6 +102,9 @@ typedef struct { /// Clang module dependencies swiftscan_string_set_t *swift_overlay_module_dependencies; + /// Directly-imported in source module dependencies + swiftscan_string_set_t *source_import_module_dependencies; + /// Options to the compile command required to build this module interface swiftscan_string_set_t *command_line; diff --git a/lib/DependencyScan/DependencyScanJSON.cpp b/lib/DependencyScan/DependencyScanJSON.cpp index 4df34e39690..b41efc6883c 100644 --- a/lib/DependencyScan/DependencyScanJSON.cpp +++ b/lib/DependencyScan/DependencyScanJSON.cpp @@ -424,6 +424,9 @@ void writeJSON(llvm::raw_ostream &out, bool hasOverlayDependencies = swiftTextualDeps->swift_overlay_module_dependencies && swiftTextualDeps->swift_overlay_module_dependencies->count > 0; + bool hasSourceImportedDependencies = + swiftTextualDeps->source_import_module_dependencies && + swiftTextualDeps->source_import_module_dependencies->count > 0; bool commaAfterBridgingHeaderPath = hasOverlayDependencies; bool commaAfterFramework = hasBridgingHeader || commaAfterBridgingHeaderPath; @@ -448,6 +451,11 @@ void writeJSON(llvm::raw_ostream &out, /*trailingComma=*/true); writeMacroDependencies(out, swiftTextualDeps->macro_dependencies, 5, /*trailingComma=*/true); + if (hasSourceImportedDependencies) { + writeDependencies(out, swiftTextualDeps->source_import_module_dependencies, + "sourceImportedDependencies", 5, + /*trailingComma=*/true); + } writeJSONSingleField(out, "isFramework", swiftTextualDeps->is_framework, 5, commaAfterFramework); /// Bridging header and its source file dependencies, if any. diff --git a/lib/DependencyScan/DependencyScanningTool.cpp b/lib/DependencyScan/DependencyScanningTool.cpp index 982cf77c7d9..f83d1f68175 100644 --- a/lib/DependencyScan/DependencyScanningTool.cpp +++ b/lib/DependencyScan/DependencyScanningTool.cpp @@ -222,6 +222,7 @@ static swiftscan_dependency_graph_t generateHollowDiagnosticOutput( c_string_utils::create_empty_set(), c_string_utils::create_empty_set(), c_string_utils::create_empty_set(), + c_string_utils::create_empty_set(), c_string_utils::create_null(), false, false, diff --git a/lib/DependencyScan/ScanDependencies.cpp b/lib/DependencyScan/ScanDependencies.cpp index d13e926e8a8..4f185bd4261 100644 --- a/lib/DependencyScan/ScanDependencies.cpp +++ b/lib/DependencyScan/ScanDependencies.cpp @@ -786,6 +786,7 @@ generateFullDependencyGraph(const CompilerInstance &instance, swiftTextualDeps->textualModuleDetails.bridgingSourceFiles), create_set(clangHeaderDependencyNames), create_set(bridgedOverlayDependencyNames), + /*sourceImportedDependencies*/ create_set({}), create_set(swiftTextualDeps->textualModuleDetails.buildCommandLine), /*bridgingHeaderBuildCommand*/ create_set({}), create_clone(swiftTextualDeps->contextHash.c_str()), @@ -813,12 +814,25 @@ generateFullDependencyGraph(const CompilerInstance &instance, bridgeDependencyIDs(swiftSourceDeps->swiftOverlayDependencies, bridgedOverlayDependencyNames); + // Create a set of directly-source-imported dependencies + std::vector sourceImportDependencies; + std::copy(swiftSourceDeps->importedSwiftModules.begin(), + swiftSourceDeps->importedSwiftModules.end(), + std::back_inserter(sourceImportDependencies)); + std::copy(swiftSourceDeps->importedClangModules.begin(), + swiftSourceDeps->importedClangModules.end(), + std::back_inserter(sourceImportDependencies)); + std::vector bridgedSourceImportedDependencyNames; + bridgeDependencyIDs(sourceImportDependencies, + bridgedSourceImportedDependencyNames); + details->swift_textual_details = { moduleInterfacePath, create_empty_set(), bridgingHeaderPath, create_set( swiftSourceDeps->textualModuleDetails.bridgingSourceFiles), create_set(clangHeaderDependencyNames), create_set(bridgedOverlayDependencyNames), + create_set(bridgedSourceImportedDependencyNames), create_set(swiftSourceDeps->textualModuleDetails.buildCommandLine), create_set(swiftSourceDeps->bridgingHeaderBuildCommandLine), /*contextHash*/ diff --git a/lib/Tooling/libSwiftScan/libSwiftScan.cpp b/lib/Tooling/libSwiftScan/libSwiftScan.cpp index 18f1e625de6..dec94b2b101 100644 --- a/lib/Tooling/libSwiftScan/libSwiftScan.cpp +++ b/lib/Tooling/libSwiftScan/libSwiftScan.cpp @@ -61,6 +61,8 @@ void swiftscan_dependency_info_details_dispose( details_impl->swift_textual_details.bridging_module_dependencies); swiftscan_string_set_dispose( details_impl->swift_textual_details.swift_overlay_module_dependencies); + swiftscan_string_set_dispose( + details_impl->swift_textual_details.source_import_module_dependencies); swiftscan_string_set_dispose( details_impl->swift_textual_details.command_line); 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 return details->swift_textual_details.swift_overlay_module_dependencies; } +swiftscan_string_set_t *swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies( + swiftscan_module_details_t details) { + return details->swift_textual_details.source_import_module_dependencies; +} + swiftscan_string_ref_t swiftscan_swift_textual_detail_get_cas_fs_root_id( swiftscan_module_details_t details) { return details->swift_textual_details.cas_fs_root_id; diff --git a/lib/Tooling/libSwiftScan/libSwiftScan.exports b/lib/Tooling/libSwiftScan/libSwiftScan.exports index a606b97eb5a..540c0d723ba 100644 --- a/lib/Tooling/libSwiftScan/libSwiftScan.exports +++ b/lib/Tooling/libSwiftScan/libSwiftScan.exports @@ -22,6 +22,7 @@ swiftscan_swift_textual_detail_get_bridging_pch_command_line swiftscan_swift_textual_detail_get_context_hash swiftscan_swift_textual_detail_get_is_framework swiftscan_swift_textual_detail_get_swift_overlay_dependencies +swiftscan_swift_textual_detail_get_swift_source_import_module_dependencies swiftscan_swift_textual_detail_get_cas_fs_root_id swiftscan_swift_textual_detail_get_module_cache_key swiftscan_swift_textual_detail_get_user_module_version diff --git a/test/ModuleInterface/clang-args-transitive-availability.swift b/test/ModuleInterface/clang-args-transitive-availability.swift index 267f707cce4..93a507345c4 100644 --- a/test/ModuleInterface/clang-args-transitive-availability.swift +++ b/test/ModuleInterface/clang-args-transitive-availability.swift @@ -16,6 +16,9 @@ import ImportsMacroSpecificClangModule // CHECK-DAG: "swift": "Swift" // CHECK-DAG: "swift": "SwiftOnoneSupport" +// Additional occurence in source-imported dependencies field +//CHECK: "swift": "ImportsMacroSpecificClangModule" + //CHECK: "swift": "ImportsMacroSpecificClangModule" //CHECK-NEXT: }, //CHECK-NEXT: { diff --git a/test/ModuleInterface/clang-session-transitive.swift b/test/ModuleInterface/clang-session-transitive.swift index a1f2f27640a..7f37e7e8759 100644 --- a/test/ModuleInterface/clang-session-transitive.swift +++ b/test/ModuleInterface/clang-session-transitive.swift @@ -16,6 +16,9 @@ import TestModule // CHECK-DAG: "swift": "Swift" // CHECK-DAG: "swift": "SwiftOnoneSupport" +// Additional occurence in source-imported dependencies field + // CHECK: "swift": "TestModule" + // CHECK: "swift": "TestModule" // CHECK-NEXT: }, // CHECK-NEXT: { diff --git a/test/ModuleInterface/extension-transitive-availability.swift b/test/ModuleInterface/extension-transitive-availability.swift index 201a74dafb6..dda66181d1b 100644 --- a/test/ModuleInterface/extension-transitive-availability.swift +++ b/test/ModuleInterface/extension-transitive-availability.swift @@ -17,6 +17,9 @@ func foo() { // CHECK-DAG: "swift": "Swift" // CHECK-DAG: "swift": "SwiftOnoneSupport" +// Additional occurence in source-imported dependencies field +// CHECK: "swift": "ExtensionAvailable" + // CHECK: "swift": "ExtensionAvailable" // CHECK-NEXT: }, // CHECK-NEXT: { diff --git a/test/ScanDependencies/binary_framework_dependency.swift b/test/ScanDependencies/binary_framework_dependency.swift index 23d88865337..fc759da4534 100644 --- a/test/ScanDependencies/binary_framework_dependency.swift +++ b/test/ScanDependencies/binary_framework_dependency.swift @@ -15,8 +15,15 @@ import Foo +// Appears as a dependency of the main module // CHECK: "swiftPrebuiltExternal": "Foo" + +// Appears as, specifically, a source-imported dependency of the main module // CHECK: "swiftPrebuiltExternal": "Foo" + +// Actual node in the dependency graph for module 'Foo' +// CHECK: "swiftPrebuiltExternal": "Foo" + // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "modulePath": diff --git a/test/ScanDependencies/source_imports_only.swift b/test/ScanDependencies/source_imports_only.swift new file mode 100644 index 00000000000..97fbf29c763 --- /dev/null +++ b/test/ScanDependencies/source_imports_only.swift @@ -0,0 +1,28 @@ +// RUN: %empty-directory(%t) +// RUN: %empty-directory(%t/module-cache) +// 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 +// Check the contents of the JSON output +// RUN: %validate-json %t/deps.json | %FileCheck %s + +// Ensure that round-trip serialization does not affect result +// 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 +// RUN: %validate-json %t/deps.json | %FileCheck %s + +// REQUIRES: executable_test +// REQUIRES: objc_interop + +import C + +// CHECK: "sourceImportedDependencies": [ +// CHECK-NEXT: { +// CHECK-DAG: "swift": "Swift" +// CHECK-DAG: "swift": "SwiftOnoneSupport" +// CHECK-DAG: "clang": "C" +// CHECK-NEXT: } +// CHECK-NEXT: ] + +// CHECK: "swiftOverlayDependencies": [ +// CHECK-NEXT: { +// CHECK-NEXT: "swift": "A" +// CHECK-NEXT: } +// CHECK-NEXT: ]