@@ -600,38 +600,46 @@ mapOffsetToNewerSnapshot(unsigned Offset,
600600 return None;
601601}
602602
603- // / Tries to remap the location from a previous snapshot to the latest one.
604- static llvm::Optional<std::pair<unsigned , unsigned >>
605- tryRemappingLocToLatestSnapshot (SwiftLangSupport &Lang,
606- std::pair<unsigned , unsigned > Range,
607- StringRef Filename,
608- ArrayRef<ImmutableTextSnapshotRef> PreviousASTSnaps) {
609- ImmutableTextSnapshotRef LatestSnap;
610- if (auto EditorDoc = Lang.getEditorDocuments ()->findByPath (Filename))
611- LatestSnap = EditorDoc->getLatestSnapshot ();
603+ // / Tries to remap the location from a previous snapshot to the latest one and
604+ // / then sets the location's line and column.
605+ static void mapLocToLatestSnapshot (
606+ SwiftLangSupport &Lang, LocationInfo &Location,
607+ ArrayRef<ImmutableTextSnapshotRef> PreviousASTSnaps) {
608+ auto EditorDoc = Lang.getEditorDocuments ()->findByPath (Location.Filename );
609+ if (!EditorDoc)
610+ return ;
611+
612+ ImmutableTextSnapshotRef LatestSnap = EditorDoc->getLatestSnapshot ();
612613 if (!LatestSnap)
613- return Range ;
614+ return ;
614615
615616 for (auto &PrevSnap : PreviousASTSnaps) {
616617 if (PrevSnap->isFromSameBuffer (LatestSnap)) {
617618 if (PrevSnap->getStamp () == LatestSnap->getStamp ())
618- return Range ;
619+ break ;
619620
620- auto OptBegin = mapOffsetToNewerSnapshot (Range. first ,
621+ auto OptBegin = mapOffsetToNewerSnapshot (Location. Offset ,
621622 PrevSnap, LatestSnap);
622- if (!OptBegin.hasValue ())
623- return None;
623+ if (!OptBegin.hasValue ()) {
624+ Location.Filename = StringRef ();
625+ return ;
626+ }
624627
625- auto OptEnd = mapOffsetToNewerSnapshot (Range.first +Range.second ,
628+ auto OptEnd = mapOffsetToNewerSnapshot (Location.Offset +
629+ Location.Length ,
626630 PrevSnap, LatestSnap);
627- if (!OptEnd.hasValue ())
628- return None;
631+ if (!OptEnd.hasValue ()) {
632+ Location.Filename = StringRef ();
633+ return ;
634+ }
629635
630- return std::make_pair (*OptBegin, *OptEnd-*OptBegin);
636+ Location.Offset = *OptBegin;
637+ Location.Length = *OptEnd - *OptBegin;
631638 }
632639 }
633640
634- return Range;
641+ std::tie (Location.Line , Location.Column ) =
642+ EditorDoc->getLineAndColumnInBuffer (Location.Offset );
635643}
636644
637645
@@ -802,10 +810,9 @@ static ArrayRef<T> copyAndClearArray(llvm::BumpPtrAllocator &Allocator,
802810 return Ref;
803811}
804812
805- static void getLocationInfoForClangNode (
806- ClangNode ClangNode, ClangImporter *Importer,
807- llvm::Optional<std::pair<unsigned , unsigned >> &DeclarationLoc,
808- StringRef &Filename) {
813+ static void setLocationInfoForClangNode (ClangNode ClangNode,
814+ ClangImporter *Importer,
815+ LocationInfo &Location) {
809816 clang::ASTContext &ClangCtx = Importer->getClangASTContext ();
810817 clang::SourceManager &ClangSM = ClangCtx.getSourceManager ();
811818
@@ -826,12 +833,15 @@ static void getLocationInfoForClangNode(
826833 ClangSM.getDecomposedLoc (CharRange.getBegin ());
827834 if (!Decomp.first .isInvalid ()) {
828835 if (auto FE = ClangSM.getFileEntryForID (Decomp.first )) {
829- Filename = FE->getName ();
836+ Location. Filename = FE->getName ();
830837
831838 std::pair<clang::FileID, unsigned > EndDecomp =
832839 ClangSM.getDecomposedLoc (CharRange.getEnd ());
833840
834- DeclarationLoc = {Decomp.second , EndDecomp.second - Decomp.second };
841+ Location.Offset = Decomp.second ;
842+ Location.Length = EndDecomp.second -Decomp.second ;
843+ Location.Line = ClangSM.getLineNumber (Decomp.first , Decomp.second );
844+ Location.Column = ClangSM.getColumnNumber (Decomp.first , Decomp.second );
835845 }
836846 }
837847}
@@ -841,10 +851,8 @@ static unsigned getCharLength(SourceManager &SM, SourceRange TokenRange) {
841851 return SM.getByteDistance (TokenRange.Start , CharEndLoc);
842852}
843853
844- static void
845- getLocationInfo (const ValueDecl *VD,
846- llvm::Optional<std::pair<unsigned , unsigned >> &DeclarationLoc,
847- StringRef &Filename) {
854+ static void setLocationInfo (const ValueDecl *VD,
855+ LocationInfo &Location) {
848856 ASTContext &Ctx = VD->getASTContext ();
849857 SourceManager &SM = Ctx.SourceMgr ;
850858
@@ -870,14 +878,15 @@ getLocationInfo(const ValueDecl *VD,
870878 }
871879
872880 unsigned DeclBufID = SM.findBufferContainingLoc (Loc);
873- DeclarationLoc = {SM.getLocOffsetInBuffer (Loc, DeclBufID),
874- NameLen};
875- Filename = SM.getIdentifierForBuffer (DeclBufID);
881+ Location.Filename = SM.getIdentifierForBuffer (DeclBufID);
882+ Location.Offset = SM.getLocOffsetInBuffer (Loc, DeclBufID);
883+ Location.Length = NameLen;
884+ std::tie (Location.Line , Location.Column ) = SM.getLineAndColumnInBuffer (
885+ Loc, DeclBufID);
876886 } else if (ClangNode) {
877887 ClangImporter *Importer =
878- static_cast <ClangImporter *>(Ctx.getClangModuleLoader ());
879- return getLocationInfoForClangNode (ClangNode, Importer, DeclarationLoc,
880- Filename);
888+ static_cast <ClangImporter*>(Ctx.getClangModuleLoader ());
889+ setLocationInfoForClangNode (ClangNode, Importer, Location);
881890 }
882891}
883892
@@ -1011,12 +1020,10 @@ fillSymbolInfo(CursorSymbolInfo &Symbol, const DeclInfo &DInfo,
10111020 Lang.getIFaceGenContexts ().find (Symbol.ModuleName , Invoc))
10121021 Symbol.ModuleInterfaceName = IFaceGenRef->getDocumentName ();
10131022
1014- getLocationInfo (DInfo.OriginalProperty , Symbol.DeclarationLoc ,
1015- Symbol.Filename );
1016- if (Symbol.DeclarationLoc .hasValue ()) {
1017- Symbol.DeclarationLoc = tryRemappingLocToLatestSnapshot (
1018- Lang, *Symbol.DeclarationLoc , Symbol.Filename , PreviousSnaps);
1019- if (!Symbol.DeclarationLoc .hasValue ()) {
1023+ setLocationInfo (DInfo.OriginalProperty , Symbol.Location );
1024+ if (!Symbol.Location .Filename .empty ()) {
1025+ mapLocToLatestSnapshot (Lang, Symbol.Location , PreviousSnaps);
1026+ if (Symbol.Location .Filename .empty ()) {
10201027 return llvm::createStringError (
10211028 llvm::inconvertibleErrorCode (),
10221029 " Failed to remap declaration to latest snapshot." );
0 commit comments