Skip to content

Commit 040b160

Browse files
make Internal.Utilities.Text.Lexing.Position a struct
1 parent e6c0d0a commit 040b160

File tree

2 files changed

+51
-47
lines changed

2 files changed

+51
-47
lines changed

src/utils/prim-lexing.fs

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/utils/prim-lexing.fsi

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@ open Microsoft.FSharp.Core
1010
open Microsoft.FSharp.Control
1111

1212
/// Position information stored for lexing tokens
13-
[<Sealed>]
13+
[<Struct>]
1414
type internal Position =
15-
interface System.IComparable
1615
/// The file index for the file associated with the input stream, use fileOfFileIndex in range.fs to decode
1716
member FileIndex : int
1817
/// The line number in the input stream, assuming fresh positions have been updated

0 commit comments

Comments
 (0)