@@ -693,6 +693,16 @@ void UnboundImport::diagnoseInvalidAttr(DeclAttrKind attrKind,
693693 attr->setInvalid ();
694694}
695695
696+ // / Returns true if any file in the module contains an import with \c flag.
697+ static bool moduleHasAnyImportsMatchingFlag (ModuleDecl *mod, ImportFlags flag) {
698+ for (const FileUnit *F : mod->getFiles ()) {
699+ auto *SF = dyn_cast<SourceFile>(F);
700+ if (SF && SF->hasImportsWithFlag (flag))
701+ return true ;
702+ }
703+ return false ;
704+ }
705+
696706// / Finds all import declarations for a single module that inconsistently match
697707// / \c predicate and passes each pair of inconsistent imports to \c diagnose.
698708template <typename Pred, typename Diag>
@@ -747,12 +757,7 @@ static void findInconsistentImports(ModuleDecl *mod, Pred predicate,
747757evaluator::SideEffect
748758CheckInconsistentImplementationOnlyImportsRequest::evaluate (
749759 Evaluator &evaluator, ModuleDecl *mod) const {
750- bool hasAnyImplementationOnlyImports =
751- llvm::any_of (mod->getFiles (), [](const FileUnit *F) -> bool {
752- auto *SF = dyn_cast<SourceFile>(F);
753- return SF && SF->hasImplementationOnlyImports ();
754- });
755- if (!hasAnyImplementationOnlyImports)
760+ if (!moduleHasAnyImportsMatchingFlag (mod, ImportFlags::ImplementationOnly))
756761 return {};
757762
758763 auto diagnose = [mod](const ImportDecl *normalImport,
@@ -783,6 +788,31 @@ CheckInconsistentImplementationOnlyImportsRequest::evaluate(
783788 return {};
784789}
785790
791+ evaluator::SideEffect
792+ CheckInconsistentWeakLinkedImportsRequest::evaluate (Evaluator &evaluator,
793+ ModuleDecl *mod) const {
794+ if (!moduleHasAnyImportsMatchingFlag (mod, ImportFlags::WeakLinked))
795+ return {};
796+
797+ auto diagnose = [mod](const ImportDecl *otherImport,
798+ const ImportDecl *weakLinkedImport) {
799+ auto attr = weakLinkedImport->getAttrs ().getAttribute <WeakLinkedAttr>();
800+ auto &diags = mod->getDiags ();
801+ diags
802+ .diagnose (otherImport, diag::import_attr_conflict,
803+ otherImport->getModule ()->getName (), attr)
804+ .fixItInsert (otherImport->getStartLoc (), " @_weakLinked " );
805+ diags.diagnose (weakLinkedImport, diag::import_attr_conflict_here, attr);
806+ };
807+
808+ auto predicate = [](ImportDecl *decl) {
809+ return decl->getAttrs ().hasAttribute <WeakLinkedAttr>();
810+ };
811+
812+ findInconsistentImports (mod, predicate, diagnose);
813+ return {};
814+ }
815+
786816// ===----------------------------------------------------------------------===//
787817// MARK: Scoped imports
788818// ===----------------------------------------------------------------------===//
0 commit comments