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

Commit4753edd

Browse files
dsymecartermp
authored andcommitted
potential fix for 5932 (dotnet#6070)
* poss fix* poss fix* Update range.fs* Update range.fs* fix build* docs and limit fix* Update src/fsharp/range.fsCo-Authored-By: dsyme <dsyme@users.noreply.github.com>* Update range.fs
1 parenteb75fcc commit4753edd

File tree

3 files changed

+204
-39
lines changed

3 files changed

+204
-39
lines changed

‎src/fsharp/range.fs‎

Lines changed: 116 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ module Microsoft.FSharp.Compiler.Range
55

66
openSystem
77
openSystem.IO
8-
openSystem.Collections.Generic
98
openSystem.Collections.Concurrent
109
openMicrosoft.FSharp.Core.Printf
1110
openMicrosoft.FSharp.Compiler.AbstractIL.Internal.Library
@@ -16,17 +15,20 @@ type FileIndex = int32
1615

1716
[<Literal>]
1817
letcolumnBitCount=20
18+
1919
[<Literal>]
2020
letlineBitCount=31
2121

2222
letposBitCount= lineBitCount+ columnBitCount
23-
let_=assert(posBitCount<=64)
23+
2424
letposColumnMask= mask640 columnBitCount
25+
2526
letlineColumnMask= mask64 columnBitCount lineBitCount
2627

2728
[<Struct; CustomEquality; NoComparison>]
2829
[<System.Diagnostics.DebuggerDisplay("{Line},{Column}")>]
2930
typepos(code:int64)=
31+
3032
new(l,c)=
3133
letl= max0 l
3234
letc= max0 c
@@ -35,63 +37,80 @@ type pos(code:int64) =
3537
pos p
3638

3739
memberp.Line= int32(uint64 code>>> columnBitCount)
40+
3841
memberp.Column= int32(code&&& posColumnMask)
3942

4043
memberr.Encoding= code
44+
4145
static memberEncodingSize= posBitCount
46+
4247
static memberDecode(code:int64):pos= pos code
48+
4349
overridep.Equals(obj)=match objwith:? posas p2-> code= p2.Encoding|_->false
50+
4451
overridep.GetHashCode()= hash code
52+
4553
overridep.ToString()= sprintf"(%d,%d)" p.Line p.Column
4654

4755
[<Literal>]
4856
letfileIndexBitCount=24
57+
4958
[<Literal>]
5059
letstartColumnBitCount= columnBitCount// 20
60+
5161
[<Literal>]
5262
letendColumnBitCount= columnBitCount// 20
5363

5464
[<Literal>]
5565
letstartLineBitCount= lineBitCount// 31
66+
5667
[<Literal>]
5768
letheightBitCount=27
69+
5870
[<Literal>]
5971
letisSyntheticBitCount=1
60-
#if DEBUG
61-
let_=assert(fileIndexBitCount+ startColumnBitCount+ endColumnBitCount<=64)
62-
let_=assert(startLineBitCount+ heightBitCount+ isSyntheticBitCount<=64)
63-
#endif
64-
72+
6573
[<Literal>]
6674
letfileIndexShift=0
75+
6776
[<Literal>]
6877
letstartColumnShift=24
78+
6979
[<Literal>]
7080
letendColumnShift=44
7181

7282
[<Literal>]
7383
letstartLineShift=0
84+
7485
[<Literal>]
7586
letheightShift=31
87+
7688
[<Literal>]
7789
letisSyntheticShift=58
7890

79-
8091
[<Literal>]
8192
letfileIndexMask=0b0000000000000000000000000000000000000000111111111111111111111111L
93+
8294
[<Literal>]
8395
letstartColumnMask=0b0000000000000000000011111111111111111111000000000000000000000000L
96+
8497
[<Literal>]
8598
letendColumnMask=0b1111111111111111111100000000000000000000000000000000000000000000L
8699

87100
[<Literal>]
88101
letstartLineMask=0b0000000000000000000000000000000001111111111111111111111111111111L
102+
89103
[<Literal>]
90104
letheightMask=0b0000001111111111111111111111111110000000000000000000000000000000L
105+
91106
[<Literal>]
92107
letisSyntheticMask=0b0000010000000000000000000000000000000000000000000000000000000000L
93108

94109
#if DEBUG
110+
let_=assert(posBitCount<=64)
111+
let_=assert(fileIndexBitCount+ startColumnBitCount+ endColumnBitCount<=64)
112+
let_=assert(startLineBitCount+ heightBitCount+ isSyntheticBitCount<=64)
113+
95114
let_=assert(startColumnShift= fileIndexShift+ fileIndexBitCount)
96115
let_=assert(endColumnShift= startColumnShift+ startColumnBitCount)
97116

@@ -106,24 +125,64 @@ let _ = assert (endColumnMask = mask64 endColumnShift endColumnBitCount)
106125
let_=assert(isSyntheticMask= mask64 isSyntheticShift isSyntheticBitCount)
107126
#endif
108127

109-
// This is just a standard unique-index table
128+
/// Removes relative parts from any full paths
129+
letnormalizeFilePath(filePath:string)=
130+
try
131+
if FileSystem.IsPathRootedShim filePaththen
132+
FileSystem.GetFullPathShim filePath
133+
else
134+
filePath
135+
with_-> filePath
136+
137+
/// A unique-index table for file names.
110138
typeFileIndexTable()=
111139
letindexToFileTable=new ResizeArray<_>(11)
112140
letfileToIndexTable=new ConcurrentDictionary<string, int>()
113-
membert.FileToIndex f=
114-
let mutableres=0
115-
letok= fileToIndexTable.TryGetValue(f,&res)
116-
if okthen res
117-
else
141+
142+
// Note: we should likely adjust this code to always normalize. However some testing (and possibly some
143+
// product behaviour) appears to be sensitive to error messages reporting un-normalized file names.
144+
// Currently all names going through 'mkRange' get normalized, while this going through just 'fileIndexOfFile'
145+
// do not. Also any file names which are not put into ranges at all are non-normalized.
146+
//
147+
// TO move forward we should eventually introduce a new type NormalizedFileName that tracks this invariant.
148+
membert.FileToIndex normalize filePath=
149+
match fileToIndexTable.TryGetValue(filePath)with
150+
|true, idx-> idx
151+
|_->
152+
153+
// Try again looking for a normalized entry.
154+
letnormalizedFilePath=if normalizethen normalizeFilePath filePathelse filePath
155+
match fileToIndexTable.TryGetValue(normalizedFilePath)with
156+
|true, idx->
157+
// Record the non-normalized entry if necessary
158+
if filePath<> normalizedFilePaththen
159+
lock fileToIndexTable(fun()->
160+
fileToIndexTable.[filePath]<- idx)
161+
162+
// Return the index
163+
idx
164+
165+
|_->
118166
lock fileToIndexTable(fun()->
119-
letn= indexToFileTable.Countin
120-
indexToFileTable.Add(f)
121-
fileToIndexTable.[f]<- n
122-
n)
167+
// Get the new index
168+
letidx= indexToFileTable.Count
169+
170+
// Record the normalized entry
171+
indexToFileTable.Add normalizedFilePath
172+
fileToIndexTable.[normalizedFilePath]<- idx
173+
174+
// Record the non-normalized entry if necessary
175+
if filePath<> normalizedFilePaththen
176+
fileToIndexTable.[filePath]<- idx
177+
178+
// Return the index
179+
idx)
123180

