Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make it possible to track the original text range #18387

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/release-notes/.FSharp.Compiler.Service/9.0.300.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
* Added nullability annotations to `.Using` builder method for `async`, `task` and compiler-internal builders ([PR #18292](https://github.com/dotnet/fsharp/pull/18292))
* Warn when `unit` is passed to an `obj`-typed argument ([PR #18330](https://github.com/dotnet/fsharp/pull/18330))
* Warning for "useless null handling" works with piped syntax constructs now ([PR #18331](https://github.com/dotnet/fsharp/pull/18331))
* Make it possible to track the original text range. ([PR #18350](https://github.com/dotnet/fsharp/pull/18387))

### Breaking Changes
* Struct unions with overlapping fields now generate mappings needed for reading via reflection ([Issue #18121](https://github.com/dotnet/fsharp/issues/17797), [PR #18274](https://github.com/dotnet/fsharp/pull/17877))
16 changes: 9 additions & 7 deletions src/Compiler/Facilities/prim-lexing.fs
Original file line number Diff line number Diff line change
Expand Up @@ -210,41 +210,43 @@ open System.Collections.Generic
[<Struct>]
type internal Position =
val FileIndex: int
val OriginalFileIndex: int
val Line: int
val OriginalLine: int
val AbsoluteOffset: int
val StartOfLineAbsoluteOffset: int
member x.Column = x.AbsoluteOffset - x.StartOfLineAbsoluteOffset

new(fileIndex: int, line: int, originalLine: int, startOfLineAbsoluteOffset: int, absoluteOffset: int) =
new(fileIndex: int, originalFileIndex: int, line: int, originalLine: int, startOfLineAbsoluteOffset: int, absoluteOffset: int) =
{
FileIndex = fileIndex
OriginalFileIndex = originalFileIndex
Line = line
OriginalLine = originalLine
AbsoluteOffset = absoluteOffset
StartOfLineAbsoluteOffset = startOfLineAbsoluteOffset
}

member x.NextLine =
Position(x.FileIndex, x.Line + 1, x.OriginalLine + 1, x.AbsoluteOffset, x.AbsoluteOffset)
Position(x.FileIndex, x.OriginalFileIndex, x.Line + 1, x.OriginalLine + 1, x.AbsoluteOffset, x.AbsoluteOffset)

member x.EndOfToken n =
Position(x.FileIndex, x.Line, x.OriginalLine, x.StartOfLineAbsoluteOffset, x.AbsoluteOffset + n)
Position(x.FileIndex, x.OriginalFileIndex, x.Line, x.OriginalLine, x.StartOfLineAbsoluteOffset, x.AbsoluteOffset + n)

member x.ShiftColumnBy by =
Position(x.FileIndex, x.Line, x.OriginalLine, x.StartOfLineAbsoluteOffset, x.AbsoluteOffset + by)
Position(x.FileIndex, x.OriginalFileIndex, x.Line, x.OriginalLine, x.StartOfLineAbsoluteOffset, x.AbsoluteOffset + by)

member x.ColumnMinusOne =
Position(x.FileIndex, x.Line, x.OriginalLine, x.StartOfLineAbsoluteOffset, x.StartOfLineAbsoluteOffset - 1)
Position(x.FileIndex, x.OriginalFileIndex, x.Line, x.OriginalLine, x.StartOfLineAbsoluteOffset, x.StartOfLineAbsoluteOffset - 1)

member x.ApplyLineDirective(fileIdx, line) =
Position(fileIdx, line, x.OriginalLine + 1, x.AbsoluteOffset, x.AbsoluteOffset)
Position(fileIdx, x.OriginalFileIndex, line, x.OriginalLine + 1, x.AbsoluteOffset, x.AbsoluteOffset)

override p.ToString() = $"({p.Line},{p.Column})"

static member Empty = Position()

static member FirstLine fileIdx = Position(fileIdx, 1, 1, 0, 0)
static member FirstLine fileIdx = Position(fileIdx, fileIdx, 1, 1, 0, 0)

type internal LexBufferFiller<'Char> = LexBuffer<'Char> -> unit

Expand Down
2 changes: 2 additions & 0 deletions src/Compiler/Facilities/prim-lexing.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ type internal Position =
/// The file index for the file associated with the input stream, use <c>fileOfFileIndex</c> to decode
val FileIndex: int

val OriginalFileIndex: int

/// The line number in the input stream, assuming fresh positions have been updated
/// for the new line by modifying the EndPos property of the LexBuffer.
val Line: int
Expand Down
24 changes: 20 additions & 4 deletions src/Compiler/SyntaxTree/ParseHelpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,30 @@ let warningStringOfPos (p: pos) = warningStringOfCoords p.Line p.Column

/// Get an F# compiler position from a lexer position
let posOfLexPosition (p: Position) = mkPos p.Line p.Column
let posOfLexOriginalPosition (p: Position) = mkPos p.OriginalLine p.Column

/// Get an F# compiler range from a lexer range
let mkSynRange (p1: Position) (p2: Position) =
if p1.FileIndex = p2.FileIndex then
mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition p2)
let range =
if p1.FileIndex = p2.FileIndex then
mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition p2)
else
// This means we had a #line directive in the middle of this syntax element.
mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition (p1.ShiftColumnBy 1))

// Check if the start or end position is affected by a #line directive
if
p1.FileIndex <> p2.FileIndex
|| p1.OriginalFileIndex <> p1.FileIndex
|| p1.OriginalLine <> p1.Line
|| p2.OriginalFileIndex <> p2.FileIndex
|| p2.OriginalLine <> p2.Line
then
mkFileIndexRange p1.OriginalFileIndex (posOfLexOriginalPosition p1) (posOfLexOriginalPosition p2)
|> ValueSome
|> range.WithOriginalRange
else
// This means we had a #line directive in the middle of this syntax element.
mkFileIndexRange p1.FileIndex (posOfLexPosition p1) (posOfLexPosition (p1.ShiftColumnBy 1))
range

type LexBuffer<'Char> with

Expand Down
3 changes: 2 additions & 1 deletion src/Compiler/SyntaxTree/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -777,7 +777,8 @@ type SynExpr =
match e with
| SynExpr.Paren(_, leftParenRange, rightParenRange, r) ->
match rightParenRange with
| Some rightParenRange when leftParenRange.FileIndex <> rightParenRange.FileIndex -> leftParenRange
| Some rightParenRange when leftParenRange.FileIndex <> rightParenRange.FileIndex ->
if r.HasOriginalRange then r else leftParenRange
| _ -> r
| SynExpr.Quote(range = m)
| SynExpr.Const(range = m)
Expand Down
40 changes: 36 additions & 4 deletions src/Compiler/Utilities/range.fs
Original file line number Diff line number Diff line change
Expand Up @@ -262,10 +262,12 @@ module FileIndex =
let commandLineArgsFileName = "commandLineArgs"

[<Struct; CustomEquality; NoComparison>]
[<System.Diagnostics.DebuggerDisplay("({StartLine},{StartColumn}-{EndLine},{EndColumn}) {ShortFileName} -> {DebugCode}")>]
type Range(code1: int64, code2: int64) =
[<System.Diagnostics.DebuggerDisplay("{OriginalRange} -> ({StartLine},{StartColumn}-{EndLine},{EndColumn}) {ShortFileName} -> {DebugCode}")>]
type Range private (code1: int64, code2: int64, originalRange: struct (int64 * int64) voption) =
Comment on lines +265 to +266
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is more than doubling the size of a very low-level structure used throughout most representations used in the compiler.

Considering #line a rather edge feature targeting code generators, I don't see this increase well justified.

Given the #line feature usage, I would rather sacrifice UX when #line is encountered at the referenced feature.

static member Zero = range (0L, 0L)

new(code1, code2) = range (code1, code2, ValueNone)

new(fIdx, bl, bc, el, ec) =
let code1 =
((int64 fIdx) &&& fileIndexMask)
Expand Down Expand Up @@ -386,8 +388,28 @@ type Range(code1: int64, code2: int64) =
let code2 = code2 &&& ~~~(debugPointKindMask ||| isSyntheticMask)
hash code1 + hash code2

member _.OriginalRange =
originalRange
|> ValueOption.map (fun struct (code1, code2) -> range (code1, code2))

override r.ToString() =
sprintf "(%d,%d--%d,%d)" r.StartLine r.StartColumn r.EndLine r.EndColumn
let fromText =
if r.HasOriginalRange then
$" (from: %s{r.OriginalRange.Value.ToString()})"
else
String.Empty

sprintf "(%d,%d--%d,%d)%s" r.StartLine r.StartColumn r.EndLine r.EndColumn fromText

member m.IsZero = m.Equals range.Zero

member _.WithOriginalRange(originalRange: range voption) =
range (code1, code2, originalRange |> ValueOption.map (fun m -> struct (m.Code1, m.Code2)))

member this.HasOriginalRange =
match this.OriginalRange with
| ValueSome range2 when not range2.IsZero -> true
| _ -> false

and range = Range

Expand Down Expand Up @@ -498,8 +520,18 @@ module Range =
else
m2

let originalRange =
match m1.OriginalRange, m2.OriginalRange with
// #line is inside the syntax block
| ValueNone, ValueSome r2 when m1.FileIndex = r2.FileIndex ->
ValueSome(range (m1.FileIndex, m1.StartLine, m1.StartColumn, r2.EndLine, r2.EndColumn))
| ValueSome r1, ValueSome r2 when r1.FileIndex = r2.FileIndex ->
ValueSome(range (r1.FileIndex, r1.StartLine, r1.StartColumn, r2.EndLine, r2.EndColumn))
| _ -> ValueNone

let m =
range (m1.FileIndex, start.StartLine, start.StartColumn, finish.EndLine, finish.EndColumn)
range(m1.FileIndex, start.StartLine, start.StartColumn, finish.EndLine, finish.EndColumn)
.WithOriginalRange(originalRange)

if m1.IsSynthetic || m2.IsSynthetic then
m.MakeSynthetic()
Expand Down
7 changes: 7 additions & 0 deletions src/Compiler/Utilities/range.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,13 @@ type Range =
/// service operations like dot-completion.
member IsSynthetic: bool

/// The original range for the range
member OriginalRange: range voption

member HasOriginalRange: bool

member WithOriginalRange: originalRange: range voption -> range

/// Convert a range to be synthetic
member internal MakeSynthetic: unit -> range

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ printfn ""
"""

[<Theory>]
[<InlineData(1, case1, "xyz.fs:(1,0--3,1)")>]
[<InlineData(2, case2, "Line.fs:(2,0--2,1)")>]
[<InlineData(3, case3, "Line.fs:(2,0--2,1)")>]
[<InlineData(1, case1, "xyz.fs:(1,0--3,1) (from: (3,0--5,1))")>]
[<InlineData(2, case2, "Line.fs:(2,0--2,1) (from: (2,0--5,1))")>]
[<InlineData(3, case3, "Line.fs:(2,0--2,1) (from: (2,0--4,1))")>]
let ``check expr range interacting with line directive`` (case, source, expectedRange) =
let parseResults = parse source
if parseResults.ParseHadErrors then failwith "unexpected: parse error"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2830,12 +2830,20 @@ FSharp.Compiler.Diagnostics.ExtendedData+DiagnosticContextInfo: Int32 GetHashCod
FSharp.Compiler.Diagnostics.ExtendedData+DiagnosticContextInfo: Int32 Tag
FSharp.Compiler.Diagnostics.ExtendedData+DiagnosticContextInfo: Int32 get_Tag()
FSharp.Compiler.Diagnostics.ExtendedData+DiagnosticContextInfo: System.String ToString()
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] DiagnosticId
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] UrlFormat
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_DiagnosticId()
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_UrlFormat()
FSharp.Compiler.Diagnostics.ExtendedData+ExpressionIsAFunctionExtendedData: FSharp.Compiler.Symbols.FSharpType ActualType
FSharp.Compiler.Diagnostics.ExtendedData+ExpressionIsAFunctionExtendedData: FSharp.Compiler.Symbols.FSharpType get_ActualType()
FSharp.Compiler.Diagnostics.ExtendedData+FieldNotContainedDiagnosticExtendedData: FSharp.Compiler.Symbols.FSharpField ImplementationField
FSharp.Compiler.Diagnostics.ExtendedData+FieldNotContainedDiagnosticExtendedData: FSharp.Compiler.Symbols.FSharpField SignatureField
FSharp.Compiler.Diagnostics.ExtendedData+FieldNotContainedDiagnosticExtendedData: FSharp.Compiler.Symbols.FSharpField get_ImplementationField()
FSharp.Compiler.Diagnostics.ExtendedData+FieldNotContainedDiagnosticExtendedData: FSharp.Compiler.Symbols.FSharpField get_SignatureField()
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] DiagnosticId
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] UrlFormat
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_DiagnosticId()
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_UrlFormat()
FSharp.Compiler.Diagnostics.ExtendedData+TypeMismatchDiagnosticExtendedData: DiagnosticContextInfo ContextInfo
FSharp.Compiler.Diagnostics.ExtendedData+TypeMismatchDiagnosticExtendedData: DiagnosticContextInfo get_ContextInfo()
FSharp.Compiler.Diagnostics.ExtendedData+TypeMismatchDiagnosticExtendedData: FSharp.Compiler.Symbols.FSharpDisplayContext DisplayContext
Expand All @@ -2851,22 +2859,13 @@ FSharp.Compiler.Diagnostics.ExtendedData+ValueNotContainedDiagnosticExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+ArgumentsInSigAndImplMismatchExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+DefinitionsInSigAndImplNotCompatibleAbbreviationsDifferExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+DiagnosticContextInfo
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+ExpressionIsAFunctionExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+FieldNotContainedDiagnosticExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+IFSharpDiagnosticExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+TypeMismatchDiagnosticExtendedData
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+ValueNotContainedDiagnosticExtendedData
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] DiagnosticId
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] UrlFormat
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_DiagnosticId()
FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_UrlFormat()
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+ObsoleteDiagnosticExtendedData
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] DiagnosticId
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] UrlFormat
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_DiagnosticId()
FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData: Microsoft.FSharp.Core.FSharpOption`1[System.String] get_UrlFormat()
FSharp.Compiler.Diagnostics.ExtendedData: FSharp.Compiler.Diagnostics.ExtendedData+ExperimentalExtendedData
FSharp.Compiler.Diagnostics.FSharpDiagnostic: FSharp.Compiler.Diagnostics.FSharpDiagnostic Create(FSharp.Compiler.Diagnostics.FSharpDiagnosticSeverity, System.String, Int32, FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[System.String], Microsoft.FSharp.Core.FSharpOption`1[System.String])
FSharp.Compiler.Diagnostics.FSharpDiagnostic: FSharp.Compiler.Diagnostics.FSharpDiagnosticSeverity Severity
FSharp.Compiler.Diagnostics.FSharpDiagnostic: FSharp.Compiler.Diagnostics.FSharpDiagnosticSeverity get_Severity()
Expand Down Expand Up @@ -10892,14 +10891,17 @@ FSharp.Compiler.Text.PositionModule: System.String stringOfPos(FSharp.Compiler.T
FSharp.Compiler.Text.PositionModule: System.Tuple`2[System.Int32,System.Int32] toZ(FSharp.Compiler.Text.Position)
FSharp.Compiler.Text.PositionModule: Void outputPos(System.IO.TextWriter, FSharp.Compiler.Text.Position)
FSharp.Compiler.Text.Range: Boolean Equals(System.Object)
FSharp.Compiler.Text.Range: Boolean HasOriginalRange
FSharp.Compiler.Text.Range: Boolean IsSynthetic
FSharp.Compiler.Text.Range: Boolean get_HasOriginalRange()
FSharp.Compiler.Text.Range: Boolean get_IsSynthetic()
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Position End
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Position Start
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Position get_End()
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Position get_Start()
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Range EndRange
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Range StartRange
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Range WithOriginalRange(Microsoft.FSharp.Core.FSharpValueOption`1[FSharp.Compiler.Text.Range])
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Range Zero
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Range get_EndRange()
FSharp.Compiler.Text.Range: FSharp.Compiler.Text.Range get_StartRange()
Expand All @@ -10913,6 +10915,8 @@ FSharp.Compiler.Text.Range: Int32 get_EndColumn()
FSharp.Compiler.Text.Range: Int32 get_EndLine()
FSharp.Compiler.Text.Range: Int32 get_StartColumn()
FSharp.Compiler.Text.Range: Int32 get_StartLine()
FSharp.Compiler.Text.Range: Microsoft.FSharp.Core.FSharpValueOption`1[FSharp.Compiler.Text.Range] OriginalRange
FSharp.Compiler.Text.Range: Microsoft.FSharp.Core.FSharpValueOption`1[FSharp.Compiler.Text.Range] get_OriginalRange()
FSharp.Compiler.Text.Range: System.String FileName
FSharp.Compiler.Text.Range: System.String ToString()
FSharp.Compiler.Text.Range: System.String get_FileName()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
[IL]: Error [UnmanagedPointer]: : FSharp.Compiler.IO.RawByteMemory::.ctor(uint8*, int32, object)][offset 0x00000009] Unmanaged pointers are not a verifiable type.
[IL]: Error [StackByRef]: : FSharp.Compiler.IO.RawByteMemory::get_Item(int32)][offset 0x0000001E][found Native Int] Expected ByRef on the stack.
[IL]: Error [StackByRef]: : FSharp.Compiler.IO.RawByteMemory::set_Item(int32, uint8)][offset 0x00000025][found Native Int] Expected ByRef on the stack.
[IL]: Error [CallVirtOnValueType]: : FSharp.Compiler.Text.Range::ToString()][offset 0x00000021] Callvirt on a value type method.
[IL]: Error [ReturnPtrToStack]: : Internal.Utilities.Text.Lexing.LexBuffer`1::get_LexemeView()][offset 0x00000019] Return type is ByRef, TypedReference, ArgHandle, or ArgIterator.
[IL]: Error [StackUnexpected]: : Internal.Utilities.Text.Lexing.UnicodeTables::scanUntilSentinel([FSharp.Compiler.Service]Internal.Utilities.Text.Lexing.LexBuffer`1<char>, int32)][offset 0x00000079][found Short] Unexpected type on the stack.
[IL]: Error [StackUnexpected]: : FSharp.Compiler.Xml.XmlDoc::processLines([FSharp.Core]Microsoft.FSharp.Collections.FSharpList`1<string>)][offset 0x00000031][found Char] Unexpected type on the stack.
Expand Down Expand Up @@ -59,7 +60,7 @@
[IL]: Error [StackUnexpected]: : FSharp.Compiler.AbstractIL.IL::parseILVersion(string)][offset 0x0000000B][found Char] Unexpected type on the stack.
[IL]: Error [StackUnexpected]: : FSharp.Compiler.AbstractIL.IL::parseILVersion(string)][offset 0x00000021][found Char] Unexpected type on the stack.
[IL]: Error [StackUnexpected]: : <StartupCode$FSharp-Compiler-Service>.$FSharp.Compiler.DiagnosticsLogger::.cctor()][offset 0x000000CD][found Char] Unexpected type on the stack.
[IL]: Error [CallVirtOnValueType]: : FSharp.Compiler.Text.RangeModule+comparer@558::System.Collections.Generic.IEqualityComparer<FSharp.Compiler.Text.Range>.GetHashCode([FSharp.Compiler.Service]FSharp.Compiler.Text.Range)][offset 0x00000002] Callvirt on a value type method.
[IL]: Error [CallVirtOnValueType]: : FSharp.Compiler.Text.RangeModule+comparer@590::System.Collections.Generic.IEqualityComparer<FSharp.Compiler.Text.Range>.GetHashCode([FSharp.Compiler.Service]FSharp.Compiler.Text.Range)][offset 0x00000002] Callvirt on a value type method.
[IL]: Error [StackUnexpected]: : Internal.Utilities.PathMapModule::applyDir([FSharp.Compiler.Service]Internal.Utilities.PathMap, string)][offset 0x00000037][found Char] Unexpected type on the stack.
[IL]: Error [StackUnexpected]: : Internal.Utilities.PathMapModule::applyDir([FSharp.Compiler.Service]Internal.Utilities.PathMap, string)][offset 0x00000043][found Char] Unexpected type on the stack.
[IL]: Error [StackUnexpected]: : <StartupCode$FSharp-Compiler-Service>.$Internal.Utilities.XmlAdapters::.cctor()][offset 0x0000000A][found Char] Unexpected type on the stack.
Expand Down
Loading
Loading