@@ -600,38 +600,46 @@ mapOffsetToNewerSnapshot(unsigned Offset,
600
600
return None;
601
601
}
602
602
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 ();
612
613
if (!LatestSnap)
613
- return Range ;
614
+ return ;
614
615
615
616
for (auto &PrevSnap : PreviousASTSnaps) {
616
617
if (PrevSnap->isFromSameBuffer (LatestSnap)) {
617
618
if (PrevSnap->getStamp () == LatestSnap->getStamp ())
618
- return Range ;
619
+ break ;
619
620
620
- auto OptBegin = mapOffsetToNewerSnapshot (Range. first ,
621
+ auto OptBegin = mapOffsetToNewerSnapshot (Location. Offset ,
621
622
PrevSnap, LatestSnap);
622
- if (!OptBegin.hasValue ())
623
- return None;
623
+ if (!OptBegin.hasValue ()) {
624
+ Location.Filename = StringRef ();
625
+ return ;
626
+ }
624
627
625
- auto OptEnd = mapOffsetToNewerSnapshot (Range.first +Range.second ,
628
+ auto OptEnd = mapOffsetToNewerSnapshot (Location.Offset +
629
+ Location.Length ,
626
630
PrevSnap, LatestSnap);
627
- if (!OptEnd.hasValue ())
628
- return None;
631
+ if (!OptEnd.hasValue ()) {
632
+ Location.Filename = StringRef ();
633
+ return ;
634
+ }
629
635
630
- return std::make_pair (*OptBegin, *OptEnd-*OptBegin);
636
+ Location.Offset = *OptBegin;
637
+ Location.Length = *OptEnd - *OptBegin;
631
638
}
632
639
}
633
640
634
- return Range;
641
+ std::tie (Location.Line , Location.Column ) =
642
+ EditorDoc->getLineAndColumnInBuffer (Location.Offset );
635
643
}
636
644
637
645
@@ -802,10 +810,9 @@ static ArrayRef<T> copyAndClearArray(llvm::BumpPtrAllocator &Allocator,
802
810
return Ref;
803
811
}
804
812
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) {
809
816
clang::ASTContext &ClangCtx = Importer->getClangASTContext ();
810
817
clang::SourceManager &ClangSM = ClangCtx.getSourceManager ();
811
818
@@ -826,12 +833,15 @@ static void getLocationInfoForClangNode(
826
833
ClangSM.getDecomposedLoc (CharRange.getBegin ());
827
834
if (!Decomp.first .isInvalid ()) {
828
835
if (auto FE = ClangSM.getFileEntryForID (Decomp.first )) {
829
- Filename = FE->getName ();
836
+ Location. Filename = FE->getName ();
830
837
831
838
std::pair<clang::FileID, unsigned > EndDecomp =
832
839
ClangSM.getDecomposedLoc (CharRange.getEnd ());
833
840
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 );
835
845
}
836
846
}
837
847
}
@@ -841,10 +851,8 @@ static unsigned getCharLength(SourceManager &SM, SourceRange TokenRange) {
841
851
return SM.getByteDistance (TokenRange.Start , CharEndLoc);
842
852
}
843
853
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) {
848
856
ASTContext &Ctx = VD->getASTContext ();
849
857
SourceManager &SM = Ctx.SourceMgr ;
850
858
@@ -870,14 +878,15 @@ getLocationInfo(const ValueDecl *VD,
870
878
}
871
879
872
880
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);
876
886
} else if (ClangNode) {
877
887
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);
881
890
}
882
891
}
883
892
@@ -1011,12 +1020,10 @@ fillSymbolInfo(CursorSymbolInfo &Symbol, const DeclInfo &DInfo,
1011
1020
Lang.getIFaceGenContexts ().find (Symbol.ModuleName , Invoc))
1012
1021
Symbol.ModuleInterfaceName = IFaceGenRef->getDocumentName ();
1013
1022
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 ()) {
1020
1027
return llvm::createStringError (
1021
1028
llvm::inconvertibleErrorCode (),
1022
1029
" Failed to remap declaration to latest snapshot." );
0 commit comments