2222#include " swift/Basic/FileTypes.h"
2323#include " swift/Basic/JSONSerialization.h"
2424#include " swift/Basic/SourceManager.h"
25+ #include " swift/Frontend/Frontend.h"
2526#include " swift/Frontend/FrontendOptions.h"
2627#include " swift/Frontend/ModuleInterfaceSupport.h"
2728#include " swift/IDE/SourceEntityWalker.h"
@@ -853,7 +854,8 @@ class ObjcMethodReferenceCollector: public SourceEntityWalker {
853854 }
854855};
855856
856- static void createFineModuleTraceFile (const InputFile &input, ModuleDecl *MD) {
857+ static void createFineModuleTraceFile (CompilerInstance &instance,
858+ const InputFile &input) {
857859 StringRef tracePath = input.getFineModuleTracePath ();
858860 if (tracePath.empty ()) {
859861 // we basically rely on the passing down of module trace file path
@@ -862,27 +864,8 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
862864 // specifically.
863865 return ;
864866 }
867+ ModuleDecl *MD = instance.getMainModule ();
865868 auto &ctx = MD->getASTContext ();
866- std::vector<SourceFile*> filesToWalk;
867- for (auto *FU : MD->getFiles ()) {
868- if (auto *SF = dyn_cast<SourceFile>(FU)) {
869- switch (SF->Kind ) {
870- case swift::SourceFileKind::Library:
871- case swift::SourceFileKind::Main:
872- case swift::SourceFileKind::MacroExpansion:
873- case swift::SourceFileKind::DefaultArgument:
874- filesToWalk.push_back (SF);
875- LLVM_FALLTHROUGH;
876- case swift::SourceFileKind::SIL:
877- case swift::SourceFileKind::Interface:
878- continue ;
879- }
880- }
881- }
882- // No source files to walk, abort.
883- if (filesToWalk.empty ()) {
884- return ;
885- }
886869 // Write output via atomic append.
887870 llvm::vfs::OutputConfig config;
888871 config.setAppend ().setAtomicWrite ();
@@ -893,10 +876,11 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
893876 return ;
894877 }
895878 ObjcMethodReferenceCollector collector (MD);
896- for (auto *SF: filesToWalk) {
897- collector.setFileBeforeVisiting (SF);
898- collector.walk (*SF);
899- }
879+ instance.forEachFileToTypeCheck ([&](SourceFile& SF) {
880+ collector.setFileBeforeVisiting (&SF);
881+ collector.walk (SF);
882+ return false ;
883+ });
900884
901885 // print this json line.
902886 std::string stringBuffer;
@@ -915,8 +899,9 @@ static void createFineModuleTraceFile(const InputFile &input, ModuleDecl *MD) {
915899 }
916900}
917901
918- bool swift::emitFineModuleTraceIfNeeded (ModuleDecl *mainModule ,
902+ bool swift::emitFineModuleTraceIfNeeded (CompilerInstance &Instance ,
919903 const FrontendOptions &opts) {
904+ ModuleDecl *mainModule = Instance.getMainModule ();
920905 // When lazy type checking is enabled, we may end up with a partial AST.
921906 // Walking on these partial AST completely may expose latent bugs.
922907 if (mainModule->getASTContext ().TypeCheckerOpts .EnableLazyTypecheck )
@@ -926,7 +911,7 @@ bool swift::emitFineModuleTraceIfNeeded(ModuleDecl *mainModule,
926911 " We should've already exited earlier if there was an error." );
927912
928913 opts.InputsAndOutputs .forEachInput ([&](const InputFile &input) {
929- createFineModuleTraceFile (input, mainModule );
914+ createFineModuleTraceFile (Instance, input );
930915 return true ;
931916 });
932917 return false ;
0 commit comments