Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit09fc352

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
[WIP] Fix inlline rename at end of file (#3766)
* do not filter symbol uses by range length in getSymbolUsesInSolution because it causes loosing symbol occurrences in Inline Rename* make impl closer to the XAML one* remove obsolete import
1 parent203d70e commit09fc352

File tree

1 file changed

+44
-43
lines changed

1 file changed

+44
-43
lines changed

‎vsintegration/src/FSharp.Editor/InlineRename/InlineRenameService.fs‎

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ namespace Microsoft.VisualStudio.FSharp.Editor
44

55
openSystem
66
openSystem.Composition
7-
openSystem.Collections.Generic
87
openSystem.Linq
98
openSystem.Threading
109
openSystem.Threading.Tasks
@@ -29,44 +28,43 @@ type internal FailureInlineRenameInfo private () =
2928
member__.DisplayName=""
3029
member__.FullDisplayName=""
3130
member__.Glyph= Glyph.MethodPublic
32-
member__.GetFinalSymbolName_replacementText=""
33-
member__.GetReferenceEditSpan(_location,_cancellationToken)= Unchecked.defaultof<_>
34-
member__.GetConflictEditSpan(_location,_replacementText,_cancellationToken)= Nullable()
35-
member__.FindRenameLocationsAsync(_optionSet,_cancellationToken)= Task<IInlineRenameLocationSet>.FromResultnull
36-
member__.TryOnBeforeGlobalSymbolRenamed(_workspace,_changedDocumentIDs,_replacementText)=false
37-
member__.TryOnAfterGlobalSymbolRenamed(_workspace,_changedDocumentIDs,_replacementText)=false
31+
member__.GetFinalSymbolName_=""
32+
member__.GetReferenceEditSpan(_,_)= Unchecked.defaultof<_>
33+
member__.GetConflictEditSpan(_,_,_)= Nullable()
34+
member__.FindRenameLocationsAsync(_,_)= Task<IInlineRenameLocationSet>.FromResultnull
35+
member__.TryOnBeforeGlobalSymbolRenamed(_,_,_)=false
36+
member__.TryOnAfterGlobalSymbolRenamed(_,_,_)=false
3837
static memberInstance= FailureInlineRenameInfo():> IInlineRenameInfo
3938

40-
typeinternalDocumentLocations=
41-
{ Document:Document
42-
Locations:InlineRenameLocation[]}
43-
44-
typeinternalInlineRenameLocationSet(locationsByDocument: DocumentLocations[],originalSolution: Solution,symbolKind: LexerSymbolKind,symbol: FSharpSymbol)=
39+
typeinternalInlineRenameLocationSet(locations: InlineRenameLocation[],originalSolution: Solution,symbolKind: LexerSymbolKind,symbol: FSharpSymbol)=
4540
interface IInlineRenameLocationSetwith
46-
member__.Locations:IList<InlineRenameLocation>=
47-
upcast[|for docin locationsByDocumentdoyield! doc.Locations|].ToList()
41+
member__.Locations=upcast locations.ToList()
4842

49-
memberthis.GetReplacementsAsync(replacementText,_optionSet,cancellationToken):Task<IInlineRenameReplacementInfo>=
50-
let recapplyChangesi(solution:Solution)=
43+
member__.GetReplacementsAsync(replacementText,_optionSet,cancellationToken):Task<IInlineRenameReplacementInfo>=
44+
let recapplyChanges(solution:Solution)(locationsByDocument:(Document* InlineRenameLocation list)list)=
5145
async{
52-
if i= locationsByDocument.Lengththen
53-
return solution
54-
else
55-
letdoc= locationsByDocument.[i]
56-
let!oldSourceText= doc.Document.GetTextAsync(cancellationToken)|> Async.AwaitTask
57-
letchanges= doc.Locations|> Seq.map(fun loc-> TextChange(loc.TextSpan, replacementText))
58-
letnewSource= oldSourceText.WithChanges(changes)
59-
return! applyChanges(i+1)(solution.WithDocumentText(doc.Document.Id, newSource))
46+
match locationsByDocumentwith
47+
|[]->return solution
48+
|(document, locations):: rest->
49+
let!oldSource= document.GetTextAsync(cancellationToken)|> Async.AwaitTask
50+
letnewSource= oldSource.WithChanges(locations|> List.map(fun l-> TextChange(l.TextSpan, replacementText)))
51+
return! applyChanges(solution.WithDocumentText(document.Id, newSource)) rest
6052
}
6153

6254
async{
63-
let!newSolution= applyChanges0 originalSolution
55+
let!newSolution= applyChanges originalSolution(locations|> Array.toList|> List.groupBy(fun x-> x.Document))
56+
// > debug
57+
letnewDoc= newSolution.GetDocument(locations.[0].Document.Id)
58+
let!newSource= newDoc.GetTextAsync(cancellationToken)|> Async.AwaitTask
59+
letnewText= newSource.ToString()
60+
let_= newText
61+
// < debug
6462
return
6563
{new IInlineRenameReplacementInfowith
6664
member__.NewSolution= newSolution
6765
member__.ReplacementTextValid= Tokenizer.isValidNameForSymbol(symbolKind, symbol, replacementText)
68-
member__.DocumentIds=locationsByDocument|> Seq.map(fun doc-> doc.Document.Id)
69-
member__.GetReplacements(documentId)= Seq.empty}
66+
member__.DocumentIds=locations|> Seq.map(fun doc-> doc.Document.Id)|> Seq.distinct
67+
member__.GetReplacements _= Seq.empty}
7068
}
7169
|> RoslynHelpers.StartAsyncAsTask(cancellationToken)
7270