124181
membert.IndexToFile n=
125-
(if n<0then failwithf"fileOfFileIndex: negative argument: n =%d\n" n)
126-
(if n>= indexToFileTable.Countthen failwithf"fileOfFileIndex: invalid argument: n =%d\n" n)
182+
if n<0then
183+
failwithf"fileOfFileIndex: negative argument: n =%d\n" n
184+
if n>= indexToFileTable.Countthen
185+
failwithf"fileOfFileIndex: invalid argument: n =%d\n" n
127186
indexToFileTable.[n]
128187

129188
letmaxFileIndex= pown32 fileIndexBitCount
@@ -133,8 +192,11 @@ let maxFileIndex = pown32 fileIndexBitCount
133192
letfileIndexTable=new FileIndexTable()
134193

135194
// If we exceed the maximum number of files we'll start to report incorrect file names
136-
letfileIndexOfFile f= fileIndexTable.FileToIndex(f)% maxFileIndex
137-
letfileOfFileIndex n= fileIndexTable.IndexToFile(n)
195+
letfileIndexOfFileAux normalize f= fileIndexTable.FileToIndex normalize f% maxFileIndex
196+
197+
letfileIndexOfFile filePath= fileIndexOfFileAuxfalse filePath
198+
199+
letfileOfFileIndex idx= fileIndexTable.IndexToFile idx
138200

139201
letmkPos l c= pos(l, c)
140202

@@ -158,19 +220,31 @@ type range(code1:int64, code2: int64) =
158220
new(fidx,b:pos,e:pos)= range(fidx, b.Line, b.Column, e.Line, e.Column)
159221

160222
memberr.StartLine= int32((code2&&& startLineMask)>>> startLineShift)
223+
161224
memberr.StartColumn= int32((code1&&& startColumnMask)>>> startColumnShift)
225+
162226
memberr.EndLine= int32((code2&&& heightMask)>>> heightShift)+ r.StartLine
227+
163228
memberr.EndColumn= int32((code1&&& endColumnMask)>>> endColumnShift)
229+
164230
memberr.IsSynthetic= int32((code2&&& isSyntheticMask)>>> isSyntheticShift)<>0
231+
165232
memberr.Start= pos(r.StartLine, r.StartColumn)
233+
166234
memberr.End= pos(r.EndLine, r.EndColumn)
235+
167236
memberr.FileIndex= int32(code1&&& fileIndexMask)
237+
168238
memberm.StartRange= range(m.FileIndex, m.Start, m.Start)
239+
169240
memberm.EndRange= range(m.FileIndex, m.End, m.End)
241+
170242
memberr.FileName= fileOfFileIndex r.FileIndex
243+
171244
memberr.MakeSynthetic()= range(code1, code2||| isSyntheticMask)
172245

