@@ -419,6 +419,7 @@ static void ParseModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
419419 Args.hasArg (OPT_debug_emit_invalid_swiftinterface_syntax);
420420 Opts.PrintMissingImports =
421421 !Args.hasArg (OPT_disable_print_missing_imports_in_module_interface);
422+ Opts.DisablePackageNameForNonPackageInterface |= Args.hasArg (OPT_disable_print_package_name_for_non_package_interface);
422423
423424 if (const Arg *A = Args.getLastArg (OPT_library_level)) {
424425 StringRef contents = A->getValue ();
@@ -434,6 +435,10 @@ static void ParseModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
434435// / Checks if an arg is generally allowed to be included
435436// / in a module interface
436437static bool ShouldIncludeModuleInterfaceArg (const Arg *A) {
438+ if (!A->getOption ().hasFlag (options::ModuleInterfaceOption) &&
439+ !A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorable))
440+ return false ;
441+
437442 if (!A->getOption ().matches (options::OPT_enable_experimental_feature))
438443 return true ;
439444
@@ -444,46 +449,69 @@ static bool ShouldIncludeModuleInterfaceArg(const Arg *A) {
444449 return true ;
445450}
446451
452+ static bool IsPackageInterfaceFlag (const Arg *A, ArgList &Args) {
453+ return A->getOption ().matches (options::OPT_package_name) &&
454+ Args.hasArg (
455+ options::OPT_disable_print_package_name_for_non_package_interface);
456+ }
457+
458+ static bool IsPrivateInterfaceFlag (const Arg *A, ArgList &Args) {
459+ return A->getOption ().matches (options::OPT_project_name);
460+ }
461+
447462// / Save a copy of any flags marked as ModuleInterfaceOption, if running
448463// / in a mode that is going to emit a .swiftinterface file.
449464static void SaveModuleInterfaceArgs (ModuleInterfaceOptions &Opts,
450465 FrontendOptions &FOpts,
451466 ArgList &Args, DiagnosticEngine &Diags) {
452467 if (!FOpts.InputsAndOutputs .hasModuleInterfaceOutputPath ())
453468 return ;
454- ArgStringList RenderedArgs;
455- ArgStringList RenderedArgsIgnorable;
456- ArgStringList RenderedArgsIgnorablePrivate;
469+
470+ struct RenderedInterfaceArgs {
471+ ArgStringList Standard = {};
472+ ArgStringList Ignorable = {};
473+ };
474+
475+ RenderedInterfaceArgs PublicArgs{};
476+ RenderedInterfaceArgs PrivateArgs{};
477+ RenderedInterfaceArgs PackageArgs{};
478+
479+ auto interfaceArgListForArg = [&](Arg *A) -> ArgStringList & {
480+ bool ignorable =
481+ A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorable);
482+ if (IsPackageInterfaceFlag (A, Args))
483+ return ignorable ? PackageArgs.Ignorable : PackageArgs.Standard ;
484+
485+ if (IsPrivateInterfaceFlag (A, Args))
486+ return ignorable ? PrivateArgs.Ignorable : PrivateArgs.Standard ;
487+
488+ return ignorable ? PublicArgs.Ignorable : PublicArgs.Standard ;
489+ };
490+
457491 for (auto A : Args) {
458492 if (!ShouldIncludeModuleInterfaceArg (A))
459493 continue ;
460494
461- if (A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorablePrivate)) {
462- A->render (Args, RenderedArgsIgnorablePrivate);
463- } else if (A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorable)) {
464- A->render (Args, RenderedArgsIgnorable);
465- } else if (A->getOption ().hasFlag (options::ModuleInterfaceOption)) {
466- A->render (Args, RenderedArgs);
467- }
468- }
469- {
470- llvm::raw_string_ostream OS (Opts.Flags );
471- interleave (RenderedArgs,
472- [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
473- [&] { OS << " " ; });
474- }
475- {
476- llvm::raw_string_ostream OS (Opts.IgnorablePrivateFlags );
477- interleave (RenderedArgsIgnorablePrivate,
478- [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
479- [&] { OS << " " ; });
480- }
481- {
482- llvm::raw_string_ostream OS (Opts.IgnorableFlags );
483- interleave (RenderedArgsIgnorable,
484- [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
485- [&] { OS << " " ; });
486- }
495+ ArgStringList &ArgList = interfaceArgListForArg (A);
496+ A->render (Args, ArgList);
497+ }
498+
499+ auto updateInterfaceOpts = [](ModuleInterfaceOptions::InterfaceFlags &Flags,
500+ RenderedInterfaceArgs &RenderedArgs) {
501+ auto printFlags = [](std::string &str, ArgStringList argList) {
502+ llvm::raw_string_ostream OS (str);
503+ interleave (
504+ argList,
505+ [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
506+ [&] { OS << " " ; });
507+ };
508+ printFlags (Flags.Flags , RenderedArgs.Standard );
509+ printFlags (Flags.IgnorableFlags , RenderedArgs.Ignorable );
510+ };
511+
512+ updateInterfaceOpts (Opts.PublicFlags , PublicArgs);
513+ updateInterfaceOpts (Opts.PrivateFlags , PrivateArgs);
514+ updateInterfaceOpts (Opts.PackageFlags , PackageArgs);
487515}
488516
489517enum class CxxCompatMode {
0 commit comments