@@ -98,7 +96,7 @@ type internal InlineRenameInfo
9896
member__.LocalizedErrorMessage=null
9997
member__.TriggerSpan= triggerSpan
10098
member__.HasOverloads=false
101-
member__.ForceRenameOverloads=true
99+
member__.ForceRenameOverloads=false
102100
member__.DisplayName= symbolUse.Symbol.DisplayName
103101
member__.FullDisplayName=try symbolUse.Symbol.FullNamewith_-> symbolUse.Symbol.DisplayName
104102
member__.Glyph= Glyph.MethodPublic
@@ -108,30 +106,34 @@ type internal InlineRenameInfo
108106
lettext= getDocumentText location.Document cancellationToken
109107
Tokenizer.fixupSpan(text, location.TextSpan)
110108

111-
member__.GetConflictEditSpan(location,_replacementText,_cancellationToken)= Nullable(location.TextSpan)
109+
member__.GetConflictEditSpan(location,replacementText,cancellationToken)=
110+
lettext= getDocumentText location.Document cancellationToken
111+
letspanText= text.ToString(location.TextSpan)
112+
letposition= spanText.LastIndexOf(replacementText, StringComparison.Ordinal)
113+
if position<0then Nullable()
114+
else Nullable(TextSpan(location.TextSpan.Start+ position, replacementText.Length))
112115

113116
member__.FindRenameLocationsAsync(_optionSet,cancellationToken)=
114117
async{
115118
let!symbolUsesByDocumentId= symbolUses
116-
let!locationsByDocument=
119+
let!locations=
117120
symbolUsesByDocumentId
118121
|> Seq.map(fun(KeyValue(documentId,symbolUses))->
119122
async{
120123
letdocument= document.Project.Solution.GetDocument(documentId)
121-
let!cancellationToken= Async.CancellationToken
122124
let!sourceText= document.GetTextAsync(cancellationToken)|> Async.AwaitTask
123-
letlocations=
124-
symbolUses
125-
|> Array.choose(fun symbolUse->
126-
RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, symbolUse.RangeAlternate)
127-
|> Option.map(fun span->
128-
lettextSpan= Tokenizer.fixupSpan(sourceText, span)
129-
InlineRenameLocation(document, textSpan)))
130-
131-
return{ Document= document; Locations= locations}
125+
return
126+
[|for symbolUsein symbolUsesdo
127+
match RoslynHelpers.TryFSharpRangeToTextSpan(sourceText, symbolUse.RangeAlternate)with
128+
| Some span->
129+
lettextSpan= Tokenizer.fixupSpan(sourceText, span)
130+
yield InlineRenameLocation(document, textSpan)
131+
| None->()|]
132132
})
133133
|> Async.Parallel
134-
return InlineRenameLocationSet(locationsByDocument, document.Project.Solution, lexerSymbol.Kind, symbolUse.Symbol):> IInlineRenameLocationSet
134+
|> Async.map Array.concat
135+
136+
return InlineRenameLocationSet(locations, document.Project.Solution, lexerSymbol.Kind, symbolUse.Symbol):> IInlineRenameLocationSet
135137
}|> RoslynHelpers.StartAsyncAsTask(cancellationToken)
136138

137139
member__.TryOnBeforeGlobalSymbolRenamed(_workspace,_changedDocumentIDs,_replacementText)=true
@@ -142,8 +144,7 @@ type internal InlineRenameService
142144
[<ImportingConstructor>]
143145
(
144146
projectInfoManager: FSharpProjectOptionsManager,
145-
checkerProvider: FSharpCheckerProvider,
146-
[<ImportMany>]_refactorNotifyServices: seq<IRefactorNotifyService>
147+
checkerProvider: FSharpCheckerProvider
147148
)=
148149

149150
static letuserOpName="InlineRename"

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp