21
21
#include " swift/Basic/Assertions.h"
22
22
#include " swift/Basic/FileTypes.h"
23
23
#include " swift/Basic/JSONSerialization.h"
24
+ #include " swift/Basic/SourceManager.h"
24
25
#include " swift/Frontend/FrontendOptions.h"
25
26
#include " swift/IDE/SourceEntityWalker.h"
26
27
@@ -816,6 +817,7 @@ bool swift::emitLoadedModuleTraceIfNeeded(ModuleDecl *mainModule,
816
817
}
817
818
818
819
class ObjcMethodReferenceCollector : public SourceEntityWalker {
820
+ StringRef visitingFilePath;
819
821
llvm::DenseSet<const clang::ObjCMethodDecl*> results;
820
822
bool visitDeclReference (ValueDecl *D, CharSourceRange Range,
821
823
TypeDecl *CtorTyRef, ExtensionDecl *ExtTyRef,
@@ -828,6 +830,10 @@ class ObjcMethodReferenceCollector: public SourceEntityWalker {
828
830
return true ;
829
831
}
830
832
public:
833
+ void setFileBeforeVisiting (SourceFile *SF) {
834
+ assert (SF && " need to visit actual source files" );
835
+ visitingFilePath = SF->getFilename ();
836
+ }
831
837
void serializeAsJson (llvm::raw_ostream &OS) {
832
838
llvm::json::OStream out (OS, /* IndentSize=*/ 4 );
833
839
out.array ([&] {
@@ -845,7 +851,8 @@ class ObjcMethodReferenceCollector: public SourceEntityWalker {
845
851
out.attribute (" type" , pName);
846
852
}
847
853
out.attribute (" method" , clangD->getNameAsString ());
848
- out.attribute (" location" , Loc.printToString (SM));
854
+ out.attribute (" declared_at" , Loc.printToString (SM));
855
+ out.attribute (" referenced_at" , visitingFilePath);
849
856
});
850
857
}
851
858
});
@@ -879,6 +886,7 @@ bool swift::emitObjCMessageSendTraceIfNeeded(ModuleDecl *mainModule,
879
886
ObjcMethodReferenceCollector collector;
880
887
for (auto *FU : mainModule->getFiles ()) {
881
888
if (auto *SF = dyn_cast<SourceFile>(FU)) {
889
+ collector.setFileBeforeVisiting (SF);
882
890
collector.walk (*SF);
883
891
}
884
892
}
0 commit comments