173246
memberr.Code1= code1
247+
174248
memberr.Code2= code2
175249

176250
#if DEBUG
@@ -195,30 +269,28 @@ type range(code1:int64, code2: int64) =
195269

196270
overrider.ToString()= sprintf"%s (%d,%d--%d,%d) IsSynthetic=%b" r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic
197271

198-
letmkRange f b e=
199-
// remove relative parts from full path
200-
letnormalizedFilePath=if FileSystem.IsPathRootedShim fthentry FileSystem.GetFullPathShim fwith_-> felse f
201-
range(fileIndexOfFile normalizedFilePath, b, e)
272+
letmkRange filePath startPos endPos= range(fileIndexOfFileAuxtrue filePath, startPos, endPos)
202273

203-
letmkFileIndexRangefi b e= range(fi, b, e)
274+
letmkFileIndexRangefileIndex startPos endPos= range(fileIndex, startPos, endPos)
204275

205-
(* end representation, start derived ops*)
206-
207276
letposOrder= Order.orderOn(fun(p:pos)-> p.Line, p.Column)(Pair.order(Int32.order, Int32.order))
208-
(* rangeOrder: not a total order, but enough to sort on ranges*)
277+
278+
/// rangeOrder: not a total order, but enough to sort on ranges
209279
letrangeOrder= Order.orderOn(fun(r:range)-> r.FileName, r.Start)(Pair.order(String.order, posOrder))
210280

211281
letoutputPos(os:TextWriter)(m:pos)= fprintf os"(%d,%d)" m.Line m.Column
282+
212283
letoutputRange(os:TextWriter)(m:range)= fprintf os"%s%a-%a" m.FileName outputPos m.Start outputPos m.End
213-
letboutputPos os(m:pos)= bprintf os"(%d,%d)" m.Line m.Column
214-
letboutputRange os(m:range)= bprintf os"%s%a-%a" m.FileName boutputPos m.Start boutputPos m.End
215284

216285
letposGt(p1:pos)(p2:pos)=(p1.Line> p2.Line||(p1.Line= p2.Line&& p1.Column> p2.Column))
286+
217287
letposEq(p1:pos)(p2:pos)=(p1.Line= p2.Line&& p1.Column= p2.Column)
288+
218289
letposGeq p1 p2= posEq p1 p2|| posGt p1 p2
290+
219291
letposLt p1 p2= posGt p2 p1
220292

221-
// This is deliberately written in an allocation-free way, i.e. m1.Start, m1.End etc. are not called
293+
/// This is deliberately written in an allocation-free way, i.e. m1.Start, m1.End etc. are not called
222294
letunionRanges(m1:range)(m2:range)=
223295
if m1.FileIndex<> m2.FileIndexthen m2else
224296
letb=
@@ -242,9 +314,13 @@ let rangeBeforePos (m1:range) p =
242314
posGeq p m1.End
243315

244316
letrangeN filename line= mkRange filename(mkPos line0)(mkPos line0)
317+
245318
letpos0= mkPos10
319+
246320
letrange0= rangeN"unknown"1
321+
247322
letrangeStartup= rangeN"startup"1
323+
248324
letrangeCmdArgs= rangeN"commandLineArgs"0
249325

250326
lettrimRangeToLine(r:range)=
@@ -258,6 +334,7 @@ let trimRangeToLine (r:range) =
258334

259335
(* For Diagnostics*)
260336
letstringOfPos(pos:pos)= sprintf"(%d,%d)" pos.Line pos.Column
337+
261338
letstringOfRange(r:range)= sprintf"%s%s-%s" r.FileName(stringOfPos r.Start)(stringOfPos r.End)
262339

263340
#if CHECK_LINE0_TYPES// turn on to check that we correctly transform zero-based line counts to one-based line counts
@@ -272,17 +349,22 @@ type Pos01 = Line0 * int
272349
typeRange01= Pos01* Pos01
273350

274351
moduleLine=
352+
275353
// Visual Studio uses line counts starting at 0, F# uses them starting at 1
276354
letfromZ(line:Line0)= int line+1
355+
277356
lettoZ(line:int):Line0= LanguagePrimitives.Int32WithMeasure(line-1)
278357

279358
modulePos=
359+
280360
letfromZ(line:Line0)idx= mkPos(Line.fromZ line) idx
281-
lettoZ(p:pos)=(Line.toZ p.Line, p.Column)
282361

362+
lettoZ(p:pos)=(Line.toZ p.Line, p.Column)
283363

284364
moduleRange=
365+
285366
lettoZ(m:range)= Pos.toZ m.Start, Pos.toZ m.End
367+
286368
lettoFileZ(m:range)= m.FileName, toZ m
287369

288370

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp