@@ -764,101 +764,14 @@ void ModuleDecl::addFile(FileUnit &newFile) {
764
764
clearLookupCache ();
765
765
}
766
766
767
- void ModuleDecl::addAuxiliaryFile (SourceFile &sourceFile) {
768
- AuxiliaryFiles.push_back (&sourceFile);
769
- }
770
-
771
- namespace {
772
- // / Compare the source location ranges for two files, as an ordering to
773
- // / use for fast searches.
774
- struct SourceFileRangeComparison {
775
- SourceManager *sourceMgr;
776
-
777
- bool operator ()(SourceFile *lhs, SourceFile *rhs) const {
778
- auto lhsRange = sourceMgr->getRangeForBuffer (lhs->getBufferID ());
779
- auto rhsRange = sourceMgr->getRangeForBuffer (rhs->getBufferID ());
780
-
781
- std::less<const char *> pointerCompare;
782
- return pointerCompare (
783
- (const char *)lhsRange.getStart ().getOpaquePointerValue (),
784
- (const char *)rhsRange.getStart ().getOpaquePointerValue ());
785
- }
786
-
787
- bool operator ()(SourceFile *lhs, SourceLoc rhsLoc) const {
788
- auto lhsRange = sourceMgr->getRangeForBuffer (lhs->getBufferID ());
789
-
790
- std::less<const char *> pointerCompare;
791
- return pointerCompare (
792
- (const char *)lhsRange.getEnd ().getOpaquePointerValue (),
793
- (const char *)rhsLoc.getOpaquePointerValue ());
794
- }
795
-
796
- bool operator ()(SourceLoc lhsLoc, SourceFile *rhs) const {
797
- auto rhsRange = sourceMgr->getRangeForBuffer (rhs->getBufferID ());
798
-
799
- std::less<const char *> pointerCompare;
800
- return pointerCompare (
801
- (const char *)lhsLoc.getOpaquePointerValue (),
802
- (const char *)rhsRange.getEnd ().getOpaquePointerValue ());
803
- }
804
- };
805
- }
806
-
807
- class swift ::ModuleSourceFileLocationMap {
808
- public:
809
- unsigned numFiles = 0 ;
810
- unsigned numAuxiliaryFiles = 0 ;
811
- std::vector<SourceFile *> allSourceFiles;
812
- SourceFile *lastSourceFile = nullptr ;
813
- };
814
-
815
- void ModuleDecl::updateSourceFileLocationMap () {
816
- // Allocate a source file location map, if we don't have one already.
817
- if (!sourceFileLocationMap) {
818
- ASTContext &ctx = getASTContext ();
819
- sourceFileLocationMap = ctx.Allocate <ModuleSourceFileLocationMap>();
820
- ctx.addCleanup ([sourceFileLocationMap=sourceFileLocationMap]() {
821
- sourceFileLocationMap->~ModuleSourceFileLocationMap ();
822
- });
823
- }
824
-
825
- // If we are up-to-date, there's nothing to do.
826
- ArrayRef<FileUnit *> files = Files;
827
- if (sourceFileLocationMap->numFiles == files.size () &&
828
- sourceFileLocationMap->numAuxiliaryFiles ==
829
- AuxiliaryFiles.size ())
830
- return ;
831
-
832
- // Rebuild the range structure.
833
- sourceFileLocationMap->allSourceFiles .clear ();
834
-
835
- // First, add all of the source files with a backing buffer.
836
- for (auto *fileUnit : files) {
837
- if (auto sourceFile = dyn_cast<SourceFile>(fileUnit)) {
838
- sourceFileLocationMap->allSourceFiles .push_back (sourceFile);
839
- }
840
- }
841
-
842
- // Next, add all of the macro expansion files.
843
- for (auto *sourceFile : AuxiliaryFiles)
844
- sourceFileLocationMap->allSourceFiles .push_back (sourceFile);
845
-
846
- // Finally, sort them all so we can do a binary search for lookup.
847
- std::sort (sourceFileLocationMap->allSourceFiles .begin (),
848
- sourceFileLocationMap->allSourceFiles .end (),
849
- SourceFileRangeComparison{&getASTContext ().SourceMgr });
850
-
851
- sourceFileLocationMap->numFiles = files.size ();
852
- sourceFileLocationMap->numAuxiliaryFiles = AuxiliaryFiles.size ();
853
- }
854
-
855
767
SourceFile *ModuleDecl::getSourceFileContainingLocation (SourceLoc loc) {
856
768
if (loc.isInvalid ())
857
769
return nullptr ;
858
770
771
+ auto &sourceMgr = getASTContext ().SourceMgr ;
772
+
859
773
// Check whether this location is in a "replaced" range, in which case
860
774
// we want to use the original source file.
861
- auto &sourceMgr = getASTContext ().SourceMgr ;
862
775
SourceLoc adjustedLoc = loc;
863
776
for (const auto &pair : sourceMgr.getReplacedRanges ()) {
864
777
if (sourceMgr.rangeContainsTokenLoc (pair.second , loc)) {
@@ -867,35 +780,14 @@ SourceFile *ModuleDecl::getSourceFileContainingLocation(SourceLoc loc) {
867
780
}
868
781
}
869
782
870
- // Before we do any extra work, check the last source file we found a result
871
- // in to see if it contains this.
872
- if (sourceFileLocationMap) {
873
- if (auto lastSourceFile = sourceFileLocationMap->lastSourceFile ) {
874
- auto range = sourceMgr.getRangeForBuffer (lastSourceFile->getBufferID ());
875
- if (range.contains (adjustedLoc))
876
- return lastSourceFile;
877
- }
783
+ auto bufferID = sourceMgr.findBufferContainingLoc (adjustedLoc);
784
+ auto sourceFiles = sourceMgr.getSourceFilesForBufferID (bufferID);
785
+ for (auto sourceFile: sourceFiles) {
786
+ if (sourceFile->getParentModule () == this )
787
+ return sourceFile;
878
788
}
879
789
880
- updateSourceFileLocationMap ();
881
-
882
- auto found = std::lower_bound (sourceFileLocationMap->allSourceFiles .begin (),
883
- sourceFileLocationMap->allSourceFiles .end (),
884
- adjustedLoc,
885
- SourceFileRangeComparison{&sourceMgr});
886
- if (found == sourceFileLocationMap->allSourceFiles .end ())
887
- return nullptr ;
888
-
889
- auto foundSourceFile = *found;
890
- auto foundRange = sourceMgr.getRangeForBuffer (foundSourceFile->getBufferID ());
891
- // Positions inside an empty file or at EOF should still be considered within
892
- // this file.
893
- if (!foundRange.contains (adjustedLoc) && adjustedLoc != foundRange.getEnd ())
894
- return nullptr ;
895
-
896
- // Update the last source file.
897
- sourceFileLocationMap->lastSourceFile = foundSourceFile;
898
- return foundSourceFile;
790
+ return nullptr ;
899
791
}
900
792
901
793
std::pair<unsigned , SourceLoc>
@@ -3447,10 +3339,6 @@ SourceFile::SourceFile(ModuleDecl &M, SourceFileKind K,
3447
3339
}
3448
3340
3449
3341
M.getASTContext ().SourceMgr .recordSourceFile (bufferID, this );
3450
-
3451
- if (Kind == SourceFileKind::MacroExpansion ||
3452
- Kind == SourceFileKind::DefaultArgument)
3453
- M.addAuxiliaryFile (*this );
3454
3342
}
3455
3343
3456
3344
SourceFile::ParsingOptions
0 commit comments