Skip to content

Commit 8e914d7

Browse files
authored
Merge pull request swiftlang#74827 from swiftlang/elsh/no-pkg-name-interfaces
Option to disable printing package-name in public or private interface.
2 parents b9369bf + 87452c6 commit 8e914d7

File tree

6 files changed

+110
-1
lines changed

6 files changed

+110
-1
lines changed

include/swift/Frontend/ModuleInterfaceSupport.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ struct ModuleInterfaceOptions {
4747
/// back .swiftinterface and reconstructing .swiftmodule.
4848
std::string Flags;
4949

50+
/// Keep track of flags to be printed in package.swiftinterface only.
51+
/// If -disable-print-package-name-for-non-package-interface is passed,
52+
/// package-name flag should only be printed in package.swiftinterface.
53+
std::string FlagsForPackageOnly;
54+
5055
/// Flags that should be emitted to the .swiftinterface file but are OK to be
5156
/// ignored by the earlier version of the compiler.
5257
std::string IgnorableFlags;
@@ -62,6 +67,10 @@ struct ModuleInterfaceOptions {
6267
/// Print imports that are missing from the source and used in API.
6368
bool PrintMissingImports = true;
6469

70+
/// If true, package-name flag is not printed in either public or private
71+
/// interface file.
72+
bool DisablePackageNameForNonPackageInterface = false;
73+
6574
/// Intentionally print invalid syntax into the file.
6675
bool DebugPrintInvalidSyntax = false;
6776

include/swift/Option/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,11 @@ def disable_bridging_pch : Flag<["-"], "disable-bridging-pch">,
720720
Flags<[HelpHidden]>,
721721
HelpText<"Disable automatic generation of bridging PCH files">;
722722

723+
def disable_print_package_name_for_non_package_interface :
724+
Flag<["-"], "disable-print-package-name-for-non-package-interface">,
725+
Flags<[FrontendOption, NoDriverOption, ModuleInterfaceOption, HelpHidden]>,
726+
HelpText<"Disable adding package name to public or private interface">;
727+
723728
def lto : Joined<["-"], "lto=">,
724729
Flags<[FrontendOption, NoInteractiveOption]>,
725730
HelpText<"Specify the LTO type to either 'llvm-thin' or 'llvm-full'">;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ static void ParseModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
459459
Args.hasArg(OPT_debug_emit_invalid_swiftinterface_syntax);
460460
Opts.PrintMissingImports =
461461
!Args.hasArg(OPT_disable_print_missing_imports_in_module_interface);
462+
Opts.DisablePackageNameForNonPackageInterface |= Args.hasArg(OPT_disable_print_package_name_for_non_package_interface);
462463

463464
if (const Arg *A = Args.getLastArg(OPT_library_level)) {
464465
StringRef contents = A->getValue();
@@ -484,6 +485,13 @@ static bool ShouldIncludeModuleInterfaceArg(const Arg *A) {
484485
return true;
485486
}
486487

488+
static bool ShouldIncludeArgInPackageInterfaceOnly(const Arg *A,
489+
ArgList &Args) {
490+
return A->getOption().matches(options::OPT_package_name) &&
491+
Args.hasArg(
492+
options::OPT_disable_print_package_name_for_non_package_interface);
493+
}
494+
487495
/// Save a copy of any flags marked as ModuleInterfaceOption, if running
488496
/// in a mode that is going to emit a .swiftinterface file.
489497
static void SaveModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
@@ -492,8 +500,10 @@ static void SaveModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
492500
if (!FOpts.InputsAndOutputs.hasModuleInterfaceOutputPath())
493501
return;
494502
ArgStringList RenderedArgs;
503+
ArgStringList RenderedArgsForPackageOnly;
495504
ArgStringList RenderedArgsIgnorable;
496505
ArgStringList RenderedArgsIgnorablePrivate;
506+
497507
for (auto A : Args) {
498508
if (!ShouldIncludeModuleInterfaceArg(A))
499509
continue;
@@ -503,7 +513,10 @@ static void SaveModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
503513
} else if (A->getOption().hasFlag(options::ModuleInterfaceOptionIgnorable)) {
504514
A->render(Args, RenderedArgsIgnorable);
505515
} else if (A->getOption().hasFlag(options::ModuleInterfaceOption)) {
506-
A->render(Args, RenderedArgs);
516+
if (ShouldIncludeArgInPackageInterfaceOnly(A, Args))
517+
A->render(Args, RenderedArgsForPackageOnly);
518+
else
519+
A->render(Args, RenderedArgs);
507520
}
508521
}
509522
{
@@ -512,6 +525,13 @@ static void SaveModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
512525
[&](const char *Argument) { PrintArg(OS, Argument, StringRef()); },
513526
[&] { OS << " "; });
514527
}
528+
{
529+
llvm::raw_string_ostream OS(Opts.FlagsForPackageOnly);
530+
interleave(
531+
RenderedArgsForPackageOnly,
532+
[&](const char *Argument) { PrintArg(OS, Argument, StringRef()); },
533+
[&] { OS << " "; });
534+
}
515535
{
516536
llvm::raw_string_ostream OS(Opts.IgnorablePrivateFlags);
517537
interleave(RenderedArgsIgnorablePrivate,

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ static void printToolVersionAndFlagsComment(raw_ostream &out,
6363
out << "// " SWIFT_MODULE_FLAGS_KEY ": "
6464
<< Opts.Flags;
6565

66+
// Adding package-name can be disabled in non-package
67+
// swiftinterfaces; add only to package.swiftinterface
68+
// in such case.
69+
if (Opts.printPackageInterface() &&
70+
!Opts.FlagsForPackageOnly.empty())
71+
out << " " << Opts.FlagsForPackageOnly;
72+
6673
// Insert additional -module-alias flags
6774
if (Opts.AliasModuleNames) {
6875
StringRef moduleName = M->getNameStr();

lib/Sema/TypeCheckAttr.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,12 @@ bool AttributeChecker::visitAbstractAccessControlAttr(
10601060
D->getASTContext().LangOpts.PackageName.empty() &&
10611061
File && File->Kind != SourceFileKind::Interface) {
10621062
// `package` modifier used outside of a package.
1063+
// Error if a source file contains a package decl or `package import` but
1064+
// no package-name is passed.
1065+
// Note that if the file containing the package decl is a public (or private)
1066+
// interface file, the decl must be @usableFromInline (or "inlinable"),
1067+
// effectively getting "public" visibility; in such case, package-name is
1068+
// not needed, and typecheck on those decls are skipped.
10631069
diagnose(attr->getLocation(), diag::access_control_requires_package_name,
10641070
isa<ValueDecl>(D), D);
10651071
return true;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// RUN: %empty-directory(%t)
2+
3+
/// Do not print package-name for public or private interfaces
4+
// RUN: %target-build-swift -emit-module %s -I %t \
5+
// RUN: -module-name Bar -package-name foopkg \
6+
// RUN: -enable-library-evolution -swift-version 6 \
7+
// RUN: -package-name barpkg \
8+
// RUN: -Xfrontend -disable-print-package-name-for-non-package-interface \
9+
// RUN: -emit-module-interface-path %t/Bar.swiftinterface \
10+
// RUN: -emit-private-module-interface-path %t/Bar.private.swiftinterface \
11+
// RUN: -emit-package-module-interface-path %t/Bar.package.swiftinterface
12+
13+
// RUN: %FileCheck %s --check-prefix=CHECK-PUBLIC < %t/Bar.swiftinterface
14+
// RUN: %FileCheck %s --check-prefix=CHECK-PRIVATE < %t/Bar.private.swiftinterface
15+
// RUN: %FileCheck %s --check-prefix=CHECK-PACKAGE < %t/Bar.package.swiftinterface
16+
17+
// CHECK-PUBLIC-NOT: -package-name foopkg
18+
// CHECK-PUBLIC-NOT: -package-name barpkg
19+
// CHECK-PRIVATE-NOT: -package-name foopkg
20+
// CHECK-PRIVATE-NOT: -package-name barpkg
21+
// CHECK-PACKAGE-NOT: -package-name foopkg
22+
23+
// CHECK-PUBLIC: -enable-library-evolution -swift-version 6 -disable-print-package-name-for-non-package-interface -module-name Bar
24+
// CHECK-PRIVATE: -enable-library-evolution -swift-version 6 -disable-print-package-name-for-non-package-interface -module-name Bar
25+
// CHECK-PACKAGE: -enable-library-evolution -swift-version 6 -disable-print-package-name-for-non-package-interface -module-name Bar -package-name barpkg
26+
27+
/// Verify building modules from non-package interfaces succeeds without the package-name flag.
28+
// RUN: %target-swift-frontend -compile-module-from-interface %t/Bar.swiftinterface -o %t/Bar.swiftmodule -module-name Bar
29+
// RUN: rm -rf %t/Bar.swiftmodule
30+
// RUN: %target-swift-frontend -compile-module-from-interface %t/Bar.private.swiftinterface -o %t/Bar.swiftmodule -module-name Bar
31+
// RUN: rm -rf %t/Bar.swiftmodule
32+
// RUN: %target-swift-frontend -compile-module-from-interface %t/Bar.package.swiftinterface -o %t/Bar.swiftmodule -module-name Bar
33+
34+
// RUN: rm -rf %t/Bar.swiftmodule
35+
// RUN: rm -rf %t/Bar.swiftinterface
36+
// RUN: rm -rf %t/Bar.private.swiftinterface
37+
// RUN: rm -rf %t/Bar.package.swiftinterface
38+
39+
/// By default, -package-name is printed in all interfaces.
40+
// RUN: %target-build-swift -emit-module %s -I %t \
41+
// RUN: -module-name Bar -package-name barpkg \
42+
// RUN: -enable-library-evolution -swift-version 6 \
43+
// RUN: -emit-module-interface-path %t/Bar.swiftinterface \
44+
// RUN: -emit-private-module-interface-path %t/Bar.private.swiftinterface \
45+
// RUN: -emit-package-module-interface-path %t/Bar.package.swiftinterface
46+
47+
// RUN: %FileCheck %s < %t/Bar.swiftinterface
48+
// RUN: %FileCheck %s < %t/Bar.private.swiftinterface
49+
// RUN: %FileCheck %s < %t/Bar.package.swiftinterface
50+
51+
// CHECK: -enable-library-evolution -package-name barpkg -swift-version 6 -module-name Bar
52+
53+
/// Building modules from non-package interfaces with package-name (default mode) should succeed.
54+
// RUN: %target-swift-frontend -compile-module-from-interface %t/Bar.swiftinterface -o %t/Bar.swiftmodule -module-name Bar
55+
// RUN: rm -rf %t/Bar.swiftmodule
56+
// RUN: %target-swift-frontend -compile-module-from-interface %t/Bar.private.swiftinterface -o %t/Bar.swiftmodule -module-name Bar
57+
// RUN: rm -rf %t/Bar.swiftmodule
58+
// RUN: %target-swift-frontend -compile-module-from-interface %t/Bar.package.swiftinterface -o %t/Bar.swiftmodule -module-name Bar
59+
60+
public struct PubStruct {}
61+
@_spi(bar) public struct SPIStruct {}
62+
package struct PkgStruct {}

0 commit comments

Comments
 (0)