@@ -2254,6 +2254,9 @@ type TyparOptionalData =
2254
2254
2255
2255
/// The declared attributes of the type parameter. Empty for type inference variables.
2256
2256
mutable typar_attribs: Attribs
2257
+
2258
+ /// Set to true if the typar is contravariant, i.e. declared as <in T> in C#
2259
+ mutable typar_is_contravariant: bool
2257
2260
}
2258
2261
2259
2262
[<DebuggerBrowsable( DebuggerBrowsableState.Never) >]
@@ -2355,10 +2358,10 @@ type Typar =
2355
2358
member x.SetAttribs attribs =
2356
2359
match attribs, x.typar_ opt_ data with
2357
2360
| [], None -> ()
2358
- | [], Some { typar_ il_ name = None; typar_ xmldoc = doc; typar_ constraints = [] } when doc.IsEmpty ->
2361
+ | [], Some { typar_ il_ name = None; typar_ xmldoc = doc; typar_ constraints = []; typar _ is _ contravariant = false } when doc.IsEmpty ->
2359
2362
x.typar_ opt_ data <- None
2360
2363
| _, Some optData -> optData.typar_ attribs <- attribs
2361
- | _ -> x.typar_ opt_ data <- Some { typar_ il_ name = None; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = []; typar_ attribs = attribs }
2364
+ | _ -> x.typar_ opt_ data <- Some { typar_ il_ name = None; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = []; typar_ attribs = attribs; typar _ is _ contravariant = false }
2362
2365
2363
2366
/// Get the XML documetnation for the type parameter
2364
2367
member x.XmlDoc =
@@ -2376,7 +2379,7 @@ type Typar =
2376
2379
member x.SetILName il_name =
2377
2380
match x.typar_ opt_ data with
2378
2381
| Some optData -> optData.typar_ il_ name <- il_ name
2379
- | _ -> x.typar_ opt_ data <- Some { typar_ il_ name = il_ name; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = []; typar_ attribs = [] }
2382
+ | _ -> x.typar_ opt_ data <- Some { typar_ il_ name = il_ name; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = []; typar_ attribs = []; typar _ is _ contravariant = false }
2380
2383
2381
2384
/// Indicates the display name of a type variable
2382
2385
member x.DisplayName = if x.Name = " ?" then " ?" + string x.Stamp else x.Name
@@ -2385,10 +2388,17 @@ type Typar =
2385
2388
member x.SetConstraints cs =
2386
2389
match cs, x.typar_ opt_ data with
2387
2390
| [], None -> ()
2388
- | [], Some { typar_ il_ name = None; typar_ xmldoc = doc; typar_ attribs = [] } when doc.IsEmpty ->
2391
+ | [], Some { typar_ il_ name = None; typar_ xmldoc = doc; typar_ attribs = []; typar _ is _ contravariant = false } when doc.IsEmpty ->
2389
2392
x.typar_ opt_ data <- None
2390
2393
| _, Some optData -> optData.typar_ constraints <- cs
2391
- | _ -> x.typar_ opt_ data <- Some { typar_ il_ name = None; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = cs; typar_ attribs = [] }
2394
+ | _ -> x.typar_ opt_ data <- Some { typar_ il_ name = None; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = cs; typar_ attribs = []; typar_ is_ contravariant = false }
2395
+
2396
+ /// Marks the typar as being contravariant
2397
+ member x.MarkAsContravariant () =
2398
+ match x.typar_ opt_ data with
2399
+ | Some optData -> optData.typar_ is_ contravariant <- true
2400
+ | _ ->
2401
+ x.typar_ opt_ data <- Some { typar_ il_ name = None; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = []; typar_ attribs = []; typar_ is_ contravariant = true }
2392
2402
2393
2403
/// Creates a type variable that contains empty data, and is not yet linked. Only used during unpickling of F# metadata.
2394
2404
static member NewUnlinked () : Typar =
@@ -2410,7 +2420,7 @@ type Typar =
2410
2420
x.typar_ solution <- tg.typar_ solution
2411
2421
match tg.typar_ opt_ data with
2412
2422
| Some tg ->
2413
- let optData = { typar_ il_ name = tg.typar_ il_ name; typar_ xmldoc = tg.typar_ xmldoc; typar_ constraints = tg.typar_ constraints; typar_ attribs = tg.typar_ attribs }
2423
+ let optData = { typar_ il_ name = tg.typar_ il_ name; typar_ xmldoc = tg.typar_ xmldoc; typar_ constraints = tg.typar_ constraints; typar_ attribs = tg.typar_ attribs; typar _ is _ contravariant = tg.typar _ is _ contravariant }
2414
2424
x.typar_ opt_ data <- Some optData
2415
2425
| None -> ()
2416
2426
@@ -6142,7 +6152,7 @@ type Construct() =
6142
6152
typar_ opt_ data =
6143
6153
match attribs with
6144
6154
| [] -> None
6145
- | _ -> Some { typar_ il_ name = None; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = []; typar_ attribs = attribs } }
6155
+ | _ -> Some { typar_ il_ name = None; typar_ xmldoc = XmlDoc.Empty; typar_ constraints = []; typar_ attribs = attribs; typar _ is _ contravariant = false } }
6146
6156
6147
6157
/// Create a new type parameter node for a declared type parameter
6148
6158
static member NewRigidTypar nm m =
0 commit comments