@@ -9,53 +9,58 @@ namespace Internal.Utilities.Text.Lexing
99 open Microsoft.FSharp .Collections
1010 open System.Collections .Generic
1111
12- // REVIEW: This type showed up on a parsing-intensive performance measurement.
13- // REVIEW: Consider whether it can be smaller or can be a struct.
14- type internal Position =
15- { /// The file name index for the position, use fileOfFileIndex in range.fs to decode
16- posFileIndex: int ;
17- /// The line number for the position
18- posLineNum: int ;
19- /// The line number for the position in the original source file
20- posOriginalLineNum : int ;
21- /// The absolute offset of the beginning of the line
22- posStartOfLineOffset: int ;
23- /// The absolute offset of the column for the position
24- posColumnOffset: int ; }
25- member x.FileIndex = x.posFileIndex
26- member x.Line = x.posLineNum
27- member x.OriginalLine = x.posOriginalLineNum
28- member x.AbsoluteOffset = x.posColumnOffset
29- member x.StartOfLine = x.posStartOfLineOffset
30- member x.StartOfLineAbsoluteOffset = x.posStartOfLineOffset
31- member x.Column = x.posColumnOffset - x.posStartOfLineOffset
32- member pos.NextLine =
33- { pos with
34- posOriginalLineNum = pos.OriginalLine + 1 ;
35- posLineNum = pos.Line+ 1 ;
36- posStartOfLineOffset = pos.AbsoluteOffset }
37- member pos.EndOfToken n = { pos with posColumnOffset= pos.posColumnOffset + n }
38- member pos.ShiftColumnBy by = { pos with posColumnOffset = pos.posColumnOffset + by}
39- member pos.ColumnMinusOne = { pos with posColumnOffset = pos.posStartOfLineOffset-1 }
40-
41- member pos.ApplyLineDirective ( fileIdx , line ) =
42- { pos with posFileIndex = fileIdx;
43- posStartOfLineOffset= pos.posColumnOffset;
44- posLineNum= line };
45-
46- static member Empty =
47- { posFileIndex= 0 ;
48- posLineNum= 0 ;
49- posOriginalLineNum = 0 ;
50- posStartOfLineOffset= 0 ;
51- posColumnOffset= 0 }
12+ [<Struct>]
13+ type internal Position ( posFileIndex : int , posLineNum : int , posOriginalLineNum : int , posStartOfLineOffset : int , posColumnOffset : int ) =
14+ member __.FileIndex = posFileIndex
15+ member __.Line = posLineNum
16+ member __.OriginalLine = posOriginalLineNum
17+ member __.AbsoluteOffset = posColumnOffset
18+ member __.StartOfLineAbsoluteOffset = posStartOfLineOffset
19+ member __.Column = posColumnOffset - posStartOfLineOffset
20+
21+ member __.NextLine =
22+ Position ( posFileIndex,
23+ posLineNum + 1 ,
24+ posOriginalLineNum + 1 ,
25+ posColumnOffset,
26+ posColumnOffset)
27+
28+ member __.EndOfToken n =
29+ Position ( posFileIndex,
30+ posLineNum,
31+ posOriginalLineNum,
32+ posStartOfLineOffset,
33+ posColumnOffset + n)
34+
35+ member __.ShiftColumnBy by =
36+ Position ( posFileIndex,
37+ posLineNum,
38+ posOriginalLineNum,
39+ posStartOfLineOffset,
40+ posColumnOffset + by)
41+
42+ member __.ColumnMinusOne =
43+ Position ( posFileIndex,
44+ posLineNum,
45+ posOriginalLineNum,
46+ posStartOfLineOffset,
47+ posStartOfLineOffset - 1 )
48+
49+ member __.ApplyLineDirective ( fileIdx , line ) =
50+ Position ( fileIdx,
51+ line,
52+ posOriginalLineNum,
53+ posColumnOffset,
54+ posColumnOffset)
55+
56+ static member Empty = Position ()
5257
5358 static member FirstLine fileIdx =
54- { posFileIndex = fileIdx;
55- posStartOfLineOffset = 0 ;
56- posColumnOffset = 0 ;
57- posOriginalLineNum = 0 ;
58- posLineNum = 1 }
59+ Position ( fileIdx,
60+ 1 ,
61+ 0 ,
62+ 0 ,
63+ 0 )
5964
6065 type internal LexBufferFiller < 'Char > = ( LexBuffer< 'Char> -> unit)
6166
0 commit comments