[swift] Consider swift bridge_header as a source file The target that builds .swift files may use an optional bridge header. This header is used to import Objective-C types in Swift when modules are not used (which Chromium currently does not support). As this header may include any file from the project, it needs to be considered as a source file (it cannot be listed in sources directly as mixed languages is not supported for .swift files). This fixes `gn check` for the target that uses .swift with a bridge header (which happens in Chromium). Bug: 305 Change-Id: Iac64c88258302b4f39d8feafc5eb020cfea8efa8 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/14660 Commit-Queue: Sylvain Defresne <sdefresne@chromium.org> Reviewed-by: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/header_checker.cc b/src/gn/header_checker.cc index 8d2d313..7bad781 100644 --- a/src/gn/header_checker.cc +++ b/src/gn/header_checker.cc
@@ -214,6 +214,16 @@ files_to_public[source].is_public = default_public; } + // If the target includes some .swift files, it may also use a header file + // to provide bridging Objective-C code. This header needs to be considered + // as a source file with the default visibility. + if (target->has_swift_values()) { + const SourceFile& bridge_header = target->swift_values().bridge_header(); + if (!bridge_header.is_null()) { + files_to_public[bridge_header].is_public = default_public; + } + } + // Add in the public files, forcing them to public. This may overwrite some // entries, and it may add new ones. if (default_public) // List only used when default is not public.
diff --git a/src/gn/header_checker.h b/src/gn/header_checker.h index d4d2f9f..55c9259 100644 --- a/src/gn/header_checker.h +++ b/src/gn/header_checker.h
@@ -77,6 +77,8 @@ FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, SourceFileForInclude); FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, SourceFileForInclude_FileNotFound); + FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, + SourceFileForInclude_SwiftBridgeHeader); FRIEND_TEST_ALL_PREFIXES(HeaderCheckerTest, Friend); ~HeaderChecker();
diff --git a/src/gn/header_checker_unittest.cc b/src/gn/header_checker_unittest.cc index a290d45..2a168fd 100644 --- a/src/gn/header_checker_unittest.cc +++ b/src/gn/header_checker_unittest.cc
@@ -391,6 +391,16 @@ EXPECT_FALSE(err.has_error()); } +TEST_F(HeaderCheckerTest, SourceFileForInclude_SwiftBridgeHeader) { + const SourceFile bridge_header("//a/bridge_header.h"); + a_.swift_values().bridge_header() = bridge_header; + auto checker = CreateChecker(); + + HeaderChecker::FileMap file_map; + checker->AddTargetToFileMap(&a_, &file_map); + EXPECT_NE(file_map.find(bridge_header), file_map.end()); +} + TEST_F(HeaderCheckerTest, Friend) { // Note: we have a public dependency chain A -> B -> C set up already. InputFile input_file(SourceFile("//some_file.cc"));