@@ -475,6 +475,10 @@ static void ParseModuleInterfaceArgs(ModuleInterfaceOptions &Opts,
475475// / Checks if an arg is generally allowed to be included
476476// / in a module interface
477477static bool ShouldIncludeModuleInterfaceArg (const Arg *A) {
478+ if (!A->getOption ().hasFlag (options::ModuleInterfaceOption) &&
479+ !A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorable))
480+ return false ;
481+
478482 if (!A->getOption ().matches (options::OPT_enable_experimental_feature))
479483 return true ;
480484
@@ -485,65 +489,69 @@ static bool ShouldIncludeModuleInterfaceArg(const Arg *A) {
485489 return true ;
486490}
487491
488- static bool ShouldIncludeArgInPackageInterfaceOnly (const Arg *A,
489- ArgList &Args) {
492+ static bool IsPackageInterfaceFlag (const Arg *A, ArgList &Args) {
490493 return A->getOption ().matches (options::OPT_package_name) &&
491494 Args.hasArg (
492495 options::OPT_disable_print_package_name_for_non_package_interface);
493496}
494497
498+ static bool IsPrivateInterfaceFlag (const Arg *A, ArgList &Args) {
499+ return A->getOption ().matches (options::OPT_project_name);
500+ }
501+
495502// / Save a copy of any flags marked as ModuleInterfaceOption, if running
496503// / in a mode that is going to emit a .swiftinterface file.
497504static void SaveModuleInterfaceArgs (ModuleInterfaceOptions &Opts,
498505 FrontendOptions &FOpts,
499506 ArgList &Args, DiagnosticEngine &Diags) {
500507 if (!FOpts.InputsAndOutputs .hasModuleInterfaceOutputPath ())
501508 return ;
502- ArgStringList RenderedArgs;
503- ArgStringList RenderedArgsForPackageOnly;
504- ArgStringList RenderedArgsIgnorable;
505- ArgStringList RenderedArgsIgnorablePrivate;
509+
510+ struct RenderedInterfaceArgs {
511+ ArgStringList Standard = {};
512+ ArgStringList Ignorable = {};
513+ };
514+
515+ RenderedInterfaceArgs PublicArgs{};
516+ RenderedInterfaceArgs PrivateArgs{};
517+ RenderedInterfaceArgs PackageArgs{};
518+
519+ auto interfaceArgListForArg = [&](Arg *A) -> ArgStringList & {
520+ bool ignorable =
521+ A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorable);
522+ if (IsPackageInterfaceFlag (A, Args))
523+ return ignorable ? PackageArgs.Ignorable : PackageArgs.Standard ;
524+
525+ if (IsPrivateInterfaceFlag (A, Args))
526+ return ignorable ? PrivateArgs.Ignorable : PrivateArgs.Standard ;
527+
528+ return ignorable ? PublicArgs.Ignorable : PublicArgs.Standard ;
529+ };
506530
507531 for (auto A : Args) {
508532 if (!ShouldIncludeModuleInterfaceArg (A))
509533 continue ;
510534
511- if (A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorablePrivate)) {
512- A->render (Args, RenderedArgsIgnorablePrivate);
513- } else if (A->getOption ().hasFlag (options::ModuleInterfaceOptionIgnorable)) {
514- A->render (Args, RenderedArgsIgnorable);
515- } else if (A->getOption ().hasFlag (options::ModuleInterfaceOption)) {
516- if (ShouldIncludeArgInPackageInterfaceOnly (A, Args))
517- A->render (Args, RenderedArgsForPackageOnly);
518- else
519- A->render (Args, RenderedArgs);
520- }
521- }
522- {
523- llvm::raw_string_ostream OS (Opts.Flags );
524- interleave (RenderedArgs,
525- [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
526- [&] { OS << " " ; });
527- }
528- {
529- llvm::raw_string_ostream OS (Opts.FlagsForPackageOnly );
530- interleave (
531- RenderedArgsForPackageOnly,
532- [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
533- [&] { OS << " " ; });
534- }
535- {
536- llvm::raw_string_ostream OS (Opts.IgnorablePrivateFlags );
537- interleave (RenderedArgsIgnorablePrivate,
538- [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
539- [&] { OS << " " ; });
540- }
541- {
542- llvm::raw_string_ostream OS (Opts.IgnorableFlags );
543- interleave (RenderedArgsIgnorable,
544- [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
545- [&] { OS << " " ; });
546- }
535+ ArgStringList &ArgList = interfaceArgListForArg (A);
536+ A->render (Args, ArgList);
537+ }
538+
539+ auto updateInterfaceOpts = [](ModuleInterfaceOptions::InterfaceFlags &Flags,
540+ RenderedInterfaceArgs &RenderedArgs) {
541+ auto printFlags = [](std::string &str, ArgStringList argList) {
542+ llvm::raw_string_ostream OS (str);
543+ interleave (
544+ argList,
545+ [&](const char *Argument) { PrintArg (OS, Argument, StringRef ()); },
546+ [&] { OS << " " ; });
547+ };
548+ printFlags (Flags.Flags , RenderedArgs.Standard );
549+ printFlags (Flags.IgnorableFlags , RenderedArgs.Ignorable );
550+ };
551+
552+ updateInterfaceOpts (Opts.PublicFlags , PublicArgs);
553+ updateInterfaceOpts (Opts.PrivateFlags , PrivateArgs);
554+ updateInterfaceOpts (Opts.PackageFlags , PackageArgs);
547555}
548556
549557enum class CxxCompatMode {
0 commit comments