@@ -764,101 +764,14 @@ void ModuleDecl::addFile(FileUnit &newFile) {
764764 clearLookupCache ();
765765}
766766
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-
855767SourceFile *ModuleDecl::getSourceFileContainingLocation (SourceLoc loc) {
856768 if (loc.isInvalid ())
857769 return nullptr ;
858770
771+ auto &sourceMgr = getASTContext ().SourceMgr ;
772+
859773 // Check whether this location is in a "replaced" range, in which case
860774 // we want to use the original source file.
861- auto &sourceMgr = getASTContext ().SourceMgr ;
862775 SourceLoc adjustedLoc = loc;
863776 for (const auto &pair : sourceMgr.getReplacedRanges ()) {
864777 if (sourceMgr.rangeContainsTokenLoc (pair.second , loc)) {
@@ -867,35 +780,14 @@ SourceFile *ModuleDecl::getSourceFileContainingLocation(SourceLoc loc) {
867780 }
868781 }
869782
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;
878788 }
879789
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 ;
899791}
900792
901793std::pair<unsigned , SourceLoc>
@@ -3446,9 +3338,7 @@ SourceFile::SourceFile(ModuleDecl &M, SourceFileKind K,
34463338 (void )problem;
34473339 }
34483340
3449- if (Kind == SourceFileKind::MacroExpansion ||
3450- Kind == SourceFileKind::DefaultArgument)
3451- M.addAuxiliaryFile (*this );
3341+ M.getASTContext ().SourceMgr .recordSourceFile (bufferID, this );
34523342}
34533343
34543344SourceFile::ParsingOptions
0 commit comments