@@ -6,98 +6,99 @@ module Microsoft.FSharp.Compiler.Range
66open System
77open System.IO
88open System.Collections .Generic
9+ open System.Collections .Concurrent
910open Microsoft.FSharp .Core .Printf
10- open Internal.Utilities
11- open Microsoft.FSharp .Compiler .AbstractIL
12- open Microsoft.FSharp .Compiler .AbstractIL .Internal
1311open Microsoft.FSharp .Compiler .AbstractIL .Internal .Library
14- open Microsoft.FSharp .Compiler
1512open Microsoft.FSharp .Compiler .Lib
1613open Microsoft.FSharp .Compiler .Lib .Bits
1714
1815type FileIndex = int32
1916
2017[<Literal>]
21- let columnBitCount = 9
18+ let columnBitCount = 20
2219[<Literal>]
23- let lineBitCount = 16
20+ let lineBitCount = 31
2421
2522let posBitCount = lineBitCount+ columnBitCount
26- let _ = assert ( posBitCount<= 32 )
27- let posColumnMask = mask320 columnBitCount
28- let lineColumnMask = mask32 columnBitCount lineBitCount
29- let inline ( lsr ) ( x : int ) ( y : int ) = int32( uint32 x>>> y)
23+ let _ = assert ( posBitCount<= 64 )
24+ let posColumnMask = mask640 columnBitCount
25+ let lineColumnMask = mask64 columnBitCount lineBitCount
3026
3127[<Struct; CustomEquality; NoComparison>]
3228[<System.Diagnostics.DebuggerDisplay( " {Line},{Column}" ) >]
33- type pos ( code : int32 ) =
29+ type pos ( code : int64 ) =
3430new ( l , c ) =
3531let l = max0 l
3632let c = max0 c
37- let p = ( c&&& posColumnMask)
38- ||| (( l<<< columnBitCount) &&& lineColumnMask)
33+ let p = ( int64 c&&& posColumnMask)
34+ ||| (( int64 l<<< columnBitCount) &&& lineColumnMask)
3935 pos p
4036
41- member p.Line = ( codelsr columnBitCount)
42- member p.Column = ( code&&& posColumnMask)
37+ member p.Line = int32 ( uint64 code>>> columnBitCount)
38+ member p.Column = int32 ( code&&& posColumnMask)
4339
4440member r.Encoding = code
4541static member EncodingSize = posBitCount
46- static member Decode ( code : int32 ) : pos = pos code
42+ static member Decode ( code : int64 ) : pos = pos code
4743override p.Equals ( obj ) = match objwith :? posas p2-> code= p2.Encoding| _ -> false
4844override p.GetHashCode () = hash code
4945override p.ToString () = sprintf" (%d ,%d )" p.Line p.Column
5046
5147[<Literal>]
52- let fileIndexBitCount = 14
48+ let fileIndexBitCount = 24
5349[<Literal>]
54- let startLineBitCount = lineBitCount
50+ let startColumnBitCount = columnBitCount // 20
5551[<Literal>]
56- let startColumnBitCount = columnBitCount
52+ let endColumnBitCount = columnBitCount// 20
53+
5754[<Literal>]
58- let heightBitCount = 15 //If necessary, could probably deduct one or two bits here without ill effect.
55+ let startLineBitCount = lineBitCount //31
5956[<Literal>]
60- let endColumnBitCount = columnBitCount
57+ let heightBitCount = 27
6158[<Literal>]
6259let isSyntheticBitCount = 1
6360#if DEBUG
64- let _ = assert ( fileIndexBitCount+ startLineBitCount+ startColumnBitCount+ heightBitCount+ endColumnBitCount+ isSyntheticBitCount= 64 )
61+ let _ = assert ( fileIndexBitCount+ startColumnBitCount+ endColumnBitCount<= 64 )
62+ let _ = assert ( startLineBitCount+ heightBitCount+ isSyntheticBitCount<= 64 )
6563#endif
6664
6765[<Literal>]
6866let fileIndexShift = 0
6967[<Literal>]
70- let startLineShift = 14
68+ let startColumnShift = 24
7169[<Literal>]
72- let startColumnShift = 30
70+ let endColumnShift = 44
71+
7372[<Literal>]
74- let heightShift = 39
73+ let startLineShift = 0
7574[<Literal>]
76- let endColumnShift = 54
75+ let heightShift = 31
7776[<Literal>]
78- let isSyntheticShift = 63
77+ let isSyntheticShift = 58
7978
8079
8180[<Literal>]
82- let fileIndexMask = 0b0000000000000000000000000000000000000000000000000011111111111111 L
81+ let fileIndexMask = 0b0000000000000000000000000000000000000000111111111111111111111111 L
8382[<Literal>]
84- let startLineMask = 0b0000000000000000000000000000000000111111111111111100000000000000 L
83+ let startColumnMask = 0b0000000000000000000011111111111111111111000000000000000000000000 L
8584[<Literal>]
86- let startColumnMask = 0b0000000000000000000000000111111111000000000000000000000000000000 L
85+ let endColumnMask = 0b1111111111111111111100000000000000000000000000000000000000000000 L
86+
8787[<Literal>]
88- let heightMask = 0b0000000000111111111111111000000000000000000000000000000000000000 L
88+ let startLineMask = 0b0000000000000000000000000000000001111111111111111111111111111111 L
8989[<Literal>]
90- let endColumnMask = 0b0111111111000000000000000000000000000000000000000000000000000000 L
90+ let heightMask = 0b0000001111111111111111111111111110000000000000000000000000000000 L
9191[<Literal>]
92- let isSyntheticMask = 0b1000000000000000000000000000000000000000000000000000000000000000 L
92+ let isSyntheticMask = 0b0000010000000000000000000000000000000000000000000000000000000000 L
9393
9494#if DEBUG
95- let _ = assert ( startLineShift= fileIndexShift+ fileIndexBitCount)
96- let _ = assert ( startColumnShift= startLineShift+ startLineBitCount)
97- let _ = assert ( heightShift= startColumnShift+ startColumnBitCount)
98- let _ = assert ( endColumnShift= heightShift+ heightBitCount)
99- let _ = assert ( isSyntheticShift= endColumnShift+ endColumnBitCount)
100- let _ = assert ( fileIndexMask= mask640 fileIndexBitCount)
95+ let _ = assert ( startColumnShift= fileIndexShift+ fileIndexBitCount)
96+ let _ = assert ( endColumnShift= startColumnShift+ startColumnBitCount)
97+
98+ let _ = assert ( heightShift= startLineShift+ startLineBitCount)
99+ let _ = assert ( isSyntheticShift= heightShift+ heightBitCount)
100+
101+ let _ = assert ( fileIndexMask= mask64 fileIndexShift fileIndexBitCount)
101102let _ = assert ( startLineMask= mask64 startLineShift startLineBitCount)
102103let _ = assert ( startColumnMask= mask64 startColumnShift startColumnBitCount)
103104let _ = assert ( heightMask= mask64 heightShift heightBitCount)
@@ -108,21 +109,17 @@ let _ = assert (isSyntheticMask = mask64 isSyntheticShift isSyntheticBitCount)
108109// This is just a standard unique-index table
109110type FileIndexTable () =
110111let indexToFileTable = new ResizeArray<_>( 11 )
111- let fileToIndexTable = new Dictionary < string, int>( 11 )
112+ let fileToIndexTable = new ConcurrentDictionary < string, int>()
112113member t.FileToIndex f =
113114let mutable res = 0
114115let ok = fileToIndexTable.TryGetValue( f, & res)
115116if okthen res
116117else
117118 lock fileToIndexTable( fun () ->
118- let mutable res = 0 in
119- let ok = fileToIndexTable.TryGetValue( f, & res) in
120- if okthen res
121- else
122- let n = indexToFileTable.Countin
123- indexToFileTable.Add( f)
124- fileToIndexTable.[ f] <- n
125- n)
119+ let n = indexToFileTable.Countin
120+ indexToFileTable.Add( f)
121+ fileToIndexTable.[ f] <- n
122+ n)
126123
127124member t.IndexToFile n =
128125( if n< 0 then failwithf" fileOfFileIndex: negative argument: n =%d \n " n)
@@ -147,28 +144,35 @@ let mkPos l c = pos (l, c)
147144#else
148145[<System.Diagnostics.DebuggerDisplay( " ({StartLine},{StartColumn}-{EndLine},{EndColumn}) {FileName} IsSynthetic={IsSynthetic}" ) >]
149146#endif
150- type range ( code : int64 ) =
151- static member Zero = range( 0 L)
147+ type range ( code1 : int64 , code2 : int64) =
148+ static member Zero = range( 0 L, 0 L )
152149new ( fidx , bl , bc , el , ec ) =
153- range( int64 fidx
154- ||| ( int64 bl<<< startLineShift)
155- ||| ( int64 bc<<< startColumnShift)
156- ||| ( int64( el- bl) <<< heightShift)
157- ||| ( int64 ec<<< endColumnShift) )
150+ let code1 = (( int64 fidx) &&& fileIndexMask)
151+ ||| (( int64 bc<<< startColumnShift) &&& startColumnMask)
152+ ||| (( int64 ec<<< endColumnShift) &&& endColumnMask)
153+ let code2 =
154+ (( int64 bl<<< startLineShift) &&& startLineMask)
155+ ||| (( int64( el- bl) <<< heightShift) &&& heightMask)
156+ range( code1, code2)
158157
159158new ( fidx , b : pos , e : pos ) = range( fidx, b.Line, b.Column, e.Line, e.Column)
160159
161- member r.StartLine = int32(( code &&& startLineMask) >>> startLineShift)
162- member r.StartColumn = int32(( code &&& startColumnMask) >>> startColumnShift)
163- member r.EndLine = int32(( code &&& heightMask) >>> heightShift) + r.StartLine
164- member r.EndColumn = int32(( code &&& endColumnMask) >>> endColumnShift)
165- member r.IsSynthetic = int32(( code &&& isSyntheticMask) >>> isSyntheticShift) <> 0
160+ member r.StartLine = int32(( code2 &&& startLineMask) >>> startLineShift)
161+ member r.StartColumn = int32(( code1 &&& startColumnMask) >>> startColumnShift)
162+ member r.EndLine = int32(( code2 &&& heightMask) >>> heightShift) + r.StartLine
163+ member r.EndColumn = int32(( code1 &&& endColumnMask) >>> endColumnShift)
164+ member r.IsSynthetic = int32(( code2 &&& isSyntheticMask) >>> isSyntheticShift) <> 0
166165member r.Start = pos( r.StartLine, r.StartColumn)
167166member r.End = pos( r.EndLine, r.EndColumn)
168- member r.FileIndex = int32( code &&& fileIndexMask)
167+ member r.FileIndex = int32( code1 &&& fileIndexMask)
169168member m.StartRange = range( m.FileIndex, m.Start, m.Start)
170169member m.EndRange = range( m.FileIndex, m.End, m.End)
171170member r.FileName = fileOfFileIndex r.FileIndex
171+ member r.MakeSynthetic () = range( code1, code2||| isSyntheticMask)
172+
173+ member r.Code1 = code1
174+ member r.Code2 = code2
175+
172176#if DEBUG
173177member r.DebugCode =
174178try
@@ -182,12 +186,14 @@ type range(code:int64) =
182186with e->
183187 e.ToString()
184188#endif
185- member r.MakeSynthetic () = range( code||| isSyntheticMask)
186- override r.ToString () = sprintf" %s (%d ,%d --%d ,%d ) IsSynthetic=%b " r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic
189+
187190member r.ToShortString () = sprintf" (%d ,%d --%d ,%d )" r.StartLine r.StartColumn r.EndLine r.EndColumn
188- member r.Code = code
189- override r.Equals ( obj ) = match objwith :? rangeas r2-> code= r2.Code| _ -> false
190- override r.GetHashCode () = hash code
191+
192+ override r.Equals ( obj ) = match objwith :? rangeas r2-> code1= r2.Code1&& code2= r2.Code2| _ -> false
193+
194+ override r.GetHashCode () = hash code1+ hash code2
195+
196+ override r.ToString () = sprintf" %s (%d ,%d --%d ,%d ) IsSynthetic=%b " r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic
191197
192198let mkRange f b e =
193199// remove relative parts from full path